Skip to content

Commit 9359592

Browse files
authored
parser: fix parsing table constraint fk actions (#480)
able to de-dupe some stuff! related: #479
1 parent 6334198 commit 9359592

File tree

5 files changed

+146
-28
lines changed

5 files changed

+146
-28
lines changed

crates/squawk_parser/src/grammar.rs

Lines changed: 25 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -3323,24 +3323,7 @@ fn opt_constraint_inner(p: &mut Parser<'_>) -> Option<SyntaxKind> {
33233323
p.error("expected FULL, PARTIAL, or SIMPLE");
33243324
}
33253325
}
3326-
// [ ON DELETE referential_action ]
3327-
if p.at(ON_KW) && p.nth_at(1, DELETE_KW) {
3328-
p.expect(ON_KW);
3329-
p.expect(DELETE_KW);
3330-
referential_action(p);
3331-
}
3332-
// [ ON UPDATE referential_action ]
3333-
if p.at(ON_KW) && p.nth_at(1, UPDATE_KW) {
3334-
p.expect(ON_KW);
3335-
p.expect(UPDATE_KW);
3336-
referential_action(p);
3337-
}
3338-
// [ ON DELETE referential_action ]
3339-
if p.at(ON_KW) && p.nth_at(1, DELETE_KW) {
3340-
p.expect(ON_KW);
3341-
p.expect(DELETE_KW);
3342-
referential_action(p);
3343-
}
3326+
foreign_key_actions(p);
33443327
REFERENCES_CONSTRAINT
33453328
}
33463329
_ => {
@@ -3350,6 +3333,29 @@ fn opt_constraint_inner(p: &mut Parser<'_>) -> Option<SyntaxKind> {
33503333
Some(kind)
33513334
}
33523335

3336+
// [ ON DELETE referential_action ]
3337+
// [ ON UPDATE referential_action ]
3338+
fn foreign_key_actions(p: &mut Parser<'_>) {
3339+
// [ ON DELETE referential_action ]
3340+
if p.at(ON_KW) && p.nth_at(1, DELETE_KW) {
3341+
p.expect(ON_KW);
3342+
p.expect(DELETE_KW);
3343+
referential_action(p);
3344+
}
3345+
// [ ON UPDATE referential_action ]
3346+
if p.at(ON_KW) && p.nth_at(1, UPDATE_KW) {
3347+
p.expect(ON_KW);
3348+
p.expect(UPDATE_KW);
3349+
referential_action(p);
3350+
}
3351+
// [ ON DELETE referential_action ]
3352+
if p.at(ON_KW) && p.nth_at(1, DELETE_KW) {
3353+
p.expect(ON_KW);
3354+
p.expect(DELETE_KW);
3355+
referential_action(p);
3356+
}
3357+
}
3358+
33533359
const LIKE_OPTION: TokenSet = TokenSet::new(&[
33543360
COMMENTS_KW,
33553361
COMPRESSION_KW,
@@ -3591,16 +3597,7 @@ fn table_constraint(p: &mut Parser<'_>) -> CompletedMarker {
35913597
p.error("expected FULL, PARTIAL, or SIMPLE");
35923598
}
35933599
}
3594-
// [ ON DELETE referential_action ]
3595-
if p.eat(ON_KW) {
3596-
p.expect(DELETE_KW);
3597-
referential_action(p);
3598-
}
3599-
// [ ON UPDATE referential_action ]
3600-
if p.eat(ON_KW) {
3601-
p.expect(UPDATE_KW);
3602-
referential_action(p);
3603-
}
3600+
foreign_key_actions(p);
36043601
FOREIGN_KEY_CONSTRAINT
36053602
}
36063603
};

crates/squawk_parser/src/snapshots/squawk_parser__test__alter_table_ok.snap

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3619,4 +3619,61 @@ SOURCE_FILE
36193619
WHITESPACE " "
36203620
FINALIZE_KW "finalize"
36213621
SEMICOLON ";"
3622+
WHITESPACE "\n\n"
3623+
COMMENT "-- references on update on delete"
3624+
WHITESPACE "\n"
3625+
ALTER_TABLE
3626+
ALTER_KW "alter"
3627+
WHITESPACE " "
3628+
TABLE_KW "table"
3629+
WHITESPACE " "
3630+
PATH
3631+
PATH_SEGMENT
3632+
NAME_REF
3633+
IDENT "foo"
3634+
WHITESPACE "\n "
3635+
ADD_CONSTRAINT
3636+
ADD_KW "add"
3637+
WHITESPACE " "
3638+
FOREIGN_KEY_CONSTRAINT
3639+
CONSTRAINT_KW "constraint"
3640+
WHITESPACE " "
3641+
NAME
3642+
IDENT "foo_bar_id_fkey"
3643+
WHITESPACE " "
3644+
FOREIGN_KW "foreign"
3645+
WHITESPACE " "
3646+
KEY_KW "key"
3647+
WHITESPACE " "
3648+
COLUMN_LIST
3649+
L_PAREN "("
3650+
COLUMN
3651+
NAME_REF
3652+
IDENT "bar_id"
3653+
R_PAREN ")"
3654+
WHITESPACE "\n "
3655+
REFERENCES_KW "references"
3656+
WHITESPACE " "
3657+
PATH
3658+
PATH_SEGMENT
3659+
NAME_REF
3660+
IDENT "bar"
3661+
WHITESPACE " "
3662+
L_PAREN "("
3663+
NAME_REF
3664+
IDENT "id"
3665+
R_PAREN ")"
3666+
WHITESPACE " "
3667+
ON_KW "on"
3668+
WHITESPACE " "
3669+
UPDATE_KW "update"
3670+
WHITESPACE " "
3671+
CASCADE_KW "cascade"
3672+
WHITESPACE " "
3673+
ON_KW "on"
3674+
WHITESPACE " "
3675+
DELETE_KW "delete"
3676+
WHITESPACE " "
3677+
CASCADE_KW "cascade"
3678+
SEMICOLON ";"
36223679
WHITESPACE "\n"

crates/squawk_parser/src/snapshots/squawk_parser__test__create_table_ok.snap

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1177,6 +1177,58 @@ SOURCE_FILE
11771177
R_PAREN ")"
11781178
SEMICOLON ";"
11791179
WHITESPACE "\n\n"
1180+
CREATE_TABLE
1181+
COMMENT "-- order swapped"
1182+
WHITESPACE "\n"
1183+
CREATE_KW "create"
1184+
WHITESPACE " "
1185+
TABLE_KW "table"
1186+
WHITESPACE " "
1187+
PATH
1188+
PATH_SEGMENT
1189+
NAME
1190+
IDENT "t"
1191+
WHITESPACE " "
1192+
TABLE_ARGS
1193+
L_PAREN "("
1194+
WHITESPACE "\n "
1195+
COLUMN
1196+
NAME_REF
1197+
IDENT "b"
1198+
WHITESPACE " "
1199+
PATH_TYPE
1200+
PATH
1201+
PATH_SEGMENT
1202+
NAME_REF
1203+
INT_KW "int"
1204+
WHITESPACE " "
1205+
REFERENCES_CONSTRAINT
1206+
REFERENCES_KW "references"
1207+
WHITESPACE " "
1208+
PATH
1209+
PATH_SEGMENT
1210+
NAME_REF
1211+
IDENT "foo"
1212+
WHITESPACE "\n "
1213+
ON_KW "on"
1214+
WHITESPACE " "
1215+
DELETE_KW "delete"
1216+
WHITESPACE " "
1217+
NO_KW "no"
1218+
WHITESPACE " "
1219+
ACTION_KW "action"
1220+
WHITESPACE "\n "
1221+
ON_KW "on"
1222+
WHITESPACE " "
1223+
UPDATE_KW "update"
1224+
WHITESPACE " "
1225+
NO_KW "no"
1226+
WHITESPACE " "
1227+
ACTION_KW "action"
1228+
WHITESPACE "\n"
1229+
R_PAREN ")"
1230+
SEMICOLON ";"
1231+
WHITESPACE "\n\n"
11801232
CREATE_TABLE
11811233
COMMENT "-- primary key"
11821234
WHITESPACE "\n"

crates/squawk_parser/test_data/ok/alter_table.sql

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -264,3 +264,8 @@ alter table t detach partition f concurrently;
264264

265265
-- finalize
266266
alter table t detach partition f finalize;
267+
268+
-- references on update on delete
269+
alter table foo
270+
add constraint foo_bar_id_fkey foreign key (bar_id)
271+
references bar (id) on update cascade on delete cascade;

crates/squawk_parser/test_data/ok/create_table.sql

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,13 @@ create table t (
140140
on delete no action
141141
);
142142

143+
-- order swapped
144+
create table t (
145+
b int references foo
146+
on delete no action
147+
on update no action
148+
);
149+
143150
-- primary key
144151
create table t (
145152
a int primary key with ( autovacuum_enabled ),

0 commit comments

Comments
 (0)