@@ -17,6 +17,7 @@ use test_utils::*;
17
17
18
18
use sqlparser:: ast:: * ;
19
19
use sqlparser:: dialect:: RedshiftSqlDialect ;
20
+ use sqlparser:: parser:: ParserOptions ;
20
21
21
22
#[ test]
22
23
fn test_square_brackets_over_db_schema_table_name ( ) {
@@ -202,10 +203,10 @@ fn parse_like() {
202
203
203
204
// Test with escape char
204
205
let sql = & format ! (
205
- "SELECT * FROM customers WHERE name {}LIKE '%a' ESCAPE '\\ '" ,
206
+ r# "SELECT * FROM customers WHERE name {}LIKE '%a' ESCAPE '\\'"# ,
206
207
if negated { "NOT " } else { "" }
207
208
) ;
208
- let select = redshift ( ) . verified_only_select ( sql) ;
209
+ let select = redshift ( ) . verified_only_select_with_canonical ( sql, "" ) ;
209
210
assert_eq ! (
210
211
Expr :: Like {
211
212
expr: Box :: new( Expr :: Identifier ( Ident :: new( "name" ) . empty_span( ) ) ) ,
@@ -220,10 +221,10 @@ fn parse_like() {
220
221
// This statement tests that LIKE and NOT LIKE have the same precedence.
221
222
// This was previously mishandled (#81).
222
223
let sql = & format ! (
223
- "SELECT * FROM customers WHERE name {}LIKE '%a' IS NULL" ,
224
+ r# "SELECT * FROM customers WHERE name {}LIKE '%a' IS NULL"# ,
224
225
if negated { "NOT " } else { "" }
225
226
) ;
226
- let select = redshift ( ) . verified_only_select ( sql) ;
227
+ let select = redshift ( ) . verified_only_select_with_canonical ( sql, "" ) ;
227
228
assert_eq ! (
228
229
Expr :: IsNull ( Box :: new( Expr :: Like {
229
230
expr: Box :: new( Expr :: Identifier ( Ident :: new( "name" ) . empty_span( ) ) ) ,
@@ -260,10 +261,10 @@ fn parse_similar_to() {
260
261
261
262
// Test with escape char
262
263
let sql = & format ! (
263
- "SELECT * FROM customers WHERE name {}SIMILAR TO '%a' ESCAPE '\\ '" ,
264
+ r# "SELECT * FROM customers WHERE name {}SIMILAR TO '%a' ESCAPE '\\'"# ,
264
265
if negated { "NOT " } else { "" }
265
266
) ;
266
- let select = redshift ( ) . verified_only_select ( sql) ;
267
+ let select = redshift ( ) . verified_only_select_with_canonical ( sql, "" ) ;
267
268
assert_eq ! (
268
269
Expr :: SimilarTo {
269
270
expr: Box :: new( Expr :: Identifier ( Ident :: new( "name" ) . empty_span( ) ) ) ,
@@ -277,10 +278,10 @@ fn parse_similar_to() {
277
278
278
279
// This statement tests that SIMILAR TO and NOT SIMILAR TO have the same precedence.
279
280
let sql = & format ! (
280
- "SELECT * FROM customers WHERE name {}SIMILAR TO '%a' ESCAPE '\\ ' IS NULL" ,
281
+ r# "SELECT * FROM customers WHERE name {}SIMILAR TO '%a' ESCAPE '\\' IS NULL"# ,
281
282
if negated { "NOT " } else { "" }
282
283
) ;
283
- let select = redshift ( ) . verified_only_select ( sql) ;
284
+ let select = redshift ( ) . verified_only_select_with_canonical ( sql, "" ) ;
284
285
assert_eq ! (
285
286
Expr :: IsNull ( Box :: new( Expr :: SimilarTo {
286
287
expr: Box :: new( Expr :: Identifier ( Ident :: new( "name" ) . empty_span( ) ) ) ,
@@ -303,6 +304,13 @@ fn redshift() -> TestedDialects {
303
304
}
304
305
}
305
306
307
+ fn redshift_unescaped ( ) -> TestedDialects {
308
+ TestedDialects {
309
+ dialects : vec ! [ Box :: new( RedshiftSqlDialect { } ) ] ,
310
+ options : Some ( ParserOptions :: new ( ) . with_unescape ( false ) ) ,
311
+ }
312
+ }
313
+
306
314
#[ test]
307
315
fn test_sharp ( ) {
308
316
let sql = "SELECT #_of_values" ;
@@ -346,3 +354,12 @@ fn parse_listagg() {
346
354
fn parse_quoted_identifier ( ) {
347
355
redshift ( ) . verified_only_select ( r#"SELECT 'foo' AS "123_col""# ) ;
348
356
}
357
+
358
+ #[ test]
359
+ fn test_escape_string ( ) {
360
+ redshift_unescaped ( ) . verified_stmt ( r"SELECT 'I\'m fine'" ) ;
361
+ redshift_unescaped ( ) . verified_stmt ( r"SELECT 'I\\\'m fine'" ) ;
362
+ redshift_unescaped ( ) . verified_stmt ( r#"SELECT 'I''m fine'"# ) ;
363
+ redshift_unescaped ( ) . verified_stmt ( r#"SELECT 'I\\\'m fine'"# ) ;
364
+ redshift_unescaped ( ) . verified_stmt ( r#"SELECT '[\'\\[\\]]'"# ) ;
365
+ }
0 commit comments