From f9f35650f71557b480d39c5bf4c998151d5cd9b2 Mon Sep 17 00:00:00 2001 From: Cedric Vangout Date: Thu, 14 Dec 2023 14:21:35 +0100 Subject: [PATCH 1/4] feat: add support for create publication --- crates/codegen/src/get_node_properties.rs | 8 ++++++++ crates/parser/src/codegen.rs | 17 +++++++++++++++++ .../parser/tests/data/statements/valid/0050.sql | 7 +++++++ 3 files changed, 32 insertions(+) create mode 100644 crates/parser/tests/data/statements/valid/0050.sql diff --git a/crates/codegen/src/get_node_properties.rs b/crates/codegen/src/get_node_properties.rs index 15a872de..248272d6 100644 --- a/crates/codegen/src/get_node_properties.rs +++ b/crates/codegen/src/get_node_properties.rs @@ -700,6 +700,14 @@ fn custom_handlers(node: &Node) -> TokenStream { tokens.push(TokenProperty::from(Token::Create)); tokens.push(TokenProperty::from(Token::Database)); }, + "CreatePublicationStmt" => quote! { + tokens.push(TokenProperty::from(Token::Create)); + tokens.push(TokenProperty::from(Token::Publication)); + tokens.push(TokenProperty::from(Token::For)); + tokens.push(TokenProperty::from(Token::Tables)); + tokens.push(TokenProperty::from(Token::InP)); + tokens.push(TokenProperty::from(Token::Schema)); + }, _ => quote! {}, } } diff --git a/crates/parser/src/codegen.rs b/crates/parser/src/codegen.rs index a4ee60b7..187381b2 100644 --- a/crates/parser/src/codegen.rs +++ b/crates/parser/src/codegen.rs @@ -281,4 +281,21 @@ mod tests { ], ) } + + #[test] + fn test_create_publication() { + test_get_node_properties( + "create publication sales_publication for tables in schema marketing;", + SyntaxKind::CreatePublicationStmt, + vec![ + TokenProperty::from(SyntaxKind::Create), + TokenProperty::from(SyntaxKind::Publication), + TokenProperty::from(SyntaxKind::For), + TokenProperty::from(SyntaxKind::Tables), + TokenProperty::from(SyntaxKind::InP), + TokenProperty::from(SyntaxKind::Schema), + TokenProperty::from("sales_publication".to_string()), + ], + ) + } } diff --git a/crates/parser/tests/data/statements/valid/0050.sql b/crates/parser/tests/data/statements/valid/0050.sql new file mode 100644 index 00000000..d2a85449 --- /dev/null +++ b/crates/parser/tests/data/statements/valid/0050.sql @@ -0,0 +1,7 @@ +-- CREATE PUBLICATION mypublication FOR TABLE users, departments; +-- CREATE PUBLICATION active_departments FOR TABLE departments WHERE (active IS TRUE); +-- CREATE PUBLICATION alltables FOR ALL TABLES; +-- CREATE PUBLICATION insert_only FOR TABLE mydata WITH (publish = 'insert'); +-- CREATE PUBLICATION production_publication FOR TABLE users, departments, TABLES IN SCHEMA production; +CREATE PUBLICATION sales_publication FOR TABLES IN SCHEMA marketing, sales; +-- CREATE PUBLICATION users_filtered FOR TABLE users (user_id, firstname); From 1d3c131b05570c946222290c58bbb3b846b3ceab Mon Sep 17 00:00:00 2001 From: Cedric Vangout Date: Thu, 14 Dec 2023 15:26:06 +0100 Subject: [PATCH 2/4] impl --- crates/codegen/src/get_node_properties.rs | 25 ++++++++++++++++--- .../tests/data/statements/valid/0050.sql | 2 +- 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/crates/codegen/src/get_node_properties.rs b/crates/codegen/src/get_node_properties.rs index 248272d6..dc27609e 100644 --- a/crates/codegen/src/get_node_properties.rs +++ b/crates/codegen/src/get_node_properties.rs @@ -703,10 +703,27 @@ fn custom_handlers(node: &Node) -> TokenStream { "CreatePublicationStmt" => quote! { tokens.push(TokenProperty::from(Token::Create)); tokens.push(TokenProperty::from(Token::Publication)); - tokens.push(TokenProperty::from(Token::For)); - tokens.push(TokenProperty::from(Token::Tables)); - tokens.push(TokenProperty::from(Token::InP)); - tokens.push(TokenProperty::from(Token::Schema)); + if n.for_all_tables { + tokens.push(TokenProperty::from(Token::For)); + tokens.push(TokenProperty::from(Token::All)); + tokens.push(TokenProperty::from(Token::Tables)); + } + if let Some(n) = n.pubobjects.first() { + tokens.push(TokenProperty::from(Token::For)); + if let Some(NodeEnum::PublicationObjSpec(n)) = &n.node { + match n.pubobjtype() { + protobuf::PublicationObjSpecType::PublicationobjTable => { + tokens.push(TokenProperty::from(Token::Table)); + }, + protobuf::PublicationObjSpecType::PublicationobjTablesInSchema => { + tokens.push(TokenProperty::from(Token::Tables)); + tokens.push(TokenProperty::from(Token::InP)); + tokens.push(TokenProperty::from(Token::Schema)); + }, + _ => panic!("Unknown CreatePublicationStmt {:#?}", n.pubobjtype()) + } + } + } }, _ => quote! {}, } diff --git a/crates/parser/tests/data/statements/valid/0050.sql b/crates/parser/tests/data/statements/valid/0050.sql index d2a85449..5582dc6d 100644 --- a/crates/parser/tests/data/statements/valid/0050.sql +++ b/crates/parser/tests/data/statements/valid/0050.sql @@ -1,6 +1,6 @@ -- CREATE PUBLICATION mypublication FOR TABLE users, departments; -- CREATE PUBLICATION active_departments FOR TABLE departments WHERE (active IS TRUE); --- CREATE PUBLICATION alltables FOR ALL TABLES; +CREATE PUBLICATION alltables FOR ALL TABLES; -- CREATE PUBLICATION insert_only FOR TABLE mydata WITH (publish = 'insert'); -- CREATE PUBLICATION production_publication FOR TABLE users, departments, TABLES IN SCHEMA production; CREATE PUBLICATION sales_publication FOR TABLES IN SCHEMA marketing, sales; From 624195262764b8a5d2559c566b0633357829fc27 Mon Sep 17 00:00:00 2001 From: Cedric Vangout Date: Tue, 19 Dec 2023 02:14:22 +0100 Subject: [PATCH 3/4] add snapshots --- .../snapshots/statements/valid/0050@1.snap | 39 ++++++++++ .../snapshots/statements/valid/0050@2.snap | 74 +++++++++++++++++++ 2 files changed, 113 insertions(+) create mode 100644 crates/parser/tests/snapshots/statements/valid/0050@1.snap create mode 100644 crates/parser/tests/snapshots/statements/valid/0050@2.snap diff --git a/crates/parser/tests/snapshots/statements/valid/0050@1.snap b/crates/parser/tests/snapshots/statements/valid/0050@1.snap new file mode 100644 index 00000000..74f1b302 --- /dev/null +++ b/crates/parser/tests/snapshots/statements/valid/0050@1.snap @@ -0,0 +1,39 @@ +--- +source: crates/parser/tests/statement_parser_test.rs +description: "-- CREATE PUBLICATION mypublication FOR TABLE users, departments;\n-- CREATE PUBLICATION active_departments FOR TABLE departments WHERE (active IS TRUE);\nCREATE PUBLICATION alltables FOR ALL TABLES;" +--- +Parse { + cst: SourceFile@0..197 + SqlComment@0..65 "-- CREATE PUBLICATION ..." + Newline@65..66 "\n" + SqlComment@66..152 "-- CREATE PUBLICATION ..." + Newline@152..153 "\n" + CreatePublicationStmt@153..197 + Create@153..159 "CREATE" + Whitespace@159..160 " " + Publication@160..171 "PUBLICATION" + Whitespace@171..172 " " + Ident@172..181 "alltables" + Whitespace@181..182 " " + For@182..185 "FOR" + Whitespace@185..186 " " + All@186..189 "ALL" + Whitespace@189..190 " " + Tables@190..196 "TABLES" + Ascii59@196..197 ";" + , + errors: [], + stmts: [ + RawStmt { + stmt: CreatePublicationStmt( + CreatePublicationStmt { + pubname: "alltables", + options: [], + pubobjects: [], + for_all_tables: true, + }, + ), + range: 152..196, + }, + ], +} diff --git a/crates/parser/tests/snapshots/statements/valid/0050@2.snap b/crates/parser/tests/snapshots/statements/valid/0050@2.snap new file mode 100644 index 00000000..412f5af6 --- /dev/null +++ b/crates/parser/tests/snapshots/statements/valid/0050@2.snap @@ -0,0 +1,74 @@ +--- +source: crates/parser/tests/statement_parser_test.rs +description: "\n-- CREATE PUBLICATION insert_only FOR TABLE mydata WITH (publish = 'insert');\n-- CREATE PUBLICATION production_publication FOR TABLE users, departments, TABLES IN SCHEMA production;\nCREATE PUBLICATION sales_publication FOR TABLES IN SCHEMA marketing, sales;" +--- +Parse { + cst: SourceFile@0..258 + Newline@0..1 "\n" + SqlComment@1..78 "-- CREATE PUBLICATION ..." + Newline@78..79 "\n" + SqlComment@79..182 "-- CREATE PUBLICATION ..." + Newline@182..183 "\n" + CreatePublicationStmt@183..258 + Create@183..189 "CREATE" + Whitespace@189..190 " " + Publication@190..201 "PUBLICATION" + Whitespace@201..202 " " + Ident@202..219 "sales_publication" + Whitespace@219..220 " " + For@220..223 "FOR" + Whitespace@223..224 " " + Tables@224..230 "TABLES" + Whitespace@230..231 " " + InP@231..233 "IN" + Whitespace@233..234 " " + Schema@234..240 "SCHEMA" + Whitespace@240..241 " " + PublicationObjSpec@241..250 + Ident@241..250 "marketing" + Ascii44@250..251 "," + Whitespace@251..252 " " + PublicationObjSpec@252..257 + Ident@252..257 "sales" + Ascii59@257..258 ";" + , + errors: [], + stmts: [ + RawStmt { + stmt: CreatePublicationStmt( + CreatePublicationStmt { + pubname: "sales_publication", + options: [], + pubobjects: [ + Node { + node: Some( + PublicationObjSpec( + PublicationObjSpec { + pubobjtype: PublicationobjTablesInSchema, + name: "marketing", + pubtable: None, + location: 58, + }, + ), + ), + }, + Node { + node: Some( + PublicationObjSpec( + PublicationObjSpec { + pubobjtype: PublicationobjTablesInSchema, + name: "sales", + pubtable: None, + location: 69, + }, + ), + ), + }, + ], + for_all_tables: false, + }, + ), + range: 182..257, + }, + ], +} From f3d6a54d79d9b5dfbf60264b2b40d3500a6622d3 Mon Sep 17 00:00:00 2001 From: Cedric Vangout Date: Tue, 19 Dec 2023 02:16:23 +0100 Subject: [PATCH 4/4] panics --- crates/parser/tests/data/statements/valid/0050.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/parser/tests/data/statements/valid/0050.sql b/crates/parser/tests/data/statements/valid/0050.sql index 5582dc6d..cb99763f 100644 --- a/crates/parser/tests/data/statements/valid/0050.sql +++ b/crates/parser/tests/data/statements/valid/0050.sql @@ -1,4 +1,4 @@ --- CREATE PUBLICATION mypublication FOR TABLE users, departments; +CREATE PUBLICATION mypublication FOR TABLE users, departments; -- CREATE PUBLICATION active_departments FOR TABLE departments WHERE (active IS TRUE); CREATE PUBLICATION alltables FOR ALL TABLES; -- CREATE PUBLICATION insert_only FOR TABLE mydata WITH (publish = 'insert');