diff --git a/crates/squawk_parser/src/grammar.rs b/crates/squawk_parser/src/grammar.rs index 12f535f4..73416f11 100644 --- a/crates/squawk_parser/src/grammar.rs +++ b/crates/squawk_parser/src/grammar.rs @@ -4482,6 +4482,10 @@ fn opt_where_clause(p: &mut Parser<'_>) -> Option { } let m = p.start(); p.bump(WHERE_KW); + // TODO: we might want to be fancier, maybe all binary only operators? + if p.at(AND_KW) || p.at(OR_KW) { + p.err_and_bump(&format!("expected expression but got {:?}", p.current())); + } expr(p); Some(m.complete(p, WHERE_CLAUSE)) } diff --git a/crates/squawk_parser/tests/data/err/select.sql b/crates/squawk_parser/tests/data/err/select.sql index f2f0e5e4..a39154b6 100644 --- a/crates/squawk_parser/tests/data/err/select.sql +++ b/crates/squawk_parser/tests/data/err/select.sql @@ -77,6 +77,10 @@ do 'begin null; end'; select grant select on t to u; +-- where with missing expr +select from t where and c > 10; +select from t where or c != 'b'; + -- select end select end; diff --git a/crates/squawk_parser/tests/snapshots/tests__select_err.snap b/crates/squawk_parser/tests/snapshots/tests__select_err.snap index fb1f3aec..95b84baa 100644 --- a/crates/squawk_parser/tests/snapshots/tests__select_err.snap +++ b/crates/squawk_parser/tests/snapshots/tests__select_err.snap @@ -747,6 +747,62 @@ SOURCE_FILE IDENT "u" SEMICOLON ";" WHITESPACE "\n\n" + COMMENT "-- where with missing expr" + WHITESPACE "\n" + SELECT + SELECT_CLAUSE + SELECT_KW "select" + WHITESPACE " " + FROM_CLAUSE + FROM_KW "from" + WHITESPACE " " + FROM_ITEM + NAME_REF + IDENT "t" + WHITESPACE " " + WHERE_CLAUSE + WHERE_KW "where" + WHITESPACE " " + ERROR + AND_KW "and" + WHITESPACE " " + BIN_EXPR + NAME_REF + IDENT "c" + WHITESPACE " " + R_ANGLE ">" + WHITESPACE " " + LITERAL + INT_NUMBER "10" + SEMICOLON ";" + WHITESPACE "\n" + SELECT + SELECT_CLAUSE + SELECT_KW "select" + WHITESPACE " " + FROM_CLAUSE + FROM_KW "from" + WHITESPACE " " + FROM_ITEM + NAME_REF + IDENT "t" + WHITESPACE " " + WHERE_CLAUSE + WHERE_KW "where" + WHITESPACE " " + ERROR + OR_KW "or" + WHITESPACE " " + BIN_EXPR + NAME_REF + IDENT "c" + WHITESPACE " " + NEQ "!=" + WHITESPACE " " + LITERAL + STRING "'b'" + SEMICOLON ";" + WHITESPACE "\n\n" COMMENT "-- select end" WHITESPACE "\n" SELECT @@ -957,31 +1013,39 @@ error[syntax-error]: expected SEMICOLON ╭▸ 77 │ select ╰╴ ━ +error[syntax-error]: expected expression but got AND_KW + ╭▸ +81 │ select from t where and c > 10; + ╰╴ ━ +error[syntax-error]: expected expression but got OR_KW + ╭▸ +82 │ select from t where or c != 'b'; + ╰╴ ━ error[syntax-error]: expected SEMICOLON ╭▸ -81 │ select +85 │ select │ ┏━━━━━━━┛ -82 │ ┃ end; +86 │ ┃ end; ╰╴┗━┛ error[syntax-error]: expected SEMICOLON ╭▸ -85 │ select +89 │ select │ ┏━━━━━━━┛ -86 │ ┃ analyze; +90 │ ┃ analyze; ╰╴┗━┛ error[syntax-error]: expected SEMICOLON ╭▸ -88 │ select +92 │ select │ ┏━━━━━━━┛ -89 │ ┃ analyse; +93 │ ┃ analyse; ╰╴┗━┛ error[syntax-error]: expected SEMICOLON ╭▸ -93 │ select +97 │ select │ ┏━━━━━━━┛ -94 │ ┃ with t as (select 1) +98 │ ┃ with t as (select 1) ╰╴┗━┛ error[syntax-error]: unexpected trailing comma - ╭▸ -98 │ select 1, - ╰╴ ━ + ╭▸ +102 │ select 1, + ╰╴ ━