Skip to content

Commit 2322ea6

Browse files
authored
parser: fix more pg test suite errors part 6 (#526)
1 parent 254be96 commit 2322ea6

38 files changed

+3851
-3386
lines changed

crates/squawk_parser/src/generated/syntax_kind.rs

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

crates/squawk_parser/src/grammar.rs

Lines changed: 64 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,14 @@ fn literal(p: &mut Parser<'_>) -> Option<CompletedMarker> {
2727
return None;
2828
}
2929
let m = p.start();
30-
p.bump_any();
30+
// E021-03 string continuation syntax
31+
// If two string literals are next to each other, and don't have a comment
32+
// between them, then they are automatically combined.
33+
if p.eat(STRING) {
34+
while !p.at(EOF) && p.eat(STRING) {}
35+
} else {
36+
p.bump_any();
37+
}
3138
Some(m.complete(p, LITERAL))
3239
}
3340

@@ -1795,27 +1802,33 @@ fn name_ref_(p: &mut Parser<'_>) -> Option<CompletedMarker> {
17951802
return None;
17961803
}
17971804
let m = p.start();
1805+
// TODO: this needs to be cleaned up
17981806
let mut is_interval_cast = false;
1799-
if p.eat(COLLATION_KW) {
1807+
let kind = if p.eat(COLLATION_KW) {
18001808
p.expect(FOR_KW);
1809+
NAME_REF
18011810
// timestamp with time zone / time with time zone
18021811
} else if p.eat(TIMESTAMP_KW) || p.eat(TIME_KW) {
1803-
if p.eat(WITH_KW) {
1804-
p.expect(TIME_KW);
1805-
p.expect(ZONE_KW);
1806-
}
1807-
} else if p.eat(INTERVAL_KW) {
18081812
if p.eat(L_PAREN) {
18091813
if opt_numeric_literal(p).is_none() {
1810-
p.error("expected number");
1814+
p.error("expected numeric literal");
18111815
}
18121816
p.expect(R_PAREN);
18131817
}
1818+
if p.eat(WITH_KW) {
1819+
p.expect(TIME_KW);
1820+
p.expect(ZONE_KW);
1821+
}
1822+
TIME_TYPE
1823+
} else if p.eat(INTERVAL_KW) {
1824+
opt_interval_trailing(p);
18141825
is_interval_cast = true;
1826+
INTERVAL_TYPE
18151827
} else {
18161828
p.bump_any();
1817-
}
1818-
let cm = m.complete(p, NAME_REF);
1829+
NAME_REF
1830+
};
1831+
let cm = m.complete(p, if p.at(STRING) { kind } else { NAME_REF });
18191832
// A path followed by a string is a type cast so we insert a CAST_EXPR
18201833
// preceding it to wrap the previously parsed data.
18211834
// e.g., `select numeric '12312'`
@@ -2540,14 +2553,12 @@ fn opt_from_clause(p: &mut Parser<'_>) -> bool {
25402553
m.abandon(p);
25412554
return false;
25422555
}
2543-
while !p.at(EOF) {
2556+
if !opt_from_item(p) {
2557+
p.error(format!("expected from item, got {:?}", p.current()));
2558+
}
2559+
while !p.at(EOF) && p.eat(COMMA) {
25442560
if !opt_from_item(p) {
2545-
m.complete(p, FROM_CLAUSE);
2546-
return false;
2547-
}
2548-
// foo, bar, buzz
2549-
// ^
2550-
if !p.eat(COMMA) {
2561+
p.error("expected from item");
25512562
break;
25522563
}
25532564
}
@@ -2626,18 +2637,48 @@ const COL_NAME_KEYWORD_FIRST: TokenSet = TokenSet::new(&[
26262637
// Generated via the above grammar, but we only take the keywords that are
26272638
// single items. So `CURRENT_DATE` but not `COLLATION FOR '(' a_expr ')'`
26282639
const FUNC_EXPR_COMMON_SUBEXPR_FIRST: TokenSet = TokenSet::new(&[
2640+
CAST_KW,
2641+
COALESCE_KW,
2642+
COLLATION_KW,
2643+
CURRENT_CATALOG_KW,
26292644
CURRENT_DATE_KW,
2645+
CURRENT_ROLE_KW,
2646+
CURRENT_SCHEMA_KW,
26302647
CURRENT_TIME_KW,
26312648
CURRENT_TIMESTAMP_KW,
2649+
CURRENT_USER_KW,
2650+
EXTRACT_KW,
2651+
GREATEST_KW,
2652+
JSON_KW,
2653+
JSON_ARRAY_KW,
2654+
JSON_EXISTS_KW,
2655+
JSON_OBJECT_KW,
2656+
JSON_QUERY_KW,
2657+
JSON_SCALAR_KW,
2658+
JSON_SERIALIZE_KW,
2659+
JSON_VALUE_KW,
2660+
LEAST_KW,
26322661
LOCALTIME_KW,
26332662
LOCALTIMESTAMP_KW,
2634-
CURRENT_ROLE_KW,
2635-
CURRENT_USER_KW,
2663+
MERGE_ACTION_KW,
2664+
NORMALIZE_KW,
2665+
NULLIF_KW,
2666+
OVERLAY_KW,
2667+
POSITION_KW,
26362668
SESSION_USER_KW,
2669+
SUBSTRING_KW,
26372670
SYSTEM_USER_KW,
2671+
TREAT_KW,
2672+
TRIM_KW,
26382673
USER_KW,
2639-
CURRENT_CATALOG_KW,
2640-
CURRENT_SCHEMA_KW,
2674+
XMLCONCAT_KW,
2675+
XMLELEMENT_KW,
2676+
XMLEXISTS_KW,
2677+
XMLFOREST_KW,
2678+
XMLPARSE_KW,
2679+
XMLPI_KW,
2680+
XMLROOT_KW,
2681+
XMLSERIALIZE_KW,
26412682
]);
26422683

26432684
const FROM_ITEM_KEYWORDS_FIRST: TokenSet = TokenSet::new(&[])
@@ -2808,10 +2849,12 @@ fn opt_from_item(p: &mut Parser<'_>) -> bool {
28082849
if !p.at_ts(FROM_ITEM_FIRST) {
28092850
return false;
28102851
}
2852+
let m = p.start();
28112853
data_source(p);
28122854
while p.at_ts(JOIN_FIRST) {
28132855
join(p);
28142856
}
2857+
m.complete(p, FROM_ITEM);
28152858
true
28162859
}
28172860

crates/squawk_parser/tests/data/regression_suite/domain.sql

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -288,7 +288,7 @@ select f1, f1[1], (f1[2])[1] from dposintatable;
288288
-- it'd be nice if you could do something like this, but for now you can't:
289289
update dposintatable set f1[2][1] = array[97];
290290
-- maybe someday we can make this syntax work:
291-
update dposintatable set (f1[2])[1] = array[98];
291+
-- update dposintatable set (f1[2])[1] = array[98];
292292

293293
drop table dposintatable;
294294
drop domain posint cascade;

crates/squawk_parser/tests/snapshots/tests__copy_ok.snap

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,8 +75,9 @@ SOURCE_FILE
7575
FROM_CLAUSE
7676
FROM_KW "FROM"
7777
WHITESPACE " "
78-
NAME_REF
79-
IDENT "country"
78+
FROM_ITEM
79+
NAME_REF
80+
IDENT "country"
8081
WHITESPACE " "
8182
WHERE_CLAUSE
8283
WHERE_KW "WHERE"

crates/squawk_parser/tests/snapshots/tests__create_rule_ok.snap

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -234,8 +234,9 @@ SOURCE_FILE
234234
FROM_CLAUSE
235235
FROM_KW "FROM"
236236
WHITESPACE " "
237-
NAME_REF
238-
IDENT "t2"
237+
FROM_ITEM
238+
NAME_REF
239+
IDENT "t2"
239240
SEMICOLON ";"
240241
WHITESPACE "\n\n"
241242
CREATE_RULE
@@ -274,8 +275,9 @@ SOURCE_FILE
274275
FROM_CLAUSE
275276
FROM_KW "FROM"
276277
WHITESPACE " "
277-
NAME_REF
278-
IDENT "t1"
278+
FROM_ITEM
279+
NAME_REF
280+
IDENT "t1"
279281
SEMICOLON ";"
280282
WHITESPACE "\n\n"
281283
SELECT
@@ -289,8 +291,9 @@ SOURCE_FILE
289291
FROM_CLAUSE
290292
FROM_KW "FROM"
291293
WHITESPACE " "
292-
NAME_REF
293-
IDENT "t1"
294+
FROM_ITEM
295+
NAME_REF
296+
IDENT "t1"
294297
SEMICOLON ";"
295298
WHITESPACE "\n\n"
296299
COMMENT "-- doc_2"

crates/squawk_parser/tests/snapshots/tests__create_table_as_ok.snap

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,8 +62,9 @@ SOURCE_FILE
6262
FROM_CLAUSE
6363
FROM_KW "from"
6464
WHITESPACE " "
65-
NAME_REF
66-
IDENT "u"
65+
FROM_ITEM
66+
NAME_REF
67+
IDENT "u"
6768
WHITESPACE " "
6869
WHERE_CLAUSE
6970
WHERE_KW "where"

crates/squawk_parser/tests/snapshots/tests__create_view_extra_parens_ok.snap

Lines changed: 25 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -31,34 +31,37 @@ SOURCE_FILE
3131
FROM_CLAUSE
3232
FROM_KW "from"
3333
WHITESPACE " "
34-
PAREN_EXPR
35-
L_PAREN "("
34+
FROM_ITEM
3635
PAREN_EXPR
3736
L_PAREN "("
38-
WHITESPACE " "
39-
SELECT
40-
SELECT_CLAUSE
41-
SELECT_KW "select"
37+
FROM_ITEM
38+
PAREN_EXPR
39+
L_PAREN "("
4240
WHITESPACE " "
43-
TARGET_LIST
44-
TARGET
45-
NAME_REF
46-
IDENT "y"
47-
WHITESPACE " "
48-
FROM_CLAUSE
49-
FROM_KW "from"
41+
SELECT
42+
SELECT_CLAUSE
43+
SELECT_KW "select"
44+
WHITESPACE " "
45+
TARGET_LIST
46+
TARGET
47+
NAME_REF
48+
IDENT "y"
49+
WHITESPACE " "
50+
FROM_CLAUSE
51+
FROM_KW "from"
52+
WHITESPACE " "
53+
FROM_ITEM
54+
NAME_REF
55+
IDENT "bar"
5056
WHITESPACE " "
51-
NAME_REF
52-
IDENT "bar"
53-
WHITESPACE " "
57+
R_PAREN ")"
5458
R_PAREN ")"
55-
R_PAREN ")"
56-
WHITESPACE " "
57-
ALIAS
58-
AS_KW "as"
5959
WHITESPACE " "
60-
NAME
61-
IDENT "b"
60+
ALIAS
61+
AS_KW "as"
62+
WHITESPACE " "
63+
NAME
64+
IDENT "b"
6265
WHITESPACE "\n "
6366
ORDER_BY_CLAUSE
6467
ORDER_KW "order"

crates/squawk_parser/tests/snapshots/tests__create_view_ok.snap

Lines changed: 29 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -81,8 +81,9 @@ SOURCE_FILE
8181
FROM_CLAUSE
8282
FROM_KW "FROM"
8383
WHITESPACE " "
84-
NAME_REF
85-
IDENT "films"
84+
FROM_ITEM
85+
NAME_REF
86+
IDENT "films"
8687
WHITESPACE "\n "
8788
WHERE_CLAUSE
8889
WHERE_KW "WHERE"
@@ -120,8 +121,9 @@ SOURCE_FILE
120121
FROM_CLAUSE
121122
FROM_KW "FROM"
122123
WHITESPACE " "
123-
NAME_REF
124-
IDENT "comedies"
124+
FROM_ITEM
125+
NAME_REF
126+
IDENT "comedies"
125127
WHITESPACE "\n "
126128
WHERE_CLAUSE
127129
WHERE_KW "WHERE"
@@ -167,8 +169,9 @@ SOURCE_FILE
167169
FROM_CLAUSE
168170
FROM_KW "FROM"
169171
WHITESPACE " "
170-
NAME_REF
171-
IDENT "comedies"
172+
FROM_ITEM
173+
NAME_REF
174+
IDENT "comedies"
172175
WHITESPACE "\n "
173176
WHERE_CLAUSE
174177
WHERE_KW "WHERE"
@@ -261,12 +264,13 @@ SOURCE_FILE
261264
FROM_CLAUSE
262265
FROM_KW "FROM"
263266
WHITESPACE " "
264-
NAME_REF
265-
IDENT "user_ratings"
266-
WHITESPACE " "
267-
ALIAS
268-
NAME
269-
IDENT "r"
267+
FROM_ITEM
268+
NAME_REF
269+
IDENT "user_ratings"
270+
WHITESPACE " "
271+
ALIAS
272+
NAME
273+
IDENT "r"
270274
WHITESPACE "\n "
271275
WHERE_CLAUSE
272276
WHERE_KW "WHERE"
@@ -297,12 +301,13 @@ SOURCE_FILE
297301
FROM_CLAUSE
298302
FROM_KW "FROM"
299303
WHITESPACE " "
300-
NAME_REF
301-
IDENT "films"
302-
WHITESPACE " "
303-
ALIAS
304-
NAME
305-
IDENT "f"
304+
FROM_ITEM
305+
NAME_REF
306+
IDENT "films"
307+
WHITESPACE " "
308+
ALIAS
309+
NAME
310+
IDENT "f"
306311
WHITESPACE "\n "
307312
WHERE_CLAUSE
308313
WHERE_KW "WHERE"
@@ -376,8 +381,9 @@ SOURCE_FILE
376381
FROM_CLAUSE
377382
FROM_KW "FROM"
378383
WHITESPACE " "
379-
NAME_REF
380-
IDENT "nums_1_100"
384+
FROM_ITEM
385+
NAME_REF
386+
IDENT "nums_1_100"
381387
WHITESPACE " "
382388
WHERE_CLAUSE
383389
WHERE_KW "WHERE"
@@ -549,7 +555,8 @@ SOURCE_FILE
549555
FROM_CLAUSE
550556
FROM_KW "from"
551557
WHITESPACE " "
552-
NAME_REF
553-
IDENT "foo"
558+
FROM_ITEM
559+
NAME_REF
560+
IDENT "foo"
554561
SEMICOLON ";"
555562
WHITESPACE "\n"

crates/squawk_parser/tests/snapshots/tests__declare_ok.snap

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,9 @@ SOURCE_FILE
2626
FROM_CLAUSE
2727
FROM_KW "FROM"
2828
WHITESPACE " "
29-
NAME_REF
30-
IDENT "t"
29+
FROM_ITEM
30+
NAME_REF
31+
IDENT "t"
3132
SEMICOLON ";"
3233
WHITESPACE "\n\n"
3334
COMMENT "-- full"

0 commit comments

Comments
 (0)