Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
53 changes: 25 additions & 28 deletions crates/squawk_parser/src/grammar.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3323,24 +3323,7 @@ fn opt_constraint_inner(p: &mut Parser<'_>) -> Option<SyntaxKind> {
p.error("expected FULL, PARTIAL, or SIMPLE");
}
}
// [ ON DELETE referential_action ]
if p.at(ON_KW) && p.nth_at(1, DELETE_KW) {
p.expect(ON_KW);
p.expect(DELETE_KW);
referential_action(p);
}
// [ ON UPDATE referential_action ]
if p.at(ON_KW) && p.nth_at(1, UPDATE_KW) {
p.expect(ON_KW);
p.expect(UPDATE_KW);
referential_action(p);
}
// [ ON DELETE referential_action ]
if p.at(ON_KW) && p.nth_at(1, DELETE_KW) {
p.expect(ON_KW);
p.expect(DELETE_KW);
referential_action(p);
}
foreign_key_actions(p);
REFERENCES_CONSTRAINT
}
_ => {
Expand All @@ -3350,6 +3333,29 @@ fn opt_constraint_inner(p: &mut Parser<'_>) -> Option<SyntaxKind> {
Some(kind)
}

// [ ON DELETE referential_action ]
// [ ON UPDATE referential_action ]
fn foreign_key_actions(p: &mut Parser<'_>) {
// [ ON DELETE referential_action ]
if p.at(ON_KW) && p.nth_at(1, DELETE_KW) {
p.expect(ON_KW);
p.expect(DELETE_KW);
referential_action(p);
}
// [ ON UPDATE referential_action ]
if p.at(ON_KW) && p.nth_at(1, UPDATE_KW) {
p.expect(ON_KW);
p.expect(UPDATE_KW);
referential_action(p);
}
// [ ON DELETE referential_action ]
if p.at(ON_KW) && p.nth_at(1, DELETE_KW) {
p.expect(ON_KW);
p.expect(DELETE_KW);
referential_action(p);
}
}

const LIKE_OPTION: TokenSet = TokenSet::new(&[
COMMENTS_KW,
COMPRESSION_KW,
Expand Down Expand Up @@ -3591,16 +3597,7 @@ fn table_constraint(p: &mut Parser<'_>) -> CompletedMarker {
p.error("expected FULL, PARTIAL, or SIMPLE");
}
}
// [ ON DELETE referential_action ]
if p.eat(ON_KW) {
p.expect(DELETE_KW);
referential_action(p);
}
// [ ON UPDATE referential_action ]
if p.eat(ON_KW) {
p.expect(UPDATE_KW);
referential_action(p);
}
foreign_key_actions(p);
FOREIGN_KEY_CONSTRAINT
}
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3619,4 +3619,61 @@ SOURCE_FILE
WHITESPACE " "
FINALIZE_KW "finalize"
SEMICOLON ";"
WHITESPACE "\n\n"
COMMENT "-- references on update on delete"
WHITESPACE "\n"
ALTER_TABLE
ALTER_KW "alter"
WHITESPACE " "
TABLE_KW "table"
WHITESPACE " "
PATH
PATH_SEGMENT
NAME_REF
IDENT "foo"
WHITESPACE "\n "
ADD_CONSTRAINT
ADD_KW "add"
WHITESPACE " "
FOREIGN_KEY_CONSTRAINT
CONSTRAINT_KW "constraint"
WHITESPACE " "
NAME
IDENT "foo_bar_id_fkey"
WHITESPACE " "
FOREIGN_KW "foreign"
WHITESPACE " "
KEY_KW "key"
WHITESPACE " "
COLUMN_LIST
L_PAREN "("
COLUMN
NAME_REF
IDENT "bar_id"
R_PAREN ")"
WHITESPACE "\n "
REFERENCES_KW "references"
WHITESPACE " "
PATH
PATH_SEGMENT
NAME_REF
IDENT "bar"
WHITESPACE " "
L_PAREN "("
NAME_REF
IDENT "id"
R_PAREN ")"
WHITESPACE " "
ON_KW "on"
WHITESPACE " "
UPDATE_KW "update"
WHITESPACE " "
CASCADE_KW "cascade"
WHITESPACE " "
ON_KW "on"
WHITESPACE " "
DELETE_KW "delete"
WHITESPACE " "
CASCADE_KW "cascade"
SEMICOLON ";"
WHITESPACE "\n"
Original file line number Diff line number Diff line change
Expand Up @@ -1177,6 +1177,58 @@ SOURCE_FILE
R_PAREN ")"
SEMICOLON ";"
WHITESPACE "\n\n"
CREATE_TABLE
COMMENT "-- order swapped"
WHITESPACE "\n"
CREATE_KW "create"
WHITESPACE " "
TABLE_KW "table"
WHITESPACE " "
PATH
PATH_SEGMENT
NAME
IDENT "t"
WHITESPACE " "
TABLE_ARGS
L_PAREN "("
WHITESPACE "\n "
COLUMN
NAME_REF
IDENT "b"
WHITESPACE " "
PATH_TYPE
PATH
PATH_SEGMENT
NAME_REF
INT_KW "int"
WHITESPACE " "
REFERENCES_CONSTRAINT
REFERENCES_KW "references"
WHITESPACE " "
PATH
PATH_SEGMENT
NAME_REF
IDENT "foo"
WHITESPACE "\n "
ON_KW "on"
WHITESPACE " "
DELETE_KW "delete"
WHITESPACE " "
NO_KW "no"
WHITESPACE " "
ACTION_KW "action"
WHITESPACE "\n "
ON_KW "on"
WHITESPACE " "
UPDATE_KW "update"
WHITESPACE " "
NO_KW "no"
WHITESPACE " "
ACTION_KW "action"
WHITESPACE "\n"
R_PAREN ")"
SEMICOLON ";"
WHITESPACE "\n\n"
CREATE_TABLE
COMMENT "-- primary key"
WHITESPACE "\n"
Expand Down
5 changes: 5 additions & 0 deletions crates/squawk_parser/test_data/ok/alter_table.sql
Original file line number Diff line number Diff line change
Expand Up @@ -264,3 +264,8 @@ alter table t detach partition f concurrently;

-- finalize
alter table t detach partition f finalize;

-- references on update on delete
alter table foo
add constraint foo_bar_id_fkey foreign key (bar_id)
references bar (id) on update cascade on delete cascade;
7 changes: 7 additions & 0 deletions crates/squawk_parser/test_data/ok/create_table.sql
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,13 @@ create table t (
on delete no action
);

-- order swapped
create table t (
b int references foo
on delete no action
on update no action
);

-- primary key
create table t (
a int primary key with ( autovacuum_enabled ),
Expand Down
Loading