Skip to content

Commit 8e1a7d0

Browse files
authored
parser: fix parsing window definition with multiple expressions (#510)
rel: #509
1 parent 369510a commit 8e1a7d0

File tree

3 files changed

+172
-1
lines changed

3 files changed

+172
-1
lines changed

crates/squawk_parser/src/grammar.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3954,6 +3954,11 @@ fn window_definition(p: &mut Parser<'_>) -> bool {
39543954
if expr(p).is_none() {
39553955
p.error("expected an expression");
39563956
}
3957+
while p.eat(COMMA) && !p.at(EOF) {
3958+
if expr(p).is_none() {
3959+
p.error("expected an expression");
3960+
}
3961+
}
39573962
}
39583963
opt_order_by_clause(p);
39593964
if p.at(RANGE_KW) || p.at(ROWS_KW) || p.at(GROUPS_KW) {

crates/squawk_parser/tests/data/ok/select_cte.sql

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,3 +117,19 @@ select timestamp from t;
117117
with t(time) as (select 1)
118118
select time from t;
119119

120+
121+
-- regression gh issue #509
122+
WITH ranked_notifications AS (
123+
SELECT
124+
notification_id,
125+
ROW_NUMBER() OVER (
126+
PARTITION BY user_id, board_id ORDER BY created_at DESC
127+
)
128+
FROM public.notification
129+
WHERE android_channel_id = 'watchlist'
130+
)
131+
UPDATE public.notification
132+
SET dismissed_at = current_timestamp
133+
WHERE notification_id IN (
134+
SELECT notification_id FROM ranked_notifications WHERE rn > 1
135+
);

crates/squawk_parser/tests/snapshots/tests__select_cte_ok.snap

Lines changed: 151 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1276,4 +1276,154 @@ SOURCE_FILE
12761276
NAME_REF
12771277
IDENT "t"
12781278
SEMICOLON ";"
1279-
WHITESPACE "\n\n"
1279+
WHITESPACE "\n\n\n"
1280+
COMMENT "-- regression gh issue #509"
1281+
WHITESPACE "\n"
1282+
UPDATE
1283+
WITH_CLAUSE
1284+
WITH_KW "WITH"
1285+
WHITESPACE " "
1286+
WITH_TABLE
1287+
NAME
1288+
IDENT "ranked_notifications"
1289+
WHITESPACE " "
1290+
AS_KW "AS"
1291+
WHITESPACE " "
1292+
L_PAREN "("
1293+
WHITESPACE "\n "
1294+
SELECT
1295+
SELECT_CLAUSE
1296+
SELECT_KW "SELECT"
1297+
WHITESPACE " \n "
1298+
TARGET_LIST
1299+
TARGET
1300+
NAME_REF
1301+
IDENT "notification_id"
1302+
COMMA ","
1303+
WHITESPACE "\n "
1304+
TARGET
1305+
CALL_EXPR
1306+
NAME_REF
1307+
IDENT "ROW_NUMBER"
1308+
ARG_LIST
1309+
L_PAREN "("
1310+
R_PAREN ")"
1311+
WHITESPACE " "
1312+
OVER_CLAUSE
1313+
OVER_KW "OVER"
1314+
WHITESPACE " "
1315+
L_PAREN "("
1316+
WHITESPACE "\n "
1317+
WINDOW_DEF
1318+
PARTITION_KW "PARTITION"
1319+
WHITESPACE " "
1320+
BY_KW "BY"
1321+
WHITESPACE " "
1322+
NAME_REF
1323+
IDENT "user_id"
1324+
COMMA ","
1325+
WHITESPACE " "
1326+
NAME_REF
1327+
IDENT "board_id"
1328+
WHITESPACE " "
1329+
ORDER_BY_CLAUSE
1330+
ORDER_KW "ORDER"
1331+
WHITESPACE " "
1332+
BY_KW "BY"
1333+
WHITESPACE " "
1334+
NAME_REF
1335+
IDENT "created_at"
1336+
WHITESPACE " "
1337+
DESC_KW "DESC"
1338+
WHITESPACE "\n "
1339+
R_PAREN ")"
1340+
WHITESPACE "\n "
1341+
FROM_CLAUSE
1342+
FROM_KW "FROM"
1343+
WHITESPACE " "
1344+
FIELD_EXPR
1345+
NAME_REF
1346+
IDENT "public"
1347+
DOT "."
1348+
NAME_REF
1349+
IDENT "notification"
1350+
WHITESPACE "\n "
1351+
WHERE_CLAUSE
1352+
WHERE_KW "WHERE"
1353+
WHITESPACE " "
1354+
BIN_EXPR
1355+
NAME_REF
1356+
IDENT "android_channel_id"
1357+
WHITESPACE " "
1358+
EQ "="
1359+
WHITESPACE " "
1360+
LITERAL
1361+
STRING "'watchlist'"
1362+
WHITESPACE "\n"
1363+
R_PAREN ")"
1364+
WHITESPACE "\n"
1365+
UPDATE_KW "UPDATE"
1366+
WHITESPACE " "
1367+
RELATION_NAME
1368+
PATH
1369+
PATH
1370+
PATH_SEGMENT
1371+
NAME_REF
1372+
IDENT "public"
1373+
DOT "."
1374+
PATH_SEGMENT
1375+
NAME_REF
1376+
IDENT "notification"
1377+
WHITESPACE "\n"
1378+
SET_KW "SET"
1379+
WHITESPACE " "
1380+
NAME_REF
1381+
IDENT "dismissed_at"
1382+
WHITESPACE " "
1383+
EQ "="
1384+
WHITESPACE " "
1385+
NAME_REF
1386+
CURRENT_TIMESTAMP_KW "current_timestamp"
1387+
WHITESPACE "\n"
1388+
WHERE_CLAUSE
1389+
WHERE_KW "WHERE"
1390+
WHITESPACE " "
1391+
BIN_EXPR
1392+
NAME_REF
1393+
IDENT "notification_id"
1394+
WHITESPACE " "
1395+
IN_KW "IN"
1396+
WHITESPACE " "
1397+
PAREN_EXPR
1398+
L_PAREN "("
1399+
WHITESPACE "\n "
1400+
SELECT
1401+
SELECT_CLAUSE
1402+
SELECT_KW "SELECT"
1403+
WHITESPACE " "
1404+
TARGET_LIST
1405+
TARGET
1406+
NAME_REF
1407+
IDENT "notification_id"
1408+
WHITESPACE " "
1409+
FROM_CLAUSE
1410+
FROM_KW "FROM"
1411+
WHITESPACE " "
1412+
NAME_REF
1413+
IDENT "ranked_notifications"
1414+
WHITESPACE " "
1415+
WHERE_CLAUSE
1416+
WHERE_KW "WHERE"
1417+
WHITESPACE " "
1418+
BIN_EXPR
1419+
NAME_REF
1420+
IDENT "rn"
1421+
WHITESPACE " "
1422+
R_ANGLE ">"
1423+
WHITESPACE " "
1424+
LITERAL
1425+
INT_NUMBER "1"
1426+
WHITESPACE "\n"
1427+
R_PAREN ")"
1428+
SEMICOLON ";"
1429+
WHITESPACE "\n"

0 commit comments

Comments
 (0)