Skip to content

Commit 9c694d7

Browse files
authored
Merge pull request #94 from supabase/fix/location
2 parents 20134dd + 10adca5 commit 9c694d7

File tree

11 files changed

+758
-30
lines changed

11 files changed

+758
-30
lines changed

Diff for: crates/codegen/src/get_location.rs

+18
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,22 @@ pub fn get_location_mod(proto_file: &ProtoFile) -> proc_macro2::TokenStream {
5555
} else {
5656
Some(n.location)
5757
},
58+
NodeEnum::PublicationObjSpec(n) => {
59+
match &n.pubtable {
60+
Some(pubtable) => match &pubtable.relation {
61+
Some(range_var) => Some(range_var.location),
62+
None => Some(n.location),
63+
},
64+
None => Some(n.location),
65+
}
66+
},
67+
NodeEnum::BooleanTest(n) => {
68+
if n.arg.is_some() {
69+
get_location_internal(&n.arg.as_ref().unwrap().node.as_ref().unwrap())
70+
} else {
71+
Some(n.location)
72+
}
73+
},
5874
#(NodeEnum::#node_identifiers(n) => #location_idents),*
5975
};
6076
if location.is_some() && location.unwrap() < 0 {
@@ -74,6 +90,8 @@ fn manual_node_names() -> Vec<&'static str> {
7490
"CollateClause",
7591
"TypeCast",
7692
"ColumnDef",
93+
"NullTest",
94+
"PublicationObjSpec",
7795
]
7896
}
7997

Diff for: crates/codegen/src/get_node_properties.rs

+68
Original file line numberDiff line numberDiff line change
@@ -692,6 +692,74 @@ fn custom_handlers(node: &Node) -> TokenStream {
692692
tokens.push(TokenProperty::from(Token::With));
693693
}
694694
},
695+
"CreatePublicationStmt" => quote! {
696+
tokens.push(TokenProperty::from(Token::Create));
697+
tokens.push(TokenProperty::from(Token::Publication));
698+
if n.for_all_tables {
699+
tokens.push(TokenProperty::from(Token::For));
700+
tokens.push(TokenProperty::from(Token::All));
701+
tokens.push(TokenProperty::from(Token::Tables));
702+
}
703+
if let Some(n) = n.options.first() {
704+
tokens.push(TokenProperty::from(Token::With));
705+
}
706+
if let Some(n) = n.pubobjects.first() {
707+
tokens.push(TokenProperty::from(Token::For));
708+
if let Some(NodeEnum::PublicationObjSpec(n)) = &n.node {
709+
match n.pubobjtype() {
710+
protobuf::PublicationObjSpecType::PublicationobjTable => {
711+
tokens.push(TokenProperty::from(Token::Table));
712+
},
713+
protobuf::PublicationObjSpecType::PublicationobjTablesInSchema => {
714+
tokens.push(TokenProperty::from(Token::Tables));
715+
tokens.push(TokenProperty::from(Token::InP));
716+
tokens.push(TokenProperty::from(Token::Schema));
717+
},
718+
_ => panic!("Unknown CreatePublicationStmt {:#?}", n.pubobjtype())
719+
}
720+
}
721+
}
722+
if let Some(n) = n.pubobjects.last() {
723+
if let Some(NodeEnum::PublicationObjSpec(n)) = &n.node {
724+
match n.pubobjtype() {
725+
protobuf::PublicationObjSpecType::PublicationobjTablesInSchema => {
726+
tokens.push(TokenProperty::from(Token::Tables));
727+
tokens.push(TokenProperty::from(Token::InP));
728+
tokens.push(TokenProperty::from(Token::Schema));
729+
},
730+
_ => {}
731+
}
732+
}
733+
}
734+
},
735+
"PublicationTable" => quote! {
736+
if n.where_clause.is_some() {
737+
tokens.push(TokenProperty::from(Token::Where));
738+
}
739+
},
740+
"BooleanTest" => quote! {
741+
match n.booltesttype() {
742+
protobuf::BoolTestType::IsTrue => {
743+
tokens.push(TokenProperty::from(Token::Is));
744+
tokens.push(TokenProperty::from(Token::TrueP));
745+
},
746+
protobuf::BoolTestType::IsNotTrue => {
747+
tokens.push(TokenProperty::from(Token::Is));
748+
tokens.push(TokenProperty::from(Token::Not));
749+
tokens.push(TokenProperty::from(Token::TrueP));
750+
},
751+
protobuf::BoolTestType::IsFalse => {
752+
tokens.push(TokenProperty::from(Token::Is));
753+
tokens.push(TokenProperty::from(Token::FalseP));
754+
},
755+
protobuf::BoolTestType::IsNotFalse => {
756+
tokens.push(TokenProperty::from(Token::Is));
757+
tokens.push(TokenProperty::from(Token::Not));
758+
tokens.push(TokenProperty::from(Token::FalseP));
759+
},
760+
_ => panic!("Unknown BooleanTest {:#?}", n.booltesttype()),
761+
}
762+
},
695763
"CompositeTypeStmt" => quote! {
696764
tokens.push(TokenProperty::from(Token::Create));
697765
tokens.push(TokenProperty::from(Token::TypeP));

Diff for: crates/parser/tests/data/statements/valid/0053.sql

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
CREATE PUBLICATION mypublication FOR TABLE users, departments;
2+
CREATE PUBLICATION active_departments FOR TABLE departments WHERE (active IS TRUE);
3+
CREATE PUBLICATION alltables FOR ALL TABLES;
4+
CREATE PUBLICATION insert_only FOR TABLE mydata WITH (publish = 'insert');
5+
CREATE PUBLICATION production_publication FOR TABLE users, departments, TABLES IN SCHEMA production;
6+
CREATE PUBLICATION sales_publication FOR TABLES IN SCHEMA marketing, sales;
7+
CREATE PUBLICATION users_filtered FOR TABLE users (user_id, firstname);

Diff for: crates/parser/tests/snapshots/statements/valid/[email protected]

+29-30
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,35 @@
11
---
22
source: crates/parser/tests/statement_parser_test.rs
3-
description: "\nCREATE EXTENSION IF NOT EXISTS x CASCADE VERSION \"1.2\" SCHEMA a;"
3+
description: "CREATE EXTENSION IF NOT EXISTS x CASCADE VERSION \"1.2\" SCHEMA a;"
44
---
55
Parse {
6-
cst: SourceFile@0..65
7-
Newline@0..1 "\n"
8-
CreateExtensionStmt@1..65
9-
Create@1..7 "CREATE"
10-
Whitespace@7..8 " "
11-
Extension@8..17 "EXTENSION"
12-
Whitespace@17..18 " "
13-
IfP@18..20 "IF"
14-
Whitespace@20..21 " "
15-
Not@21..24 "NOT"
16-
Whitespace@24..25 " "
17-
Exists@25..31 "EXISTS"
18-
Whitespace@31..32 " "
19-
Ident@32..33 "x"
20-
Whitespace@33..34 " "
21-
DefElem@34..41
22-
Cascade@34..41 "CASCADE"
23-
Whitespace@41..42 " "
24-
DefElem@42..55
25-
VersionP@42..49 "VERSION"
26-
Whitespace@49..50 " "
27-
Ident@50..55 "\"1.2\""
28-
Whitespace@55..56 " "
29-
DefElem@56..64
30-
Schema@56..62 "SCHEMA"
31-
Whitespace@62..63 " "
32-
Ident@63..64 "a"
33-
Ascii59@64..65 ";"
6+
cst: SourceFile@0..64
7+
CreateExtensionStmt@0..64
8+
Create@0..6 "CREATE"
9+
Whitespace@6..7 " "
10+
Extension@7..16 "EXTENSION"
11+
Whitespace@16..17 " "
12+
IfP@17..19 "IF"
13+
Whitespace@19..20 " "
14+
Not@20..23 "NOT"
15+
Whitespace@23..24 " "
16+
Exists@24..30 "EXISTS"
17+
Whitespace@30..31 " "
18+
Ident@31..32 "x"
19+
Whitespace@32..33 " "
20+
DefElem@33..40
21+
Cascade@33..40 "CASCADE"
22+
Whitespace@40..41 " "
23+
DefElem@41..54
24+
VersionP@41..48 "VERSION"
25+
Whitespace@48..49 " "
26+
Ident@49..54 "\"1.2\""
27+
Whitespace@54..55 " "
28+
DefElem@55..63
29+
Schema@55..61 "SCHEMA"
30+
Whitespace@61..62 " "
31+
Ident@62..63 "a"
32+
Ascii59@63..64 ";"
3433
,
3534
errors: [],
3635
stmts: [
@@ -112,7 +111,7 @@ Parse {
112111
],
113112
},
114113
),
115-
range: 0..64,
114+
range: 0..63,
116115
},
117116
],
118117
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
---
2+
source: crates/parser/tests/statement_parser_test.rs
3+
description: "CREATE PUBLICATION mypublication FOR TABLE users, departments;"
4+
---
5+
Parse {
6+
cst: SourceFile@0..62
7+
CreatePublicationStmt@0..62
8+
Create@0..6 "CREATE"
9+
Whitespace@6..7 " "
10+
Publication@7..18 "PUBLICATION"
11+
Whitespace@18..19 " "
12+
Ident@19..32 "mypublication"
13+
Whitespace@32..33 " "
14+
For@33..36 "FOR"
15+
Whitespace@36..37 " "
16+
Table@37..42 "TABLE"
17+
Whitespace@42..43 " "
18+
PublicationObjSpec@43..48
19+
PublicationTable@43..48
20+
RangeVar@43..48
21+
Ident@43..48 "users"
22+
Ascii44@48..49 ","
23+
Whitespace@49..50 " "
24+
PublicationObjSpec@50..61
25+
PublicationTable@50..61
26+
RangeVar@50..61
27+
Ident@50..61 "departments"
28+
Ascii59@61..62 ";"
29+
,
30+
errors: [],
31+
stmts: [
32+
RawStmt {
33+
stmt: CreatePublicationStmt(
34+
CreatePublicationStmt {
35+
pubname: "mypublication",
36+
options: [],
37+
pubobjects: [
38+
Node {
39+
node: Some(
40+
PublicationObjSpec(
41+
PublicationObjSpec {
42+
pubobjtype: PublicationobjTable,
43+
name: "",
44+
pubtable: Some(
45+
PublicationTable {
46+
relation: Some(
47+
RangeVar {
48+
catalogname: "",
49+
schemaname: "",
50+
relname: "users",
51+
inh: true,
52+
relpersistence: "p",
53+
alias: None,
54+
location: 43,
55+
},
56+
),
57+
where_clause: None,
58+
columns: [],
59+
},
60+
),
61+
location: 0,
62+
},
63+
),
64+
),
65+
},
66+
Node {
67+
node: Some(
68+
PublicationObjSpec(
69+
PublicationObjSpec {
70+
pubobjtype: PublicationobjTable,
71+
name: "",
72+
pubtable: Some(
73+
PublicationTable {
74+
relation: Some(
75+
RangeVar {
76+
catalogname: "",
77+
schemaname: "",
78+
relname: "departments",
79+
inh: true,
80+
relpersistence: "p",
81+
alias: None,
82+
location: 50,
83+
},
84+
),
85+
where_clause: None,
86+
columns: [],
87+
},
88+
),
89+
location: 50,
90+
},
91+
),
92+
),
93+
},
94+
],
95+
for_all_tables: false,
96+
},
97+
),
98+
range: 0..61,
99+
},
100+
],
101+
}

0 commit comments

Comments
 (0)