Skip to content

Commit 87c43df

Browse files
committed
Fix ILIKE expression support in SQL unparser (#76)
1 parent 03fa3b9 commit 87c43df

File tree

2 files changed

+82
-8
lines changed

2 files changed

+82
-8
lines changed

datafusion/sql/src/unparser/expr.rs

Lines changed: 37 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -273,20 +273,39 @@ impl Unparser<'_> {
273273
pattern,
274274
escape_char,
275275
case_insensitive: _,
276-
})
277-
| Expr::Like(Like {
278-
negated,
279-
expr,
280-
pattern,
281-
escape_char,
282-
case_insensitive: _,
283276
}) => Ok(ast::Expr::Like {
284277
negated: *negated,
285278
expr: Box::new(self.expr_to_sql_inner(expr)?),
286279
pattern: Box::new(self.expr_to_sql_inner(pattern)?),
287280
escape_char: escape_char.map(|c| c.to_string()),
288281
any: false,
289282
}),
283+
Expr::Like(Like {
284+
negated,
285+
expr,
286+
pattern,
287+
escape_char,
288+
case_insensitive,
289+
}) => {
290+
if *case_insensitive {
291+
Ok(ast::Expr::ILike {
292+
negated: *negated,
293+
expr: Box::new(self.expr_to_sql_inner(expr)?),
294+
pattern: Box::new(self.expr_to_sql_inner(pattern)?),
295+
escape_char: escape_char.map(|c| c.to_string()),
296+
any: false,
297+
})
298+
} else {
299+
Ok(ast::Expr::Like {
300+
negated: *negated,
301+
expr: Box::new(self.expr_to_sql_inner(expr)?),
302+
pattern: Box::new(self.expr_to_sql_inner(pattern)?),
303+
escape_char: escape_char.map(|c| c.to_string()),
304+
any: false,
305+
})
306+
}
307+
}
308+
290309
Expr::AggregateFunction(agg) => {
291310
let func_name = agg.func.name();
292311
let AggregateFunctionParams {
@@ -1866,10 +1885,20 @@ mod tests {
18661885
expr: Box::new(col("a")),
18671886
pattern: Box::new(lit("foo")),
18681887
escape_char: Some('o'),
1869-
case_insensitive: true,
1888+
case_insensitive: false,
18701889
}),
18711890
r#"a NOT LIKE 'foo' ESCAPE 'o'"#,
18721891
),
1892+
(
1893+
Expr::Like(Like {
1894+
negated: true,
1895+
expr: Box::new(col("a")),
1896+
pattern: Box::new(lit("foo")),
1897+
escape_char: Some('o'),
1898+
case_insensitive: true,
1899+
}),
1900+
r#"a NOT ILIKE 'foo' ESCAPE 'o'"#,
1901+
),
18731902
(
18741903
Expr::SimilarTo(Like {
18751904
negated: false,

datafusion/sql/tests/cases/plan_to_sql.rs

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2425,3 +2425,48 @@ fn test_unparse_left_semi_join_with_table_scan_projection() -> Result<()> {
24252425
);
24262426
Ok(())
24272427
}
2428+
2429+
#[test]
2430+
fn test_like_filters() {
2431+
sql_round_trip(
2432+
GenericDialect {},
2433+
r#"SELECT * FROM person WHERE first_name LIKE '%John%'"#,
2434+
r#"SELECT * FROM person WHERE person.first_name LIKE '%John%'"#,
2435+
);
2436+
2437+
sql_round_trip(
2438+
GenericDialect {},
2439+
r#"SELECT * FROM person WHERE first_name ILIKE '%john%'"#,
2440+
r#"SELECT * FROM person WHERE person.first_name ILIKE '%john%'"#,
2441+
);
2442+
2443+
sql_round_trip(
2444+
GenericDialect {},
2445+
r#"SELECT * FROM person WHERE first_name NOT LIKE 'A%'"#,
2446+
r#"SELECT * FROM person WHERE person.first_name NOT LIKE 'A%'"#,
2447+
);
2448+
2449+
sql_round_trip(
2450+
GenericDialect {},
2451+
r#"SELECT * FROM person WHERE first_name NOT ILIKE 'a%'"#,
2452+
r#"SELECT * FROM person WHERE person.first_name NOT ILIKE 'a%'"#,
2453+
);
2454+
2455+
sql_round_trip(
2456+
GenericDialect {},
2457+
r#"SELECT * FROM person WHERE first_name LIKE 'A!_%' ESCAPE '!'"#,
2458+
r#"SELECT * FROM person WHERE person.first_name LIKE 'A!_%' ESCAPE '!'"#,
2459+
);
2460+
2461+
sql_round_trip(
2462+
GenericDialect {},
2463+
r#"SELECT * FROM person WHERE first_name NOT LIKE 'A!_%' ESCAPE '!'"#,
2464+
r#"SELECT * FROM person WHERE person.first_name NOT LIKE 'A!_%' ESCAPE '!'"#,
2465+
);
2466+
2467+
sql_round_trip(
2468+
GenericDialect {},
2469+
r#"SELECT * FROM person WHERE first_name NOT ILIKE 'A!_%' ESCAPE '!'"#,
2470+
r#"SELECT * FROM person WHERE person.first_name NOT ILIKE 'A!_%' ESCAPE '!'"#,
2471+
);
2472+
}

0 commit comments

Comments
 (0)