Skip to content

Commit 5ffe722

Browse files
orisanokyleconroy
andauthored
fix(engine/sqlite): fixed IN operator precedence (#2428)
* fix(engine/sqlite): fixed IN operator precedence close #2368 * test: add endtoend * chore: v1.19.1 * Regenerate parser --------- Co-authored-by: Kyle Conroy <kyle@sqlc.dev>
1 parent 6d3cdc2 commit 5ffe722

File tree

8 files changed

+351
-205
lines changed

8 files changed

+351
-205
lines changed

internal/endtoend/testdata/select_in_and/sqlite/go/db.go

Lines changed: 31 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

internal/endtoend/testdata/select_in_and/sqlite/go/models.go

Lines changed: 28 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

internal/endtoend/testdata/select_in_and/sqlite/go/query.sql.go

Lines changed: 45 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
-- Example queries for sqlc
2+
CREATE TABLE authors (
3+
id integer PRIMARY KEY,
4+
name text NOT NULL,
5+
age integer
6+
);
7+
8+
CREATE TABLE translators (
9+
id integer PRIMARY KEY,
10+
name text NOT NULL,
11+
age integer
12+
);
13+
14+
CREATE TABLE books (
15+
id integer PRIMARY KEY,
16+
author text NOT NULL,
17+
translator text NOT NULL,
18+
year integer
19+
);
20+
21+
-- name: DeleteAuthor :exec
22+
DELETE FROM
23+
books AS b
24+
WHERE
25+
b.author NOT IN (
26+
SELECT
27+
a.name
28+
FROM
29+
authors a
30+
WHERE
31+
a.age >= ?
32+
)
33+
AND b.translator NOT IN (
34+
SELECT
35+
t.name
36+
FROM
37+
translators t
38+
WHERE
39+
t.age >= ?
40+
)
41+
AND b.year <= ?;
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{"version": "1", "packages": [{"path": "go", "engine": "sqlite", "schema": "query.sql", "queries": "query.sql", "name": "querytest"}]}

internal/engine/sqlite/parser/SQLiteParser.g4

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -299,6 +299,11 @@ expr:
299299
| MATCH_
300300
| REGEXP_
301301
) expr #expr_comparison
302+
| expr NOT_? IN_ (
303+
OPEN_PAR (select_stmt | expr ( COMMA expr)*)? CLOSE_PAR
304+
| ( schema_name DOT)? table_name
305+
| (schema_name DOT)? table_function_name OPEN_PAR (expr (COMMA expr)*)? CLOSE_PAR
306+
) #expr_in_select
302307
| expr AND_ expr #expr_binary
303308
| expr OR_ expr #expr_binary
304309
| qualified_function_name OPEN_PAR ((DISTINCT_? expr ( COMMA expr)*) | STAR)? CLOSE_PAR filter_clause? over_clause? #expr_function
@@ -310,11 +315,6 @@ expr:
310315
)? #expr_comparison
311316
| expr ( ISNULL_ | NOTNULL_ | NOT_ NULL_) #expr_null_comp
312317
| expr NOT_? BETWEEN_ expr AND_ expr #expr_between
313-
| expr NOT_? IN_ (
314-
OPEN_PAR (select_stmt | expr ( COMMA expr)*)? CLOSE_PAR
315-
| ( schema_name DOT)? table_name
316-
| (schema_name DOT)? table_function_name OPEN_PAR (expr (COMMA expr)*)? CLOSE_PAR
317-
) #expr_in_select
318318
| ((NOT_)? EXISTS_)? OPEN_PAR select_stmt CLOSE_PAR #expr_in_select
319319
| CASE_ expr? (WHEN_ expr THEN_ expr)+ (ELSE_ expr)? END_ #expr_case
320320
| raise_function #expr_raise

internal/engine/sqlite/parser/SQLiteParser.interp

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

0 commit comments

Comments
 (0)