Skip to content

Commit 3d72eaf

Browse files
authored
parser: fix more pg test suite errors part 7 (#527)
support `select x is not normalized` & more
1 parent 2322ea6 commit 3d72eaf

File tree

9 files changed

+264
-102
lines changed

9 files changed

+264
-102
lines changed

crates/squawk_parser/src/generated/syntax_kind.rs

Lines changed: 3 additions & 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: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1318,6 +1318,18 @@ fn postfix_expr(
13181318
lhs = m.complete(p, POSTFIX_EXPR);
13191319
break;
13201320
}
1321+
IS_KW if p.at(IS_NOT_NORMALIZED)=> {
1322+
let m = lhs.precede(p);
1323+
p.bump(IS_NOT_NORMALIZED);
1324+
lhs = m.complete(p, POSTFIX_EXPR);
1325+
break;
1326+
}
1327+
IS_KW if p.at(IS_NORMALIZED)=> {
1328+
let m = lhs.precede(p);
1329+
p.bump(IS_NORMALIZED);
1330+
lhs = m.complete(p, POSTFIX_EXPR);
1331+
break;
1332+
}
13211333
NOTNULL_KW => {
13221334
let m = lhs.precede(p);
13231335
p.bump(NOTNULL_KW);
@@ -2092,6 +2104,10 @@ fn current_op(p: &Parser<'_>, r: &Restrictions) -> (u8, SyntaxKind, Associativit
20922104
NOT_KW if !r.not_disabled && p.at(NOT_ILIKE) => (6, NOT_ILIKE, Left),
20932105
// not in
20942106
NOT_KW if !r.not_disabled && p.at(NOT_IN) => (6, NOT_IN, Left),
2107+
// is normalized
2108+
IS_KW if !r.is_disabled && p.at(IS_NORMALIZED) => NOT_AN_OP,
2109+
// is not normalized
2110+
IS_KW if !r.is_disabled && p.at(IS_NOT_NORMALIZED) => NOT_AN_OP,
20952111
// is distinct from
20962112
IS_KW if !r.is_disabled && p.at(IS_DISTINCT_FROM) => (4, IS_DISTINCT_FROM, Left),
20972113
// is not distinct from
@@ -2765,6 +2781,12 @@ fn data_source(p: &mut Parser<'_>) {
27652781
opt_alias(p);
27662782
}
27672783
IDENT => from_item_name(p),
2784+
CAST_KW | TREAT_KW => {
2785+
if expr(p).is_none() {
2786+
p.error("expected expression");
2787+
}
2788+
opt_alias(p);
2789+
}
27682790
_ if p.at_ts(FROM_ITEM_KEYWORDS_FIRST) => from_item_name(p),
27692791
_ => {}
27702792
}

crates/squawk_parser/src/lib.rs

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,39 @@ impl<'t> Parser<'t> {
211211
m.complete(self, SyntaxKind::AT_TIME_ZONE);
212212
return true;
213213
}
214+
SyntaxKind::IS_NOT_NORMALIZED => {
215+
let m = self.start();
216+
self.bump(SyntaxKind::IS_KW);
217+
self.bump(SyntaxKind::NOT_KW);
218+
if matches!(
219+
self.current(),
220+
SyntaxKind::NFC_KW
221+
| SyntaxKind::NFD_KW
222+
| SyntaxKind::NFKC_KW
223+
| SyntaxKind::NFKD_KW
224+
) {
225+
self.bump_any();
226+
}
227+
self.bump(SyntaxKind::NORMALIZED_KW);
228+
m.complete(self, SyntaxKind::IS_NOT_NORMALIZED);
229+
return true;
230+
}
231+
SyntaxKind::IS_NORMALIZED => {
232+
let m = self.start();
233+
self.bump(SyntaxKind::IS_KW);
234+
if matches!(
235+
self.current(),
236+
SyntaxKind::NFC_KW
237+
| SyntaxKind::NFD_KW
238+
| SyntaxKind::NFKC_KW
239+
| SyntaxKind::NFKD_KW
240+
) {
241+
self.bump_any();
242+
}
243+
self.bump(SyntaxKind::NORMALIZED_KW);
244+
m.complete(self, SyntaxKind::IS_NORMALIZED);
245+
return true;
246+
}
214247
SyntaxKind::IS_NOT_DISTINCT_FROM => {
215248
let m = self.start();
216249
self.bump(SyntaxKind::IS_KW);
@@ -564,6 +597,52 @@ impl<'t> Parser<'t> {
564597
SyntaxKind::DISTINCT_KW,
565598
SyntaxKind::FROM_KW,
566599
),
600+
// is normalized
601+
SyntaxKind::IS_NORMALIZED => {
602+
if self.at(SyntaxKind::IS_KW) {
603+
if matches!(
604+
self.nth(1),
605+
SyntaxKind::NFC_KW
606+
| SyntaxKind::NFD_KW
607+
| SyntaxKind::NFKC_KW
608+
| SyntaxKind::NFKD_KW
609+
) {
610+
if self.nth_at(2, SyntaxKind::NORMALIZED_KW) {
611+
return true;
612+
}
613+
} else {
614+
if self.nth_at(1, SyntaxKind::NORMALIZED_KW) {
615+
return true;
616+
}
617+
}
618+
}
619+
return false;
620+
}
621+
// is not normalized
622+
SyntaxKind::IS_NOT_NORMALIZED => {
623+
if self.at(SyntaxKind::IS_KW) && self.nth_at(1, SyntaxKind::NOT_KW) {
624+
if matches!(
625+
self.nth(2),
626+
SyntaxKind::NFC_KW
627+
| SyntaxKind::NFD_KW
628+
| SyntaxKind::NFKC_KW
629+
| SyntaxKind::NFKD_KW
630+
) {
631+
if self.nth_at(3, SyntaxKind::NOT_KW)
632+
&& self.nth_at(4, SyntaxKind::NORMALIZED_KW)
633+
{
634+
return true;
635+
}
636+
} else {
637+
if self.nth_at(2, SyntaxKind::NOT_KW)
638+
&& self.nth_at(3, SyntaxKind::NORMALIZED_KW)
639+
{
640+
return true;
641+
}
642+
}
643+
}
644+
return false;
645+
}
567646
// similar to
568647
SyntaxKind::SIMILAR_TO => self.at_composite2(
569648
n,

crates/squawk_parser/tests/snapshots/tests__regression_create_view.snap

Lines changed: 0 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -2,30 +2,6 @@
22
source: crates/squawk_parser/tests/tests.rs
33
input_file: crates/squawk_parser/tests/data/regression_suite/create_view.sql
44
---
5-
ERROR@21471: expected name
6-
ERROR@21471: expected SEMICOLON
7-
ERROR@21471: expected command, found CAST_KW
8-
ERROR@21475: expected command, found L_PAREN
9-
ERROR@21476: expected command, found INT_NUMBER
10-
ERROR@21477: expected command, found PLUS
11-
ERROR@21478: expected command, found INT_NUMBER
12-
ERROR@21480: expected command, found AS_KW
13-
ERROR@21483: expected command, found IDENT
14-
ERROR@21487: expected command, found R_PAREN
15-
ERROR@21489: expected command, found AS_KW
16-
ERROR@21492: expected command, found IDENT
17-
ERROR@21494: expected command, found COMMA
18-
ERROR@21498: expected command, found CAST_KW
19-
ERROR@21502: expected command, found L_PAREN
20-
ERROR@21503: expected command, found INT_NUMBER
21-
ERROR@21504: expected command, found PLUS
22-
ERROR@21505: expected command, found INT_NUMBER
23-
ERROR@21507: expected command, found AS_KW
24-
ERROR@21510: expected command, found IDENT
25-
ERROR@21514: expected command, found R_PAREN
26-
ERROR@21516: expected command, found AS_KW
27-
ERROR@21519: expected command, found IDENT
28-
ERROR@21912: missing comma
295
ERROR@22280: expected R_PAREN
306
ERROR@22285: expected from item, got STRING
317
ERROR@22285: expected SEMICOLON

crates/squawk_parser/tests/snapshots/tests__regression_suite_errors.snap

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
source: crates/squawk_parser/tests/tests.rs
33
expression: "out.join(\"\\n\")"
44
---
5-
tests/snapshots/tests__regression_create_view.snap:235
5+
tests/snapshots/tests__regression_create_view.snap:211
66
tests/snapshots/tests__regression_errors.snap:286
77
tests/snapshots/tests__regression_foreign_data.snap:51
88
tests/snapshots/tests__regression_foreign_key.snap:24
@@ -29,7 +29,6 @@ tests/snapshots/tests__regression_transactions.snap:114
2929
tests/snapshots/tests__regression_triggers.snap:51
3030
tests/snapshots/tests__regression_tsearch.snap:62
3131
tests/snapshots/tests__regression_tuplesort.snap:188
32-
tests/snapshots/tests__regression_unicode.snap:40
3332
tests/snapshots/tests__regression_union.snap:25
3433
tests/snapshots/tests__regression_update.snap:29
3534
tests/snapshots/tests__regression_vacuum.snap:21

crates/squawk_parser/tests/snapshots/tests__regression_unicode.snap

Lines changed: 0 additions & 44 deletions
This file was deleted.

crates/squawk_parser/tests/snapshots/tests__select_operators_ok.snap

Lines changed: 28 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1533,13 +1533,13 @@ SOURCE_FILE
15331533
WHITESPACE " "
15341534
TARGET_LIST
15351535
TARGET
1536-
BIN_EXPR
1536+
POSTFIX_EXPR
15371537
LITERAL
15381538
BYTE_STRING "U&'\\0061\\0308bc'"
15391539
WHITESPACE " "
1540-
IS_KW "is"
1541-
WHITESPACE " "
1542-
NAME_REF
1540+
IS_NORMALIZED
1541+
IS_KW "is"
1542+
WHITESPACE " "
15431543
NORMALIZED_KW "normalized"
15441544
SEMICOLON ";"
15451545
WHITESPACE "\n"
@@ -1549,17 +1549,16 @@ SOURCE_FILE
15491549
WHITESPACE " "
15501550
TARGET_LIST
15511551
TARGET
1552-
BIN_EXPR
1552+
POSTFIX_EXPR
15531553
LITERAL
15541554
BYTE_STRING "U&'\\0061\\0308bc'"
15551555
WHITESPACE " "
1556-
IS_KW "is"
1557-
WHITESPACE " "
1558-
NAME_REF
1556+
IS_NORMALIZED
1557+
IS_KW "is"
1558+
WHITESPACE " "
15591559
NFC_KW "nfc"
1560-
WHITESPACE " "
1561-
NAME
1562-
NORMALIZED_KW "normalized"
1560+
WHITESPACE " "
1561+
NORMALIZED_KW "normalized"
15631562
SEMICOLON ";"
15641563
WHITESPACE "\n"
15651564
SELECT
@@ -1568,17 +1567,16 @@ SOURCE_FILE
15681567
WHITESPACE " "
15691568
TARGET_LIST
15701569
TARGET
1571-
BIN_EXPR
1570+
POSTFIX_EXPR
15721571
LITERAL
15731572
BYTE_STRING "U&'\\0061\\0308bc'"
15741573
WHITESPACE " "
1575-
IS_KW "is"
1576-
WHITESPACE " "
1577-
NAME_REF
1574+
IS_NORMALIZED
1575+
IS_KW "is"
1576+
WHITESPACE " "
15781577
NFD_KW "nfd"
1579-
WHITESPACE " "
1580-
NAME
1581-
NORMALIZED_KW "normalized"
1578+
WHITESPACE " "
1579+
NORMALIZED_KW "normalized"
15821580
SEMICOLON ";"
15831581
WHITESPACE "\n"
15841582
SELECT
@@ -1587,17 +1585,16 @@ SOURCE_FILE
15871585
WHITESPACE " "
15881586
TARGET_LIST
15891587
TARGET
1590-
BIN_EXPR
1588+
POSTFIX_EXPR
15911589
LITERAL
15921590
BYTE_STRING "U&'\\0061\\0308bc'"
15931591
WHITESPACE " "
1594-
IS_KW "is"
1595-
WHITESPACE " "
1596-
NAME_REF
1592+
IS_NORMALIZED
1593+
IS_KW "is"
1594+
WHITESPACE " "
15971595
NFKC_KW "nfkc"
1598-
WHITESPACE " "
1599-
NAME
1600-
NORMALIZED_KW "normalized"
1596+
WHITESPACE " "
1597+
NORMALIZED_KW "normalized"
16011598
SEMICOLON ";"
16021599
WHITESPACE "\n"
16031600
SELECT
@@ -1606,17 +1603,16 @@ SOURCE_FILE
16061603
WHITESPACE " "
16071604
TARGET_LIST
16081605
TARGET
1609-
BIN_EXPR
1606+
POSTFIX_EXPR
16101607
LITERAL
16111608
BYTE_STRING "U&'\\0061\\0308bc'"
16121609
WHITESPACE " "
1613-
IS_KW "is"
1614-
WHITESPACE " "
1615-
NAME_REF
1610+
IS_NORMALIZED
1611+
IS_KW "is"
1612+
WHITESPACE " "
16161613
NFKD_KW "nfkd"
1617-
WHITESPACE " "
1618-
NAME
1619-
NORMALIZED_KW "normalized"
1614+
WHITESPACE " "
1615+
NORMALIZED_KW "normalized"
16201616
SEMICOLON ";"
16211617
WHITESPACE "\n"
16221618
SELECT

0 commit comments

Comments
 (0)