@@ -2383,15 +2383,29 @@ fn parse_in_unnest() {
23832383
23842384#[test]
23852385fn parse_in_error() {
2386- // <expr> IN <expr> is no valid
2386+ // <expr> IN <expr> is no valid, except in dialects that accept an
2387+ // unparenthesized expression as the IN right-hand side (e.g. ClickHouse).
23872388 let sql = "SELECT * FROM customers WHERE segment in segment";
2388- let res = parse_sql_statements(sql);
2389+ let res =
2390+ all_dialects_except(|d| d.supports_in_unparenthesized_expr()).parse_sql_statements(sql);
23892391 assert_eq!(
23902392 ParserError::ParserError("Expected: (, found: segment".to_string()),
23912393 res.unwrap_err()
23922394 );
23932395}
23942396
2397+ #[test]
2398+ fn parse_in_unparenthesized_expr() {
2399+ // Dialects supporting an unparenthesized IN right-hand side wrap a bare expression
2400+ // into a single-element list (e.g. `x IN 'a'` -> `x IN ('a')`).
2401+ let dialects = all_dialects_where(|d| d.supports_in_unparenthesized_expr());
2402+ dialects.expr_parses_to("x IN 'a'", "x IN ('a')");
2403+
2404+ // The branch must not fire when the next token is `(` (regressions).
2405+ dialects.verified_expr("x IN (1, 2, 3)");
2406+ dialects.verified_stmt("SELECT * FROM t WHERE x IN (SELECT y FROM u)");
2407+ }
2408+
23952409#[test]
23962410fn parse_string_agg() {
23972411 let sql = "SELECT a || b";
@@ -10842,12 +10856,23 @@ fn parse_position() {
1084210856
1084310857#[test]
1084410858fn parse_position_negative() {
10859+ // Dialects that accept an unparenthesized IN right-hand side (e.g. ClickHouse)
10860+ // report a different error here, so exclude them.
1084510861 let sql = "SELECT POSITION(foo IN) from bar";
10846- let res = parse_sql_statements(sql);
10862+ let res =
10863+ all_dialects_except(|d| d.supports_in_unparenthesized_expr()).parse_sql_statements(sql);
1084710864 assert_eq!(
1084810865 ParserError::ParserError("Expected: (, found: )".to_string()),
1084910866 res.unwrap_err()
1085010867 );
10868+
10869+ let result_unparenthesized =
10870+ all_dialects_where(|d| d.supports_in_unparenthesized_expr()).parse_sql_statements(sql);
10871+
10872+ assert_eq!(
10873+ ParserError::ParserError("Expected: an expression, found: )".to_string()),
10874+ result_unparenthesized.unwrap_err()
10875+ );
1085110876}
1085210877
1085310878#[test]
0 commit comments