From 639bb17251411c363a462bf0bc209eb2815839a9 Mon Sep 17 00:00:00 2001 From: Cedric Vangout Date: Thu, 14 Dec 2023 01:43:47 +0100 Subject: [PATCH 1/3] feat: support `CreatedbStmt` --- crates/codegen/src/get_node_properties.rs | 15 +++++++++++++++ crates/parser/src/codegen.rs | 15 +++++++++++++++ .../parser/tests/data/statements/valid/0047.sql | 6 ++++++ 3 files changed, 36 insertions(+) create mode 100644 crates/parser/tests/data/statements/valid/0047.sql diff --git a/crates/codegen/src/get_node_properties.rs b/crates/codegen/src/get_node_properties.rs index 8c29796a..90500672 100644 --- a/crates/codegen/src/get_node_properties.rs +++ b/crates/codegen/src/get_node_properties.rs @@ -683,6 +683,21 @@ fn custom_handlers(node: &Node) -> TokenStream { tokens.push(TokenProperty::from(Token::Create)); tokens.push(TokenProperty::from(Token::TypeP)); }, + "CreatedbStmt" => quote! { + tokens.push(TokenProperty::from(Token::Create)); + tokens.push(TokenProperty::from(Token::Database)); + for option in &n.options { + if let Some(NodeEnum::DefElem(node)) = &option.node { + if node.defname == "location" { + tokens.push(TokenProperty::from(Token::Default)); + } + if node.defname == "connection_limit" { + tokens.push(TokenProperty::from(Token::Limit)); + tokens.push(TokenProperty::from(Token::Iconst)); + } + } + } + }, _ => quote! {}, } } diff --git a/crates/parser/src/codegen.rs b/crates/parser/src/codegen.rs index 44951c80..fe83182e 100644 --- a/crates/parser/src/codegen.rs +++ b/crates/parser/src/codegen.rs @@ -268,4 +268,19 @@ mod tests { ], ) } + + #[test] + fn test_create_database() { + test_get_node_properties( + "create database x owner abc connection limit 5;", + SyntaxKind::CreatedbStmt, + vec![ + TokenProperty::from(SyntaxKind::Create), + TokenProperty::from(SyntaxKind::Database), + TokenProperty::from(SyntaxKind::Limit), + TokenProperty::from(SyntaxKind::Iconst), + TokenProperty::from("x".to_string()), + ], + ) + } } diff --git a/crates/parser/tests/data/statements/valid/0047.sql b/crates/parser/tests/data/statements/valid/0047.sql new file mode 100644 index 00000000..3f950e44 --- /dev/null +++ b/crates/parser/tests/data/statements/valid/0047.sql @@ -0,0 +1,6 @@ +CREATE DATABASE x OWNER abc CONNECTION LIMIT 5; +CREATE DATABASE x ENCODING \"SQL_ASCII\"; +CREATE DATABASE x LC_COLLATE \"en_US.UTF-8\"; +CREATE DATABASE x LOCATION DEFAULT; +CREATE DATABASE x TABLESPACE abc; +CREATE DATABASE x TEMPLATE TRUE; From 8b2fd2591232a11170ac840736d88be1fe4344ed Mon Sep 17 00:00:00 2001 From: Cedric Vangout Date: Mon, 18 Dec 2023 23:33:46 +0100 Subject: [PATCH 2/3] add snapshots --- .../tests/data/statements/valid/0047.sql | 4 +- .../snapshots/statements/valid/0047@1.snap | 86 +++++++++++++++++++ .../snapshots/statements/valid/0047@2.snap | 57 ++++++++++++ .../snapshots/statements/valid/0047@3.snap | 57 ++++++++++++ .../snapshots/statements/valid/0047@4.snap | 47 ++++++++++ .../snapshots/statements/valid/0047@5.snap | 57 ++++++++++++ .../snapshots/statements/valid/0047@6.snap | 57 ++++++++++++ 7 files changed, 363 insertions(+), 2 deletions(-) create mode 100644 crates/parser/tests/snapshots/statements/valid/0047@1.snap create mode 100644 crates/parser/tests/snapshots/statements/valid/0047@2.snap create mode 100644 crates/parser/tests/snapshots/statements/valid/0047@3.snap create mode 100644 crates/parser/tests/snapshots/statements/valid/0047@4.snap create mode 100644 crates/parser/tests/snapshots/statements/valid/0047@5.snap create mode 100644 crates/parser/tests/snapshots/statements/valid/0047@6.snap diff --git a/crates/parser/tests/data/statements/valid/0047.sql b/crates/parser/tests/data/statements/valid/0047.sql index 3f950e44..843ea285 100644 --- a/crates/parser/tests/data/statements/valid/0047.sql +++ b/crates/parser/tests/data/statements/valid/0047.sql @@ -1,6 +1,6 @@ CREATE DATABASE x OWNER abc CONNECTION LIMIT 5; -CREATE DATABASE x ENCODING \"SQL_ASCII\"; -CREATE DATABASE x LC_COLLATE \"en_US.UTF-8\"; +CREATE DATABASE x ENCODING "SQL_ASCII"; +CREATE DATABASE x LC_COLLATE "en_US.UTF-8"; CREATE DATABASE x LOCATION DEFAULT; CREATE DATABASE x TABLESPACE abc; CREATE DATABASE x TEMPLATE TRUE; diff --git a/crates/parser/tests/snapshots/statements/valid/0047@1.snap b/crates/parser/tests/snapshots/statements/valid/0047@1.snap new file mode 100644 index 00000000..62204c30 --- /dev/null +++ b/crates/parser/tests/snapshots/statements/valid/0047@1.snap @@ -0,0 +1,86 @@ +--- +source: crates/parser/tests/statement_parser_test.rs +description: CREATE DATABASE x OWNER abc CONNECTION LIMIT 5; +--- +Parse { + cst: SourceFile@0..47 + CreatedbStmt@0..47 + Create@0..6 "CREATE" + Whitespace@6..7 " " + Database@7..15 "DATABASE" + Whitespace@15..16 " " + Ident@16..17 "x" + Whitespace@17..18 " " + DefElem@18..27 + Owner@18..23 "OWNER" + Whitespace@23..24 " " + Ident@24..27 "abc" + Whitespace@27..28 " " + DefElem@28..38 + Connection@28..38 "CONNECTION" + Whitespace@38..39 " " + Limit@39..44 "LIMIT" + Whitespace@44..45 " " + Iconst@45..46 "5" + Ascii59@46..47 ";" + , + errors: [], + stmts: [ + RawStmt { + stmt: CreatedbStmt( + CreatedbStmt { + dbname: "x", + options: [ + Node { + node: Some( + DefElem( + DefElem { + defnamespace: "", + defname: "owner", + arg: Some( + Node { + node: Some( + String( + String { + sval: "abc", + }, + ), + ), + }, + ), + defaction: DefelemUnspec, + location: 18, + }, + ), + ), + }, + Node { + node: Some( + DefElem( + DefElem { + defnamespace: "", + defname: "connection_limit", + arg: Some( + Node { + node: Some( + Integer( + Integer { + ival: 5, + }, + ), + ), + }, + ), + defaction: DefelemUnspec, + location: 28, + }, + ), + ), + }, + ], + }, + ), + range: 0..46, + }, + ], +} diff --git a/crates/parser/tests/snapshots/statements/valid/0047@2.snap b/crates/parser/tests/snapshots/statements/valid/0047@2.snap new file mode 100644 index 00000000..047cd49f --- /dev/null +++ b/crates/parser/tests/snapshots/statements/valid/0047@2.snap @@ -0,0 +1,57 @@ +--- +source: crates/parser/tests/statement_parser_test.rs +description: "\nCREATE DATABASE x ENCODING \"SQL_ASCII\";" +--- +Parse { + cst: SourceFile@0..40 + Newline@0..1 "\n" + CreatedbStmt@1..40 + Create@1..7 "CREATE" + Whitespace@7..8 " " + Database@8..16 "DATABASE" + Whitespace@16..17 " " + Ident@17..18 "x" + Whitespace@18..19 " " + DefElem@19..39 + Encoding@19..27 "ENCODING" + Whitespace@27..28 " " + Ident@28..39 "\"SQL_ASCII\"" + Ascii59@39..40 ";" + , + errors: [], + stmts: [ + RawStmt { + stmt: CreatedbStmt( + CreatedbStmt { + dbname: "x", + options: [ + Node { + node: Some( + DefElem( + DefElem { + defnamespace: "", + defname: "encoding", + arg: Some( + Node { + node: Some( + String( + String { + sval: "SQL_ASCII", + }, + ), + ), + }, + ), + defaction: DefelemUnspec, + location: 18, + }, + ), + ), + }, + ], + }, + ), + range: 0..39, + }, + ], +} diff --git a/crates/parser/tests/snapshots/statements/valid/0047@3.snap b/crates/parser/tests/snapshots/statements/valid/0047@3.snap new file mode 100644 index 00000000..65df202c --- /dev/null +++ b/crates/parser/tests/snapshots/statements/valid/0047@3.snap @@ -0,0 +1,57 @@ +--- +source: crates/parser/tests/statement_parser_test.rs +description: "\nCREATE DATABASE x LC_COLLATE \"en_US.UTF-8\";" +--- +Parse { + cst: SourceFile@0..44 + Newline@0..1 "\n" + CreatedbStmt@1..44 + Create@1..7 "CREATE" + Whitespace@7..8 " " + Database@8..16 "DATABASE" + Whitespace@16..17 " " + Ident@17..18 "x" + Whitespace@18..19 " " + DefElem@19..43 + Ident@19..29 "LC_COLLATE" + Whitespace@29..30 " " + Ident@30..43 "\"en_US.UTF-8\"" + Ascii59@43..44 ";" + , + errors: [], + stmts: [ + RawStmt { + stmt: CreatedbStmt( + CreatedbStmt { + dbname: "x", + options: [ + Node { + node: Some( + DefElem( + DefElem { + defnamespace: "", + defname: "lc_collate", + arg: Some( + Node { + node: Some( + String( + String { + sval: "en_US.UTF-8", + }, + ), + ), + }, + ), + defaction: DefelemUnspec, + location: 18, + }, + ), + ), + }, + ], + }, + ), + range: 0..43, + }, + ], +} diff --git a/crates/parser/tests/snapshots/statements/valid/0047@4.snap b/crates/parser/tests/snapshots/statements/valid/0047@4.snap new file mode 100644 index 00000000..c48ecb70 --- /dev/null +++ b/crates/parser/tests/snapshots/statements/valid/0047@4.snap @@ -0,0 +1,47 @@ +--- +source: crates/parser/tests/statement_parser_test.rs +description: "\nCREATE DATABASE x LOCATION DEFAULT;" +--- +Parse { + cst: SourceFile@0..36 + Newline@0..1 "\n" + CreatedbStmt@1..36 + Create@1..7 "CREATE" + Whitespace@7..8 " " + Database@8..16 "DATABASE" + Whitespace@16..17 " " + Ident@17..18 "x" + Whitespace@18..19 " " + DefElem@19..27 + Location@19..27 "LOCATION" + Whitespace@27..28 " " + Default@28..35 "DEFAULT" + Ascii59@35..36 ";" + , + errors: [], + stmts: [ + RawStmt { + stmt: CreatedbStmt( + CreatedbStmt { + dbname: "x", + options: [ + Node { + node: Some( + DefElem( + DefElem { + defnamespace: "", + defname: "location", + arg: None, + defaction: DefelemUnspec, + location: 18, + }, + ), + ), + }, + ], + }, + ), + range: 0..35, + }, + ], +} diff --git a/crates/parser/tests/snapshots/statements/valid/0047@5.snap b/crates/parser/tests/snapshots/statements/valid/0047@5.snap new file mode 100644 index 00000000..6e3c7564 --- /dev/null +++ b/crates/parser/tests/snapshots/statements/valid/0047@5.snap @@ -0,0 +1,57 @@ +--- +source: crates/parser/tests/statement_parser_test.rs +description: "\nCREATE DATABASE x TABLESPACE abc;" +--- +Parse { + cst: SourceFile@0..34 + Newline@0..1 "\n" + CreatedbStmt@1..34 + Create@1..7 "CREATE" + Whitespace@7..8 " " + Database@8..16 "DATABASE" + Whitespace@16..17 " " + Ident@17..18 "x" + Whitespace@18..19 " " + DefElem@19..33 + Tablespace@19..29 "TABLESPACE" + Whitespace@29..30 " " + Ident@30..33 "abc" + Ascii59@33..34 ";" + , + errors: [], + stmts: [ + RawStmt { + stmt: CreatedbStmt( + CreatedbStmt { + dbname: "x", + options: [ + Node { + node: Some( + DefElem( + DefElem { + defnamespace: "", + defname: "tablespace", + arg: Some( + Node { + node: Some( + String( + String { + sval: "abc", + }, + ), + ), + }, + ), + defaction: DefelemUnspec, + location: 18, + }, + ), + ), + }, + ], + }, + ), + range: 0..33, + }, + ], +} diff --git a/crates/parser/tests/snapshots/statements/valid/0047@6.snap b/crates/parser/tests/snapshots/statements/valid/0047@6.snap new file mode 100644 index 00000000..74c0dce1 --- /dev/null +++ b/crates/parser/tests/snapshots/statements/valid/0047@6.snap @@ -0,0 +1,57 @@ +--- +source: crates/parser/tests/statement_parser_test.rs +description: "\nCREATE DATABASE x TEMPLATE TRUE;" +--- +Parse { + cst: SourceFile@0..33 + Newline@0..1 "\n" + CreatedbStmt@1..33 + Create@1..7 "CREATE" + Whitespace@7..8 " " + Database@8..16 "DATABASE" + Whitespace@16..17 " " + Ident@17..18 "x" + Whitespace@18..19 " " + DefElem@19..32 + Template@19..27 "TEMPLATE" + Whitespace@27..28 " " + TrueP@28..32 "TRUE" + Ascii59@32..33 ";" + , + errors: [], + stmts: [ + RawStmt { + stmt: CreatedbStmt( + CreatedbStmt { + dbname: "x", + options: [ + Node { + node: Some( + DefElem( + DefElem { + defnamespace: "", + defname: "template", + arg: Some( + Node { + node: Some( + String( + String { + sval: "true", + }, + ), + ), + }, + ), + defaction: DefelemUnspec, + location: 18, + }, + ), + ), + }, + ], + }, + ), + range: 0..32, + }, + ], +} From 45f88be683ba728c8454d02c6a2feb1349f3ce58 Mon Sep 17 00:00:00 2001 From: Cedric Vangout Date: Tue, 19 Dec 2023 14:30:59 +0100 Subject: [PATCH 3/3] move properties to defelem --- crates/codegen/src/get_node_properties.rs | 26 ++++++++++--------- crates/parser/src/codegen.rs | 2 -- .../snapshots/statements/valid/0047@1.snap | 10 +++---- .../snapshots/statements/valid/0047@4.snap | 6 ++--- 4 files changed, 22 insertions(+), 22 deletions(-) diff --git a/crates/codegen/src/get_node_properties.rs b/crates/codegen/src/get_node_properties.rs index 90500672..15a872de 100644 --- a/crates/codegen/src/get_node_properties.rs +++ b/crates/codegen/src/get_node_properties.rs @@ -211,6 +211,19 @@ fn custom_handlers(node: &Node) -> TokenStream { tokens.push(TokenProperty::from(n)); }, "DefElem" => quote! { + match n.defname.as_str() { + "location" => { + tokens.push(TokenProperty::from(Token::Default)); + }, + "connection_limit" => { + tokens.push(TokenProperty::from(Token::Limit)); + tokens.push(TokenProperty::from(Token::Iconst)); + }, + "owner" => { + tokens.push(TokenProperty::from(Token::Owner)); + } + _ => {} + } match n.defaction() { protobuf::DefElemAction::DefelemUnspec => tokens.push(TokenProperty::from(Token::Ascii61)), _ => panic!("Unknown DefElem {:#?}", n.defaction()), @@ -679,24 +692,13 @@ fn custom_handlers(node: &Node) -> TokenStream { tokens.push(TokenProperty::from(Token::With)); } }, - "CompositeTypeStmt" => quote! { + "CompositeTypeStmt" => quote! { tokens.push(TokenProperty::from(Token::Create)); tokens.push(TokenProperty::from(Token::TypeP)); }, "CreatedbStmt" => quote! { tokens.push(TokenProperty::from(Token::Create)); tokens.push(TokenProperty::from(Token::Database)); - for option in &n.options { - if let Some(NodeEnum::DefElem(node)) = &option.node { - if node.defname == "location" { - tokens.push(TokenProperty::from(Token::Default)); - } - if node.defname == "connection_limit" { - tokens.push(TokenProperty::from(Token::Limit)); - tokens.push(TokenProperty::from(Token::Iconst)); - } - } - } }, _ => quote! {}, } diff --git a/crates/parser/src/codegen.rs b/crates/parser/src/codegen.rs index fe83182e..a4ee60b7 100644 --- a/crates/parser/src/codegen.rs +++ b/crates/parser/src/codegen.rs @@ -277,8 +277,6 @@ mod tests { vec![ TokenProperty::from(SyntaxKind::Create), TokenProperty::from(SyntaxKind::Database), - TokenProperty::from(SyntaxKind::Limit), - TokenProperty::from(SyntaxKind::Iconst), TokenProperty::from("x".to_string()), ], ) diff --git a/crates/parser/tests/snapshots/statements/valid/0047@1.snap b/crates/parser/tests/snapshots/statements/valid/0047@1.snap index 62204c30..a472c058 100644 --- a/crates/parser/tests/snapshots/statements/valid/0047@1.snap +++ b/crates/parser/tests/snapshots/statements/valid/0047@1.snap @@ -16,12 +16,12 @@ Parse { Whitespace@23..24 " " Ident@24..27 "abc" Whitespace@27..28 " " - DefElem@28..38 + DefElem@28..46 Connection@28..38 "CONNECTION" - Whitespace@38..39 " " - Limit@39..44 "LIMIT" - Whitespace@44..45 " " - Iconst@45..46 "5" + Whitespace@38..39 " " + Limit@39..44 "LIMIT" + Whitespace@44..45 " " + Iconst@45..46 "5" Ascii59@46..47 ";" , errors: [], diff --git a/crates/parser/tests/snapshots/statements/valid/0047@4.snap b/crates/parser/tests/snapshots/statements/valid/0047@4.snap index c48ecb70..a27baac8 100644 --- a/crates/parser/tests/snapshots/statements/valid/0047@4.snap +++ b/crates/parser/tests/snapshots/statements/valid/0047@4.snap @@ -12,10 +12,10 @@ Parse { Whitespace@16..17 " " Ident@17..18 "x" Whitespace@18..19 " " - DefElem@19..27 + DefElem@19..35 Location@19..27 "LOCATION" - Whitespace@27..28 " " - Default@28..35 "DEFAULT" + Whitespace@27..28 " " + Default@28..35 "DEFAULT" Ascii59@35..36 ";" , errors: [],