diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 50a2f674..8517ca70 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -17,6 +17,8 @@ jobs: steps: - name: 🏗 Setup repository uses: actions/checkout@v3 + with: + submodules: true - name: 🏗 Setup monorepo uses: ./.github/actions/setup-monorepo diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 00000000..e3989614 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "libpg_query"] + path = libpg_query + url = git@github.com:pganalyze/libpg_query.git diff --git a/Cargo.lock b/Cargo.lock index c52b49d2..9eed1789 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -40,7 +40,7 @@ checksum = "bc00ceb34980c03614e35a3a4e218276a0a824e911d07651cd0d858a51e8c0f0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.32", ] [[package]] @@ -95,24 +95,24 @@ checksum = "3a8241f3ebb85c056b509d4327ad0358fbbba6ffb340bf388f26350aeda225b1" [[package]] name = "bindgen" -version = "0.60.1" +version = "0.66.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "062dddbc1ba4aca46de6338e2bf87771414c335f7b2f2036e8f3e9befebf88e6" +checksum = "f2b84e06fc203107bfbad243f4aba2af864eb7db3b1cf46ea0a023b0b433d2a7" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.4.0", "cexpr", "clang-sys", - "clap", - "env_logger", "lazy_static", "lazycell", "log", "peeking_take_while", + "prettyplease", "proc-macro2", "quote", "regex", "rustc-hash", "shlex", + "syn 2.0.32", "which", ] @@ -176,36 +176,42 @@ dependencies = [ ] [[package]] -name = "clap" -version = "3.2.25" +name = "cmake" +version = "0.1.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ea181bf566f71cb9a5d17a59e1871af638180a18fb0035c92ae62b705207123" +checksum = "a31c789563b815f77f4250caee12365734369f942439b7defd71e18a48197130" dependencies = [ - "atty", - "bitflags 1.3.2", - "clap_lex", - "indexmap 1.9.3", - "strsim", - "termcolor", - "textwrap", + "cc", +] + +[[package]] +name = "codegen" +version = "0.0.0" +dependencies = [ + "pg_query_proto_parser", + "proc-macro2", + "quote", ] [[package]] -name = "clap_lex" -version = "0.2.4" +name = "console" +version = "0.15.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2850f2f5a82cbf437dd5af4d49848fbdfc27c157c3d010345776f952765261c5" +checksum = "c926e00cc70edefdc64d3a5ff31cc65bb97a3460097762bd23afb4d8145fccf8" dependencies = [ - "os_str_bytes", + "encode_unicode", + "lazy_static", + "libc", + "windows-sys 0.45.0", ] [[package]] -name = "cmake" -version = "0.1.50" +name = "convert_case" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a31c789563b815f77f4250caee12365734369f942439b7defd71e18a48197130" +checksum = "ec182b0ca2f35d8fc196cf3404988fd8b8c739a4d270ff118a398feb0cbec1ca" dependencies = [ - "cc", + "unicode-segmentation", ] [[package]] @@ -249,7 +255,7 @@ checksum = "0da6c38bede0ecec78757fe92451c463ac9e6d37961c2cbce6a20be917951baf" dependencies = [ "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.32", ] [[package]] @@ -277,6 +283,12 @@ version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" +[[package]] +name = "encode_unicode" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" + [[package]] name = "env_logger" version = "0.9.3" @@ -304,7 +316,7 @@ checksum = "6b30f669a7961ef1631673d2766cc92f52d64f7ef354d4fe0ddfd30ed52f0f4f" dependencies = [ "errno-dragonfly", "libc", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -404,7 +416,7 @@ checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" dependencies = [ "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.32", ] [[package]] @@ -533,6 +545,19 @@ dependencies = [ "hashbrown 0.14.0", ] +[[package]] +name = "insta" +version = "1.31.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0770b0a3d4c70567f0d58331f3088b0e4c4f56c9b8d764efe654b4a5d46de3a" +dependencies = [ + "console", + "lazy_static", + "linked-hash-map", + "similar", + "yaml-rust", +] + [[package]] name = "itertools" version = "0.10.5" @@ -576,6 +601,12 @@ dependencies = [ "winapi", ] +[[package]] +name = "linked-hash-map" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" + [[package]] name = "linux-raw-sys" version = "0.4.5" @@ -618,7 +649,7 @@ dependencies = [ "proc-macro2", "quote", "regex-syntax 0.6.29", - "syn 2.0.29", + "syn 2.0.32", ] [[package]] @@ -672,7 +703,7 @@ checksum = "927a765cd3fc26206e66b296465fa9d3e5ab003e651c1b3c060e7956d96b19d2" dependencies = [ "libc", "wasi", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -716,12 +747,6 @@ version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" -[[package]] -name = "os_str_bytes" -version = "6.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d5d9eb14b174ee9aa2ef96dc2b94637a2d4b6e7cb873c7e171f0c20c6cf3eac" - [[package]] name = "parking_lot" version = "0.12.1" @@ -742,16 +767,21 @@ dependencies = [ "libc", "redox_syscall", "smallvec", - "windows-targets", + "windows-targets 0.48.5", ] [[package]] name = "parser" version = "0.0.0" dependencies = [ + "codegen", "cstree", + "env_logger", + "insta", + "log", "logos", "pg_query", + "pg_query_proto_parser", "regex", "serde", "serde_json", @@ -781,9 +811,9 @@ dependencies = [ [[package]] name = "pg_query" -version = "0.7.0" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61c1738c89c0bfd5b76ff7f3817c5a7cf2d39e5e5f25b5d60433ab58a01aca02" +checksum = "d62d572612b3aa26c454f27f2a3d94c19b7d10edcca957c1d23767a8f3fbccb6" dependencies = [ "bindgen", "fs_extra", @@ -795,6 +825,15 @@ dependencies = [ "thiserror", ] +[[package]] +name = "pg_query_proto_parser" +version = "0.0.0" +dependencies = [ + "convert_case", + "protobuf", + "protobuf-parse", +] + [[package]] name = "pin-project" version = "1.1.3" @@ -812,7 +851,7 @@ checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405" dependencies = [ "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.32", ] [[package]] @@ -829,7 +868,7 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "postgres_lsp" -version = "0.1.0" +version = "0.0.0" dependencies = [ "dashmap", "env_logger", @@ -842,6 +881,16 @@ dependencies = [ "tower-lsp", ] +[[package]] +name = "prettyplease" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae005bd773ab59b4725093fd7df83fd7892f7d8eafb48dbd7de6e024e4215f9d" +dependencies = [ + "proc-macro2", + "syn 2.0.32", +] + [[package]] name = "proc-macro-error" version = "1.0.4" @@ -930,6 +979,42 @@ dependencies = [ "prost", ] +[[package]] +name = "protobuf" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b55bad9126f378a853655831eb7363b7b01b81d19f8cb1218861086ca4a1a61e" +dependencies = [ + "once_cell", + "protobuf-support", + "thiserror", +] + +[[package]] +name = "protobuf-parse" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d39b14605eaa1f6a340aec7f320b34064feb26c93aec35d6a9a2272a8ddfa49" +dependencies = [ + "anyhow", + "indexmap 1.9.3", + "log", + "protobuf", + "protobuf-support", + "tempfile", + "thiserror", + "which", +] + +[[package]] +name = "protobuf-support" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5d4d7b8601c814cfb36bcebb79f0e61e45e1e93640cf778837833bbed05c372" +dependencies = [ + "thiserror", +] + [[package]] name = "quote" version = "1.0.33" @@ -1015,7 +1100,7 @@ dependencies = [ "errno", "libc", "linux-raw-sys", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -1047,7 +1132,7 @@ checksum = "dc59dfdcbad1437773485e0367fea4b090a2e0a16d9ffc46af47764536a298ec" dependencies = [ "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.32", ] [[package]] @@ -1069,7 +1154,7 @@ checksum = "8725e1dfadb3a50f7e5ce0b1a540466f6ed3fe7a0fca2ac2b8b831d31316bd00" dependencies = [ "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.32", ] [[package]] @@ -1087,6 +1172,12 @@ dependencies = [ "libc", ] +[[package]] +name = "similar" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "420acb44afdae038210c99e69aae24109f32f15500aa708e81d46c9f29d55fcf" + [[package]] name = "slab" version = "0.4.9" @@ -1109,7 +1200,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2538b18701741680e0322a2302176d3253a35388e2e62f172f64f4f16605f877" dependencies = [ "libc", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -1130,12 +1221,6 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f026164926842ec52deb1938fae44f83dfdb82d0a5b0270c5bd5935ab74d6dd" -[[package]] -name = "strsim" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" - [[package]] name = "syn" version = "1.0.109" @@ -1149,9 +1234,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.29" +version = "2.0.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c324c494eba9d92503e6f1ef2e6df781e78f6a7705a0202d9801b198807d518a" +checksum = "239814284fd6f1a4ffe4ca893952cdd93c224b6a1571c9a9eadd670295c0c9e2" dependencies = [ "proc-macro2", "quote", @@ -1168,7 +1253,7 @@ dependencies = [ "fastrand", "redox_syscall", "rustix", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -1186,12 +1271,6 @@ version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f18aa187839b2bdb1ad2fa35ead8c4c2976b64e4363c386d45ac0f7ee85c9233" -[[package]] -name = "textwrap" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "222a222a5bfe1bba4a77b45ec488a741b3cb8872e5e499451fd7d0129c9c7c3d" - [[package]] name = "thiserror" version = "1.0.47" @@ -1209,7 +1288,7 @@ checksum = "6bb623b56e39ab7dcd4b1b98bb6c8f8d907ed255b18de254088016b27a8ee19b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.32", ] [[package]] @@ -1260,7 +1339,7 @@ dependencies = [ "signal-hook-registry", "socket2", "tokio-macros", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -1271,7 +1350,7 @@ checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.32", ] [[package]] @@ -1368,7 +1447,7 @@ checksum = "5f4f31f56159e98206da9efd823404b79b6ef3143b4a7ab76e67b1751b25a4ab" dependencies = [ "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.32", ] [[package]] @@ -1410,6 +1489,12 @@ dependencies = [ "tinyvec", ] +[[package]] +name = "unicode-segmentation" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1dd624098567895118886609431a7c3b8f516e41d30e0643f03d94592a147e36" + [[package]] name = "url" version = "2.4.0" @@ -1476,13 +1561,37 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +[[package]] +name = "windows-sys" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +dependencies = [ + "windows-targets 0.42.2", +] + [[package]] name = "windows-sys" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" dependencies = [ - "windows-targets", + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-targets" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", ] [[package]] @@ -1491,51 +1600,93 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", ] +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + [[package]] name = "windows_aarch64_gnullvm" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + [[package]] name = "windows_aarch64_msvc" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" +[[package]] +name = "windows_i686_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + [[package]] name = "windows_i686_gnu" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" +[[package]] +name = "windows_i686_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + [[package]] name = "windows_i686_msvc" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + [[package]] name = "windows_x86_64_gnu" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + [[package]] name = "windows_x86_64_gnullvm" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" + [[package]] name = "windows_x86_64_msvc" version = "0.48.5" @@ -1591,6 +1742,15 @@ dependencies = [ "zip", ] +[[package]] +name = "yaml-rust" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56c1936c4cc7a1c9ab21a1ebb602eb942ba868cbd44a99cb7cdc5892335e1c85" +dependencies = [ + "linked-hash-map", +] + [[package]] name = "zip" version = "0.6.6" diff --git a/Cargo.toml b/Cargo.toml index c4af3bd3..a8ccb32b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -9,4 +9,11 @@ rust-version = "1.71" [workspace.dependencies] parser = { path = "./crates/parser", version = "0.0.0" } +codegen = { path = "./crates/codegen", version = "0.0.0" } +sourcegen = { path = "./crates/sourcegen", version = "0.0.0" } +pg_query_proto_parser = { path = "./crates/pg_query_proto_parser", version = "0.0.0" } triomphe = { version = "0.1.8", default-features = false, features = ["std"] } + +[profile.dev.package] +insta.opt-level = 3 +similar.opt-level = 3 diff --git a/crates/codegen/Cargo.toml b/crates/codegen/Cargo.toml new file mode 100644 index 00000000..86b06851 --- /dev/null +++ b/crates/codegen/Cargo.toml @@ -0,0 +1,16 @@ +[package] +name = "codegen" +version = "0.0.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +proc-macro2 = "1.0.66" +quote = "1.0.33" +pg_query_proto_parser.workspace = true + +[lib] +proc-macro = true +doctest = false + diff --git a/crates/codegen/src/get_children.rs b/crates/codegen/src/get_children.rs new file mode 100644 index 00000000..e92c5f6e --- /dev/null +++ b/crates/codegen/src/get_children.rs @@ -0,0 +1,126 @@ +use pg_query_proto_parser::{FieldType, Node, ProtoParser}; +use proc_macro2::{Ident, TokenStream}; +use quote::{format_ident, quote}; + +pub fn get_children_mod(_item: proc_macro2::TokenStream) -> proc_macro2::TokenStream { + let parser = ProtoParser::new("./libpg_query/protobuf/pg_query.proto"); + let proto_file = parser.parse(); + + let manual_node_names = manual_node_names(); + + let node_identifiers = node_identifiers(&proto_file.nodes, &manual_node_names); + let node_handlers = node_handlers(&proto_file.nodes, &manual_node_names); + + quote! { + use pg_query::NodeEnum; + use std::collections::VecDeque; + + #[derive(Debug, Clone)] + pub struct ChildrenNode { + pub node: NodeEnum, + pub depth: i32, + pub path: String, + } + + /// Returns all children of the node, recursively + /// location is resolved manually + pub fn get_children(node: &NodeEnum, text: String, current_depth: i32) -> Vec<ChildrenNode> { + let mut nodes: Vec<ChildrenNode> = vec![]; + // Node, depth, path + let mut stack: VecDeque<(NodeEnum, i32, String)> = + VecDeque::from(vec![(node.to_owned(), current_depth, "0".to_string())]); + while !stack.is_empty() { + let (node, depth, path) = stack.pop_front().unwrap(); + let current_depth = depth + 1; + let mut child_ctr: i32 = 0; + let mut handle_child = |c: NodeEnum| { + let path = path.clone() + "." + child_ctr.to_string().as_str(); + child_ctr = child_ctr + 1; + stack.push_back((c.to_owned(), current_depth, path.clone())); + nodes.push(ChildrenNode { + node: c, + depth: current_depth, + path: path.clone(), + }); + }; + match &node { + // `AConst` is the only node with a `one of` property, so we handle it manually + // if you need to handle other nodes manually, add them to the `manual_node_names` function below + NodeEnum::AConst(n) => { + if n.val.is_some() { + handle_child(match n.val.to_owned().unwrap() { + pg_query::protobuf::a_const::Val::Ival(v) => NodeEnum::Integer(v), + pg_query::protobuf::a_const::Val::Fval(v) => NodeEnum::Float(v), + pg_query::protobuf::a_const::Val::Boolval(v) => NodeEnum::Boolean(v), + pg_query::protobuf::a_const::Val::Sval(v) => NodeEnum::String(v), + pg_query::protobuf::a_const::Val::Bsval(v) => NodeEnum::BitString(v), + }); + } + } + #(NodeEnum::#node_identifiers(n) => {#node_handlers}),*, + }; + } + nodes + } + } +} + +fn manual_node_names() -> Vec<&'static str> { + vec!["AConst"] +} + +fn node_identifiers(nodes: &[Node], exclude_nodes: &[&str]) -> Vec<Ident> { + nodes + .iter() + .filter(|node| !exclude_nodes.contains(&node.name.as_str())) + .map(|node| format_ident!("{}", &node.name)) + .collect() +} + +fn node_handlers(nodes: &[Node], exclude_nodes: &[&str]) -> Vec<TokenStream> { + nodes + .iter() + .filter(|node| !exclude_nodes.contains(&node.name.as_str())) + .map(|node| { + let property_handlers = property_handlers(&node); + quote! { + #(#property_handlers)* + } + }) + .collect() +} + +fn property_handlers(node: &Node) -> Vec<TokenStream> { + node.fields + .iter() + .filter_map(|field| { + let field_name = format_ident!("{}", field.name.as_str()); + if field.field_type == FieldType::Node && field.repeated { + Some(quote! { + n.#field_name + .iter() + .for_each(|x| handle_child(x.node.as_ref().unwrap().to_owned())); + + }) + } else if field.field_type == FieldType::Node && field.is_one_of == false { + if field.node_name == Some("Node".to_owned()) { + Some(quote! { + if n.#field_name.is_some() { + handle_child(n.#field_name.to_owned().unwrap().node.unwrap()); + } + }) + } else { + let enum_variant_name = + format_ident!("{}", field.enum_variant_name.as_ref().unwrap().as_str()); + Some(quote! { + if n.#field_name.is_some() { + handle_child(NodeEnum::#enum_variant_name(n.#field_name.to_owned().unwrap())); + } + }) + } + } else { + None + } + }) + .collect() +} diff --git a/crates/codegen/src/get_location.rs b/crates/codegen/src/get_location.rs new file mode 100644 index 00000000..29c79088 --- /dev/null +++ b/crates/codegen/src/get_location.rs @@ -0,0 +1,72 @@ +use pg_query_proto_parser::{FieldType, Node, ProtoParser}; +use proc_macro2::{Ident, TokenStream}; +use quote::{format_ident, quote}; + +pub fn get_location_mod(_item: proc_macro2::TokenStream) -> proc_macro2::TokenStream { + let parser = ProtoParser::new("./libpg_query/protobuf/pg_query.proto"); + let proto_file = parser.parse(); + + let manual_node_names = manual_node_names(); + + let node_identifiers = node_identifiers(&proto_file.nodes, &manual_node_names); + let location_idents = location_idents(&proto_file.nodes, &manual_node_names); + + quote! { + use pg_query::NodeEnum; + + // Returns the location of a node + pub fn get_location(node: &NodeEnum) -> Option<i32> { + let location = match node { + // for some nodes, the location of the node itself is after their childrens location. + // we implement the logic for those nodes manually. + // if you add one, make sure to add its name to `manual_node_names()`. + NodeEnum::BoolExpr(n) => { + let a = n.args.iter().min_by(|a, b| { + let loc_a = get_location(&a.node.as_ref().unwrap()); + let loc_b = get_location(&b.node.as_ref().unwrap()); + loc_a.cmp(&loc_b) + }); + get_location(&a.unwrap().node.as_ref().unwrap()) + }, + NodeEnum::AExpr(n) => get_location(&n.lexpr.as_ref().unwrap().node.as_ref().unwrap()), + #(NodeEnum::#node_identifiers(n) => #location_idents),* + }; + if location.is_some() && location.unwrap() < 0 { + None + } else { + location + } + } + } +} + +fn manual_node_names() -> Vec<&'static str> { + vec!["BoolExpr", "AExpr"] +} + +fn location_idents(nodes: &[Node], exclude_nodes: &[&str]) -> Vec<TokenStream> { + nodes + .iter() + .filter(|n| !exclude_nodes.contains(&n.name.as_str())) + .map(|node| { + if node + .fields + .iter() + .find(|n| n.name == "location" && n.field_type == FieldType::Int32) + .is_some() + { + quote! { Some(n.location) } + } else { + quote! { None } + } + }) + .collect() +} + +fn node_identifiers(nodes: &[Node], exclude_nodes: &[&str]) -> Vec<Ident> { + nodes + .iter() + .filter(|n| !exclude_nodes.contains(&n.name.as_str())) + .map(|node| format_ident!("{}", &node.name)) + .collect() +} diff --git a/crates/codegen/src/lib.rs b/crates/codegen/src/lib.rs new file mode 100644 index 00000000..fba42ea7 --- /dev/null +++ b/crates/codegen/src/lib.rs @@ -0,0 +1,22 @@ +mod get_children; +mod get_location; +mod syntax_kind; + +use get_children::get_children_mod; +use get_location::get_location_mod; +use syntax_kind::syntax_kind_mod; + +#[proc_macro] +pub fn get_children(item: proc_macro::TokenStream) -> proc_macro::TokenStream { + get_children_mod(item.into()).into() +} + +#[proc_macro] +pub fn syntax_kind(item: proc_macro::TokenStream) -> proc_macro::TokenStream { + syntax_kind_mod(item.into()).into() +} + +#[proc_macro] +pub fn get_location(item: proc_macro::TokenStream) -> proc_macro::TokenStream { + get_location_mod(item.into()).into() +} diff --git a/crates/codegen/src/syntax_kind.rs b/crates/codegen/src/syntax_kind.rs new file mode 100644 index 00000000..652cb16b --- /dev/null +++ b/crates/codegen/src/syntax_kind.rs @@ -0,0 +1,126 @@ +use std::collections::HashSet; +use std::env::current_dir; + +use pg_query_proto_parser::{Node, ProtoParser, Token}; +use proc_macro2::{Ident, Literal}; +use quote::{format_ident, quote}; + +pub fn syntax_kind_mod(_item: proc_macro2::TokenStream) -> proc_macro2::TokenStream { + let parser = ProtoParser::new("libpg_query/protobuf/pg_query.proto"); + let proto_file = parser.parse(); + + let custom_node_names = custom_node_names(); + let custom_node_identifiers = custom_node_identifiers(&custom_node_names); + + let node_identifiers = node_identifiers(&proto_file.nodes); + + let token_identifiers = token_identifiers(&proto_file.tokens); + let token_value_literals = token_value_literals(&proto_file.tokens); + + let syntax_kind_impl = + syntax_kind_impl(&node_identifiers, &token_identifiers, &token_value_literals); + + let mut enum_variants = HashSet::new(); + enum_variants.extend(&custom_node_identifiers); + enum_variants.extend(&node_identifiers); + enum_variants.extend(&token_identifiers); + let unique_enum_variants = enum_variants.into_iter().collect::<Vec<_>>(); + + quote! { + use cstree::Syntax; + use pg_query::{protobuf::ScanToken, NodeEnum, NodeRef}; + + /// An u32 enum of all valid syntax elements (nodes and tokens) of the postgres + /// sql dialect, and a few custom ones that are not parsed by pg_query.rs, such + /// as `Whitespace`. + #[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Debug, Syntax)] + #[repr(u32)] + pub enum SyntaxKind { + #(#unique_enum_variants),*, + } + + #syntax_kind_impl + } +} + +fn custom_node_names() -> Vec<&'static str> { + vec![ + "SourceFile", + "Comment", + "Whitespace", + "Newline", + "Tab", + "Stmt", + ] +} + +fn custom_node_identifiers(custom_node_names: &[&str]) -> Vec<Ident> { + custom_node_names + .iter() + .map(|&node_name| format_ident!("{}", node_name)) + .collect() +} + +fn node_identifiers(nodes: &[Node]) -> Vec<Ident> { + nodes + .iter() + .map(|node| format_ident!("{}", &node.name)) + .collect() +} + +fn token_identifiers(tokens: &[Token]) -> Vec<Ident> { + tokens + .iter() + .map(|token| format_ident!("{}", &token.name)) + .collect() +} + +fn token_value_literals(tokens: &[Token]) -> Vec<Literal> { + tokens + .iter() + .map(|token| Literal::i32_unsuffixed(token.value)) + .collect() +} + +fn syntax_kind_impl( + node_identifiers: &[Ident], + token_identifiers: &[Ident], + token_value_literals: &[Literal], +) -> proc_macro2::TokenStream { + let new_from_pg_query_node_fn = new_from_pg_query_node_fn(node_identifiers); + let new_from_pg_query_token_fn = + new_from_pg_query_token_fn(token_identifiers, token_value_literals); + quote! { + impl SyntaxKind { + #new_from_pg_query_node_fn + + #new_from_pg_query_token_fn + } + } +} + +fn new_from_pg_query_node_fn(node_identifiers: &[Ident]) -> proc_macro2::TokenStream { + quote! { + /// Converts a `pg_query` node to a `SyntaxKind` + pub fn new_from_pg_query_node(node: &NodeEnum) -> Self { + match node { + #(NodeEnum::#node_identifiers(_) => SyntaxKind::#node_identifiers),* + } + } + } +} + +fn new_from_pg_query_token_fn( + token_identifiers: &[Ident], + token_value_literals: &[Literal], +) -> proc_macro2::TokenStream { + quote! { + /// Converts a `pg_query` token to a `SyntaxKind` + pub fn new_from_pg_query_token(token: &ScanToken) -> Self { + match token.token { + #(#token_value_literals => SyntaxKind::#token_identifiers),*, + _ => panic!("Unknown token: {:?}", token.token), + } + } + } +} diff --git a/crates/parser/Cargo.toml b/crates/parser/Cargo.toml index c5bb8591..2049bace 100644 --- a/crates/parser/Cargo.toml +++ b/crates/parser/Cargo.toml @@ -7,8 +7,19 @@ edition = "2021" [dependencies] cstree = { version = "0.12.0", features = ["derive"] } -pg_query = "0.7" +pg_query = "0.8" logos = "0.13.0" serde_json = "1.0" regex = "1.9.1" serde = { version = "1.0", features = ["derive"] } +env_logger = { version = "0.9.1" } +log = { version = "0.4.20" } + +codegen.workspace = true +pg_query_proto_parser.workspace = true + +[dev-dependencies] +insta = "1.31.0" + +[lib] +doctest = false diff --git a/crates/parser/src/lib.rs b/crates/parser/src/lib.rs index 69076f3e..e871b2a5 100644 --- a/crates/parser/src/lib.rs +++ b/crates/parser/src/lib.rs @@ -17,13 +17,13 @@ mod ast_node; mod parser; -mod pg_query_utils; +mod sibling_token; mod source_file; mod statement; mod syntax_error; -mod syntax_kind; +mod syntax_kind_codegen; mod syntax_node; pub use crate::parser::{Parse, Parser}; -pub use crate::syntax_kind::SyntaxKind; +pub use crate::syntax_kind_codegen::SyntaxKind; pub use crate::syntax_node::{SyntaxElement, SyntaxNode, SyntaxToken}; diff --git a/crates/parser/src/parser.rs b/crates/parser/src/parser.rs index 3f9201c3..80219f8d 100644 --- a/crates/parser/src/parser.rs +++ b/crates/parser/src/parser.rs @@ -1,10 +1,11 @@ use cstree::syntax::ResolvedNode; use cstree::{build::GreenNodeBuilder, text::TextRange}; +use log::debug; use pg_query::NodeEnum; use crate::ast_node::RawStmt; use crate::syntax_error::SyntaxError; -use crate::syntax_kind::{SyntaxKind, SyntaxKindType}; +use crate::syntax_kind_codegen::SyntaxKind; use crate::syntax_node::SyntaxNode; /// Main parser that controls the cst building process, and collects errors and statements @@ -12,10 +13,6 @@ use crate::syntax_node::SyntaxNode; pub struct Parser { /// The cst builder inner: GreenNodeBuilder<'static, 'static, SyntaxKind>, - /// A buffer for tokens that are not yet applied to the cst - token_buffer: Vec<(SyntaxKind, String)>, - /// The current depth of the cst - curr_depth: i32, /// The syntax errors accumulated during parsing errors: Vec<SyntaxError>, /// The pg_query statements representing the abtract syntax tree @@ -24,6 +21,9 @@ pub struct Parser { checkpoint: Option<i32>, /// Whether the parser is currently parsing a flat node is_parsing_flat_node: bool, + /// Keeps track of currently open nodes + /// Latest opened is last + open_nodes: Vec<(SyntaxKind, i32)>, } /// Result of parsing @@ -40,43 +40,46 @@ pub struct Parse { impl Parser { pub fn new() -> Self { Self { - curr_depth: -1, inner: GreenNodeBuilder::new(), - token_buffer: Vec::new(), errors: Vec::new(), stmts: Vec::new(), checkpoint: None, is_parsing_flat_node: false, + open_nodes: Vec::new(), } } /// close all nodes until the specified depth is reached pub fn close_until_depth(&mut self, depth: i32) { - while self.curr_depth >= depth { + debug!("close until depth {}", depth); + if self.open_nodes.is_empty() || self.get_current_depth() < depth { + return; + } + loop { + if self.open_nodes.is_empty() || self.get_current_depth() < depth { + break; + } self.finish_node(); - self.curr_depth -= 1; } } + fn get_current_depth(&self) -> i32 { + self.open_nodes[self.open_nodes.len() - 1].1 + } + /// set a checkpoint at current depth /// /// if `is_parsing_flat_node` is true, all tokens parsed until this checkpoint is closed will be applied immediately - pub fn set_checkpoint(&mut self, is_parsing_flat_node: bool) { + pub fn set_checkpoint(&mut self) { assert!( self.checkpoint.is_none(), "Must close previouos checkpoint before setting new one" ); - assert!( - self.token_buffer.is_empty(), - "Token buffer must be empty before setting a checkpoint" - ); - self.checkpoint = Some(self.curr_depth); - self.is_parsing_flat_node = is_parsing_flat_node; + self.checkpoint = Some(self.get_current_depth()); } /// close all nodes until checkpoint depth is reached pub fn close_checkpoint(&mut self) { - self.consume_token_buffer(); if self.checkpoint.is_some() { self.close_until_depth(self.checkpoint.unwrap()); } @@ -84,64 +87,34 @@ impl Parser { self.is_parsing_flat_node = false; } - /// start a new node of `SyntaxKind` - pub fn start_node(&mut self, kind: SyntaxKind) { - self.inner.start_node(kind); - } - /// start a new node of `SyntaxKind` at `depth` /// handles closing previous nodes if necessary - /// and consumes token buffer before starting new node - pub fn start_node_at(&mut self, kind: SyntaxKind, depth: Option<i32>) { - let depth = depth.unwrap_or(self.curr_depth + 1); + pub fn start_node_at(&mut self, kind: SyntaxKind, depth: i32) { + debug!("starting node at depth {} {:?}", depth, kind); // close until target depth self.close_until_depth(depth); - self.consume_token_buffer(); - - self.curr_depth = depth; - self.start_node(kind); + self.open_nodes.push((kind, depth)); + debug!("start node {:?}", kind); + self.inner.start_node(kind); } /// finish current node pub fn finish_node(&mut self) { - self.inner.finish_node(); - } + debug!("finish_node"); - /// Drains the token buffer and applies all tokens - pub fn consume_token_buffer(&mut self) { - for (kind, text) in self.token_buffer.drain(..) { - self.inner.token(kind, &text); + let n = self.open_nodes.pop(); + if n.is_none() { + panic!("No node to finish"); } + + debug!("finish node {:?}", n.unwrap().0); + self.inner.finish_node(); } - /// applies token based on its `SyntaxKindType` - /// if `SyntaxKindType::Close`, closes all nodes until depth 1 - /// if `SyntaxKindType::Follow`, add token to buffer and wait until next node to apply token at same depth - /// otherwise, applies token immediately - /// - /// if `is_parsing_flat_node` is true, applies token immediately + /// applies token pub fn token(&mut self, kind: SyntaxKind, text: &str) { - if self.is_parsing_flat_node { - self.inner.token(kind, text); - return; - } - - match kind.get_type() { - Some(SyntaxKindType::Close) => { - // move up to depth 2 and consume buffered tokens before applying closing token - self.close_until_depth(2); - self.consume_token_buffer(); - self.inner.token(kind, text); - } - Some(SyntaxKindType::Follow) => { - // wait until next node, and apply token at same depth - self.token_buffer.push((kind, text.to_string())); - } - _ => { - self.inner.token(kind, text); - } - } + self.inner.token(kind, text); } /// collects an SyntaxError with an `error` message at `range` diff --git a/crates/parser/src/pg_query_utils.rs b/crates/parser/src/pg_query_utils.rs deleted file mode 100644 index 53fe07c5..00000000 --- a/crates/parser/src/pg_query_utils.rs +++ /dev/null @@ -1,18 +0,0 @@ -use pg_query::NodeRef; - -/// Gets the position value for a pg_query node -/// -/// This can mostly be generated by just returning `node.location` if the type has the property, -/// but there are some exceptions where the location on the node itself is not leftmost position, e.g. for `AExpr`. -pub fn get_position_for_pg_query_node(node: &NodeRef) -> i32 { - match node { - NodeRef::ResTarget(n) => n.location, - NodeRef::AExpr(n) => get_position_for_pg_query_node( - &n.lexpr.as_ref().unwrap().node.as_ref().unwrap().to_ref(), - ), - NodeRef::RangeVar(n) => n.location, - NodeRef::ColumnRef(n) => n.location, - NodeRef::AConst(n) => n.location, - _ => -1, - } -} diff --git a/crates/parser/src/sibling_token.rs b/crates/parser/src/sibling_token.rs new file mode 100644 index 00000000..6a42dd0d --- /dev/null +++ b/crates/parser/src/sibling_token.rs @@ -0,0 +1,31 @@ +use crate::syntax_kind_codegen::SyntaxKind; + +impl SyntaxKind { + pub fn is_opening_sibling(&self) -> bool { + match self { + SyntaxKind::Ascii40 => true, + SyntaxKind::Ascii91 => true, + SyntaxKind::Case => true, + _ => false, + } + } + pub fn is_closing_sibling(&self) -> bool { + match self { + SyntaxKind::Ascii41 => true, + SyntaxKind::Ascii93 => true, + SyntaxKind::EndP => true, + _ => false, + } + } + pub fn sibling(&self) -> Option<SyntaxKind> { + match self { + SyntaxKind::Case => Some(SyntaxKind::EndP), + SyntaxKind::EndP => Some(SyntaxKind::Case), + SyntaxKind::Ascii40 => Some(SyntaxKind::Ascii41), + SyntaxKind::Ascii41 => Some(SyntaxKind::Ascii40), + SyntaxKind::Ascii91 => Some(SyntaxKind::Ascii93), + SyntaxKind::Ascii93 => Some(SyntaxKind::Ascii91), + _ => None, + } + } +} diff --git a/crates/parser/src/source_file.rs b/crates/parser/src/source_file.rs index 0a433966..9ae9b641 100644 --- a/crates/parser/src/source_file.rs +++ b/crates/parser/src/source_file.rs @@ -1,6 +1,6 @@ use logos::Logos; -use crate::{parser::Parser, syntax_kind::SyntaxKind}; +use crate::{parser::Parser, syntax_kind_codegen::SyntaxKind}; /// A super simple lexer for sql files that splits the input into indivudual statements and /// comments. @@ -28,7 +28,7 @@ impl Parser { pub fn parse_source_file(&mut self, text: &str) { let mut lexer = SourceFileToken::lexer(text); - self.start_node_at(SyntaxKind::SourceFile, Some(0)); + self.start_node_at(SyntaxKind::SourceFile, 0); while let Some(token) = lexer.next() { match token { Ok(token) => { @@ -95,7 +95,6 @@ select 1; "; let mut parser = Parser::new(); - println!("input {:?}", input); parser.parse_source_file(input); let parsed = parser.finish(); diff --git a/crates/parser/src/statement.rs b/crates/parser/src/statement.rs index 6de2e1fe..51b488b5 100644 --- a/crates/parser/src/statement.rs +++ b/crates/parser/src/statement.rs @@ -1,63 +1,15 @@ use cstree::text::{TextRange, TextSize}; -use logos::Logos; -use regex::Regex; +use logos::{Logos, Span}; -use crate::{ - parser::Parser, pg_query_utils::get_position_for_pg_query_node, syntax_kind::SyntaxKind, -}; +use crate::{parser::Parser, syntax_kind_codegen::SyntaxKind}; /// A super simple lexer for sql statements. /// -/// One weakness of pg_query.rs is that it does not parse whitespace or newlines. To circumvent -/// this, we use a very simple lexer that just knows what kind of characters are being used. It -/// does not know anything about postgres syntax or keywords. For example, all words such as `select` and `from` are put into the `Word` type. +/// One weakness of pg_query.rs is that it does not parse whitespace or newlines. We use a very +/// simple lexer to fill the gaps. #[derive(Logos, Debug, PartialEq)] pub enum StatementToken { - // copied from protobuf::Token. can be generated later - #[token("%")] - Ascii37, - #[token("(")] - Ascii40, - #[token(")")] - Ascii41, - #[token("*")] - Ascii42, - #[token("+")] - Ascii43, - #[token(",")] - Ascii44, - #[token("-")] - Ascii45, - #[token(".")] - Ascii46, - #[token("/")] - Ascii47, - #[token(":")] - Ascii58, - #[token(";")] - Ascii59, - #[token("<")] - Ascii60, - #[token("=")] - Ascii61, - #[token(">")] - Ascii62, - #[token("?")] - Ascii63, - #[token("[")] - Ascii91, - #[token("\\")] - Ascii92, - #[token("]")] - Ascii93, - #[token("^")] - Ascii94, - // comments, whitespaces and keywords - // FIXME: nexted and named dollar quoted strings do not work yet - #[regex("'([^']+)'|\\$(\\w)?\\$.*\\$(\\w)?\\$")] - Sconst, - #[regex("(\\w+)"gm)] - Word, + // comments and whitespaces #[regex(" +"gm)] Whitespace, #[regex("\n+"gm)] @@ -73,32 +25,10 @@ impl StatementToken { /// can be generated. pub fn syntax_kind(&self) -> SyntaxKind { match self { - StatementToken::Ascii37 => SyntaxKind::Ascii37, - StatementToken::Ascii40 => SyntaxKind::Ascii40, - StatementToken::Ascii41 => SyntaxKind::Ascii41, - StatementToken::Ascii42 => SyntaxKind::Ascii42, - StatementToken::Ascii43 => SyntaxKind::Ascii43, - StatementToken::Ascii44 => SyntaxKind::Ascii44, - StatementToken::Ascii45 => SyntaxKind::Ascii45, - StatementToken::Ascii46 => SyntaxKind::Ascii46, - StatementToken::Ascii47 => SyntaxKind::Ascii47, - StatementToken::Ascii58 => SyntaxKind::Ascii58, - StatementToken::Ascii59 => SyntaxKind::Ascii59, - StatementToken::Ascii60 => SyntaxKind::Ascii60, - StatementToken::Ascii61 => SyntaxKind::Ascii61, - StatementToken::Ascii62 => SyntaxKind::Ascii62, - StatementToken::Ascii63 => SyntaxKind::Ascii63, - StatementToken::Ascii91 => SyntaxKind::Ascii91, - StatementToken::Ascii92 => SyntaxKind::Ascii92, - StatementToken::Ascii93 => SyntaxKind::Ascii93, - StatementToken::Ascii94 => SyntaxKind::Ascii94, - StatementToken::Word => SyntaxKind::Word, StatementToken::Whitespace => SyntaxKind::Whitespace, StatementToken::Newline => SyntaxKind::Newline, StatementToken::Tab => SyntaxKind::Tab, - StatementToken::Sconst => SyntaxKind::Sconst, StatementToken::Comment => SyntaxKind::Comment, - _ => panic!("Unknown StatementToken: {:?}", self), } } } @@ -107,18 +37,17 @@ impl Parser { /// The main entry point for parsing a statement `text`. `at_offset` is the offset of the statement in the source file. /// /// On a high level, the algorithm works as follows: - /// 1. Parse the statement with pg_query.rs and order nodes by their position. If the - /// statement contains syntax errors, the parser will report the error and continue to work without information + /// 1. Parse the statement with pg_query.rs. If the statement contains syntax errors, the parser will report the error and continue to work without information /// about the nodes. The result will be a flat list of tokens under the generic `Stmt` node. /// If successful, the first node in the ordered list will be the main node of the statement, /// and serves as a root node. /// 2. Scan the statements for tokens with pg_query.rs. This will never fail, even if the statement contains syntax errors. - /// 3. Parse the statement with the `StatementToken` lexer. The lexer will be the main vehicle - /// while walking the statement. - /// 4. Walk the statement with the `StatementToken` lexer. - /// - at every token, consume all nodes that are within the token's range. - /// - if there is a pg_query token within the token's range, consume it. if not, fallback to - /// the StatementToken. This is the case for e.g. whitespace. + /// 3. Parse the statement with the `StatementToken` lexer. The lexer only contains the tokens + /// that are not parsed by pg_query.rs, such as whitespace. + /// 4. Define a pointer that starts at 0 and move it along the statement. + /// - first, check if the current pointer is within a pg_query token. If so, consume the + /// token. + /// - if not, consume the next token from the `StatementToken` lexer. /// 5. Close all open nodes for that statement. pub fn parse_statement(&mut self, text: &str, at_offset: Option<u32>) { let offset = at_offset.unwrap_or(0); @@ -135,97 +64,94 @@ impl Parser { } }; - let parsed = pg_query::parse(text); - let proto; - let mut nodes; - let mut pg_query_nodes = match parsed { - Ok(parsed) => { - proto = parsed.protobuf; - - nodes = proto.nodes(); - - nodes.sort_by(|a, b| { - get_position_for_pg_query_node(&a.0).cmp(&get_position_for_pg_query_node(&b.0)) - }); - - nodes.into_iter().peekable() - } + // Get root node with depth 1 + // Since we are parsing only a single statement there can be only a single node at depth 1 + let pg_query_root = match pg_query::parse(text) { + Ok(parsed) => Some( + parsed + .protobuf + .nodes() + .iter() + .find(|n| n.1 == 1) + .unwrap() + .0 + .to_enum(), + ), Err(e) => { self.error(e.to_string(), range); - Vec::new().into_iter().peekable() + None } }; let mut lexer = StatementToken::lexer(&text); // parse root node if no syntax errors - if pg_query_nodes.peek().is_some() { - let (node, depth, _) = pg_query_nodes.next().unwrap(); - self.stmt(node.to_enum(), range); - self.start_node_at(SyntaxKind::from_pg_query_node(&node), Some(depth)); - // if there is only one node, there are no children, and we do not need to buffer the - // tokens. this happens for example with create or alter function statements. - self.set_checkpoint(pg_query_nodes.peek().is_none()); + if pg_query_root.is_some() { + let root_node = pg_query_root.unwrap(); + self.stmt(root_node.to_owned(), range); + self.start_node_at(SyntaxKind::new_from_pg_query_node(&root_node), 1); } else { // fallback to generic node as root - self.start_node_at(SyntaxKind::Stmt, None); - self.set_checkpoint(true); + self.start_node_at(SyntaxKind::Stmt, 1); } + self.set_checkpoint(); - // FIXME: the lexer, for some reason, does not parse dollar quoted string - // so we check if the error is one - while let Some(token) = lexer.next() { - let t: Option<StatementToken> = match token { - Ok(token) => Some(token), - Err(_) => { - if Regex::new("'([^']+)'|\\$(\\w)?\\$.*\\$(\\w)?\\$") - .unwrap() - .is_match_at(lexer.slice(), 0) - { - Some(StatementToken::Sconst) - } else { - None - } - } - }; + // start at 0, and increment by the length of the token + let mut pointer: i32 = 0; - match t { - Some(token) => { - let span = lexer.span(); + #[derive(Debug)] + struct Token { + syntax_kind: SyntaxKind, + span: Span, + } - // consume pg_query nodes until there is none, or the node is outside of the current text span - while let Some(node) = pg_query_nodes.peek() { - let pos = get_position_for_pg_query_node(&node.0); - if span.contains(&usize::try_from(pos).unwrap()) == false { - break; - } else { - // node is within span - let (node, depth, _) = pg_query_nodes.next().unwrap(); - self.start_node_at(SyntaxKind::from_pg_query_node(&node), Some(depth)); - } - } + while pointer < text.len() as i32 { + // Check if the pointer is within a pg_query token + let next_pg_query_token = pg_query_tokens.peek(); + let token = if next_pg_query_token.is_some() + && next_pg_query_token.unwrap().start <= pointer + && pointer <= next_pg_query_token.unwrap().end + { + let token = pg_query_tokens.next().unwrap(); + Token { + syntax_kind: SyntaxKind::new_from_pg_query_token(&token), + span: Span { + start: token.start as usize, + end: token.end as usize, + }, + } + } else { + // fallback to statement token - // consume pg_query token if it is within the current text span - let next_pg_query_token = pg_query_tokens.peek(); - if next_pg_query_token.is_some() - && (span.contains( - &usize::try_from(next_pg_query_token.unwrap().start).unwrap(), - ) || span - .contains(&usize::try_from(next_pg_query_token.unwrap().end).unwrap())) - { - // TODO: if within function declaration and current token is Sconst, its - // the function body. it should be passed into parse_source_file. - self.token( - SyntaxKind::from_pg_query_token(&pg_query_tokens.next().unwrap()), - lexer.slice(), - ); - } else { - // fallback to statement token - self.token(token.syntax_kind(), lexer.slice()); - } + // move statement token lexer to before pointer + while (lexer.span().end as i32) < pointer { + lexer.next(); } - None => panic!("Unknown StatementToken: {:?}", lexer.slice()), - } + let token = lexer.next(); + if token.is_none() || (lexer.span().start as i32) != pointer { + // if the token is not at the pointer, we have a syntax error + panic!( + "Expected token for '{}' at offset {}", + lexer.slice(), + lexer.span().start + ); + } + Token { + syntax_kind: token.unwrap().unwrap().syntax_kind(), + span: lexer.span(), + } + }; + + self.token( + token.syntax_kind, + text.chars() + .skip(token.span.start) + .take(token.span.end - token.span.start) + .collect::<String>() + .as_str(), + ); + + pointer = pointer + (token.span.end - token.span.start) as i32; } // close up nodes @@ -239,63 +165,6 @@ mod tests { use super::*; - #[test] - fn test_statement_lexer() { - let input = "select * from contact where id = '123 4 5';"; - - let mut lex = StatementToken::lexer(&input); - - assert_eq!(lex.next(), Some(Ok(StatementToken::Word))); - assert_eq!(lex.slice(), "select"); - - assert_eq!(lex.next(), Some(Ok(StatementToken::Whitespace))); - - assert_eq!(lex.next(), Some(Ok(StatementToken::Ascii42))); - - assert_eq!(lex.next(), Some(Ok(StatementToken::Whitespace))); - - assert_eq!(lex.next(), Some(Ok(StatementToken::Word))); - assert_eq!(lex.slice(), "from"); - - assert_eq!(lex.next(), Some(Ok(StatementToken::Whitespace))); - - assert_eq!(lex.next(), Some(Ok(StatementToken::Word))); - assert_eq!(lex.slice(), "contact"); - - assert_eq!(lex.next(), Some(Ok(StatementToken::Whitespace))); - - assert_eq!(lex.next(), Some(Ok(StatementToken::Word))); - assert_eq!(lex.slice(), "where"); - - assert_eq!(lex.next(), Some(Ok(StatementToken::Whitespace))); - - assert_eq!(lex.next(), Some(Ok(StatementToken::Word))); - assert_eq!(lex.slice(), "id"); - - assert_eq!(lex.next(), Some(Ok(StatementToken::Whitespace))); - - assert_eq!(lex.next(), Some(Ok(StatementToken::Ascii61))); - - assert_eq!(lex.next(), Some(Ok(StatementToken::Whitespace))); - - assert_eq!(lex.next(), Some(Ok(StatementToken::Sconst))); - - assert_eq!(lex.next(), Some(Ok(StatementToken::Ascii59))); - } - - #[test] - fn test_statement_parser() { - let input = "select *,some_col from contact where id = '123 4 5';"; - - let mut parser = Parser::new(); - parser.parse_statement(input, None); - let parsed = parser.finish(); - - dbg!(&parsed.cst); - - assert_eq!(parsed.cst.text(), input); - } - #[test] fn test_invalid_statement() { let input = "select select;"; diff --git a/crates/parser/src/syntax_kind.rs b/crates/parser/src/syntax_kind.rs deleted file mode 100644 index a2f63b06..00000000 --- a/crates/parser/src/syntax_kind.rs +++ /dev/null @@ -1,1333 +0,0 @@ -//! This module bridges the gap between pg_query.rs nodes, and the `SyntaxKind` cstree requires. -//! Most of the code here can be generated. - -use cstree::Syntax; -use pg_query::{protobuf::ScanToken, NodeRef}; - -/// An u32 enum of all valid syntax elements (nodes and tokens) of the postgres sql dialect, and a few custom ones -/// that are not parsed by pg_query.rs, such as `Whitespace`. -/// -/// Copied from pg_query.rs source code. Can be generated. -#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Debug, Syntax)] -#[repr(u32)] -pub enum SyntaxKind { - // custom nodes, which are not parsed by pg_query.rs - SourceFile, - Comment, - Whitespace, - Newline, - Tab, - /// common value for all keywords (select, from, ...) - Word, - /// node for unknown statements (e.g. when parsing fails) - Stmt, - // from here copyied from NodeEnum - Alias, - RangeVar, - TableFunc, - Expr, - Var, - Param, - Aggref, - GroupingFunc, - WindowFunc, - SubscriptingRef, - FuncExpr, - NamedArgExpr, - OpExpr, - DistinctExpr, - NullIfExpr, - ScalarArrayOpExpr, - BoolExpr, - SubLink, - SubPlan, - AlternativeSubPlan, - FieldSelect, - FieldStore, - RelabelType, - CoerceViaIo, - ArrayCoerceExpr, - ConvertRowtypeExpr, - CollateExpr, - CaseExpr, - CaseWhen, - CaseTestExpr, - ArrayExpr, - RowExpr, - RowCompareExpr, - CoalesceExpr, - MinMaxExpr, - SqlvalueFunction, - XmlExpr, - NullTest, - BooleanTest, - CoerceToDomain, - CoerceToDomainValue, - SetToDefault, - CurrentOfExpr, - NextValueExpr, - InferenceElem, - TargetEntry, - RangeTblRef, - JoinExpr, - FromExpr, - OnConflictExpr, - IntoClause, - RawStmt, - Query, - InsertStmt, - DeleteStmt, - UpdateStmt, - SelectStmt, - AlterTableStmt, - AlterTableCmd, - AlterDomainStmt, - SetOperationStmt, - GrantStmt, - GrantRoleStmt, - AlterDefaultPrivilegesStmt, - ClosePortalStmt, - ClusterStmt, - CopyStmt, - CreateStmt, - DefineStmt, - DropStmt, - TruncateStmt, - CommentStmt, - FetchStmt, - IndexStmt, - CreateFunctionStmt, - AlterFunctionStmt, - DoStmt, - RenameStmt, - RuleStmt, - NotifyStmt, - ListenStmt, - UnlistenStmt, - TransactionStmt, - ViewStmt, - LoadStmt, - CreateDomainStmt, - CreatedbStmt, - DropdbStmt, - VacuumStmt, - ExplainStmt, - CreateTableAsStmt, - CreateSeqStmt, - AlterSeqStmt, - VariableSetStmt, - VariableShowStmt, - DiscardStmt, - CreateTrigStmt, - CreatePlangStmt, - CreateRoleStmt, - AlterRoleStmt, - DropRoleStmt, - LockStmt, - ConstraintsSetStmt, - ReindexStmt, - CheckPointStmt, - CreateSchemaStmt, - AlterDatabaseStmt, - AlterDatabaseSetStmt, - AlterRoleSetStmt, - CreateConversionStmt, - CreateCastStmt, - CreateOpClassStmt, - CreateOpFamilyStmt, - AlterOpFamilyStmt, - PrepareStmt, - ExecuteStmt, - DeallocateStmt, - DeclareCursorStmt, - CreateTableSpaceStmt, - DropTableSpaceStmt, - AlterObjectDependsStmt, - AlterObjectSchemaStmt, - AlterOwnerStmt, - AlterOperatorStmt, - AlterTypeStmt, - DropOwnedStmt, - ReassignOwnedStmt, - CompositeTypeStmt, - CreateEnumStmt, - CreateRangeStmt, - AlterEnumStmt, - AlterTsdictionaryStmt, - AlterTsconfigurationStmt, - CreateFdwStmt, - AlterFdwStmt, - CreateForeignServerStmt, - AlterForeignServerStmt, - CreateUserMappingStmt, - AlterUserMappingStmt, - DropUserMappingStmt, - AlterTableSpaceOptionsStmt, - AlterTableMoveAllStmt, - SecLabelStmt, - CreateForeignTableStmt, - ImportForeignSchemaStmt, - CreateExtensionStmt, - AlterExtensionStmt, - AlterExtensionContentsStmt, - CreateEventTrigStmt, - AlterEventTrigStmt, - RefreshMatViewStmt, - ReplicaIdentityStmt, - AlterSystemStmt, - CreatePolicyStmt, - AlterPolicyStmt, - CreateTransformStmt, - CreateAmStmt, - CreatePublicationStmt, - AlterPublicationStmt, - CreateSubscriptionStmt, - AlterSubscriptionStmt, - DropSubscriptionStmt, - CreateStatsStmt, - AlterCollationStmt, - CallStmt, - AlterStatsStmt, - AExpr, - ColumnRef, - ParamRef, - AConst, - FuncCall, - AStar, - AIndices, - AIndirection, - AArrayExpr, - ResTarget, - MultiAssignRef, - TypeCast, - CollateClause, - SortBy, - WindowDef, - RangeSubselect, - RangeFunction, - RangeTableSample, - RangeTableFunc, - RangeTableFuncCol, - TypeName, - ColumnDef, - IndexElem, - Constraint, - DefElem, - RangeTblEntry, - RangeTblFunction, - TableSampleClause, - WithCheckOption, - SortGroupClause, - GroupingSet, - WindowClause, - ObjectWithArgs, - AccessPriv, - CreateOpClassItem, - TableLikeClause, - FunctionParameter, - LockingClause, - RowMarkClause, - XmlSerialize, - WithClause, - InferClause, - OnConflictClause, - CommonTableExpr, - RoleSpec, - TriggerTransition, - PartitionElem, - PartitionSpec, - PartitionBoundSpec, - PartitionRangeDatum, - PartitionCmd, - VacuumRelation, - InlineCodeBlock, - CallContext, - // Integer, - Float, - String, - BitString, - Null, - List, - IntList, - OidList, - // from here copied from protobuf::Token - Nul, - /// Single-character tokens that are returned 1:1 (identical with "self" list in scan.l) - /// Either supporting syntax, or single-character operators (some can be both) - /// Also see <https://www.postgresql.org/docs/12/sql-syntax-lexical.html#SQL-SYNTAX-SPECIAL-CHARS> - /// - /// "%" - Ascii37, - /// "(" - Ascii40, - /// ")" - Ascii41, - /// "*" - Ascii42, - /// "+" - Ascii43, - /// "," - Ascii44, - /// "-" - Ascii45, - /// "." - Ascii46, - /// "/" - Ascii47, - /// ":" - Ascii58, - /// ";" - Ascii59, - /// "<" - Ascii60, - /// ", - Ascii61, - /// ">" - Ascii62, - /// "?" - Ascii63, - /// "[" - Ascii91, - /// "\" - Ascii92, - /// "]" - Ascii93, - /// "^" - Ascii94, - /// Named tokens in scan.l - Ident, - Uident, - Fconst, - Sconst, - Usconst, - Bconst, - Xconst, - Op, - Iconst, - // Param, - Typecast, - DotDot, - ColonEquals, - EqualsGreater, - LessEquals, - GreaterEquals, - NotEquals, - SqlComment, - CComment, - AbortP, - AbsoluteP, - Access, - Action, - AddP, - Admin, - After, - Aggregate, - All, - Also, - Alter, - Always, - Analyse, - Analyze, - And, - Any, - Array, - As, - Asc, - Assertion, - Assignment, - Asymmetric, - At, - Attach, - Attribute, - Authorization, - Backward, - Before, - BeginP, - Between, - Bigint, - Binary, - Bit, - BooleanP, - Both, - By, - Cache, - Call, - Called, - Cascade, - Cascaded, - Case, - Cast, - CatalogP, - Chain, - CharP, - Character, - Characteristics, - Check, - Checkpoint, - Class, - Close, - Cluster, - Coalesce, - Collate, - Collation, - Column, - Columns, - // Comment, - Comments, - Commit, - Committed, - Concurrently, - Configuration, - Conflict, - Connection, - // Constraint, - Constraints, - ContentP, - ContinueP, - ConversionP, - Copy, - Cost, - Create, - Cross, - Csv, - Cube, - CurrentP, - CurrentCatalog, - CurrentDate, - CurrentRole, - CurrentSchema, - CurrentTime, - CurrentTimestamp, - CurrentUser, - Cursor, - Cycle, - DataP, - Database, - DayP, - Deallocate, - Dec, - DecimalP, - Declare, - Default, - Defaults, - Deferrable, - Deferred, - Definer, - DeleteP, - Delimiter, - Delimiters, - Depends, - Desc, - Detach, - Dictionary, - DisableP, - Discard, - Distinct, - Do, - DocumentP, - DomainP, - DoubleP, - Drop, - Each, - Else, - EnableP, - Encoding, - Encrypted, - EndP, - EnumP, - Escape, - Event, - Except, - Exclude, - Excluding, - Exclusive, - Execute, - Exists, - Explain, - Expression, - Extension, - External, - Extract, - FalseP, - Family, - Fetch, - Filter, - FirstP, - FloatP, - Following, - For, - Force, - Foreign, - Forward, - Freeze, - From, - Full, - Function, - Functions, - Generated, - Global, - Grant, - Granted, - Greatest, - GroupP, - Grouping, - Groups, - Handler, - Having, - HeaderP, - Hold, - HourP, - IdentityP, - IfP, - Ilike, - Immediate, - Immutable, - ImplicitP, - ImportP, - InP, - Include, - Including, - Increment, - Index, - Indexes, - Inherit, - Inherits, - Initially, - InlineP, - InnerP, - Inout, - InputP, - Insensitive, - Insert, - Instead, - IntP, - Integer, - Intersect, - Interval, - Into, - Invoker, - Is, - Isnull, - Isolation, - Join, - Key, - Label, - Language, - LargeP, - LastP, - LateralP, - Leading, - Leakproof, - Least, - Left, - Level, - Like, - Limit, - Listen, - Load, - Local, - Localtime, - Localtimestamp, - Location, - LockP, - Locked, - Logged, - Mapping, - Match, - Materialized, - Maxvalue, - Method, - MinuteP, - Minvalue, - Mode, - MonthP, - Move, - NameP, - Names, - National, - Natural, - Nchar, - New, - Next, - Nfc, - Nfd, - Nfkc, - Nfkd, - No, - None, - Normalize, - Normalized, - Not, - Nothing, - Notify, - Notnull, - Nowait, - NullP, - Nullif, - NullsP, - Numeric, - ObjectP, - Of, - Off, - Offset, - Oids, - Old, - On, - Only, - Operator, - Option, - Options, - Or, - Order, - Ordinality, - Others, - OutP, - OuterP, - Over, - Overlaps, - Overlay, - Overriding, - Owned, - Owner, - Parallel, - Parser, - Partial, - Partition, - Passing, - Password, - Placing, - Plans, - Policy, - Position, - Preceding, - Precision, - Preserve, - Prepare, - Prepared, - Primary, - Prior, - Privileges, - Procedural, - Procedure, - Procedures, - Program, - Publication, - Quote, - Range, - Read, - Real, - Reassign, - Recheck, - Recursive, - Ref, - References, - Referencing, - Refresh, - Reindex, - RelativeP, - Release, - Rename, - Repeatable, - Replace, - Replica, - Reset, - Restart, - Restrict, - Returning, - Returns, - Revoke, - Right, - Role, - Rollback, - Rollup, - Routine, - Routines, - Row, - Rows, - Rule, - Savepoint, - Schema, - Schemas, - Scroll, - Search, - SecondP, - Security, - Select, - Sequence, - Sequences, - Serializable, - Server, - Session, - SessionUser, - Set, - Sets, - Setof, - Share, - Show, - Similar, - Simple, - Skip, - Smallint, - Snapshot, - Some, - SqlP, - Stable, - StandaloneP, - Start, - Statement, - Statistics, - Stdin, - Stdout, - Storage, - Stored, - StrictP, - StripP, - Subscription, - Substring, - Support, - Symmetric, - Sysid, - SystemP, - Table, - Tables, - Tablesample, - Tablespace, - Temp, - Template, - Temporary, - TextP, - Then, - Ties, - Time, - Timestamp, - To, - Trailing, - Transaction, - Transform, - Treat, - Trigger, - Trim, - TrueP, - Truncate, - Trusted, - TypeP, - TypesP, - Uescape, - Unbounded, - Uncommitted, - Unencrypted, - Union, - Unique, - Unknown, - Unlisten, - Unlogged, - Until, - Update, - User, - Using, - Vacuum, - Valid, - Validate, - Validator, - ValueP, - Values, - Varchar, - Variadic, - Varying, - Verbose, - VersionP, - View, - Views, - Volatile, - When, - Where, - WhitespaceP, - Window, - With, - Within, - Without, - Work, - Wrapper, - Write, - XmlP, - Xmlattributes, - Xmlconcat, - Xmlelement, - Xmlexists, - Xmlforest, - Xmlnamespaces, - Xmlparse, - Xmlpi, - Xmlroot, - Xmlserialize, - Xmltable, - YearP, - YesP, - Zone, - NotLa, - NullsLa, - WithLa, - Postfixop, - Uminus, -} - -/// Kind of a `SyntaxKind` -/// This is the only manual definition required for properly creating a concrete syntax tree. -/// If a token is of type `Follow`, it is not immediately applied to the syntax tree, but put into -/// a buffer. Before the next node is started, all buffered tokens are applied to the syntax tree -/// at the depth of the node that is opened next. -/// -/// For example, in `select * from contact;`, the whitespace between `*` and `from` should be a direct -/// child of the `SelectStmt` node. Without this concept, it would be put into the `ColumnRef` -/// node. -/// -/// SelectStmt@0..22 -/// Select@0..6 "select" -/// Whitespace@6..7 " " -/// ResTarget@7..8 -/// ColumnRef@7..8 -/// Ascii42@7..8 "*" -/// Whitespace@8..9 " " -/// From@9..13 "from" -/// Whitespace@13..14 " " -/// RangeVar@14..21 -/// Ident@14..21 "contact" -/// Ascii59@21..22 ";" -pub enum SyntaxKindType { - Follow, - Close, -} - -impl SyntaxKind { - /// Converts a `pg_query` node to a `SyntaxKind` - /// Can be generated - pub fn from_pg_query_node(node: &NodeRef) -> Self { - match node { - NodeRef::SelectStmt(_) => SyntaxKind::SelectStmt, - NodeRef::CreateFunctionStmt(_) => SyntaxKind::CreateFunctionStmt, - NodeRef::ResTarget(_) => SyntaxKind::ResTarget, - NodeRef::AExpr(_) => SyntaxKind::AExpr, - NodeRef::RangeVar(_) => SyntaxKind::RangeVar, - NodeRef::ColumnRef(_) => SyntaxKind::ColumnRef, - NodeRef::AConst(_) => SyntaxKind::AConst, - _ => panic!("Unknown node type: {:?}", node), - } - } - - /// Converts a `pg_query` ScanToken to a `SyntaxKind` - /// Can be generated - pub fn from_pg_query_token(token: &ScanToken) -> Self { - match token.token { - 0 => SyntaxKind::Nul, - 37 => SyntaxKind::Ascii37, - 40 => SyntaxKind::Ascii40, - 41 => SyntaxKind::Ascii41, - 42 => SyntaxKind::Ascii42, - 43 => SyntaxKind::Ascii43, - 44 => SyntaxKind::Ascii44, - 45 => SyntaxKind::Ascii45, - 46 => SyntaxKind::Ascii46, - 47 => SyntaxKind::Ascii47, - 58 => SyntaxKind::Ascii58, - 59 => SyntaxKind::Ascii59, - 60 => SyntaxKind::Ascii60, - 61 => SyntaxKind::Ascii61, - 62 => SyntaxKind::Ascii62, - 63 => SyntaxKind::Ascii63, - 91 => SyntaxKind::Ascii91, - 92 => SyntaxKind::Ascii92, - 93 => SyntaxKind::Ascii93, - 94 => SyntaxKind::Ascii94, - 258 => SyntaxKind::Ident, - 259 => SyntaxKind::Uident, - 260 => SyntaxKind::Fconst, - 261 => SyntaxKind::Sconst, - 262 => SyntaxKind::Usconst, - 263 => SyntaxKind::Bconst, - 264 => SyntaxKind::Xconst, - 265 => SyntaxKind::Op, - 266 => SyntaxKind::Iconst, - 267 => SyntaxKind::Param, - 268 => SyntaxKind::Typecast, - 269 => SyntaxKind::DotDot, - 270 => SyntaxKind::ColonEquals, - 271 => SyntaxKind::EqualsGreater, - 272 => SyntaxKind::LessEquals, - 273 => SyntaxKind::GreaterEquals, - 274 => SyntaxKind::NotEquals, - 275 => SyntaxKind::SqlComment, - 276 => SyntaxKind::CComment, - 277 => SyntaxKind::AbortP, - 278 => SyntaxKind::AbsoluteP, - 279 => SyntaxKind::Access, - 280 => SyntaxKind::Action, - 281 => SyntaxKind::AddP, - 282 => SyntaxKind::Admin, - 283 => SyntaxKind::After, - 284 => SyntaxKind::Aggregate, - 285 => SyntaxKind::All, - 286 => SyntaxKind::Also, - 287 => SyntaxKind::Alter, - 288 => SyntaxKind::Always, - 289 => SyntaxKind::Analyse, - 290 => SyntaxKind::Analyze, - 291 => SyntaxKind::And, - 292 => SyntaxKind::Any, - 293 => SyntaxKind::Array, - 294 => SyntaxKind::As, - 295 => SyntaxKind::Asc, - 296 => SyntaxKind::Assertion, - 297 => SyntaxKind::Assignment, - 298 => SyntaxKind::Asymmetric, - 299 => SyntaxKind::At, - 300 => SyntaxKind::Attach, - 301 => SyntaxKind::Attribute, - 302 => SyntaxKind::Authorization, - 303 => SyntaxKind::Backward, - 305 => SyntaxKind::BeginP, - 306 => SyntaxKind::Between, - 307 => SyntaxKind::Bigint, - 308 => SyntaxKind::Binary, - 309 => SyntaxKind::Bit, - 310 => SyntaxKind::BooleanP, - 311 => SyntaxKind::Both, - 312 => SyntaxKind::By, - 313 => SyntaxKind::Cache, - 314 => SyntaxKind::Call, - 315 => SyntaxKind::Called, - 316 => SyntaxKind::Cascade, - 317 => SyntaxKind::Cascaded, - 318 => SyntaxKind::Case, - 319 => SyntaxKind::Cast, - 320 => SyntaxKind::CatalogP, - 321 => SyntaxKind::Chain, - 322 => SyntaxKind::CharP, - 323 => SyntaxKind::Character, - 324 => SyntaxKind::Characteristics, - 325 => SyntaxKind::Check, - 326 => SyntaxKind::Checkpoint, - 327 => SyntaxKind::Class, - 328 => SyntaxKind::Close, - 329 => SyntaxKind::Cluster, - 330 => SyntaxKind::Coalesce, - 331 => SyntaxKind::Collate, - 332 => SyntaxKind::Collation, - 333 => SyntaxKind::Column, - 334 => SyntaxKind::Columns, - 335 => SyntaxKind::Comment, - 336 => SyntaxKind::Comments, - 337 => SyntaxKind::Commit, - 338 => SyntaxKind::Committed, - 339 => SyntaxKind::Concurrently, - 340 => SyntaxKind::Configuration, - 341 => SyntaxKind::Conflict, - 342 => SyntaxKind::Connection, - 343 => SyntaxKind::Constraint, - 344 => SyntaxKind::Constraints, - 345 => SyntaxKind::ContentP, - 346 => SyntaxKind::ContinueP, - 347 => SyntaxKind::ConversionP, - 348 => SyntaxKind::Copy, - 349 => SyntaxKind::Cost, - 350 => SyntaxKind::Create, - 351 => SyntaxKind::Cross, - 352 => SyntaxKind::Csv, - 353 => SyntaxKind::Cube, - 354 => SyntaxKind::CurrentP, - 355 => SyntaxKind::CurrentCatalog, - 356 => SyntaxKind::CurrentDate, - 357 => SyntaxKind::CurrentRole, - 358 => SyntaxKind::CurrentSchema, - 359 => SyntaxKind::CurrentTime, - 360 => SyntaxKind::CurrentTimestamp, - 361 => SyntaxKind::CurrentUser, - 362 => SyntaxKind::Cursor, - 363 => SyntaxKind::Cycle, - 364 => SyntaxKind::DataP, - 365 => SyntaxKind::Database, - 366 => SyntaxKind::DayP, - 367 => SyntaxKind::Deallocate, - 368 => SyntaxKind::Dec, - 369 => SyntaxKind::DecimalP, - 370 => SyntaxKind::Declare, - 371 => SyntaxKind::Default, - 372 => SyntaxKind::Defaults, - 373 => SyntaxKind::Deferrable, - 374 => SyntaxKind::Deferred, - 375 => SyntaxKind::Definer, - 376 => SyntaxKind::DeleteP, - 377 => SyntaxKind::Delimiter, - 378 => SyntaxKind::Delimiters, - 379 => SyntaxKind::Depends, - 380 => SyntaxKind::Desc, - 381 => SyntaxKind::Detach, - 382 => SyntaxKind::Dictionary, - 383 => SyntaxKind::DisableP, - 384 => SyntaxKind::Discard, - 385 => SyntaxKind::Distinct, - 386 => SyntaxKind::Do, - 387 => SyntaxKind::DocumentP, - 388 => SyntaxKind::DomainP, - 389 => SyntaxKind::DoubleP, - 390 => SyntaxKind::Drop, - 391 => SyntaxKind::Each, - 392 => SyntaxKind::Else, - 393 => SyntaxKind::EnableP, - 394 => SyntaxKind::Encoding, - 395 => SyntaxKind::Encrypted, - 396 => SyntaxKind::EndP, - 397 => SyntaxKind::EnumP, - 398 => SyntaxKind::Escape, - 399 => SyntaxKind::Event, - 400 => SyntaxKind::Except, - 401 => SyntaxKind::Exclude, - 402 => SyntaxKind::Excluding, - 403 => SyntaxKind::Exclusive, - 404 => SyntaxKind::Execute, - 405 => SyntaxKind::Exists, - 406 => SyntaxKind::Explain, - 407 => SyntaxKind::Expression, - 408 => SyntaxKind::Extension, - 409 => SyntaxKind::External, - 410 => SyntaxKind::Extract, - 411 => SyntaxKind::FalseP, - 412 => SyntaxKind::Family, - 413 => SyntaxKind::Fetch, - 414 => SyntaxKind::Filter, - 415 => SyntaxKind::FirstP, - 416 => SyntaxKind::FloatP, - 417 => SyntaxKind::Following, - 418 => SyntaxKind::For, - 419 => SyntaxKind::Force, - 420 => SyntaxKind::Foreign, - 421 => SyntaxKind::Forward, - 422 => SyntaxKind::Freeze, - 423 => SyntaxKind::From, - 424 => SyntaxKind::Full, - 425 => SyntaxKind::Function, - 426 => SyntaxKind::Functions, - 427 => SyntaxKind::Generated, - 428 => SyntaxKind::Global, - 429 => SyntaxKind::Grant, - 430 => SyntaxKind::Granted, - 431 => SyntaxKind::Greatest, - 432 => SyntaxKind::GroupP, - 433 => SyntaxKind::Grouping, - 434 => SyntaxKind::Groups, - 435 => SyntaxKind::Handler, - 436 => SyntaxKind::Having, - 437 => SyntaxKind::HeaderP, - 438 => SyntaxKind::Hold, - 439 => SyntaxKind::HourP, - 440 => SyntaxKind::IdentityP, - 441 => SyntaxKind::IfP, - 442 => SyntaxKind::Ilike, - 443 => SyntaxKind::Immediate, - 444 => SyntaxKind::Immutable, - 445 => SyntaxKind::ImplicitP, - 446 => SyntaxKind::ImportP, - 447 => SyntaxKind::InP, - 448 => SyntaxKind::Include, - 449 => SyntaxKind::Including, - 450 => SyntaxKind::Increment, - 451 => SyntaxKind::Index, - 452 => SyntaxKind::Indexes, - 453 => SyntaxKind::Inherit, - 454 => SyntaxKind::Inherits, - 455 => SyntaxKind::Initially, - 456 => SyntaxKind::InlineP, - 457 => SyntaxKind::InnerP, - 458 => SyntaxKind::Inout, - 459 => SyntaxKind::InputP, - 460 => SyntaxKind::Insensitive, - 461 => SyntaxKind::Insert, - 462 => SyntaxKind::Instead, - 463 => SyntaxKind::IntP, - 464 => SyntaxKind::Integer, - 465 => SyntaxKind::Intersect, - 466 => SyntaxKind::Interval, - 467 => SyntaxKind::Into, - 468 => SyntaxKind::Invoker, - 469 => SyntaxKind::Is, - 470 => SyntaxKind::Isnull, - 471 => SyntaxKind::Isolation, - 472 => SyntaxKind::Join, - 473 => SyntaxKind::Key, - 474 => SyntaxKind::Label, - 475 => SyntaxKind::Language, - 476 => SyntaxKind::LargeP, - 477 => SyntaxKind::LastP, - 478 => SyntaxKind::LateralP, - 479 => SyntaxKind::Leading, - 480 => SyntaxKind::Leakproof, - 481 => SyntaxKind::Least, - 482 => SyntaxKind::Left, - 483 => SyntaxKind::Level, - 484 => SyntaxKind::Like, - 485 => SyntaxKind::Limit, - 486 => SyntaxKind::Listen, - 487 => SyntaxKind::Load, - 488 => SyntaxKind::Local, - 489 => SyntaxKind::Localtime, - 490 => SyntaxKind::Localtimestamp, - 491 => SyntaxKind::Location, - 492 => SyntaxKind::LockP, - 493 => SyntaxKind::Locked, - 494 => SyntaxKind::Logged, - 495 => SyntaxKind::Mapping, - 496 => SyntaxKind::Match, - 497 => SyntaxKind::Materialized, - 498 => SyntaxKind::Maxvalue, - 499 => SyntaxKind::Method, - 500 => SyntaxKind::MinuteP, - 501 => SyntaxKind::Minvalue, - 502 => SyntaxKind::Mode, - 503 => SyntaxKind::MonthP, - 504 => SyntaxKind::Move, - 505 => SyntaxKind::NameP, - 506 => SyntaxKind::Names, - 507 => SyntaxKind::National, - 508 => SyntaxKind::Natural, - 509 => SyntaxKind::Nchar, - 510 => SyntaxKind::New, - 511 => SyntaxKind::Next, - 512 => SyntaxKind::Nfc, - 513 => SyntaxKind::Nfd, - 514 => SyntaxKind::Nfkc, - 515 => SyntaxKind::Nfkd, - 516 => SyntaxKind::No, - 517 => SyntaxKind::None, - 518 => SyntaxKind::Normalize, - 519 => SyntaxKind::Normalized, - 520 => SyntaxKind::Not, - 521 => SyntaxKind::Nothing, - 522 => SyntaxKind::Notify, - 523 => SyntaxKind::Notnull, - 524 => SyntaxKind::Nowait, - 525 => SyntaxKind::NullP, - 526 => SyntaxKind::Nullif, - 527 => SyntaxKind::NullsP, - 528 => SyntaxKind::Numeric, - 529 => SyntaxKind::ObjectP, - 530 => SyntaxKind::Of, - 531 => SyntaxKind::Off, - 532 => SyntaxKind::Offset, - 533 => SyntaxKind::Oids, - 534 => SyntaxKind::Old, - 535 => SyntaxKind::On, - 536 => SyntaxKind::Only, - 537 => SyntaxKind::Operator, - 538 => SyntaxKind::Option, - 539 => SyntaxKind::Options, - 540 => SyntaxKind::Or, - 541 => SyntaxKind::Order, - 542 => SyntaxKind::Ordinality, - 543 => SyntaxKind::Others, - 544 => SyntaxKind::OutP, - 545 => SyntaxKind::OuterP, - 546 => SyntaxKind::Over, - 547 => SyntaxKind::Overlaps, - 548 => SyntaxKind::Overlay, - 549 => SyntaxKind::Overriding, - 550 => SyntaxKind::Owned, - 551 => SyntaxKind::Owner, - 552 => SyntaxKind::Parallel, - 553 => SyntaxKind::Parser, - 554 => SyntaxKind::Partial, - 555 => SyntaxKind::Partition, - 556 => SyntaxKind::Passing, - 557 => SyntaxKind::Password, - 558 => SyntaxKind::Placing, - 559 => SyntaxKind::Plans, - 560 => SyntaxKind::Policy, - 561 => SyntaxKind::Position, - 562 => SyntaxKind::Preceding, - 563 => SyntaxKind::Precision, - 564 => SyntaxKind::Preserve, - 565 => SyntaxKind::Prepare, - 566 => SyntaxKind::Prepared, - 567 => SyntaxKind::Primary, - 568 => SyntaxKind::Prior, - 569 => SyntaxKind::Privileges, - 570 => SyntaxKind::Procedural, - 571 => SyntaxKind::Procedure, - 572 => SyntaxKind::Procedures, - 573 => SyntaxKind::Program, - 574 => SyntaxKind::Publication, - 575 => SyntaxKind::Quote, - 576 => SyntaxKind::Range, - 577 => SyntaxKind::Read, - 578 => SyntaxKind::Real, - 579 => SyntaxKind::Reassign, - 580 => SyntaxKind::Recheck, - 581 => SyntaxKind::Recursive, - 582 => SyntaxKind::Ref, - 583 => SyntaxKind::References, - 584 => SyntaxKind::Referencing, - 585 => SyntaxKind::Refresh, - 586 => SyntaxKind::Reindex, - 587 => SyntaxKind::RelativeP, - 588 => SyntaxKind::Release, - 589 => SyntaxKind::Rename, - 590 => SyntaxKind::Repeatable, - 591 => SyntaxKind::Replace, - 592 => SyntaxKind::Replica, - 593 => SyntaxKind::Reset, - 594 => SyntaxKind::Restart, - 595 => SyntaxKind::Restrict, - 596 => SyntaxKind::Returning, - 597 => SyntaxKind::Returns, - 598 => SyntaxKind::Revoke, - 599 => SyntaxKind::Right, - 600 => SyntaxKind::Role, - 601 => SyntaxKind::Rollback, - 602 => SyntaxKind::Rollup, - 603 => SyntaxKind::Routine, - 604 => SyntaxKind::Routines, - 605 => SyntaxKind::Row, - 606 => SyntaxKind::Rows, - 607 => SyntaxKind::Rule, - 608 => SyntaxKind::Savepoint, - 609 => SyntaxKind::Schema, - 610 => SyntaxKind::Schemas, - 611 => SyntaxKind::Scroll, - 612 => SyntaxKind::Search, - 613 => SyntaxKind::SecondP, - 614 => SyntaxKind::Security, - 615 => SyntaxKind::Select, - 616 => SyntaxKind::Sequence, - 617 => SyntaxKind::Sequences, - 618 => SyntaxKind::Serializable, - 619 => SyntaxKind::Server, - 620 => SyntaxKind::Session, - 621 => SyntaxKind::SessionUser, - 622 => SyntaxKind::Set, - 623 => SyntaxKind::Sets, - 624 => SyntaxKind::Setof, - 625 => SyntaxKind::Share, - 626 => SyntaxKind::Show, - 627 => SyntaxKind::Similar, - 628 => SyntaxKind::Simple, - 629 => SyntaxKind::Skip, - 630 => SyntaxKind::Smallint, - 631 => SyntaxKind::Snapshot, - 632 => SyntaxKind::Some, - 633 => SyntaxKind::SqlP, - 634 => SyntaxKind::Stable, - 635 => SyntaxKind::StandaloneP, - 636 => SyntaxKind::Start, - 637 => SyntaxKind::Statement, - 638 => SyntaxKind::Statistics, - 639 => SyntaxKind::Stdin, - 640 => SyntaxKind::Stdout, - 641 => SyntaxKind::Storage, - 642 => SyntaxKind::Stored, - 643 => SyntaxKind::StrictP, - 644 => SyntaxKind::StripP, - 645 => SyntaxKind::Subscription, - 646 => SyntaxKind::Substring, - 647 => SyntaxKind::Support, - 648 => SyntaxKind::Symmetric, - 649 => SyntaxKind::Sysid, - 650 => SyntaxKind::SystemP, - 651 => SyntaxKind::Table, - 652 => SyntaxKind::Tables, - 653 => SyntaxKind::Tablesample, - 654 => SyntaxKind::Tablespace, - 655 => SyntaxKind::Temp, - 656 => SyntaxKind::Template, - 657 => SyntaxKind::Temporary, - 658 => SyntaxKind::TextP, - 659 => SyntaxKind::Then, - 660 => SyntaxKind::Ties, - 661 => SyntaxKind::Time, - 662 => SyntaxKind::Timestamp, - 663 => SyntaxKind::To, - 664 => SyntaxKind::Trailing, - 665 => SyntaxKind::Transaction, - 666 => SyntaxKind::Transform, - 667 => SyntaxKind::Treat, - 668 => SyntaxKind::Trigger, - 669 => SyntaxKind::Trim, - 670 => SyntaxKind::TrueP, - 671 => SyntaxKind::Truncate, - 672 => SyntaxKind::Trusted, - 673 => SyntaxKind::TypeP, - 674 => SyntaxKind::TypesP, - 675 => SyntaxKind::Uescape, - 676 => SyntaxKind::Unbounded, - 677 => SyntaxKind::Uncommitted, - 678 => SyntaxKind::Unencrypted, - 679 => SyntaxKind::Union, - 680 => SyntaxKind::Unique, - 681 => SyntaxKind::Unknown, - 682 => SyntaxKind::Unlisten, - 683 => SyntaxKind::Unlogged, - 684 => SyntaxKind::Until, - 685 => SyntaxKind::Update, - 686 => SyntaxKind::User, - 687 => SyntaxKind::Using, - 688 => SyntaxKind::Vacuum, - 689 => SyntaxKind::Valid, - 690 => SyntaxKind::Validate, - 691 => SyntaxKind::Validator, - 692 => SyntaxKind::ValueP, - 693 => SyntaxKind::Values, - 694 => SyntaxKind::Varchar, - 695 => SyntaxKind::Variadic, - 696 => SyntaxKind::Varying, - 697 => SyntaxKind::Verbose, - 698 => SyntaxKind::VersionP, - 699 => SyntaxKind::View, - 700 => SyntaxKind::Views, - 701 => SyntaxKind::Volatile, - 702 => SyntaxKind::When, - 703 => SyntaxKind::Where, - 704 => SyntaxKind::WhitespaceP, - 705 => SyntaxKind::Window, - 706 => SyntaxKind::With, - 707 => SyntaxKind::Within, - 708 => SyntaxKind::Without, - 709 => SyntaxKind::Work, - 710 => SyntaxKind::Wrapper, - 711 => SyntaxKind::Write, - 712 => SyntaxKind::XmlP, - 713 => SyntaxKind::Xmlattributes, - 714 => SyntaxKind::Xmlconcat, - 715 => SyntaxKind::Xmlelement, - 716 => SyntaxKind::Xmlexists, - 717 => SyntaxKind::Xmlforest, - 718 => SyntaxKind::Xmlnamespaces, - 719 => SyntaxKind::Xmlparse, - 720 => SyntaxKind::Xmlpi, - 721 => SyntaxKind::Xmlroot, - 722 => SyntaxKind::Xmlserialize, - 723 => SyntaxKind::Xmltable, - 724 => SyntaxKind::YearP, - 725 => SyntaxKind::YesP, - 726 => SyntaxKind::Zone, - 727 => SyntaxKind::NotLa, - 728 => SyntaxKind::NullsLa, - 729 => SyntaxKind::WithLa, - 730 => SyntaxKind::Postfixop, - 731 => SyntaxKind::Uminus, - _ => panic!("Unknown StatementToken: {:?}", token), - } - } - - /// Returns the `SyntaxKindType` of a `SyntaxKind` - /// Maybe this can be generated from the ScanToken type in pg_query.rs - pub fn get_type(&self) -> Option<SyntaxKindType> { - match self { - SyntaxKind::Whitespace => Some(SyntaxKindType::Follow), - SyntaxKind::Ascii40 => Some(SyntaxKindType::Follow), - SyntaxKind::Ascii41 => Some(SyntaxKindType::Follow), - SyntaxKind::Ascii44 => Some(SyntaxKindType::Follow), - SyntaxKind::Ascii59 => Some(SyntaxKindType::Close), - SyntaxKind::Ascii61 => Some(SyntaxKindType::Follow), - SyntaxKind::From => Some(SyntaxKindType::Follow), - SyntaxKind::Where => Some(SyntaxKindType::Follow), - _ => None, - } - } -} diff --git a/crates/parser/src/syntax_kind_codegen.rs b/crates/parser/src/syntax_kind_codegen.rs new file mode 100644 index 00000000..b50dd1a8 --- /dev/null +++ b/crates/parser/src/syntax_kind_codegen.rs @@ -0,0 +1,3 @@ +use codegen::syntax_kind; + +syntax_kind!(); diff --git a/crates/parser/src/syntax_node.rs b/crates/parser/src/syntax_node.rs index b0f9389a..d962427e 100644 --- a/crates/parser/src/syntax_node.rs +++ b/crates/parser/src/syntax_node.rs @@ -6,7 +6,7 @@ //! The *real* implementation is in the (language-agnostic) `cstree` crate, this //! module just wraps its API. -use crate::syntax_kind::SyntaxKind; +use crate::syntax_kind_codegen::SyntaxKind; pub type SyntaxNode = cstree::syntax::SyntaxNode<SyntaxKind>; pub type SyntaxToken = cstree::syntax::SyntaxToken<SyntaxKind>; diff --git a/crates/parser/tests/common/mod.rs b/crates/parser/tests/common/mod.rs new file mode 100644 index 00000000..af191dab --- /dev/null +++ b/crates/parser/tests/common/mod.rs @@ -0,0 +1,3 @@ +pub fn setup() { + let _ = env_logger::builder().is_test(true).try_init(); +} diff --git a/crates/parser/tests/data/source_file/valid/0001.sql b/crates/parser/tests/data/source_file/valid/0001.sql new file mode 100644 index 00000000..82cc0bf0 --- /dev/null +++ b/crates/parser/tests/data/source_file/valid/0001.sql @@ -0,0 +1,11 @@ +BEGIN; +UPDATE accounts SET balance = balance - 100.00 + WHERE name = 'Alice'; +SAVEPOINT my_savepoint; +UPDATE accounts SET balance = balance + 100.00 + WHERE name = 'Bob'; +-- oops ... forget that and use Wally's account +ROLLBACK TO my_savepoint; +UPDATE accounts SET balance = balance + 100.00 + WHERE name = 'Wally'; +COMMIT; diff --git a/crates/parser/tests/data/statements/valid/0001.sql b/crates/parser/tests/data/statements/valid/0001.sql new file mode 100644 index 00000000..831b69ab --- /dev/null +++ b/crates/parser/tests/data/statements/valid/0001.sql @@ -0,0 +1,3 @@ +SELECT city, count(*) FILTER (WHERE temp_lo < 45), max(temp_lo) + FROM weather + GROUP BY city; diff --git a/crates/parser/tests/data/statements/valid/0002.sql b/crates/parser/tests/data/statements/valid/0002.sql new file mode 100644 index 00000000..938d1e40 --- /dev/null +++ b/crates/parser/tests/data/statements/valid/0002.sql @@ -0,0 +1 @@ +COPY weather FROM '/home/user/weather.txt'; diff --git a/crates/parser/tests/data/statements/valid/0003.sql b/crates/parser/tests/data/statements/valid/0003.sql new file mode 100644 index 00000000..0ac47170 --- /dev/null +++ b/crates/parser/tests/data/statements/valid/0003.sql @@ -0,0 +1,7 @@ +CREATE TABLE weather ( + city varchar(80) references cities(name), + temp_lo int, + temp_hi int, + prcp real, + date date +); diff --git a/crates/parser/tests/data/statements/valid/0004.sql b/crates/parser/tests/data/statements/valid/0004.sql new file mode 100644 index 00000000..e97f771f --- /dev/null +++ b/crates/parser/tests/data/statements/valid/0004.sql @@ -0,0 +1,4 @@ +CREATE VIEW myview AS + SELECT name, temp_lo, temp_hi, prcp, date, location + FROM weather, cities + WHERE city = name; diff --git a/crates/parser/tests/data/statements/valid/0005.sql b/crates/parser/tests/data/statements/valid/0005.sql new file mode 100644 index 00000000..136067af --- /dev/null +++ b/crates/parser/tests/data/statements/valid/0005.sql @@ -0,0 +1 @@ +DELETE FROM weather WHERE city = 'Hayward'; diff --git a/crates/parser/tests/data/statements/valid/0006.sql b/crates/parser/tests/data/statements/valid/0006.sql new file mode 100644 index 00000000..664437a4 --- /dev/null +++ b/crates/parser/tests/data/statements/valid/0006.sql @@ -0,0 +1 @@ +DROP TABLE tablename; diff --git a/crates/parser/tests/data/statements/valid/0007.sql b/crates/parser/tests/data/statements/valid/0007.sql new file mode 100644 index 00000000..f0e8fc3d --- /dev/null +++ b/crates/parser/tests/data/statements/valid/0007.sql @@ -0,0 +1,6 @@ +CREATE TABLE cities ( + name text, + population real, + elevation int -- (in ft) +); + diff --git a/crates/parser/tests/data/statements/valid/0008.sql b/crates/parser/tests/data/statements/valid/0008.sql new file mode 100644 index 00000000..308d8d2c --- /dev/null +++ b/crates/parser/tests/data/statements/valid/0008.sql @@ -0,0 +1,2 @@ +INSERT INTO weather (date, city, temp_hi, temp_lo) + VALUES ('1994-11-29', 'Hayward', 54, 37); diff --git a/crates/parser/tests/data/statements/valid/0009.sql b/crates/parser/tests/data/statements/valid/0009.sql new file mode 100644 index 00000000..d631c061 --- /dev/null +++ b/crates/parser/tests/data/statements/valid/0009.sql @@ -0,0 +1,4 @@ +SELECT w1.city, w1.temp_lo AS low, w1.temp_hi AS high, + w2.city, w2.temp_lo AS low, w2.temp_hi AS high + FROM weather w1 JOIN weather w2 + ON w1.temp_lo < w2.temp_lo AND w1.temp_hi > w2.temp_hi; diff --git a/crates/parser/tests/data/statements/valid/0010.sql b/crates/parser/tests/data/statements/valid/0010.sql new file mode 100644 index 00000000..97d05a75 --- /dev/null +++ b/crates/parser/tests/data/statements/valid/0010.sql @@ -0,0 +1 @@ +INSERT INTO weather VALUES ('San Francisco', 46, 50, 0.25, '1994-11-27'); diff --git a/crates/parser/tests/data/statements/valid/0011.sql b/crates/parser/tests/data/statements/valid/0011.sql new file mode 100644 index 00000000..f1b088ca --- /dev/null +++ b/crates/parser/tests/data/statements/valid/0011.sql @@ -0,0 +1,3 @@ +SELECT DISTINCT city + FROM weather + ORDER BY city; diff --git a/crates/parser/tests/data/statements/valid/0012.sql b/crates/parser/tests/data/statements/valid/0012.sql new file mode 100644 index 00000000..15073751 --- /dev/null +++ b/crates/parser/tests/data/statements/valid/0012.sql @@ -0,0 +1,4 @@ +CREATE TABLE measurement_y2008m01 PARTITION OF measurement + FOR VALUES FROM ('2008-01-01') TO ('2008-02-01') + WITH (parallel_workers = 4) + TABLESPACE fasttablespace; diff --git a/crates/parser/tests/data/statements/valid/0013.sql b/crates/parser/tests/data/statements/valid/0013.sql new file mode 100644 index 00000000..24154690 --- /dev/null +++ b/crates/parser/tests/data/statements/valid/0013.sql @@ -0,0 +1,3 @@ +UPDATE weather + SET temp_hi = temp_hi - 2, temp_lo = temp_lo - 2 + WHERE date > '1994-11-28'; diff --git a/crates/parser/tests/data/statements/valid/0014.sql b/crates/parser/tests/data/statements/valid/0014.sql new file mode 100644 index 00000000..aafd6fab --- /dev/null +++ b/crates/parser/tests/data/statements/valid/0014.sql @@ -0,0 +1,3 @@ +SELECT sum(salary) OVER w, avg(salary) OVER w + FROM empsalary + WINDOW w AS (PARTITION BY depname ORDER BY salary DESC); diff --git a/crates/parser/tests/data/statements/valid/0015.sql b/crates/parser/tests/data/statements/valid/0015.sql new file mode 100644 index 00000000..62866cad --- /dev/null +++ b/crates/parser/tests/data/statements/valid/0015.sql @@ -0,0 +1,4 @@ +SELECT + count(*) AS unfiltered, + count(*) FILTER (WHERE i < 5) AS filtered +FROM generate_series(1,10) AS s(i); diff --git a/crates/parser/tests/data/statements/valid/0016.sql b/crates/parser/tests/data/statements/valid/0016.sql new file mode 100644 index 00000000..4d7ce856 --- /dev/null +++ b/crates/parser/tests/data/statements/valid/0016.sql @@ -0,0 +1 @@ +SELECT * FROM tbl WHERE a COLLATE "C" > 'foo'; diff --git a/crates/parser/tests/data/statements/valid/0017.sql b/crates/parser/tests/data/statements/valid/0017.sql new file mode 100644 index 00000000..f9d7b1f0 --- /dev/null +++ b/crates/parser/tests/data/statements/valid/0017.sql @@ -0,0 +1,2 @@ +SELECT name, (SELECT max(pop) FROM cities WHERE cities.state = states.name) + FROM states; diff --git a/crates/parser/tests/data/statements/valid/0018.sql b/crates/parser/tests/data/statements/valid/0018.sql new file mode 100644 index 00000000..9ab1949a --- /dev/null +++ b/crates/parser/tests/data/statements/valid/0018.sql @@ -0,0 +1 @@ +SELECT ARRAY[1,2,22.7]::integer[]; diff --git a/crates/parser/tests/data/statements/valid/0019.sql b/crates/parser/tests/data/statements/valid/0019.sql new file mode 100644 index 00000000..822511cf --- /dev/null +++ b/crates/parser/tests/data/statements/valid/0019.sql @@ -0,0 +1,4 @@ +SELECT CASE WHEN min(employees) > 0 + THEN avg(expenses / employees) + END + FROM departments; diff --git a/crates/parser/tests/data/statements/valid/0020.sql b/crates/parser/tests/data/statements/valid/0020.sql new file mode 100644 index 00000000..989af6c2 --- /dev/null +++ b/crates/parser/tests/data/statements/valid/0020.sql @@ -0,0 +1,10 @@ +CREATE FUNCTION concat_lower_or_upper(a text, b text, uppercase boolean DEFAULT false) +RETURNS text +AS +$$ + SELECT CASE + WHEN $3 THEN UPPER($1 || ' ' || $2) + ELSE LOWER($1 || ' ' || $2) + END; +$$ +LANGUAGE SQL IMMUTABLE STRICT; diff --git a/crates/parser/tests/data/statements/valid/0021.sql b/crates/parser/tests/data/statements/valid/0021.sql new file mode 100644 index 00000000..155b7f48 --- /dev/null +++ b/crates/parser/tests/data/statements/valid/0021.sql @@ -0,0 +1 @@ +SELECT concat_lower_or_upper(a => 'Hello', b => 'World', uppercase => true); diff --git a/crates/parser/tests/data/statements/valid/0022.sql b/crates/parser/tests/data/statements/valid/0022.sql new file mode 100644 index 00000000..f4cf2e26 --- /dev/null +++ b/crates/parser/tests/data/statements/valid/0022.sql @@ -0,0 +1,5 @@ +CREATE TABLE products ( + product_no integer, + name text, + price numeric DEFAULT 9.99 +); diff --git a/crates/parser/tests/data/statements/valid/0023.sql b/crates/parser/tests/data/statements/valid/0023.sql new file mode 100644 index 00000000..908e3839 --- /dev/null +++ b/crates/parser/tests/data/statements/valid/0023.sql @@ -0,0 +1,7 @@ +CREATE TABLE products ( + product_no integer, + name text, + price numeric CHECK (price > 0), + discounted_price numeric CHECK (discounted_price > 0), + CHECK (price > discounted_price) +); diff --git a/crates/parser/tests/data/statements/valid/0024.sql b/crates/parser/tests/data/statements/valid/0024.sql new file mode 100644 index 00000000..0a97d2bd --- /dev/null +++ b/crates/parser/tests/data/statements/valid/0024.sql @@ -0,0 +1,6 @@ +CREATE TABLE order_items ( + product_no integer REFERENCES products, + order_id integer REFERENCES orders, + quantity integer, + PRIMARY KEY (product_no, order_id) +); diff --git a/crates/parser/tests/data/statements/valid/0025.sql b/crates/parser/tests/data/statements/valid/0025.sql new file mode 100644 index 00000000..a4872682 --- /dev/null +++ b/crates/parser/tests/data/statements/valid/0025.sql @@ -0,0 +1 @@ +ALTER TABLE products ADD CHECK (name <> ''); diff --git a/crates/parser/tests/data/statements/valid/0026.sql b/crates/parser/tests/data/statements/valid/0026.sql new file mode 100644 index 00000000..fc18e84d --- /dev/null +++ b/crates/parser/tests/data/statements/valid/0026.sql @@ -0,0 +1 @@ +ALTER TABLE products ALTER COLUMN price TYPE numeric(10,2); diff --git a/crates/parser/tests/data/statements/valid/0027.sql b/crates/parser/tests/data/statements/valid/0027.sql new file mode 100644 index 00000000..8b7e3047 --- /dev/null +++ b/crates/parser/tests/data/statements/valid/0027.sql @@ -0,0 +1 @@ +GRANT UPDATE ON accounts TO joe; diff --git a/crates/parser/tests/data/statements/valid/0028.sql b/crates/parser/tests/data/statements/valid/0028.sql new file mode 100644 index 00000000..03fc8b91 --- /dev/null +++ b/crates/parser/tests/data/statements/valid/0028.sql @@ -0,0 +1 @@ +REVOKE ALL ON accounts FROM PUBLIC; diff --git a/crates/parser/tests/data/statements/valid/0029.sql b/crates/parser/tests/data/statements/valid/0029.sql new file mode 100644 index 00000000..9612a088 --- /dev/null +++ b/crates/parser/tests/data/statements/valid/0029.sql @@ -0,0 +1 @@ +GRANT SELECT (col1), UPDATE (col1) ON mytable TO miriam_rw; diff --git a/crates/parser/tests/data/statements/valid/0030.sql b/crates/parser/tests/data/statements/valid/0030.sql new file mode 100644 index 00000000..7a333a33 --- /dev/null +++ b/crates/parser/tests/data/statements/valid/0030.sql @@ -0,0 +1,2 @@ +CREATE POLICY account_managers ON accounts TO managers + USING (manager = current_user); diff --git a/crates/parser/tests/data/statements/valid/0031.sql b/crates/parser/tests/data/statements/valid/0031.sql new file mode 100644 index 00000000..cdbb7b20 --- /dev/null +++ b/crates/parser/tests/data/statements/valid/0031.sql @@ -0,0 +1,6 @@ +CREATE POLICY user_mod ON passwd FOR UPDATE + USING (current_user = user_name) + WITH CHECK ( + current_user = user_name AND + shell IN ('/bin/bash','/bin/sh','/bin/dash','/bin/zsh','/bin/tcsh') + ); diff --git a/crates/parser/tests/data/statements/valid/0032.sql b/crates/parser/tests/data/statements/valid/0032.sql new file mode 100644 index 00000000..6d28c679 --- /dev/null +++ b/crates/parser/tests/data/statements/valid/0032.sql @@ -0,0 +1 @@ +SET search_path TO myschema,public; diff --git a/crates/parser/tests/data/statements/valid/0033.sql b/crates/parser/tests/data/statements/valid/0033.sql new file mode 100644 index 00000000..219c2e7b --- /dev/null +++ b/crates/parser/tests/data/statements/valid/0033.sql @@ -0,0 +1,6 @@ +CREATE TABLE measurement ( + city_id int not null, + logdate date not null, + peaktemp int, + unitsales int +) PARTITION BY RANGE (logdate); diff --git a/crates/parser/tests/data/statements/valid/0034.sql b/crates/parser/tests/data/statements/valid/0034.sql new file mode 100644 index 00000000..2e4bf534 --- /dev/null +++ b/crates/parser/tests/data/statements/valid/0034.sql @@ -0,0 +1 @@ +select *,some_col from contact where id = '123 4 5'; diff --git a/crates/parser/tests/data/statements/valid/0035.sql b/crates/parser/tests/data/statements/valid/0035.sql new file mode 100644 index 00000000..2e4bf534 --- /dev/null +++ b/crates/parser/tests/data/statements/valid/0035.sql @@ -0,0 +1 @@ +select *,some_col from contact where id = '123 4 5'; diff --git a/crates/parser/tests/data/statements/valid/0036.sql b/crates/parser/tests/data/statements/valid/0036.sql new file mode 100644 index 00000000..fd9214ce --- /dev/null +++ b/crates/parser/tests/data/statements/valid/0036.sql @@ -0,0 +1,3 @@ +CREATE FUNCTION dup(in int, out f1 int, out f2 text) + AS $$ SELECT $1, CAST($1 AS text) || ' is text' $$ + LANGUAGE SQL; diff --git a/crates/parser/tests/snapshots/statements/valid/0001.snap b/crates/parser/tests/snapshots/statements/valid/0001.snap new file mode 100644 index 00000000..1c2083ab --- /dev/null +++ b/crates/parser/tests/snapshots/statements/valid/0001.snap @@ -0,0 +1,47 @@ +--- +source: crates/parser/tests/statement_parser_test.rs +description: "SELECT city, count(*) FILTER (WHERE temp_lo < 45), max(temp_lo)\n FROM weather\n GROUP BY city;\n" +--- +SelectStmt@0..100 + Select@0..6 "SELECT" + Whitespace@6..7 " " + Ident@7..11 "city" + Ascii44@11..12 "," + Whitespace@12..13 " " + Ident@13..18 "count" + Ascii40@18..19 "(" + Ascii42@19..20 "*" + Ascii41@20..21 ")" + Whitespace@21..22 " " + Filter@22..28 "FILTER" + Whitespace@28..29 " " + Ascii40@29..30 "(" + Where@30..35 "WHERE" + Whitespace@35..36 " " + Ident@36..43 "temp_lo" + Whitespace@43..44 " " + Ascii60@44..45 "<" + Whitespace@45..46 " " + Iconst@46..48 "45" + Ascii41@48..49 ")" + Ascii44@49..50 "," + Whitespace@50..51 " " + Ident@51..54 "max" + Ascii40@54..55 "(" + Ident@55..62 "temp_lo" + Ascii41@62..63 ")" + Newline@63..64 "\n" + Whitespace@64..68 " " + From@68..72 "FROM" + Whitespace@72..73 " " + Ident@73..80 "weather" + Newline@80..81 "\n" + Whitespace@81..85 " " + GroupP@85..90 "GROUP" + Whitespace@90..91 " " + By@91..93 "BY" + Whitespace@93..94 " " + Ident@94..98 "city" + Ascii59@98..99 ";" + Newline@99..100 "\n" + diff --git a/crates/parser/tests/snapshots/statements/valid/0002.snap b/crates/parser/tests/snapshots/statements/valid/0002.snap new file mode 100644 index 00000000..45ebc465 --- /dev/null +++ b/crates/parser/tests/snapshots/statements/valid/0002.snap @@ -0,0 +1,15 @@ +--- +source: crates/parser/tests/statement_parser_test.rs +description: "COPY weather FROM '/home/user/weather.txt';\n" +--- +CopyStmt@0..44 + Copy@0..4 "COPY" + Whitespace@4..5 " " + Ident@5..12 "weather" + Whitespace@12..13 " " + From@13..17 "FROM" + Whitespace@17..18 " " + Sconst@18..42 "'/home/user/weather.txt'" + Ascii59@42..43 ";" + Newline@43..44 "\n" + diff --git a/crates/parser/tests/snapshots/statements/valid/0003.snap b/crates/parser/tests/snapshots/statements/valid/0003.snap new file mode 100644 index 00000000..090b3a9a --- /dev/null +++ b/crates/parser/tests/snapshots/statements/valid/0003.snap @@ -0,0 +1,56 @@ +--- +source: crates/parser/tests/statement_parser_test.rs +description: "CREATE TABLE weather (\n city varchar(80) references cities(name),\n temp_lo int,\n temp_hi int,\n prcp real,\n date date\n);\n" +--- +CreateStmt@0..174 + Create@0..6 "CREATE" + Whitespace@6..7 " " + Table@7..12 "TABLE" + Whitespace@12..13 " " + Ident@13..20 "weather" + Whitespace@20..21 " " + Ascii40@21..22 "(" + Newline@22..23 "\n" + Whitespace@23..31 " " + Ident@31..35 "city" + Whitespace@35..41 " " + Varchar@41..48 "varchar" + Ascii40@48..49 "(" + Iconst@49..51 "80" + Ascii41@51..52 ")" + Whitespace@52..53 " " + References@53..63 "references" + Whitespace@63..64 " " + Ident@64..70 "cities" + Ascii40@70..71 "(" + NameP@71..75 "name" + Ascii41@75..76 ")" + Ascii44@76..77 "," + Newline@77..78 "\n" + Whitespace@78..86 " " + Ident@86..93 "temp_lo" + Whitespace@93..96 " " + IntP@96..99 "int" + Ascii44@99..100 "," + Newline@100..101 "\n" + Whitespace@101..109 " " + Ident@109..116 "temp_hi" + Whitespace@116..119 " " + IntP@119..122 "int" + Ascii44@122..123 "," + Newline@123..124 "\n" + Whitespace@124..132 " " + Ident@132..136 "prcp" + Whitespace@136..142 " " + Real@142..146 "real" + Ascii44@146..147 "," + Newline@147..148 "\n" + Whitespace@148..156 " " + Ident@156..160 "date" + Whitespace@160..166 " " + Ident@166..170 "date" + Newline@170..171 "\n" + Ascii41@171..172 ")" + Ascii59@172..173 ";" + Newline@173..174 "\n" + diff --git a/crates/parser/tests/snapshots/statements/valid/0004.snap b/crates/parser/tests/snapshots/statements/valid/0004.snap new file mode 100644 index 00000000..d5e1524f --- /dev/null +++ b/crates/parser/tests/snapshots/statements/valid/0004.snap @@ -0,0 +1,52 @@ +--- +source: crates/parser/tests/statement_parser_test.rs +description: "CREATE VIEW myview AS\n SELECT name, temp_lo, temp_hi, prcp, date, location\n FROM weather, cities\n WHERE city = name;\n" +--- +ViewStmt@0..134 + Create@0..6 "CREATE" + Whitespace@6..7 " " + View@7..11 "VIEW" + Whitespace@11..12 " " + Ident@12..18 "myview" + Whitespace@18..19 " " + As@19..21 "AS" + Newline@21..22 "\n" + Whitespace@22..26 " " + Select@26..32 "SELECT" + Whitespace@32..33 " " + NameP@33..37 "name" + Ascii44@37..38 "," + Whitespace@38..39 " " + Ident@39..46 "temp_lo" + Ascii44@46..47 "," + Whitespace@47..48 " " + Ident@48..55 "temp_hi" + Ascii44@55..56 "," + Whitespace@56..57 " " + Ident@57..61 "prcp" + Ascii44@61..62 "," + Whitespace@62..63 " " + Ident@63..67 "date" + Ascii44@67..68 "," + Whitespace@68..69 " " + Location@69..77 "location" + Newline@77..78 "\n" + Whitespace@78..86 " " + From@86..90 "FROM" + Whitespace@90..91 " " + Ident@91..98 "weather" + Ascii44@98..99 "," + Whitespace@99..100 " " + Ident@100..106 "cities" + Newline@106..107 "\n" + Whitespace@107..115 " " + Where@115..120 "WHERE" + Whitespace@120..121 " " + Ident@121..125 "city" + Whitespace@125..126 " " + Ascii61@126..127 "=" + Whitespace@127..128 " " + NameP@128..132 "name" + Ascii59@132..133 ";" + Newline@133..134 "\n" + diff --git a/crates/parser/tests/snapshots/statements/valid/0005.snap b/crates/parser/tests/snapshots/statements/valid/0005.snap new file mode 100644 index 00000000..d99908db --- /dev/null +++ b/crates/parser/tests/snapshots/statements/valid/0005.snap @@ -0,0 +1,21 @@ +--- +source: crates/parser/tests/statement_parser_test.rs +description: "DELETE FROM weather WHERE city = 'Hayward';\n" +--- +DeleteStmt@0..44 + DeleteP@0..6 "DELETE" + Whitespace@6..7 " " + From@7..11 "FROM" + Whitespace@11..12 " " + Ident@12..19 "weather" + Whitespace@19..20 " " + Where@20..25 "WHERE" + Whitespace@25..26 " " + Ident@26..30 "city" + Whitespace@30..31 " " + Ascii61@31..32 "=" + Whitespace@32..33 " " + Sconst@33..42 "'Hayward'" + Ascii59@42..43 ";" + Newline@43..44 "\n" + diff --git a/crates/parser/tests/snapshots/statements/valid/0006.snap b/crates/parser/tests/snapshots/statements/valid/0006.snap new file mode 100644 index 00000000..37cfd337 --- /dev/null +++ b/crates/parser/tests/snapshots/statements/valid/0006.snap @@ -0,0 +1,13 @@ +--- +source: crates/parser/tests/statement_parser_test.rs +description: "DROP TABLE tablename;\n" +--- +DropStmt@0..22 + Drop@0..4 "DROP" + Whitespace@4..5 " " + Table@5..10 "TABLE" + Whitespace@10..11 " " + Ident@11..20 "tablename" + Ascii59@20..21 ";" + Newline@21..22 "\n" + diff --git a/crates/parser/tests/snapshots/statements/valid/0007.snap b/crates/parser/tests/snapshots/statements/valid/0007.snap new file mode 100644 index 00000000..61ccfb22 --- /dev/null +++ b/crates/parser/tests/snapshots/statements/valid/0007.snap @@ -0,0 +1,36 @@ +--- +source: crates/parser/tests/statement_parser_test.rs +description: "CREATE TABLE cities (\n name text,\n population real,\n elevation int -- (in ft)\n);\n\n" +--- +CreateStmt@0..96 + Create@0..6 "CREATE" + Whitespace@6..7 " " + Table@7..12 "TABLE" + Whitespace@12..13 " " + Ident@13..19 "cities" + Whitespace@19..20 " " + Ascii40@20..21 "(" + Newline@21..22 "\n" + Whitespace@22..24 " " + NameP@24..28 "name" + Whitespace@28..35 " " + TextP@35..39 "text" + Ascii44@39..40 "," + Newline@40..41 "\n" + Whitespace@41..43 " " + Ident@43..53 "population" + Whitespace@53..54 " " + Real@54..58 "real" + Ascii44@58..59 "," + Newline@59..60 "\n" + Whitespace@60..62 " " + Ident@62..71 "elevation" + Whitespace@71..73 " " + IntP@73..76 "int" + Whitespace@76..81 " " + SqlComment@81..91 "-- (in ft)" + Newline@91..92 "\n" + Ascii41@92..93 ")" + Ascii59@93..94 ";" + Newline@94..96 "\n\n" + diff --git a/crates/parser/tests/snapshots/statements/valid/0008.snap b/crates/parser/tests/snapshots/statements/valid/0008.snap new file mode 100644 index 00000000..a33927f9 --- /dev/null +++ b/crates/parser/tests/snapshots/statements/valid/0008.snap @@ -0,0 +1,42 @@ +--- +source: crates/parser/tests/statement_parser_test.rs +description: "INSERT INTO weather (date, city, temp_hi, temp_lo)\n VALUES ('1994-11-29', 'Hayward', 54, 37);\n" +--- +InsertStmt@0..97 + Insert@0..6 "INSERT" + Whitespace@6..7 " " + Into@7..11 "INTO" + Whitespace@11..12 " " + Ident@12..19 "weather" + Whitespace@19..20 " " + Ascii40@20..21 "(" + Ident@21..25 "date" + Ascii44@25..26 "," + Whitespace@26..27 " " + Ident@27..31 "city" + Ascii44@31..32 "," + Whitespace@32..33 " " + Ident@33..40 "temp_hi" + Ascii44@40..41 "," + Whitespace@41..42 " " + Ident@42..49 "temp_lo" + Ascii41@49..50 ")" + Newline@50..51 "\n" + Whitespace@51..55 " " + Values@55..61 "VALUES" + Whitespace@61..62 " " + Ascii40@62..63 "(" + Sconst@63..75 "'1994-11-29'" + Ascii44@75..76 "," + Whitespace@76..77 " " + Sconst@77..86 "'Hayward'" + Ascii44@86..87 "," + Whitespace@87..88 " " + Iconst@88..90 "54" + Ascii44@90..91 "," + Whitespace@91..92 " " + Iconst@92..94 "37" + Ascii41@94..95 ")" + Ascii59@95..96 ";" + Newline@96..97 "\n" + diff --git a/crates/parser/tests/snapshots/statements/valid/0009.snap b/crates/parser/tests/snapshots/statements/valid/0009.snap new file mode 100644 index 00000000..bf17d60a --- /dev/null +++ b/crates/parser/tests/snapshots/statements/valid/0009.snap @@ -0,0 +1,93 @@ +--- +source: crates/parser/tests/statement_parser_test.rs +description: "SELECT w1.city, w1.temp_lo AS low, w1.temp_hi AS high,\n w2.city, w2.temp_lo AS low, w2.temp_hi AS high\n FROM weather w1 JOIN weather w2\n ON w1.temp_lo < w2.temp_lo AND w1.temp_hi > w2.temp_hi;\n" +--- +SelectStmt@0..209 + Select@0..6 "SELECT" + Whitespace@6..7 " " + Ident@7..9 "w1" + Ascii46@9..10 "." + Ident@10..14 "city" + Ascii44@14..15 "," + Whitespace@15..16 " " + Ident@16..18 "w1" + Ascii46@18..19 "." + Ident@19..26 "temp_lo" + Whitespace@26..27 " " + As@27..29 "AS" + Whitespace@29..30 " " + Ident@30..33 "low" + Ascii44@33..34 "," + Whitespace@34..35 " " + Ident@35..37 "w1" + Ascii46@37..38 "." + Ident@38..45 "temp_hi" + Whitespace@45..46 " " + As@46..48 "AS" + Whitespace@48..49 " " + Ident@49..53 "high" + Ascii44@53..54 "," + Newline@54..55 "\n" + Whitespace@55..62 " " + Ident@62..64 "w2" + Ascii46@64..65 "." + Ident@65..69 "city" + Ascii44@69..70 "," + Whitespace@70..71 " " + Ident@71..73 "w2" + Ascii46@73..74 "." + Ident@74..81 "temp_lo" + Whitespace@81..82 " " + As@82..84 "AS" + Whitespace@84..85 " " + Ident@85..88 "low" + Ascii44@88..89 "," + Whitespace@89..90 " " + Ident@90..92 "w2" + Ascii46@92..93 "." + Ident@93..100 "temp_hi" + Whitespace@100..101 " " + As@101..103 "AS" + Whitespace@103..104 " " + Ident@104..108 "high" + Newline@108..109 "\n" + Whitespace@109..113 " " + From@113..117 "FROM" + Whitespace@117..118 " " + Ident@118..125 "weather" + Whitespace@125..126 " " + Ident@126..128 "w1" + Whitespace@128..129 " " + Join@129..133 "JOIN" + Whitespace@133..134 " " + Ident@134..141 "weather" + Whitespace@141..142 " " + Ident@142..144 "w2" + Newline@144..145 "\n" + Whitespace@145..153 " " + On@153..155 "ON" + Whitespace@155..156 " " + Ident@156..158 "w1" + Ascii46@158..159 "." + Ident@159..166 "temp_lo" + Whitespace@166..167 " " + Ascii60@167..168 "<" + Whitespace@168..169 " " + Ident@169..171 "w2" + Ascii46@171..172 "." + Ident@172..179 "temp_lo" + Whitespace@179..180 " " + And@180..183 "AND" + Whitespace@183..184 " " + Ident@184..186 "w1" + Ascii46@186..187 "." + Ident@187..194 "temp_hi" + Whitespace@194..195 " " + Ascii62@195..196 ">" + Whitespace@196..197 " " + Ident@197..199 "w2" + Ascii46@199..200 "." + Ident@200..207 "temp_hi" + Ascii59@207..208 ";" + Newline@208..209 "\n" + diff --git a/crates/parser/tests/snapshots/statements/valid/0010.snap b/crates/parser/tests/snapshots/statements/valid/0010.snap new file mode 100644 index 00000000..402b5c07 --- /dev/null +++ b/crates/parser/tests/snapshots/statements/valid/0010.snap @@ -0,0 +1,31 @@ +--- +source: crates/parser/tests/statement_parser_test.rs +description: "INSERT INTO weather VALUES ('San Francisco', 46, 50, 0.25, '1994-11-27');\n" +--- +InsertStmt@0..74 + Insert@0..6 "INSERT" + Whitespace@6..7 " " + Into@7..11 "INTO" + Whitespace@11..12 " " + Ident@12..19 "weather" + Whitespace@19..20 " " + Values@20..26 "VALUES" + Whitespace@26..27 " " + Ascii40@27..28 "(" + Sconst@28..43 "'San Francisco'" + Ascii44@43..44 "," + Whitespace@44..45 " " + Iconst@45..47 "46" + Ascii44@47..48 "," + Whitespace@48..49 " " + Iconst@49..51 "50" + Ascii44@51..52 "," + Whitespace@52..53 " " + Fconst@53..57 "0.25" + Ascii44@57..58 "," + Whitespace@58..59 " " + Sconst@59..71 "'1994-11-27'" + Ascii41@71..72 ")" + Ascii59@72..73 ";" + Newline@73..74 "\n" + diff --git a/crates/parser/tests/snapshots/statements/valid/0011.snap b/crates/parser/tests/snapshots/statements/valid/0011.snap new file mode 100644 index 00000000..48d7b674 --- /dev/null +++ b/crates/parser/tests/snapshots/statements/valid/0011.snap @@ -0,0 +1,25 @@ +--- +source: crates/parser/tests/statement_parser_test.rs +description: "SELECT DISTINCT city\n FROM weather\n ORDER BY city;\n" +--- +SelectStmt@0..57 + Select@0..6 "SELECT" + Whitespace@6..7 " " + Distinct@7..15 "DISTINCT" + Whitespace@15..16 " " + Ident@16..20 "city" + Newline@20..21 "\n" + Whitespace@21..25 " " + From@25..29 "FROM" + Whitespace@29..30 " " + Ident@30..37 "weather" + Newline@37..38 "\n" + Whitespace@38..42 " " + Order@42..47 "ORDER" + Whitespace@47..48 " " + By@48..50 "BY" + Whitespace@50..51 " " + Ident@51..55 "city" + Ascii59@55..56 ";" + Newline@56..57 "\n" + diff --git a/crates/parser/tests/snapshots/statements/valid/0012.snap b/crates/parser/tests/snapshots/statements/valid/0012.snap new file mode 100644 index 00000000..f4d77ae0 --- /dev/null +++ b/crates/parser/tests/snapshots/statements/valid/0012.snap @@ -0,0 +1,52 @@ +--- +source: crates/parser/tests/statement_parser_test.rs +description: "CREATE TABLE measurement_y2008m01 PARTITION OF measurement\n FOR VALUES FROM ('2008-01-01') TO ('2008-02-01')\n WITH (parallel_workers = 4)\n TABLESPACE fasttablespace;\n" +--- +CreateStmt@0..175 + Create@0..6 "CREATE" + Whitespace@6..7 " " + Table@7..12 "TABLE" + Whitespace@12..13 " " + Ident@13..33 "measurement_y2008m01" + Whitespace@33..34 " " + Partition@34..43 "PARTITION" + Whitespace@43..44 " " + Of@44..46 "OF" + Whitespace@46..47 " " + Ident@47..58 "measurement" + Newline@58..59 "\n" + Whitespace@59..63 " " + For@63..66 "FOR" + Whitespace@66..67 " " + Values@67..73 "VALUES" + Whitespace@73..74 " " + From@74..78 "FROM" + Whitespace@78..79 " " + Ascii40@79..80 "(" + Sconst@80..92 "'2008-01-01'" + Ascii41@92..93 ")" + Whitespace@93..94 " " + To@94..96 "TO" + Whitespace@96..97 " " + Ascii40@97..98 "(" + Sconst@98..110 "'2008-02-01'" + Ascii41@110..111 ")" + Newline@111..112 "\n" + Whitespace@112..116 " " + With@116..120 "WITH" + Whitespace@120..121 " " + Ascii40@121..122 "(" + Ident@122..138 "parallel_workers" + Whitespace@138..139 " " + Ascii61@139..140 "=" + Whitespace@140..141 " " + Iconst@141..142 "4" + Ascii41@142..143 ")" + Newline@143..144 "\n" + Whitespace@144..148 " " + Tablespace@148..158 "TABLESPACE" + Whitespace@158..159 " " + Ident@159..173 "fasttablespace" + Ascii59@173..174 ";" + Newline@174..175 "\n" + diff --git a/crates/parser/tests/snapshots/statements/valid/0013.snap b/crates/parser/tests/snapshots/statements/valid/0013.snap new file mode 100644 index 00000000..643f1e95 --- /dev/null +++ b/crates/parser/tests/snapshots/statements/valid/0013.snap @@ -0,0 +1,44 @@ +--- +source: crates/parser/tests/statement_parser_test.rs +description: "UPDATE weather\n SET temp_hi = temp_hi - 2, temp_lo = temp_lo - 2\n WHERE date > '1994-11-28';\n" +--- +UpdateStmt@0..100 + Update@0..6 "UPDATE" + Whitespace@6..7 " " + Ident@7..14 "weather" + Newline@14..15 "\n" + Whitespace@15..19 " " + Set@19..22 "SET" + Whitespace@22..23 " " + Ident@23..30 "temp_hi" + Whitespace@30..31 " " + Ascii61@31..32 "=" + Whitespace@32..33 " " + Ident@33..40 "temp_hi" + Whitespace@40..41 " " + Ascii45@41..42 "-" + Whitespace@42..43 " " + Iconst@43..44 "2" + Ascii44@44..45 "," + Whitespace@45..47 " " + Ident@47..54 "temp_lo" + Whitespace@54..55 " " + Ascii61@55..56 "=" + Whitespace@56..57 " " + Ident@57..64 "temp_lo" + Whitespace@64..65 " " + Ascii45@65..66 "-" + Whitespace@66..67 " " + Iconst@67..68 "2" + Newline@68..69 "\n" + Whitespace@69..73 " " + Where@73..78 "WHERE" + Whitespace@78..79 " " + Ident@79..83 "date" + Whitespace@83..84 " " + Ascii62@84..85 ">" + Whitespace@85..86 " " + Sconst@86..98 "'1994-11-28'" + Ascii59@98..99 ";" + Newline@99..100 "\n" + diff --git a/crates/parser/tests/snapshots/statements/valid/0014.snap b/crates/parser/tests/snapshots/statements/valid/0014.snap new file mode 100644 index 00000000..80ceaf6d --- /dev/null +++ b/crates/parser/tests/snapshots/statements/valid/0014.snap @@ -0,0 +1,56 @@ +--- +source: crates/parser/tests/statement_parser_test.rs +description: "SELECT sum(salary) OVER w, avg(salary) OVER w\n FROM empsalary\n WINDOW w AS (PARTITION BY depname ORDER BY salary DESC);\n" +--- +SelectStmt@0..122 + Select@0..6 "SELECT" + Whitespace@6..7 " " + Ident@7..10 "sum" + Ascii40@10..11 "(" + Ident@11..17 "salary" + Ascii41@17..18 ")" + Whitespace@18..19 " " + Over@19..23 "OVER" + Whitespace@23..24 " " + Ident@24..25 "w" + Ascii44@25..26 "," + Whitespace@26..27 " " + Ident@27..30 "avg" + Ascii40@30..31 "(" + Ident@31..37 "salary" + Ascii41@37..38 ")" + Whitespace@38..39 " " + Over@39..43 "OVER" + Whitespace@43..44 " " + Ident@44..45 "w" + Newline@45..46 "\n" + Whitespace@46..48 " " + From@48..52 "FROM" + Whitespace@52..53 " " + Ident@53..62 "empsalary" + Newline@62..63 "\n" + Whitespace@63..65 " " + Window@65..71 "WINDOW" + Whitespace@71..72 " " + Ident@72..73 "w" + Whitespace@73..74 " " + As@74..76 "AS" + Whitespace@76..77 " " + Ascii40@77..78 "(" + Partition@78..87 "PARTITION" + Whitespace@87..88 " " + By@88..90 "BY" + Whitespace@90..91 " " + Ident@91..98 "depname" + Whitespace@98..99 " " + Order@99..104 "ORDER" + Whitespace@104..105 " " + By@105..107 "BY" + Whitespace@107..108 " " + Ident@108..114 "salary" + Whitespace@114..115 " " + Desc@115..119 "DESC" + Ascii41@119..120 ")" + Ascii59@120..121 ";" + Newline@121..122 "\n" + diff --git a/crates/parser/tests/snapshots/statements/valid/0015.snap b/crates/parser/tests/snapshots/statements/valid/0015.snap new file mode 100644 index 00000000..0d9223c5 --- /dev/null +++ b/crates/parser/tests/snapshots/statements/valid/0015.snap @@ -0,0 +1,58 @@ +--- +source: crates/parser/tests/statement_parser_test.rs +description: "SELECT\n count(*) AS unfiltered,\n count(*) FILTER (WHERE i < 5) AS filtered\nFROM generate_series(1,10) AS s(i);\n" +--- +SelectStmt@0..117 + Select@0..6 "SELECT" + Newline@6..7 "\n" + Whitespace@7..11 " " + Ident@11..16 "count" + Ascii40@16..17 "(" + Ascii42@17..18 "*" + Ascii41@18..19 ")" + Whitespace@19..20 " " + As@20..22 "AS" + Whitespace@22..23 " " + Ident@23..33 "unfiltered" + Ascii44@33..34 "," + Newline@34..35 "\n" + Whitespace@35..39 " " + Ident@39..44 "count" + Ascii40@44..45 "(" + Ascii42@45..46 "*" + Ascii41@46..47 ")" + Whitespace@47..48 " " + Filter@48..54 "FILTER" + Whitespace@54..55 " " + Ascii40@55..56 "(" + Where@56..61 "WHERE" + Whitespace@61..62 " " + Ident@62..63 "i" + Whitespace@63..64 " " + Ascii60@64..65 "<" + Whitespace@65..66 " " + Iconst@66..67 "5" + Ascii41@67..68 ")" + Whitespace@68..69 " " + As@69..71 "AS" + Whitespace@71..72 " " + Ident@72..80 "filtered" + Newline@80..81 "\n" + From@81..85 "FROM" + Whitespace@85..86 " " + Ident@86..101 "generate_series" + Ascii40@101..102 "(" + Iconst@102..103 "1" + Ascii44@103..104 "," + Iconst@104..106 "10" + Ascii41@106..107 ")" + Whitespace@107..108 " " + As@108..110 "AS" + Whitespace@110..111 " " + Ident@111..112 "s" + Ascii40@112..113 "(" + Ident@113..114 "i" + Ascii41@114..115 ")" + Ascii59@115..116 ";" + Newline@116..117 "\n" + diff --git a/crates/parser/tests/snapshots/statements/valid/0016.snap b/crates/parser/tests/snapshots/statements/valid/0016.snap new file mode 100644 index 00000000..6306aa10 --- /dev/null +++ b/crates/parser/tests/snapshots/statements/valid/0016.snap @@ -0,0 +1,27 @@ +--- +source: crates/parser/tests/statement_parser_test.rs +description: "SELECT * FROM tbl WHERE a COLLATE \"C\" > 'foo';\n" +--- +SelectStmt@0..47 + Select@0..6 "SELECT" + Whitespace@6..7 " " + Ascii42@7..8 "*" + Whitespace@8..9 " " + From@9..13 "FROM" + Whitespace@13..14 " " + Ident@14..17 "tbl" + Whitespace@17..18 " " + Where@18..23 "WHERE" + Whitespace@23..24 " " + Ident@24..25 "a" + Whitespace@25..26 " " + Collate@26..33 "COLLATE" + Whitespace@33..34 " " + Ident@34..37 "\"C\"" + Whitespace@37..38 " " + Ascii62@38..39 ">" + Whitespace@39..40 " " + Sconst@40..45 "'foo'" + Ascii59@45..46 ";" + Newline@46..47 "\n" + diff --git a/crates/parser/tests/snapshots/statements/valid/0017.snap b/crates/parser/tests/snapshots/statements/valid/0017.snap new file mode 100644 index 00000000..6c3f9d52 --- /dev/null +++ b/crates/parser/tests/snapshots/statements/valid/0017.snap @@ -0,0 +1,42 @@ +--- +source: crates/parser/tests/statement_parser_test.rs +description: "SELECT name, (SELECT max(pop) FROM cities WHERE cities.state = states.name)\n FROM states;\n" +--- +SelectStmt@0..93 + Select@0..6 "SELECT" + Whitespace@6..7 " " + NameP@7..11 "name" + Ascii44@11..12 "," + Whitespace@12..13 " " + Ascii40@13..14 "(" + Select@14..20 "SELECT" + Whitespace@20..21 " " + Ident@21..24 "max" + Ascii40@24..25 "(" + Ident@25..28 "pop" + Ascii41@28..29 ")" + Whitespace@29..30 " " + From@30..34 "FROM" + Whitespace@34..35 " " + Ident@35..41 "cities" + Whitespace@41..42 " " + Where@42..47 "WHERE" + Whitespace@47..48 " " + Ident@48..54 "cities" + Ascii46@54..55 "." + Ident@55..60 "state" + Whitespace@60..61 " " + Ascii61@61..62 "=" + Whitespace@62..63 " " + Ident@63..69 "states" + Ascii46@69..70 "." + NameP@70..74 "name" + Ascii41@74..75 ")" + Newline@75..76 "\n" + Whitespace@76..80 " " + From@80..84 "FROM" + Whitespace@84..85 " " + Ident@85..91 "states" + Ascii59@91..92 ";" + Newline@92..93 "\n" + diff --git a/crates/parser/tests/snapshots/statements/valid/0018.snap b/crates/parser/tests/snapshots/statements/valid/0018.snap new file mode 100644 index 00000000..a93ef99c --- /dev/null +++ b/crates/parser/tests/snapshots/statements/valid/0018.snap @@ -0,0 +1,22 @@ +--- +source: crates/parser/tests/statement_parser_test.rs +description: "SELECT ARRAY[1,2,22.7]::integer[];\n" +--- +SelectStmt@0..35 + Select@0..6 "SELECT" + Whitespace@6..7 " " + Array@7..12 "ARRAY" + Ascii91@12..13 "[" + Iconst@13..14 "1" + Ascii44@14..15 "," + Iconst@15..16 "2" + Ascii44@16..17 "," + Fconst@17..21 "22.7" + Ascii93@21..22 "]" + Typecast@22..24 "::" + Integer@24..31 "integer" + Ascii91@31..32 "[" + Ascii93@32..33 "]" + Ascii59@33..34 ";" + Newline@34..35 "\n" + diff --git a/crates/parser/tests/snapshots/statements/valid/0019.snap b/crates/parser/tests/snapshots/statements/valid/0019.snap new file mode 100644 index 00000000..97f59c8f --- /dev/null +++ b/crates/parser/tests/snapshots/statements/valid/0019.snap @@ -0,0 +1,42 @@ +--- +source: crates/parser/tests/statement_parser_test.rs +description: "SELECT CASE WHEN min(employees) > 0\n THEN avg(expenses / employees)\n END\n FROM departments;\n" +--- +SelectStmt@0..112 + Select@0..6 "SELECT" + Whitespace@6..7 " " + Case@7..11 "CASE" + Whitespace@11..12 " " + When@12..16 "WHEN" + Whitespace@16..17 " " + Ident@17..20 "min" + Ascii40@20..21 "(" + Ident@21..30 "employees" + Ascii41@30..31 ")" + Whitespace@31..32 " " + Ascii62@32..33 ">" + Whitespace@33..34 " " + Iconst@34..35 "0" + Newline@35..36 "\n" + Whitespace@36..48 " " + Then@48..52 "THEN" + Whitespace@52..53 " " + Ident@53..56 "avg" + Ascii40@56..57 "(" + Ident@57..65 "expenses" + Whitespace@65..66 " " + Ascii47@66..67 "/" + Whitespace@67..68 " " + Ident@68..77 "employees" + Ascii41@77..78 ")" + Newline@78..79 "\n" + Whitespace@79..86 " " + EndP@86..89 "END" + Newline@89..90 "\n" + Whitespace@90..94 " " + From@94..98 "FROM" + Whitespace@98..99 " " + Ident@99..110 "departments" + Ascii59@110..111 ";" + Newline@111..112 "\n" + diff --git a/crates/parser/tests/snapshots/statements/valid/0020.snap b/crates/parser/tests/snapshots/statements/valid/0020.snap new file mode 100644 index 00000000..f84f0ed9 --- /dev/null +++ b/crates/parser/tests/snapshots/statements/valid/0020.snap @@ -0,0 +1,48 @@ +--- +source: crates/parser/tests/statement_parser_test.rs +description: "CREATE FUNCTION concat_lower_or_upper(a text, b text, uppercase boolean DEFAULT false)\nRETURNS text\nAS\n$$\n SELECT CASE\n WHEN $3 THEN UPPER($1 || ' ' || $2)\n ELSE LOWER($1 || ' ' || $2)\n END;\n$$\nLANGUAGE SQL IMMUTABLE STRICT;\n" +--- +CreateFunctionStmt@0..246 + Create@0..6 "CREATE" + Whitespace@6..7 " " + Function@7..15 "FUNCTION" + Whitespace@15..16 " " + Ident@16..37 "concat_lower_or_upper" + Ascii40@37..38 "(" + Ident@38..39 "a" + Whitespace@39..40 " " + TextP@40..44 "text" + Ascii44@44..45 "," + Whitespace@45..46 " " + Ident@46..47 "b" + Whitespace@47..48 " " + TextP@48..52 "text" + Ascii44@52..53 "," + Whitespace@53..54 " " + Ident@54..63 "uppercase" + Whitespace@63..64 " " + BooleanP@64..71 "boolean" + Whitespace@71..72 " " + Default@72..79 "DEFAULT" + Whitespace@79..80 " " + FalseP@80..85 "false" + Ascii41@85..86 ")" + Newline@86..87 "\n" + Returns@87..94 "RETURNS" + Whitespace@94..95 " " + TextP@95..99 "text" + Newline@99..100 "\n" + As@100..102 "AS" + Newline@102..103 "\n" + Sconst@103..214 "$$\n SELECT CASE\n ..." + Newline@214..215 "\n" + Language@215..223 "LANGUAGE" + Whitespace@223..224 " " + SqlP@224..227 "SQL" + Whitespace@227..228 " " + Immutable@228..237 "IMMUTABLE" + Whitespace@237..238 " " + StrictP@238..244 "STRICT" + Ascii59@244..245 ";" + Newline@245..246 "\n" + diff --git a/crates/parser/tests/snapshots/statements/valid/0021.snap b/crates/parser/tests/snapshots/statements/valid/0021.snap new file mode 100644 index 00000000..ec8ea421 --- /dev/null +++ b/crates/parser/tests/snapshots/statements/valid/0021.snap @@ -0,0 +1,32 @@ +--- +source: crates/parser/tests/statement_parser_test.rs +description: "SELECT concat_lower_or_upper(a => 'Hello', b => 'World', uppercase => true);\n" +--- +SelectStmt@0..77 + Select@0..6 "SELECT" + Whitespace@6..7 " " + Ident@7..28 "concat_lower_or_upper" + Ascii40@28..29 "(" + Ident@29..30 "a" + Whitespace@30..31 " " + EqualsGreater@31..33 "=>" + Whitespace@33..34 " " + Sconst@34..41 "'Hello'" + Ascii44@41..42 "," + Whitespace@42..43 " " + Ident@43..44 "b" + Whitespace@44..45 " " + EqualsGreater@45..47 "=>" + Whitespace@47..48 " " + Sconst@48..55 "'World'" + Ascii44@55..56 "," + Whitespace@56..57 " " + Ident@57..66 "uppercase" + Whitespace@66..67 " " + EqualsGreater@67..69 "=>" + Whitespace@69..70 " " + TrueP@70..74 "true" + Ascii41@74..75 ")" + Ascii59@75..76 ";" + Newline@76..77 "\n" + diff --git a/crates/parser/tests/snapshots/statements/valid/0022.snap b/crates/parser/tests/snapshots/statements/valid/0022.snap new file mode 100644 index 00000000..b80610e9 --- /dev/null +++ b/crates/parser/tests/snapshots/statements/valid/0022.snap @@ -0,0 +1,38 @@ +--- +source: crates/parser/tests/statement_parser_test.rs +description: "CREATE TABLE products (\n product_no integer,\n name text,\n price numeric DEFAULT 9.99\n);\n" +--- +CreateStmt@0..97 + Create@0..6 "CREATE" + Whitespace@6..7 " " + Table@7..12 "TABLE" + Whitespace@12..13 " " + Ident@13..21 "products" + Whitespace@21..22 " " + Ascii40@22..23 "(" + Newline@23..24 "\n" + Whitespace@24..28 " " + Ident@28..38 "product_no" + Whitespace@38..39 " " + Integer@39..46 "integer" + Ascii44@46..47 "," + Newline@47..48 "\n" + Whitespace@48..52 " " + NameP@52..56 "name" + Whitespace@56..57 " " + TextP@57..61 "text" + Ascii44@61..62 "," + Newline@62..63 "\n" + Whitespace@63..67 " " + Ident@67..72 "price" + Whitespace@72..73 " " + Numeric@73..80 "numeric" + Whitespace@80..81 " " + Default@81..88 "DEFAULT" + Whitespace@88..89 " " + Fconst@89..93 "9.99" + Newline@93..94 "\n" + Ascii41@94..95 ")" + Ascii59@95..96 ";" + Newline@96..97 "\n" + diff --git a/crates/parser/tests/snapshots/statements/valid/0023.snap b/crates/parser/tests/snapshots/statements/valid/0023.snap new file mode 100644 index 00000000..2a8ccc2b --- /dev/null +++ b/crates/parser/tests/snapshots/statements/valid/0023.snap @@ -0,0 +1,72 @@ +--- +source: crates/parser/tests/statement_parser_test.rs +description: "CREATE TABLE products (\n product_no integer,\n name text,\n price numeric CHECK (price > 0),\n discounted_price numeric CHECK (discounted_price > 0),\n CHECK (price > discounted_price)\n);\n" +--- +CreateStmt@0..199 + Create@0..6 "CREATE" + Whitespace@6..7 " " + Table@7..12 "TABLE" + Whitespace@12..13 " " + Ident@13..21 "products" + Whitespace@21..22 " " + Ascii40@22..23 "(" + Newline@23..24 "\n" + Whitespace@24..28 " " + Ident@28..38 "product_no" + Whitespace@38..39 " " + Integer@39..46 "integer" + Ascii44@46..47 "," + Newline@47..48 "\n" + Whitespace@48..52 " " + NameP@52..56 "name" + Whitespace@56..57 " " + TextP@57..61 "text" + Ascii44@61..62 "," + Newline@62..63 "\n" + Whitespace@63..67 " " + Ident@67..72 "price" + Whitespace@72..73 " " + Numeric@73..80 "numeric" + Whitespace@80..81 " " + Check@81..86 "CHECK" + Whitespace@86..87 " " + Ascii40@87..88 "(" + Ident@88..93 "price" + Whitespace@93..94 " " + Ascii62@94..95 ">" + Whitespace@95..96 " " + Iconst@96..97 "0" + Ascii41@97..98 ")" + Ascii44@98..99 "," + Newline@99..100 "\n" + Whitespace@100..104 " " + Ident@104..120 "discounted_price" + Whitespace@120..121 " " + Numeric@121..128 "numeric" + Whitespace@128..129 " " + Check@129..134 "CHECK" + Whitespace@134..135 " " + Ascii40@135..136 "(" + Ident@136..152 "discounted_price" + Whitespace@152..153 " " + Ascii62@153..154 ">" + Whitespace@154..155 " " + Iconst@155..156 "0" + Ascii41@156..157 ")" + Ascii44@157..158 "," + Newline@158..159 "\n" + Whitespace@159..163 " " + Check@163..168 "CHECK" + Whitespace@168..169 " " + Ascii40@169..170 "(" + Ident@170..175 "price" + Whitespace@175..176 " " + Ascii62@176..177 ">" + Whitespace@177..178 " " + Ident@178..194 "discounted_price" + Ascii41@194..195 ")" + Newline@195..196 "\n" + Ascii41@196..197 ")" + Ascii59@197..198 ";" + Newline@198..199 "\n" + diff --git a/crates/parser/tests/snapshots/statements/valid/0024.snap b/crates/parser/tests/snapshots/statements/valid/0024.snap new file mode 100644 index 00000000..e4c63589 --- /dev/null +++ b/crates/parser/tests/snapshots/statements/valid/0024.snap @@ -0,0 +1,55 @@ +--- +source: crates/parser/tests/statement_parser_test.rs +description: "CREATE TABLE order_items (\n product_no integer REFERENCES products,\n order_id integer REFERENCES orders,\n quantity integer,\n PRIMARY KEY (product_no, order_id)\n);\n" +--- +CreateStmt@0..175 + Create@0..6 "CREATE" + Whitespace@6..7 " " + Table@7..12 "TABLE" + Whitespace@12..13 " " + Ident@13..24 "order_items" + Whitespace@24..25 " " + Ascii40@25..26 "(" + Newline@26..27 "\n" + Whitespace@27..31 " " + Ident@31..41 "product_no" + Whitespace@41..42 " " + Integer@42..49 "integer" + Whitespace@49..50 " " + References@50..60 "REFERENCES" + Whitespace@60..61 " " + Ident@61..69 "products" + Ascii44@69..70 "," + Newline@70..71 "\n" + Whitespace@71..75 " " + Ident@75..83 "order_id" + Whitespace@83..84 " " + Integer@84..91 "integer" + Whitespace@91..92 " " + References@92..102 "REFERENCES" + Whitespace@102..103 " " + Ident@103..109 "orders" + Ascii44@109..110 "," + Newline@110..111 "\n" + Whitespace@111..115 " " + Ident@115..123 "quantity" + Whitespace@123..124 " " + Integer@124..131 "integer" + Ascii44@131..132 "," + Newline@132..133 "\n" + Whitespace@133..137 " " + Primary@137..144 "PRIMARY" + Whitespace@144..145 " " + Key@145..148 "KEY" + Whitespace@148..149 " " + Ascii40@149..150 "(" + Ident@150..160 "product_no" + Ascii44@160..161 "," + Whitespace@161..162 " " + Ident@162..170 "order_id" + Ascii41@170..171 ")" + Newline@171..172 "\n" + Ascii41@172..173 ")" + Ascii59@173..174 ";" + Newline@174..175 "\n" + diff --git a/crates/parser/tests/snapshots/statements/valid/0025.snap b/crates/parser/tests/snapshots/statements/valid/0025.snap new file mode 100644 index 00000000..cc279acf --- /dev/null +++ b/crates/parser/tests/snapshots/statements/valid/0025.snap @@ -0,0 +1,25 @@ +--- +source: crates/parser/tests/statement_parser_test.rs +description: "ALTER TABLE products ADD CHECK (name <> '');\n" +--- +AlterTableStmt@0..45 + Alter@0..5 "ALTER" + Whitespace@5..6 " " + Table@6..11 "TABLE" + Whitespace@11..12 " " + Ident@12..20 "products" + Whitespace@20..21 " " + AddP@21..24 "ADD" + Whitespace@24..25 " " + Check@25..30 "CHECK" + Whitespace@30..31 " " + Ascii40@31..32 "(" + NameP@32..36 "name" + Whitespace@36..37 " " + NotEquals@37..39 "<>" + Whitespace@39..40 " " + Sconst@40..42 "''" + Ascii41@42..43 ")" + Ascii59@43..44 ";" + Newline@44..45 "\n" + diff --git a/crates/parser/tests/snapshots/statements/valid/0026.snap b/crates/parser/tests/snapshots/statements/valid/0026.snap new file mode 100644 index 00000000..730b2138 --- /dev/null +++ b/crates/parser/tests/snapshots/statements/valid/0026.snap @@ -0,0 +1,28 @@ +--- +source: crates/parser/tests/statement_parser_test.rs +description: "ALTER TABLE products ALTER COLUMN price TYPE numeric(10,2);\n" +--- +AlterTableStmt@0..60 + Alter@0..5 "ALTER" + Whitespace@5..6 " " + Table@6..11 "TABLE" + Whitespace@11..12 " " + Ident@12..20 "products" + Whitespace@20..21 " " + Alter@21..26 "ALTER" + Whitespace@26..27 " " + Column@27..33 "COLUMN" + Whitespace@33..34 " " + Ident@34..39 "price" + Whitespace@39..40 " " + TypeP@40..44 "TYPE" + Whitespace@44..45 " " + Numeric@45..52 "numeric" + Ascii40@52..53 "(" + Iconst@53..55 "10" + Ascii44@55..56 "," + Iconst@56..57 "2" + Ascii41@57..58 ")" + Ascii59@58..59 ";" + Newline@59..60 "\n" + diff --git a/crates/parser/tests/snapshots/statements/valid/0027.snap b/crates/parser/tests/snapshots/statements/valid/0027.snap new file mode 100644 index 00000000..2b88e432 --- /dev/null +++ b/crates/parser/tests/snapshots/statements/valid/0027.snap @@ -0,0 +1,19 @@ +--- +source: crates/parser/tests/statement_parser_test.rs +description: "GRANT UPDATE ON accounts TO joe;\n" +--- +GrantStmt@0..33 + Grant@0..5 "GRANT" + Whitespace@5..6 " " + Update@6..12 "UPDATE" + Whitespace@12..13 " " + On@13..15 "ON" + Whitespace@15..16 " " + Ident@16..24 "accounts" + Whitespace@24..25 " " + To@25..27 "TO" + Whitespace@27..28 " " + Ident@28..31 "joe" + Ascii59@31..32 ";" + Newline@32..33 "\n" + diff --git a/crates/parser/tests/snapshots/statements/valid/0028.snap b/crates/parser/tests/snapshots/statements/valid/0028.snap new file mode 100644 index 00000000..c9ca0372 --- /dev/null +++ b/crates/parser/tests/snapshots/statements/valid/0028.snap @@ -0,0 +1,19 @@ +--- +source: crates/parser/tests/statement_parser_test.rs +description: "REVOKE ALL ON accounts FROM PUBLIC;\n" +--- +GrantStmt@0..36 + Revoke@0..6 "REVOKE" + Whitespace@6..7 " " + All@7..10 "ALL" + Whitespace@10..11 " " + On@11..13 "ON" + Whitespace@13..14 " " + Ident@14..22 "accounts" + Whitespace@22..23 " " + From@23..27 "FROM" + Whitespace@27..28 " " + Ident@28..34 "PUBLIC" + Ascii59@34..35 ";" + Newline@35..36 "\n" + diff --git a/crates/parser/tests/snapshots/statements/valid/0029.snap b/crates/parser/tests/snapshots/statements/valid/0029.snap new file mode 100644 index 00000000..ae280f52 --- /dev/null +++ b/crates/parser/tests/snapshots/statements/valid/0029.snap @@ -0,0 +1,30 @@ +--- +source: crates/parser/tests/statement_parser_test.rs +description: "GRANT SELECT (col1), UPDATE (col1) ON mytable TO miriam_rw;\n" +--- +GrantStmt@0..60 + Grant@0..5 "GRANT" + Whitespace@5..6 " " + Select@6..12 "SELECT" + Whitespace@12..13 " " + Ascii40@13..14 "(" + Ident@14..18 "col1" + Ascii41@18..19 ")" + Ascii44@19..20 "," + Whitespace@20..21 " " + Update@21..27 "UPDATE" + Whitespace@27..28 " " + Ascii40@28..29 "(" + Ident@29..33 "col1" + Ascii41@33..34 ")" + Whitespace@34..35 " " + On@35..37 "ON" + Whitespace@37..38 " " + Ident@38..45 "mytable" + Whitespace@45..46 " " + To@46..48 "TO" + Whitespace@48..49 " " + Ident@49..58 "miriam_rw" + Ascii59@58..59 ";" + Newline@59..60 "\n" + diff --git a/crates/parser/tests/snapshots/statements/valid/0030.snap b/crates/parser/tests/snapshots/statements/valid/0030.snap new file mode 100644 index 00000000..68c40f34 --- /dev/null +++ b/crates/parser/tests/snapshots/statements/valid/0030.snap @@ -0,0 +1,32 @@ +--- +source: crates/parser/tests/statement_parser_test.rs +description: "CREATE POLICY account_managers ON accounts TO managers\n USING (manager = current_user);\n" +--- +CreatePolicyStmt@0..91 + Create@0..6 "CREATE" + Whitespace@6..7 " " + Policy@7..13 "POLICY" + Whitespace@13..14 " " + Ident@14..30 "account_managers" + Whitespace@30..31 " " + On@31..33 "ON" + Whitespace@33..34 " " + Ident@34..42 "accounts" + Whitespace@42..43 " " + To@43..45 "TO" + Whitespace@45..46 " " + Ident@46..54 "managers" + Newline@54..55 "\n" + Whitespace@55..59 " " + Using@59..64 "USING" + Whitespace@64..65 " " + Ascii40@65..66 "(" + Ident@66..73 "manager" + Whitespace@73..74 " " + Ascii61@74..75 "=" + Whitespace@75..76 " " + CurrentUser@76..88 "current_user" + Ascii41@88..89 ")" + Ascii59@89..90 ";" + Newline@90..91 "\n" + diff --git a/crates/parser/tests/snapshots/statements/valid/0031.snap b/crates/parser/tests/snapshots/statements/valid/0031.snap new file mode 100644 index 00000000..f3456e11 --- /dev/null +++ b/crates/parser/tests/snapshots/statements/valid/0031.snap @@ -0,0 +1,68 @@ +--- +source: crates/parser/tests/statement_parser_test.rs +description: "CREATE POLICY user_mod ON passwd FOR UPDATE\n USING (current_user = user_name)\n WITH CHECK (\n current_user = user_name AND\n shell IN ('/bin/bash','/bin/sh','/bin/dash','/bin/zsh','/bin/tcsh')\n );\n" +--- +CreatePolicyStmt@0..204 + Create@0..6 "CREATE" + Whitespace@6..7 " " + Policy@7..13 "POLICY" + Whitespace@13..14 " " + Ident@14..22 "user_mod" + Whitespace@22..23 " " + On@23..25 "ON" + Whitespace@25..26 " " + Ident@26..32 "passwd" + Whitespace@32..33 " " + For@33..36 "FOR" + Whitespace@36..37 " " + Update@37..43 "UPDATE" + Newline@43..44 "\n" + Whitespace@44..46 " " + Using@46..51 "USING" + Whitespace@51..52 " " + Ascii40@52..53 "(" + CurrentUser@53..65 "current_user" + Whitespace@65..66 " " + Ascii61@66..67 "=" + Whitespace@67..68 " " + Ident@68..77 "user_name" + Ascii41@77..78 ")" + Newline@78..79 "\n" + Whitespace@79..81 " " + With@81..85 "WITH" + Whitespace@85..86 " " + Check@86..91 "CHECK" + Whitespace@91..92 " " + Ascii40@92..93 "(" + Newline@93..94 "\n" + Whitespace@94..98 " " + CurrentUser@98..110 "current_user" + Whitespace@110..111 " " + Ascii61@111..112 "=" + Whitespace@112..113 " " + Ident@113..122 "user_name" + Whitespace@122..123 " " + And@123..126 "AND" + Newline@126..127 "\n" + Whitespace@127..131 " " + Ident@131..136 "shell" + Whitespace@136..137 " " + InP@137..139 "IN" + Whitespace@139..140 " " + Ascii40@140..141 "(" + Sconst@141..152 "'/bin/bash'" + Ascii44@152..153 "," + Sconst@153..162 "'/bin/sh'" + Ascii44@162..163 "," + Sconst@163..174 "'/bin/dash'" + Ascii44@174..175 "," + Sconst@175..185 "'/bin/zsh'" + Ascii44@185..186 "," + Sconst@186..197 "'/bin/tcsh'" + Ascii41@197..198 ")" + Newline@198..199 "\n" + Whitespace@199..201 " " + Ascii41@201..202 ")" + Ascii59@202..203 ";" + Newline@203..204 "\n" + diff --git a/crates/parser/tests/snapshots/statements/valid/0032.snap b/crates/parser/tests/snapshots/statements/valid/0032.snap new file mode 100644 index 00000000..d82132b6 --- /dev/null +++ b/crates/parser/tests/snapshots/statements/valid/0032.snap @@ -0,0 +1,17 @@ +--- +source: crates/parser/tests/statement_parser_test.rs +description: "SET search_path TO myschema,public;\n" +--- +VariableSetStmt@0..36 + Set@0..3 "SET" + Whitespace@3..4 " " + Ident@4..15 "search_path" + Whitespace@15..16 " " + To@16..18 "TO" + Whitespace@18..19 " " + Ident@19..27 "myschema" + Ascii44@27..28 "," + Ident@28..34 "public" + Ascii59@34..35 ";" + Newline@35..36 "\n" + diff --git a/crates/parser/tests/snapshots/statements/valid/0033.snap b/crates/parser/tests/snapshots/statements/valid/0033.snap new file mode 100644 index 00000000..dbef84a2 --- /dev/null +++ b/crates/parser/tests/snapshots/statements/valid/0033.snap @@ -0,0 +1,58 @@ +--- +source: crates/parser/tests/statement_parser_test.rs +description: "CREATE TABLE measurement (\n city_id int not null,\n logdate date not null,\n peaktemp int,\n unitsales int\n) PARTITION BY RANGE (logdate);\n" +--- +CreateStmt@0..177 + Create@0..6 "CREATE" + Whitespace@6..7 " " + Table@7..12 "TABLE" + Whitespace@12..13 " " + Ident@13..24 "measurement" + Whitespace@24..25 " " + Ascii40@25..26 "(" + Newline@26..27 "\n" + Whitespace@27..31 " " + Ident@31..38 "city_id" + Whitespace@38..47 " " + IntP@47..50 "int" + Whitespace@50..51 " " + Not@51..54 "not" + Whitespace@54..55 " " + NullP@55..59 "null" + Ascii44@59..60 "," + Newline@60..61 "\n" + Whitespace@61..65 " " + Ident@65..72 "logdate" + Whitespace@72..81 " " + Ident@81..85 "date" + Whitespace@85..86 " " + Not@86..89 "not" + Whitespace@89..90 " " + NullP@90..94 "null" + Ascii44@94..95 "," + Newline@95..96 "\n" + Whitespace@96..100 " " + Ident@100..108 "peaktemp" + Whitespace@108..116 " " + IntP@116..119 "int" + Ascii44@119..120 "," + Newline@120..121 "\n" + Whitespace@121..125 " " + Ident@125..134 "unitsales" + Whitespace@134..141 " " + IntP@141..144 "int" + Newline@144..145 "\n" + Ascii41@145..146 ")" + Whitespace@146..147 " " + Partition@147..156 "PARTITION" + Whitespace@156..157 " " + By@157..159 "BY" + Whitespace@159..160 " " + Range@160..165 "RANGE" + Whitespace@165..166 " " + Ascii40@166..167 "(" + Ident@167..174 "logdate" + Ascii41@174..175 ")" + Ascii59@175..176 ";" + Newline@176..177 "\n" + diff --git a/crates/parser/tests/snapshots/statements/valid/0034.snap b/crates/parser/tests/snapshots/statements/valid/0034.snap new file mode 100644 index 00000000..efede445 --- /dev/null +++ b/crates/parser/tests/snapshots/statements/valid/0034.snap @@ -0,0 +1,25 @@ +--- +source: crates/parser/tests/statement_parser_test.rs +description: "select *,some_col from contact where id = '123 4 5';\n" +--- +SelectStmt@0..53 + Select@0..6 "select" + Whitespace@6..7 " " + Ascii42@7..8 "*" + Ascii44@8..9 "," + Ident@9..17 "some_col" + Whitespace@17..18 " " + From@18..22 "from" + Whitespace@22..23 " " + Ident@23..30 "contact" + Whitespace@30..31 " " + Where@31..36 "where" + Whitespace@36..37 " " + Ident@37..39 "id" + Whitespace@39..40 " " + Ascii61@40..41 "=" + Whitespace@41..42 " " + Sconst@42..51 "'123 4 5'" + Ascii59@51..52 ";" + Newline@52..53 "\n" + diff --git a/crates/parser/tests/snapshots/statements/valid/0035.snap b/crates/parser/tests/snapshots/statements/valid/0035.snap new file mode 100644 index 00000000..efede445 --- /dev/null +++ b/crates/parser/tests/snapshots/statements/valid/0035.snap @@ -0,0 +1,25 @@ +--- +source: crates/parser/tests/statement_parser_test.rs +description: "select *,some_col from contact where id = '123 4 5';\n" +--- +SelectStmt@0..53 + Select@0..6 "select" + Whitespace@6..7 " " + Ascii42@7..8 "*" + Ascii44@8..9 "," + Ident@9..17 "some_col" + Whitespace@17..18 " " + From@18..22 "from" + Whitespace@22..23 " " + Ident@23..30 "contact" + Whitespace@30..31 " " + Where@31..36 "where" + Whitespace@36..37 " " + Ident@37..39 "id" + Whitespace@39..40 " " + Ascii61@40..41 "=" + Whitespace@41..42 " " + Sconst@42..51 "'123 4 5'" + Ascii59@51..52 ";" + Newline@52..53 "\n" + diff --git a/crates/parser/tests/snapshots/statements/valid/0036.snap b/crates/parser/tests/snapshots/statements/valid/0036.snap new file mode 100644 index 00000000..56b13946 --- /dev/null +++ b/crates/parser/tests/snapshots/statements/valid/0036.snap @@ -0,0 +1,42 @@ +--- +source: crates/parser/tests/statement_parser_test.rs +description: "CREATE FUNCTION dup(in int, out f1 int, out f2 text)\n AS $$ SELECT $1, CAST($1 AS text) || ' is text' $$\n LANGUAGE SQL;\n" +--- +CreateFunctionStmt@0..126 + Create@0..6 "CREATE" + Whitespace@6..7 " " + Function@7..15 "FUNCTION" + Whitespace@15..16 " " + Ident@16..19 "dup" + Ascii40@19..20 "(" + InP@20..22 "in" + Whitespace@22..23 " " + IntP@23..26 "int" + Ascii44@26..27 "," + Whitespace@27..28 " " + OutP@28..31 "out" + Whitespace@31..32 " " + Ident@32..34 "f1" + Whitespace@34..35 " " + IntP@35..38 "int" + Ascii44@38..39 "," + Whitespace@39..40 " " + OutP@40..43 "out" + Whitespace@43..44 " " + Ident@44..46 "f2" + Whitespace@46..47 " " + TextP@47..51 "text" + Ascii41@51..52 ")" + Newline@52..53 "\n" + Whitespace@53..57 " " + As@57..59 "AS" + Whitespace@59..60 " " + Sconst@60..107 "$$ SELECT $1, CAST($1 ..." + Newline@107..108 "\n" + Whitespace@108..112 " " + Language@112..120 "LANGUAGE" + Whitespace@120..121 " " + SqlP@121..124 "SQL" + Ascii59@124..125 ";" + Newline@125..126 "\n" + diff --git a/crates/parser/tests/statement_parser_test.rs b/crates/parser/tests/statement_parser_test.rs new file mode 100644 index 00000000..4eef7303 --- /dev/null +++ b/crates/parser/tests/statement_parser_test.rs @@ -0,0 +1,39 @@ +use std::fs; +mod common; +use insta; +use parser::Parser; + +const VALID_STATEMENTS_PATH: &str = "tests/data/statements/valid/"; + +#[test] +fn valid_statements() { + common::setup(); + + let mut paths: Vec<_> = fs::read_dir(VALID_STATEMENTS_PATH) + .unwrap() + .map(|r| r.unwrap()) + .collect(); + paths.sort_by_key(|dir| dir.path()); + + paths.iter().for_each(|f| { + let path = f.path(); + let file_name = path.file_name().unwrap(); + let test_name = file_name.to_str().unwrap().replace(".sql", ""); + + let contents = fs::read_to_string(&path).unwrap(); + + let mut parser = Parser::new(); + parser.parse_statement(&contents, None); + let parsed = parser.finish(); + + let mut settings = insta::Settings::clone_current(); + settings.set_input_file(path); + settings.set_prepend_module_to_snapshot(false); + settings.set_description(contents); + settings.set_omit_expression(true); + settings.set_snapshot_path("snapshots/statements/valid"); + settings.bind(|| { + insta::assert_debug_snapshot!(test_name, &parsed.cst); + }); + }); +} diff --git a/crates/pg_query_proto_parser/Cargo.toml b/crates/pg_query_proto_parser/Cargo.toml new file mode 100644 index 00000000..a8c0fdb5 --- /dev/null +++ b/crates/pg_query_proto_parser/Cargo.toml @@ -0,0 +1,14 @@ +[package] +name = "pg_query_proto_parser" +version = "0.0.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +protobuf-parse = "3.2.0" +protobuf = "3.2.0" +convert_case = "0.6.0" + +[lib] +doctest = false diff --git a/crates/pg_query_proto_parser/src/lib.rs b/crates/pg_query_proto_parser/src/lib.rs new file mode 100644 index 00000000..12f8cf9c --- /dev/null +++ b/crates/pg_query_proto_parser/src/lib.rs @@ -0,0 +1,9 @@ +//! A parser for the libg_query proto file +//! +//! This crate provides a parser for the libg_query proto file, and a struct to represent and interact with the parsed file. + +mod proto_file; +mod proto_parser; + +pub use crate::proto_file::{Field, FieldType, Node, ProtoFile, Token}; +pub use crate::proto_parser::ProtoParser; diff --git a/crates/pg_query_proto_parser/src/proto_file.rs b/crates/pg_query_proto_parser/src/proto_file.rs new file mode 100644 index 00000000..2cc32798 --- /dev/null +++ b/crates/pg_query_proto_parser/src/proto_file.rs @@ -0,0 +1,60 @@ +/// The FieldTypes of a protobuf message +#[derive(Debug, Eq, PartialEq)] +pub enum FieldType { + Node, + Double, + Float, + Int64, + Uint64, + Int32, + Fixed64, + Fixed32, + Bool, + String, + Group, + Message, + Bytes, + Uint32, + Enum, + Sfixed32, + Sfixed64, + Sint32, + Sint64, +} + +/// A libg_query token +#[derive(Debug)] +pub struct Token { + pub name: String, + pub value: i32, +} + +/// A libg_query field +#[derive(Debug)] +pub struct Field { + pub name: String, + pub node_name: Option<String>, + pub enum_variant_name: Option<String>, + pub field_type: FieldType, + pub repeated: bool, + pub is_one_of: bool, +} + +/// A libg_query node +#[derive(Debug)] +pub struct Node { + pub name: String, + pub fields: Vec<Field>, +} + +/// The libg_query proto file +pub struct ProtoFile { + pub tokens: Vec<Token>, + pub nodes: Vec<Node>, +} + +impl ProtoFile { + pub fn node(&self, name: &str) -> Option<&Node> { + self.nodes.iter().find(|n| n.name == name) + } +} diff --git a/crates/pg_query_proto_parser/src/proto_parser.rs b/crates/pg_query_proto_parser/src/proto_parser.rs new file mode 100644 index 00000000..f393b0a1 --- /dev/null +++ b/crates/pg_query_proto_parser/src/proto_parser.rs @@ -0,0 +1,182 @@ +use convert_case::{Case, Casing}; +use protobuf::descriptor::{field_descriptor_proto::Label, FileDescriptorProto}; +use protobuf_parse::Parser; +use std::path::Path; + +use crate::proto_file::{Field, FieldType, Node, ProtoFile, Token}; + +/// The parser for the libg_query proto file +pub struct ProtoParser { + inner: FileDescriptorProto, +} + +impl ProtoParser { + pub fn new(file_path: &str) -> Self { + let proto_file = Path::new(file_path); + let proto_dir = proto_file.parent().unwrap(); + + let result = Parser::new() + .pure() + .include(proto_dir) + .input(proto_file) + .parse_and_typecheck() + .unwrap(); + + ProtoParser { + inner: result.file_descriptors[0].clone(), + } + } + + pub fn parse(&self) -> ProtoFile { + ProtoFile { + tokens: self.tokens(), + nodes: self.nodes(), + } + } + + fn tokens(&self) -> Vec<Token> { + self.inner + .enum_type + .iter() + .find(|e| e.name == Some("Token".into())) + .unwrap() + .value + .iter() + .map(|e| Token { + // token names in proto are UPPERCASE_SNAKE_CASE + name: e.name.clone().unwrap().to_case(Case::UpperCamel), + value: e.number.unwrap(), + }) + .collect() + } + + fn get_enum_variant_name(&self, type_name: &str) -> Option<String> { + let variant = self + .inner + .message_type + .iter() + .find(|e| e.name == Some("Node".into())) + .unwrap() + .field + .iter() + .find(|e| e.type_name().split(".").last().unwrap() == type_name); + match variant { + Some(v) => Some(v.name.clone().unwrap().to_case(Case::UpperCamel)), + None => None, + } + } + + fn nodes(&self) -> Vec<Node> { + self.inner + .message_type + .iter() + .find(|e| e.name == Some("Node".into())) + .unwrap() + .field + .iter() + .map(|e| { + let name: String = e.name.to_owned().unwrap().to_case(Case::UpperCamel); + let node = self + .inner + .message_type + .iter() + .find(|n| { + n.name.clone().unwrap().to_case(Case::UpperCamel) + == e.json_name.as_ref().unwrap().to_case(Case::UpperCamel) + }) + .unwrap(); + + let mut fields: Vec<Field> = Vec::new(); + // from node fields + fields.append(&mut + node + .field + .iter() + .filter_map(|e| { + // skip one of fields, they are handled separately + if e.has_oneof_index() { + return None; + } + // use label and type to get the field type + let type_name: FieldType = match e.type_name() { + "" => match e.type_() { + protobuf::descriptor::field_descriptor_proto::Type::TYPE_DOUBLE => FieldType::Double, + protobuf::descriptor::field_descriptor_proto::Type::TYPE_FLOAT => FieldType::Float, + protobuf::descriptor::field_descriptor_proto::Type::TYPE_INT64 => FieldType::Int64, + protobuf::descriptor::field_descriptor_proto::Type::TYPE_UINT64 => FieldType::Uint64, + protobuf::descriptor::field_descriptor_proto::Type::TYPE_INT32 => FieldType::Int32, + protobuf::descriptor::field_descriptor_proto::Type::TYPE_FIXED64 => FieldType::Fixed64, + protobuf::descriptor::field_descriptor_proto::Type::TYPE_FIXED32 => FieldType::Fixed32, + protobuf::descriptor::field_descriptor_proto::Type::TYPE_BOOL => FieldType::Bool, + protobuf::descriptor::field_descriptor_proto::Type::TYPE_STRING => FieldType::String, + protobuf::descriptor::field_descriptor_proto::Type::TYPE_GROUP => FieldType::Group, + protobuf::descriptor::field_descriptor_proto::Type::TYPE_MESSAGE => FieldType::Message, + protobuf::descriptor::field_descriptor_proto::Type::TYPE_BYTES => FieldType::Bytes, + protobuf::descriptor::field_descriptor_proto::Type::TYPE_UINT32 => FieldType::Uint32, + protobuf::descriptor::field_descriptor_proto::Type::TYPE_ENUM => FieldType::Enum, + protobuf::descriptor::field_descriptor_proto::Type::TYPE_SFIXED32 => FieldType::Sfixed32, + protobuf::descriptor::field_descriptor_proto::Type::TYPE_SFIXED64 => FieldType::Sfixed64, + protobuf::descriptor::field_descriptor_proto::Type::TYPE_SINT32 => FieldType::Sint32, + protobuf::descriptor::field_descriptor_proto::Type::TYPE_SINT64 => FieldType::Sint64, + }, + _ => { + if !e.type_name().starts_with(".pg_query") { + panic!("Unknown type: {}", e.type_name()); + + } + if e.type_() == protobuf::descriptor::field_descriptor_proto::Type::TYPE_ENUM { + FieldType::Enum + } else { + FieldType::Node + } + }, + }; + let mut node_name = None; + let mut enum_variant_name = None; + if e.type_name().starts_with(".pg_query") { + let n = e.type_name().split(".").last().unwrap().to_string(); + node_name = Some(n.clone()); + if n != "Node" { + enum_variant_name = self.get_enum_variant_name(e.type_name().split(".").last().unwrap().to_string().as_str()); + } + } + // TODO: node name must be derived from the property name in the node + // enum + Some(Field { + name: e.name.clone().unwrap(), + node_name, + enum_variant_name, + field_type: type_name, + repeated: e.label() == Label::LABEL_REPEATED, + is_one_of: false, + }) + }) + .collect() + ); + + // one of declarations + fields.append(&mut + node + .oneof_decl + .iter() + .map(|e| { + Field { + name: e.name.clone().unwrap(), + node_name: Some("Node".to_string()), + enum_variant_name: None, + field_type: FieldType::Node, + repeated: false, + is_one_of: true, + } + }) + .collect() + ); + Node { + // token names in proto are UPPERCASE_SNAKE_CASE + name: name.clone(), + fields, + } + }) + .collect() + } +} diff --git a/crates/postgres_lsp/Cargo.toml b/crates/postgres_lsp/Cargo.toml index b9d6c8ca..1220fda3 100644 --- a/crates/postgres_lsp/Cargo.toml +++ b/crates/postgres_lsp/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "postgres_lsp" -version = "0.1.0" +version = "0.0.0" edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/crates/postgres_lsp/src/main.rs b/crates/postgres_lsp/src/main.rs index 7bd288ff..11019ddb 100644 --- a/crates/postgres_lsp/src/main.rs +++ b/crates/postgres_lsp/src/main.rs @@ -89,7 +89,6 @@ impl LanguageServer for Backend { } async fn initialized(&self, _: InitializedParams) { - debug!("initialized"); self.client .log_message(MessageType::INFO, "initialized!") .await; @@ -193,7 +192,6 @@ impl LanguageServer for Backend { &self, params: SemanticTokensRangeParams, ) -> Result<Option<SemanticTokensRangeResult>> { - println!("semantic_tokens_range"); return Ok(None); } @@ -298,8 +296,6 @@ impl Backend { async fn main() { env_logger::init(); - debug!("starting up"); - let stdin = tokio::io::stdin(); let stdout = tokio::io::stdout(); @@ -312,7 +308,5 @@ async fn main() { }) .finish(); - debug!("built service and created backend"); - Server::new(stdin, stdout, socket).serve(service).await; } diff --git a/expanded.rs b/expanded.rs new file mode 100644 index 00000000..691c8b76 --- /dev/null +++ b/expanded.rs @@ -0,0 +1,3121 @@ +mod syntax_kind_codegen { + use codegen::syntax_kind; + use cstree::Syntax; + use pg_query::{protobuf::ScanToken, NodeEnum, NodeRef}; + /// An u32 enum of all valid syntax elements (nodes and tokens) of the postgres + /// sql dialect, and a few custom ones that are not parsed by pg_query.rs, such + /// as `Whitespace`. + #[repr(u32)] + pub enum SyntaxKind { + SourceFile, + Comment, + Whitespace, + Newline, + Tab, + Stmt, + Alias, + RangeVar, + TableFunc, + Var, + Param, + Aggref, + GroupingFunc, + WindowFunc, + SubscriptingRef, + FuncExpr, + NamedArgExpr, + OpExpr, + DistinctExpr, + NullIfExpr, + ScalarArrayOpExpr, + BoolExpr, + SubLink, + SubPlan, + AlternativeSubPlan, + FieldSelect, + FieldStore, + RelabelType, + CoerceViaIo, + ArrayCoerceExpr, + ConvertRowtypeExpr, + CollateExpr, + CaseExpr, + CaseWhen, + CaseTestExpr, + ArrayExpr, + RowExpr, + RowCompareExpr, + CoalesceExpr, + MinMaxExpr, + SqlvalueFunction, + XmlExpr, + NullTest, + BooleanTest, + CoerceToDomain, + CoerceToDomainValue, + SetToDefault, + CurrentOfExpr, + NextValueExpr, + InferenceElem, + TargetEntry, + RangeTblRef, + JoinExpr, + FromExpr, + OnConflictExpr, + IntoClause, + MergeAction, + RawStmt, + Query, + InsertStmt, + DeleteStmt, + UpdateStmt, + MergeStmt, + SelectStmt, + ReturnStmt, + PlassignStmt, + AlterTableStmt, + AlterTableCmd, + AlterDomainStmt, + SetOperationStmt, + GrantStmt, + GrantRoleStmt, + AlterDefaultPrivilegesStmt, + ClosePortalStmt, + ClusterStmt, + CopyStmt, + CreateStmt, + DefineStmt, + DropStmt, + TruncateStmt, + CommentStmt, + FetchStmt, + IndexStmt, + CreateFunctionStmt, + AlterFunctionStmt, + DoStmt, + RenameStmt, + RuleStmt, + NotifyStmt, + ListenStmt, + UnlistenStmt, + TransactionStmt, + ViewStmt, + LoadStmt, + CreateDomainStmt, + CreatedbStmt, + DropdbStmt, + VacuumStmt, + ExplainStmt, + CreateTableAsStmt, + CreateSeqStmt, + AlterSeqStmt, + VariableSetStmt, + VariableShowStmt, + DiscardStmt, + CreateTrigStmt, + CreatePlangStmt, + CreateRoleStmt, + AlterRoleStmt, + DropRoleStmt, + LockStmt, + ConstraintsSetStmt, + ReindexStmt, + CheckPointStmt, + CreateSchemaStmt, + AlterDatabaseStmt, + AlterDatabaseRefreshCollStmt, + AlterDatabaseSetStmt, + AlterRoleSetStmt, + CreateConversionStmt, + CreateCastStmt, + CreateOpClassStmt, + CreateOpFamilyStmt, + AlterOpFamilyStmt, + PrepareStmt, + ExecuteStmt, + DeallocateStmt, + DeclareCursorStmt, + CreateTableSpaceStmt, + DropTableSpaceStmt, + AlterObjectDependsStmt, + AlterObjectSchemaStmt, + AlterOwnerStmt, + AlterOperatorStmt, + AlterTypeStmt, + DropOwnedStmt, + ReassignOwnedStmt, + CompositeTypeStmt, + CreateEnumStmt, + CreateRangeStmt, + AlterEnumStmt, + AlterTsdictionaryStmt, + AlterTsconfigurationStmt, + CreateFdwStmt, + AlterFdwStmt, + CreateForeignServerStmt, + AlterForeignServerStmt, + CreateUserMappingStmt, + AlterUserMappingStmt, + DropUserMappingStmt, + AlterTableSpaceOptionsStmt, + AlterTableMoveAllStmt, + SecLabelStmt, + CreateForeignTableStmt, + ImportForeignSchemaStmt, + CreateExtensionStmt, + AlterExtensionStmt, + AlterExtensionContentsStmt, + CreateEventTrigStmt, + AlterEventTrigStmt, + RefreshMatViewStmt, + ReplicaIdentityStmt, + AlterSystemStmt, + CreatePolicyStmt, + AlterPolicyStmt, + CreateTransformStmt, + CreateAmStmt, + CreatePublicationStmt, + AlterPublicationStmt, + CreateSubscriptionStmt, + AlterSubscriptionStmt, + DropSubscriptionStmt, + CreateStatsStmt, + AlterCollationStmt, + CallStmt, + AlterStatsStmt, + AExpr, + ColumnRef, + ParamRef, + FuncCall, + AStar, + AIndices, + AIndirection, + AArrayExpr, + ResTarget, + MultiAssignRef, + TypeCast, + CollateClause, + SortBy, + WindowDef, + RangeSubselect, + RangeFunction, + RangeTableSample, + RangeTableFunc, + RangeTableFuncCol, + TypeName, + ColumnDef, + IndexElem, + StatsElem, + Constraint, + DefElem, + RangeTblEntry, + RangeTblFunction, + TableSampleClause, + WithCheckOption, + SortGroupClause, + GroupingSet, + WindowClause, + ObjectWithArgs, + AccessPriv, + CreateOpClassItem, + TableLikeClause, + FunctionParameter, + LockingClause, + RowMarkClause, + XmlSerialize, + WithClause, + InferClause, + OnConflictClause, + CtesearchClause, + CtecycleClause, + CommonTableExpr, + MergeWhenClause, + RoleSpec, + TriggerTransition, + PartitionElem, + PartitionSpec, + PartitionBoundSpec, + PartitionRangeDatum, + PartitionCmd, + VacuumRelation, + PublicationObjSpec, + PublicationTable, + InlineCodeBlock, + CallContext, + Integer, + Float, + Boolean, + String, + BitString, + List, + IntList, + OidList, + AConst, + Nul, + Ascii37, + Ascii40, + Ascii41, + Ascii42, + Ascii43, + Ascii44, + Ascii45, + Ascii46, + Ascii47, + Ascii58, + Ascii59, + Ascii60, + Ascii61, + Ascii62, + Ascii63, + Ascii91, + Ascii92, + Ascii93, + Ascii94, + Ident, + Uident, + Fconst, + Sconst, + Usconst, + Bconst, + Xconst, + Op, + Iconst, + Typecast, + DotDot, + ColonEquals, + EqualsGreater, + LessEquals, + GreaterEquals, + NotEquals, + SqlComment, + CComment, + AbortP, + AbsoluteP, + Access, + Action, + AddP, + Admin, + After, + Aggregate, + All, + Also, + Alter, + Always, + Analyse, + Analyze, + And, + Any, + Array, + As, + Asc, + Asensitive, + Assertion, + Assignment, + Asymmetric, + Atomic, + At, + Attach, + Attribute, + Authorization, + Backward, + Before, + BeginP, + Between, + Bigint, + Binary, + Bit, + BooleanP, + Both, + Breadth, + By, + Cache, + Call, + Called, + Cascade, + Cascaded, + Case, + Cast, + CatalogP, + Chain, + CharP, + Character, + Characteristics, + Check, + Checkpoint, + Class, + Close, + Cluster, + Coalesce, + Collate, + Collation, + Column, + Columns, + Comments, + Commit, + Committed, + Compression, + Concurrently, + Configuration, + Conflict, + Connection, + Constraints, + ContentP, + ContinueP, + ConversionP, + Copy, + Cost, + Create, + Cross, + Csv, + Cube, + CurrentP, + CurrentCatalog, + CurrentDate, + CurrentRole, + CurrentSchema, + CurrentTime, + CurrentTimestamp, + CurrentUser, + Cursor, + Cycle, + DataP, + Database, + DayP, + Deallocate, + Dec, + DecimalP, + Declare, + Default, + Defaults, + Deferrable, + Deferred, + Definer, + DeleteP, + Delimiter, + Delimiters, + Depends, + Depth, + Desc, + Detach, + Dictionary, + DisableP, + Discard, + Distinct, + Do, + DocumentP, + DomainP, + DoubleP, + Drop, + Each, + Else, + EnableP, + Encoding, + Encrypted, + EndP, + EnumP, + Escape, + Event, + Except, + Exclude, + Excluding, + Exclusive, + Execute, + Exists, + Explain, + Expression, + Extension, + External, + Extract, + FalseP, + Family, + Fetch, + Filter, + Finalize, + FirstP, + FloatP, + Following, + For, + Force, + Foreign, + Forward, + Freeze, + From, + Full, + Function, + Functions, + Generated, + Global, + Grant, + Granted, + Greatest, + GroupP, + Grouping, + Groups, + Handler, + Having, + HeaderP, + Hold, + HourP, + IdentityP, + IfP, + Ilike, + Immediate, + Immutable, + ImplicitP, + ImportP, + InP, + Include, + Including, + Increment, + Index, + Indexes, + Inherit, + Inherits, + Initially, + InlineP, + InnerP, + Inout, + InputP, + Insensitive, + Insert, + Instead, + IntP, + Intersect, + Interval, + Into, + Invoker, + Is, + Isnull, + Isolation, + Join, + Key, + Label, + Language, + LargeP, + LastP, + LateralP, + Leading, + Leakproof, + Least, + Left, + Level, + Like, + Limit, + Listen, + Load, + Local, + Localtime, + Localtimestamp, + Location, + LockP, + Locked, + Logged, + Mapping, + Match, + Matched, + Materialized, + Maxvalue, + Merge, + Method, + MinuteP, + Minvalue, + Mode, + MonthP, + Move, + NameP, + Names, + National, + Natural, + Nchar, + New, + Next, + Nfc, + Nfd, + Nfkc, + Nfkd, + No, + None, + Normalize, + Normalized, + Not, + Nothing, + Notify, + Notnull, + Nowait, + NullP, + Nullif, + NullsP, + Numeric, + ObjectP, + Of, + Off, + Offset, + Oids, + Old, + On, + Only, + Operator, + Option, + Options, + Or, + Order, + Ordinality, + Others, + OutP, + OuterP, + Over, + Overlaps, + Overlay, + Overriding, + Owned, + Owner, + Parallel, + Parameter, + Parser, + Partial, + Partition, + Passing, + Password, + Placing, + Plans, + Policy, + Position, + Preceding, + Precision, + Preserve, + Prepare, + Prepared, + Primary, + Prior, + Privileges, + Procedural, + Procedure, + Procedures, + Program, + Publication, + Quote, + Range, + Read, + Real, + Reassign, + Recheck, + Recursive, + RefP, + References, + Referencing, + Refresh, + Reindex, + RelativeP, + Release, + Rename, + Repeatable, + Replace, + Replica, + Reset, + Restart, + Restrict, + Return, + Returning, + Returns, + Revoke, + Right, + Role, + Rollback, + Rollup, + Routine, + Routines, + Row, + Rows, + Rule, + Savepoint, + Schema, + Schemas, + Scroll, + Search, + SecondP, + Security, + Select, + Sequence, + Sequences, + Serializable, + Server, + Session, + SessionUser, + Set, + Sets, + Setof, + Share, + Show, + Similar, + Simple, + Skip, + Smallint, + Snapshot, + Some, + SqlP, + Stable, + StandaloneP, + Start, + Statement, + Statistics, + Stdin, + Stdout, + Storage, + Stored, + StrictP, + StripP, + Subscription, + Substring, + Support, + Symmetric, + Sysid, + SystemP, + Table, + Tables, + Tablesample, + Tablespace, + Temp, + Template, + Temporary, + TextP, + Then, + Ties, + Time, + Timestamp, + To, + Trailing, + Transaction, + Transform, + Treat, + Trigger, + Trim, + TrueP, + Truncate, + Trusted, + TypeP, + TypesP, + Uescape, + Unbounded, + Uncommitted, + Unencrypted, + Union, + Unique, + Unknown, + Unlisten, + Unlogged, + Until, + Update, + User, + Using, + Vacuum, + Valid, + Validate, + Validator, + ValueP, + Values, + Varchar, + Variadic, + Varying, + Verbose, + VersionP, + View, + Views, + Volatile, + When, + Where, + WhitespaceP, + Window, + With, + Within, + Without, + Work, + Wrapper, + Write, + XmlP, + Xmlattributes, + Xmlconcat, + Xmlelement, + Xmlexists, + Xmlforest, + Xmlnamespaces, + Xmlparse, + Xmlpi, + Xmlroot, + Xmlserialize, + Xmltable, + YearP, + YesP, + Zone, + NotLa, + NullsLa, + WithLa, + ModeTypeName, + ModePlpgsqlExpr, + ModePlpgsqlAssign1, + ModePlpgsqlAssign2, + ModePlpgsqlAssign3, + Uminus, + } + #[automatically_derived] + impl ::core::clone::Clone for SyntaxKind { + #[inline] + fn clone(&self) -> SyntaxKind { + *self + } + } + #[automatically_derived] + impl ::core::marker::Copy for SyntaxKind {} + #[automatically_derived] + impl ::core::marker::StructuralPartialEq for SyntaxKind {} + #[automatically_derived] + impl ::core::cmp::PartialEq for SyntaxKind { + #[inline] + fn eq(&self, other: &SyntaxKind) -> bool { + let __self_tag = ::core::intrinsics::discriminant_value(self); + let __arg1_tag = ::core::intrinsics::discriminant_value(other); + __self_tag == __arg1_tag + } + } + #[automatically_derived] + impl ::core::marker::StructuralEq for SyntaxKind {} + #[automatically_derived] + impl ::core::cmp::Eq for SyntaxKind { + #[inline] + #[doc(hidden)] + #[no_coverage] + fn assert_receiver_is_total_eq(&self) -> () {} + } + #[automatically_derived] + impl ::core::cmp::PartialOrd for SyntaxKind { + #[inline] + fn partial_cmp( + &self, + other: &SyntaxKind, + ) -> ::core::option::Option<::core::cmp::Ordering> { + let __self_tag = ::core::intrinsics::discriminant_value(self); + let __arg1_tag = ::core::intrinsics::discriminant_value(other); + ::core::cmp::PartialOrd::partial_cmp(&__self_tag, &__arg1_tag) + } + } + #[automatically_derived] + impl ::core::cmp::Ord for SyntaxKind { + #[inline] + fn cmp(&self, other: &SyntaxKind) -> ::core::cmp::Ordering { + let __self_tag = ::core::intrinsics::discriminant_value(self); + let __arg1_tag = ::core::intrinsics::discriminant_value(other); + ::core::cmp::Ord::cmp(&__self_tag, &__arg1_tag) + } + } + #[automatically_derived] + impl ::core::hash::Hash for SyntaxKind { + fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) -> () { + let __self_tag = ::core::intrinsics::discriminant_value(self); + ::core::hash::Hash::hash(&__self_tag, state) + } + } + #[automatically_derived] + impl ::core::fmt::Debug for SyntaxKind { + fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result { + ::core::fmt::Formatter::write_str( + f, + match self { + SyntaxKind::SourceFile => "SourceFile", + SyntaxKind::Comment => "Comment", + SyntaxKind::Whitespace => "Whitespace", + SyntaxKind::Newline => "Newline", + SyntaxKind::Tab => "Tab", + SyntaxKind::Stmt => "Stmt", + SyntaxKind::Alias => "Alias", + SyntaxKind::RangeVar => "RangeVar", + SyntaxKind::TableFunc => "TableFunc", + SyntaxKind::Var => "Var", + SyntaxKind::Param => "Param", + SyntaxKind::Aggref => "Aggref", + SyntaxKind::GroupingFunc => "GroupingFunc", + SyntaxKind::WindowFunc => "WindowFunc", + SyntaxKind::SubscriptingRef => "SubscriptingRef", + SyntaxKind::FuncExpr => "FuncExpr", + SyntaxKind::NamedArgExpr => "NamedArgExpr", + SyntaxKind::OpExpr => "OpExpr", + SyntaxKind::DistinctExpr => "DistinctExpr", + SyntaxKind::NullIfExpr => "NullIfExpr", + SyntaxKind::ScalarArrayOpExpr => "ScalarArrayOpExpr", + SyntaxKind::BoolExpr => "BoolExpr", + SyntaxKind::SubLink => "SubLink", + SyntaxKind::SubPlan => "SubPlan", + SyntaxKind::AlternativeSubPlan => "AlternativeSubPlan", + SyntaxKind::FieldSelect => "FieldSelect", + SyntaxKind::FieldStore => "FieldStore", + SyntaxKind::RelabelType => "RelabelType", + SyntaxKind::CoerceViaIo => "CoerceViaIo", + SyntaxKind::ArrayCoerceExpr => "ArrayCoerceExpr", + SyntaxKind::ConvertRowtypeExpr => "ConvertRowtypeExpr", + SyntaxKind::CollateExpr => "CollateExpr", + SyntaxKind::CaseExpr => "CaseExpr", + SyntaxKind::CaseWhen => "CaseWhen", + SyntaxKind::CaseTestExpr => "CaseTestExpr", + SyntaxKind::ArrayExpr => "ArrayExpr", + SyntaxKind::RowExpr => "RowExpr", + SyntaxKind::RowCompareExpr => "RowCompareExpr", + SyntaxKind::CoalesceExpr => "CoalesceExpr", + SyntaxKind::MinMaxExpr => "MinMaxExpr", + SyntaxKind::SqlvalueFunction => "SqlvalueFunction", + SyntaxKind::XmlExpr => "XmlExpr", + SyntaxKind::NullTest => "NullTest", + SyntaxKind::BooleanTest => "BooleanTest", + SyntaxKind::CoerceToDomain => "CoerceToDomain", + SyntaxKind::CoerceToDomainValue => "CoerceToDomainValue", + SyntaxKind::SetToDefault => "SetToDefault", + SyntaxKind::CurrentOfExpr => "CurrentOfExpr", + SyntaxKind::NextValueExpr => "NextValueExpr", + SyntaxKind::InferenceElem => "InferenceElem", + SyntaxKind::TargetEntry => "TargetEntry", + SyntaxKind::RangeTblRef => "RangeTblRef", + SyntaxKind::JoinExpr => "JoinExpr", + SyntaxKind::FromExpr => "FromExpr", + SyntaxKind::OnConflictExpr => "OnConflictExpr", + SyntaxKind::IntoClause => "IntoClause", + SyntaxKind::MergeAction => "MergeAction", + SyntaxKind::RawStmt => "RawStmt", + SyntaxKind::Query => "Query", + SyntaxKind::InsertStmt => "InsertStmt", + SyntaxKind::DeleteStmt => "DeleteStmt", + SyntaxKind::UpdateStmt => "UpdateStmt", + SyntaxKind::MergeStmt => "MergeStmt", + SyntaxKind::SelectStmt => "SelectStmt", + SyntaxKind::ReturnStmt => "ReturnStmt", + SyntaxKind::PlassignStmt => "PlassignStmt", + SyntaxKind::AlterTableStmt => "AlterTableStmt", + SyntaxKind::AlterTableCmd => "AlterTableCmd", + SyntaxKind::AlterDomainStmt => "AlterDomainStmt", + SyntaxKind::SetOperationStmt => "SetOperationStmt", + SyntaxKind::GrantStmt => "GrantStmt", + SyntaxKind::GrantRoleStmt => "GrantRoleStmt", + SyntaxKind::AlterDefaultPrivilegesStmt => { + "AlterDefaultPrivilegesStmt" + } + SyntaxKind::ClosePortalStmt => "ClosePortalStmt", + SyntaxKind::ClusterStmt => "ClusterStmt", + SyntaxKind::CopyStmt => "CopyStmt", + SyntaxKind::CreateStmt => "CreateStmt", + SyntaxKind::DefineStmt => "DefineStmt", + SyntaxKind::DropStmt => "DropStmt", + SyntaxKind::TruncateStmt => "TruncateStmt", + SyntaxKind::CommentStmt => "CommentStmt", + SyntaxKind::FetchStmt => "FetchStmt", + SyntaxKind::IndexStmt => "IndexStmt", + SyntaxKind::CreateFunctionStmt => "CreateFunctionStmt", + SyntaxKind::AlterFunctionStmt => "AlterFunctionStmt", + SyntaxKind::DoStmt => "DoStmt", + SyntaxKind::RenameStmt => "RenameStmt", + SyntaxKind::RuleStmt => "RuleStmt", + SyntaxKind::NotifyStmt => "NotifyStmt", + SyntaxKind::ListenStmt => "ListenStmt", + SyntaxKind::UnlistenStmt => "UnlistenStmt", + SyntaxKind::TransactionStmt => "TransactionStmt", + SyntaxKind::ViewStmt => "ViewStmt", + SyntaxKind::LoadStmt => "LoadStmt", + SyntaxKind::CreateDomainStmt => "CreateDomainStmt", + SyntaxKind::CreatedbStmt => "CreatedbStmt", + SyntaxKind::DropdbStmt => "DropdbStmt", + SyntaxKind::VacuumStmt => "VacuumStmt", + SyntaxKind::ExplainStmt => "ExplainStmt", + SyntaxKind::CreateTableAsStmt => "CreateTableAsStmt", + SyntaxKind::CreateSeqStmt => "CreateSeqStmt", + SyntaxKind::AlterSeqStmt => "AlterSeqStmt", + SyntaxKind::VariableSetStmt => "VariableSetStmt", + SyntaxKind::VariableShowStmt => "VariableShowStmt", + SyntaxKind::DiscardStmt => "DiscardStmt", + SyntaxKind::CreateTrigStmt => "CreateTrigStmt", + SyntaxKind::CreatePlangStmt => "CreatePlangStmt", + SyntaxKind::CreateRoleStmt => "CreateRoleStmt", + SyntaxKind::AlterRoleStmt => "AlterRoleStmt", + SyntaxKind::DropRoleStmt => "DropRoleStmt", + SyntaxKind::LockStmt => "LockStmt", + SyntaxKind::ConstraintsSetStmt => "ConstraintsSetStmt", + SyntaxKind::ReindexStmt => "ReindexStmt", + SyntaxKind::CheckPointStmt => "CheckPointStmt", + SyntaxKind::CreateSchemaStmt => "CreateSchemaStmt", + SyntaxKind::AlterDatabaseStmt => "AlterDatabaseStmt", + SyntaxKind::AlterDatabaseRefreshCollStmt => { + "AlterDatabaseRefreshCollStmt" + } + SyntaxKind::AlterDatabaseSetStmt => "AlterDatabaseSetStmt", + SyntaxKind::AlterRoleSetStmt => "AlterRoleSetStmt", + SyntaxKind::CreateConversionStmt => "CreateConversionStmt", + SyntaxKind::CreateCastStmt => "CreateCastStmt", + SyntaxKind::CreateOpClassStmt => "CreateOpClassStmt", + SyntaxKind::CreateOpFamilyStmt => "CreateOpFamilyStmt", + SyntaxKind::AlterOpFamilyStmt => "AlterOpFamilyStmt", + SyntaxKind::PrepareStmt => "PrepareStmt", + SyntaxKind::ExecuteStmt => "ExecuteStmt", + SyntaxKind::DeallocateStmt => "DeallocateStmt", + SyntaxKind::DeclareCursorStmt => "DeclareCursorStmt", + SyntaxKind::CreateTableSpaceStmt => "CreateTableSpaceStmt", + SyntaxKind::DropTableSpaceStmt => "DropTableSpaceStmt", + SyntaxKind::AlterObjectDependsStmt => "AlterObjectDependsStmt", + SyntaxKind::AlterObjectSchemaStmt => "AlterObjectSchemaStmt", + SyntaxKind::AlterOwnerStmt => "AlterOwnerStmt", + SyntaxKind::AlterOperatorStmt => "AlterOperatorStmt", + SyntaxKind::AlterTypeStmt => "AlterTypeStmt", + SyntaxKind::DropOwnedStmt => "DropOwnedStmt", + SyntaxKind::ReassignOwnedStmt => "ReassignOwnedStmt", + SyntaxKind::CompositeTypeStmt => "CompositeTypeStmt", + SyntaxKind::CreateEnumStmt => "CreateEnumStmt", + SyntaxKind::CreateRangeStmt => "CreateRangeStmt", + SyntaxKind::AlterEnumStmt => "AlterEnumStmt", + SyntaxKind::AlterTsdictionaryStmt => "AlterTsdictionaryStmt", + SyntaxKind::AlterTsconfigurationStmt => "AlterTsconfigurationStmt", + SyntaxKind::CreateFdwStmt => "CreateFdwStmt", + SyntaxKind::AlterFdwStmt => "AlterFdwStmt", + SyntaxKind::CreateForeignServerStmt => "CreateForeignServerStmt", + SyntaxKind::AlterForeignServerStmt => "AlterForeignServerStmt", + SyntaxKind::CreateUserMappingStmt => "CreateUserMappingStmt", + SyntaxKind::AlterUserMappingStmt => "AlterUserMappingStmt", + SyntaxKind::DropUserMappingStmt => "DropUserMappingStmt", + SyntaxKind::AlterTableSpaceOptionsStmt => { + "AlterTableSpaceOptionsStmt" + } + SyntaxKind::AlterTableMoveAllStmt => "AlterTableMoveAllStmt", + SyntaxKind::SecLabelStmt => "SecLabelStmt", + SyntaxKind::CreateForeignTableStmt => "CreateForeignTableStmt", + SyntaxKind::ImportForeignSchemaStmt => "ImportForeignSchemaStmt", + SyntaxKind::CreateExtensionStmt => "CreateExtensionStmt", + SyntaxKind::AlterExtensionStmt => "AlterExtensionStmt", + SyntaxKind::AlterExtensionContentsStmt => { + "AlterExtensionContentsStmt" + } + SyntaxKind::CreateEventTrigStmt => "CreateEventTrigStmt", + SyntaxKind::AlterEventTrigStmt => "AlterEventTrigStmt", + SyntaxKind::RefreshMatViewStmt => "RefreshMatViewStmt", + SyntaxKind::ReplicaIdentityStmt => "ReplicaIdentityStmt", + SyntaxKind::AlterSystemStmt => "AlterSystemStmt", + SyntaxKind::CreatePolicyStmt => "CreatePolicyStmt", + SyntaxKind::AlterPolicyStmt => "AlterPolicyStmt", + SyntaxKind::CreateTransformStmt => "CreateTransformStmt", + SyntaxKind::CreateAmStmt => "CreateAmStmt", + SyntaxKind::CreatePublicationStmt => "CreatePublicationStmt", + SyntaxKind::AlterPublicationStmt => "AlterPublicationStmt", + SyntaxKind::CreateSubscriptionStmt => "CreateSubscriptionStmt", + SyntaxKind::AlterSubscriptionStmt => "AlterSubscriptionStmt", + SyntaxKind::DropSubscriptionStmt => "DropSubscriptionStmt", + SyntaxKind::CreateStatsStmt => "CreateStatsStmt", + SyntaxKind::AlterCollationStmt => "AlterCollationStmt", + SyntaxKind::CallStmt => "CallStmt", + SyntaxKind::AlterStatsStmt => "AlterStatsStmt", + SyntaxKind::AExpr => "AExpr", + SyntaxKind::ColumnRef => "ColumnRef", + SyntaxKind::ParamRef => "ParamRef", + SyntaxKind::FuncCall => "FuncCall", + SyntaxKind::AStar => "AStar", + SyntaxKind::AIndices => "AIndices", + SyntaxKind::AIndirection => "AIndirection", + SyntaxKind::AArrayExpr => "AArrayExpr", + SyntaxKind::ResTarget => "ResTarget", + SyntaxKind::MultiAssignRef => "MultiAssignRef", + SyntaxKind::TypeCast => "TypeCast", + SyntaxKind::CollateClause => "CollateClause", + SyntaxKind::SortBy => "SortBy", + SyntaxKind::WindowDef => "WindowDef", + SyntaxKind::RangeSubselect => "RangeSubselect", + SyntaxKind::RangeFunction => "RangeFunction", + SyntaxKind::RangeTableSample => "RangeTableSample", + SyntaxKind::RangeTableFunc => "RangeTableFunc", + SyntaxKind::RangeTableFuncCol => "RangeTableFuncCol", + SyntaxKind::TypeName => "TypeName", + SyntaxKind::ColumnDef => "ColumnDef", + SyntaxKind::IndexElem => "IndexElem", + SyntaxKind::StatsElem => "StatsElem", + SyntaxKind::Constraint => "Constraint", + SyntaxKind::DefElem => "DefElem", + SyntaxKind::RangeTblEntry => "RangeTblEntry", + SyntaxKind::RangeTblFunction => "RangeTblFunction", + SyntaxKind::TableSampleClause => "TableSampleClause", + SyntaxKind::WithCheckOption => "WithCheckOption", + SyntaxKind::SortGroupClause => "SortGroupClause", + SyntaxKind::GroupingSet => "GroupingSet", + SyntaxKind::WindowClause => "WindowClause", + SyntaxKind::ObjectWithArgs => "ObjectWithArgs", + SyntaxKind::AccessPriv => "AccessPriv", + SyntaxKind::CreateOpClassItem => "CreateOpClassItem", + SyntaxKind::TableLikeClause => "TableLikeClause", + SyntaxKind::FunctionParameter => "FunctionParameter", + SyntaxKind::LockingClause => "LockingClause", + SyntaxKind::RowMarkClause => "RowMarkClause", + SyntaxKind::XmlSerialize => "XmlSerialize", + SyntaxKind::WithClause => "WithClause", + SyntaxKind::InferClause => "InferClause", + SyntaxKind::OnConflictClause => "OnConflictClause", + SyntaxKind::CtesearchClause => "CtesearchClause", + SyntaxKind::CtecycleClause => "CtecycleClause", + SyntaxKind::CommonTableExpr => "CommonTableExpr", + SyntaxKind::MergeWhenClause => "MergeWhenClause", + SyntaxKind::RoleSpec => "RoleSpec", + SyntaxKind::TriggerTransition => "TriggerTransition", + SyntaxKind::PartitionElem => "PartitionElem", + SyntaxKind::PartitionSpec => "PartitionSpec", + SyntaxKind::PartitionBoundSpec => "PartitionBoundSpec", + SyntaxKind::PartitionRangeDatum => "PartitionRangeDatum", + SyntaxKind::PartitionCmd => "PartitionCmd", + SyntaxKind::VacuumRelation => "VacuumRelation", + SyntaxKind::PublicationObjSpec => "PublicationObjSpec", + SyntaxKind::PublicationTable => "PublicationTable", + SyntaxKind::InlineCodeBlock => "InlineCodeBlock", + SyntaxKind::CallContext => "CallContext", + SyntaxKind::Integer => "Integer", + SyntaxKind::Float => "Float", + SyntaxKind::Boolean => "Boolean", + SyntaxKind::String => "String", + SyntaxKind::BitString => "BitString", + SyntaxKind::List => "List", + SyntaxKind::IntList => "IntList", + SyntaxKind::OidList => "OidList", + SyntaxKind::AConst => "AConst", + SyntaxKind::Nul => "Nul", + SyntaxKind::Ascii37 => "Ascii37", + SyntaxKind::Ascii40 => "Ascii40", + SyntaxKind::Ascii41 => "Ascii41", + SyntaxKind::Ascii42 => "Ascii42", + SyntaxKind::Ascii43 => "Ascii43", + SyntaxKind::Ascii44 => "Ascii44", + SyntaxKind::Ascii45 => "Ascii45", + SyntaxKind::Ascii46 => "Ascii46", + SyntaxKind::Ascii47 => "Ascii47", + SyntaxKind::Ascii58 => "Ascii58", + SyntaxKind::Ascii59 => "Ascii59", + SyntaxKind::Ascii60 => "Ascii60", + SyntaxKind::Ascii61 => "Ascii61", + SyntaxKind::Ascii62 => "Ascii62", + SyntaxKind::Ascii63 => "Ascii63", + SyntaxKind::Ascii91 => "Ascii91", + SyntaxKind::Ascii92 => "Ascii92", + SyntaxKind::Ascii93 => "Ascii93", + SyntaxKind::Ascii94 => "Ascii94", + SyntaxKind::Ident => "Ident", + SyntaxKind::Uident => "Uident", + SyntaxKind::Fconst => "Fconst", + SyntaxKind::Sconst => "Sconst", + SyntaxKind::Usconst => "Usconst", + SyntaxKind::Bconst => "Bconst", + SyntaxKind::Xconst => "Xconst", + SyntaxKind::Op => "Op", + SyntaxKind::Iconst => "Iconst", + SyntaxKind::Typecast => "Typecast", + SyntaxKind::DotDot => "DotDot", + SyntaxKind::ColonEquals => "ColonEquals", + SyntaxKind::EqualsGreater => "EqualsGreater", + SyntaxKind::LessEquals => "LessEquals", + SyntaxKind::GreaterEquals => "GreaterEquals", + SyntaxKind::NotEquals => "NotEquals", + SyntaxKind::SqlComment => "SqlComment", + SyntaxKind::CComment => "CComment", + SyntaxKind::AbortP => "AbortP", + SyntaxKind::AbsoluteP => "AbsoluteP", + SyntaxKind::Access => "Access", + SyntaxKind::Action => "Action", + SyntaxKind::AddP => "AddP", + SyntaxKind::Admin => "Admin", + SyntaxKind::After => "After", + SyntaxKind::Aggregate => "Aggregate", + SyntaxKind::All => "All", + SyntaxKind::Also => "Also", + SyntaxKind::Alter => "Alter", + SyntaxKind::Always => "Always", + SyntaxKind::Analyse => "Analyse", + SyntaxKind::Analyze => "Analyze", + SyntaxKind::And => "And", + SyntaxKind::Any => "Any", + SyntaxKind::Array => "Array", + SyntaxKind::As => "As", + SyntaxKind::Asc => "Asc", + SyntaxKind::Asensitive => "Asensitive", + SyntaxKind::Assertion => "Assertion", + SyntaxKind::Assignment => "Assignment", + SyntaxKind::Asymmetric => "Asymmetric", + SyntaxKind::Atomic => "Atomic", + SyntaxKind::At => "At", + SyntaxKind::Attach => "Attach", + SyntaxKind::Attribute => "Attribute", + SyntaxKind::Authorization => "Authorization", + SyntaxKind::Backward => "Backward", + SyntaxKind::Before => "Before", + SyntaxKind::BeginP => "BeginP", + SyntaxKind::Between => "Between", + SyntaxKind::Bigint => "Bigint", + SyntaxKind::Binary => "Binary", + SyntaxKind::Bit => "Bit", + SyntaxKind::BooleanP => "BooleanP", + SyntaxKind::Both => "Both", + SyntaxKind::Breadth => "Breadth", + SyntaxKind::By => "By", + SyntaxKind::Cache => "Cache", + SyntaxKind::Call => "Call", + SyntaxKind::Called => "Called", + SyntaxKind::Cascade => "Cascade", + SyntaxKind::Cascaded => "Cascaded", + SyntaxKind::Case => "Case", + SyntaxKind::Cast => "Cast", + SyntaxKind::CatalogP => "CatalogP", + SyntaxKind::Chain => "Chain", + SyntaxKind::CharP => "CharP", + SyntaxKind::Character => "Character", + SyntaxKind::Characteristics => "Characteristics", + SyntaxKind::Check => "Check", + SyntaxKind::Checkpoint => "Checkpoint", + SyntaxKind::Class => "Class", + SyntaxKind::Close => "Close", + SyntaxKind::Cluster => "Cluster", + SyntaxKind::Coalesce => "Coalesce", + SyntaxKind::Collate => "Collate", + SyntaxKind::Collation => "Collation", + SyntaxKind::Column => "Column", + SyntaxKind::Columns => "Columns", + SyntaxKind::Comments => "Comments", + SyntaxKind::Commit => "Commit", + SyntaxKind::Committed => "Committed", + SyntaxKind::Compression => "Compression", + SyntaxKind::Concurrently => "Concurrently", + SyntaxKind::Configuration => "Configuration", + SyntaxKind::Conflict => "Conflict", + SyntaxKind::Connection => "Connection", + SyntaxKind::Constraints => "Constraints", + SyntaxKind::ContentP => "ContentP", + SyntaxKind::ContinueP => "ContinueP", + SyntaxKind::ConversionP => "ConversionP", + SyntaxKind::Copy => "Copy", + SyntaxKind::Cost => "Cost", + SyntaxKind::Create => "Create", + SyntaxKind::Cross => "Cross", + SyntaxKind::Csv => "Csv", + SyntaxKind::Cube => "Cube", + SyntaxKind::CurrentP => "CurrentP", + SyntaxKind::CurrentCatalog => "CurrentCatalog", + SyntaxKind::CurrentDate => "CurrentDate", + SyntaxKind::CurrentRole => "CurrentRole", + SyntaxKind::CurrentSchema => "CurrentSchema", + SyntaxKind::CurrentTime => "CurrentTime", + SyntaxKind::CurrentTimestamp => "CurrentTimestamp", + SyntaxKind::CurrentUser => "CurrentUser", + SyntaxKind::Cursor => "Cursor", + SyntaxKind::Cycle => "Cycle", + SyntaxKind::DataP => "DataP", + SyntaxKind::Database => "Database", + SyntaxKind::DayP => "DayP", + SyntaxKind::Deallocate => "Deallocate", + SyntaxKind::Dec => "Dec", + SyntaxKind::DecimalP => "DecimalP", + SyntaxKind::Declare => "Declare", + SyntaxKind::Default => "Default", + SyntaxKind::Defaults => "Defaults", + SyntaxKind::Deferrable => "Deferrable", + SyntaxKind::Deferred => "Deferred", + SyntaxKind::Definer => "Definer", + SyntaxKind::DeleteP => "DeleteP", + SyntaxKind::Delimiter => "Delimiter", + SyntaxKind::Delimiters => "Delimiters", + SyntaxKind::Depends => "Depends", + SyntaxKind::Depth => "Depth", + SyntaxKind::Desc => "Desc", + SyntaxKind::Detach => "Detach", + SyntaxKind::Dictionary => "Dictionary", + SyntaxKind::DisableP => "DisableP", + SyntaxKind::Discard => "Discard", + SyntaxKind::Distinct => "Distinct", + SyntaxKind::Do => "Do", + SyntaxKind::DocumentP => "DocumentP", + SyntaxKind::DomainP => "DomainP", + SyntaxKind::DoubleP => "DoubleP", + SyntaxKind::Drop => "Drop", + SyntaxKind::Each => "Each", + SyntaxKind::Else => "Else", + SyntaxKind::EnableP => "EnableP", + SyntaxKind::Encoding => "Encoding", + SyntaxKind::Encrypted => "Encrypted", + SyntaxKind::EndP => "EndP", + SyntaxKind::EnumP => "EnumP", + SyntaxKind::Escape => "Escape", + SyntaxKind::Event => "Event", + SyntaxKind::Except => "Except", + SyntaxKind::Exclude => "Exclude", + SyntaxKind::Excluding => "Excluding", + SyntaxKind::Exclusive => "Exclusive", + SyntaxKind::Execute => "Execute", + SyntaxKind::Exists => "Exists", + SyntaxKind::Explain => "Explain", + SyntaxKind::Expression => "Expression", + SyntaxKind::Extension => "Extension", + SyntaxKind::External => "External", + SyntaxKind::Extract => "Extract", + SyntaxKind::FalseP => "FalseP", + SyntaxKind::Family => "Family", + SyntaxKind::Fetch => "Fetch", + SyntaxKind::Filter => "Filter", + SyntaxKind::Finalize => "Finalize", + SyntaxKind::FirstP => "FirstP", + SyntaxKind::FloatP => "FloatP", + SyntaxKind::Following => "Following", + SyntaxKind::For => "For", + SyntaxKind::Force => "Force", + SyntaxKind::Foreign => "Foreign", + SyntaxKind::Forward => "Forward", + SyntaxKind::Freeze => "Freeze", + SyntaxKind::From => "From", + SyntaxKind::Full => "Full", + SyntaxKind::Function => "Function", + SyntaxKind::Functions => "Functions", + SyntaxKind::Generated => "Generated", + SyntaxKind::Global => "Global", + SyntaxKind::Grant => "Grant", + SyntaxKind::Granted => "Granted", + SyntaxKind::Greatest => "Greatest", + SyntaxKind::GroupP => "GroupP", + SyntaxKind::Grouping => "Grouping", + SyntaxKind::Groups => "Groups", + SyntaxKind::Handler => "Handler", + SyntaxKind::Having => "Having", + SyntaxKind::HeaderP => "HeaderP", + SyntaxKind::Hold => "Hold", + SyntaxKind::HourP => "HourP", + SyntaxKind::IdentityP => "IdentityP", + SyntaxKind::IfP => "IfP", + SyntaxKind::Ilike => "Ilike", + SyntaxKind::Immediate => "Immediate", + SyntaxKind::Immutable => "Immutable", + SyntaxKind::ImplicitP => "ImplicitP", + SyntaxKind::ImportP => "ImportP", + SyntaxKind::InP => "InP", + SyntaxKind::Include => "Include", + SyntaxKind::Including => "Including", + SyntaxKind::Increment => "Increment", + SyntaxKind::Index => "Index", + SyntaxKind::Indexes => "Indexes", + SyntaxKind::Inherit => "Inherit", + SyntaxKind::Inherits => "Inherits", + SyntaxKind::Initially => "Initially", + SyntaxKind::InlineP => "InlineP", + SyntaxKind::InnerP => "InnerP", + SyntaxKind::Inout => "Inout", + SyntaxKind::InputP => "InputP", + SyntaxKind::Insensitive => "Insensitive", + SyntaxKind::Insert => "Insert", + SyntaxKind::Instead => "Instead", + SyntaxKind::IntP => "IntP", + SyntaxKind::Intersect => "Intersect", + SyntaxKind::Interval => "Interval", + SyntaxKind::Into => "Into", + SyntaxKind::Invoker => "Invoker", + SyntaxKind::Is => "Is", + SyntaxKind::Isnull => "Isnull", + SyntaxKind::Isolation => "Isolation", + SyntaxKind::Join => "Join", + SyntaxKind::Key => "Key", + SyntaxKind::Label => "Label", + SyntaxKind::Language => "Language", + SyntaxKind::LargeP => "LargeP", + SyntaxKind::LastP => "LastP", + SyntaxKind::LateralP => "LateralP", + SyntaxKind::Leading => "Leading", + SyntaxKind::Leakproof => "Leakproof", + SyntaxKind::Least => "Least", + SyntaxKind::Left => "Left", + SyntaxKind::Level => "Level", + SyntaxKind::Like => "Like", + SyntaxKind::Limit => "Limit", + SyntaxKind::Listen => "Listen", + SyntaxKind::Load => "Load", + SyntaxKind::Local => "Local", + SyntaxKind::Localtime => "Localtime", + SyntaxKind::Localtimestamp => "Localtimestamp", + SyntaxKind::Location => "Location", + SyntaxKind::LockP => "LockP", + SyntaxKind::Locked => "Locked", + SyntaxKind::Logged => "Logged", + SyntaxKind::Mapping => "Mapping", + SyntaxKind::Match => "Match", + SyntaxKind::Matched => "Matched", + SyntaxKind::Materialized => "Materialized", + SyntaxKind::Maxvalue => "Maxvalue", + SyntaxKind::Merge => "Merge", + SyntaxKind::Method => "Method", + SyntaxKind::MinuteP => "MinuteP", + SyntaxKind::Minvalue => "Minvalue", + SyntaxKind::Mode => "Mode", + SyntaxKind::MonthP => "MonthP", + SyntaxKind::Move => "Move", + SyntaxKind::NameP => "NameP", + SyntaxKind::Names => "Names", + SyntaxKind::National => "National", + SyntaxKind::Natural => "Natural", + SyntaxKind::Nchar => "Nchar", + SyntaxKind::New => "New", + SyntaxKind::Next => "Next", + SyntaxKind::Nfc => "Nfc", + SyntaxKind::Nfd => "Nfd", + SyntaxKind::Nfkc => "Nfkc", + SyntaxKind::Nfkd => "Nfkd", + SyntaxKind::No => "No", + SyntaxKind::None => "None", + SyntaxKind::Normalize => "Normalize", + SyntaxKind::Normalized => "Normalized", + SyntaxKind::Not => "Not", + SyntaxKind::Nothing => "Nothing", + SyntaxKind::Notify => "Notify", + SyntaxKind::Notnull => "Notnull", + SyntaxKind::Nowait => "Nowait", + SyntaxKind::NullP => "NullP", + SyntaxKind::Nullif => "Nullif", + SyntaxKind::NullsP => "NullsP", + SyntaxKind::Numeric => "Numeric", + SyntaxKind::ObjectP => "ObjectP", + SyntaxKind::Of => "Of", + SyntaxKind::Off => "Off", + SyntaxKind::Offset => "Offset", + SyntaxKind::Oids => "Oids", + SyntaxKind::Old => "Old", + SyntaxKind::On => "On", + SyntaxKind::Only => "Only", + SyntaxKind::Operator => "Operator", + SyntaxKind::Option => "Option", + SyntaxKind::Options => "Options", + SyntaxKind::Or => "Or", + SyntaxKind::Order => "Order", + SyntaxKind::Ordinality => "Ordinality", + SyntaxKind::Others => "Others", + SyntaxKind::OutP => "OutP", + SyntaxKind::OuterP => "OuterP", + SyntaxKind::Over => "Over", + SyntaxKind::Overlaps => "Overlaps", + SyntaxKind::Overlay => "Overlay", + SyntaxKind::Overriding => "Overriding", + SyntaxKind::Owned => "Owned", + SyntaxKind::Owner => "Owner", + SyntaxKind::Parallel => "Parallel", + SyntaxKind::Parameter => "Parameter", + SyntaxKind::Parser => "Parser", + SyntaxKind::Partial => "Partial", + SyntaxKind::Partition => "Partition", + SyntaxKind::Passing => "Passing", + SyntaxKind::Password => "Password", + SyntaxKind::Placing => "Placing", + SyntaxKind::Plans => "Plans", + SyntaxKind::Policy => "Policy", + SyntaxKind::Position => "Position", + SyntaxKind::Preceding => "Preceding", + SyntaxKind::Precision => "Precision", + SyntaxKind::Preserve => "Preserve", + SyntaxKind::Prepare => "Prepare", + SyntaxKind::Prepared => "Prepared", + SyntaxKind::Primary => "Primary", + SyntaxKind::Prior => "Prior", + SyntaxKind::Privileges => "Privileges", + SyntaxKind::Procedural => "Procedural", + SyntaxKind::Procedure => "Procedure", + SyntaxKind::Procedures => "Procedures", + SyntaxKind::Program => "Program", + SyntaxKind::Publication => "Publication", + SyntaxKind::Quote => "Quote", + SyntaxKind::Range => "Range", + SyntaxKind::Read => "Read", + SyntaxKind::Real => "Real", + SyntaxKind::Reassign => "Reassign", + SyntaxKind::Recheck => "Recheck", + SyntaxKind::Recursive => "Recursive", + SyntaxKind::RefP => "RefP", + SyntaxKind::References => "References", + SyntaxKind::Referencing => "Referencing", + SyntaxKind::Refresh => "Refresh", + SyntaxKind::Reindex => "Reindex", + SyntaxKind::RelativeP => "RelativeP", + SyntaxKind::Release => "Release", + SyntaxKind::Rename => "Rename", + SyntaxKind::Repeatable => "Repeatable", + SyntaxKind::Replace => "Replace", + SyntaxKind::Replica => "Replica", + SyntaxKind::Reset => "Reset", + SyntaxKind::Restart => "Restart", + SyntaxKind::Restrict => "Restrict", + SyntaxKind::Return => "Return", + SyntaxKind::Returning => "Returning", + SyntaxKind::Returns => "Returns", + SyntaxKind::Revoke => "Revoke", + SyntaxKind::Right => "Right", + SyntaxKind::Role => "Role", + SyntaxKind::Rollback => "Rollback", + SyntaxKind::Rollup => "Rollup", + SyntaxKind::Routine => "Routine", + SyntaxKind::Routines => "Routines", + SyntaxKind::Row => "Row", + SyntaxKind::Rows => "Rows", + SyntaxKind::Rule => "Rule", + SyntaxKind::Savepoint => "Savepoint", + SyntaxKind::Schema => "Schema", + SyntaxKind::Schemas => "Schemas", + SyntaxKind::Scroll => "Scroll", + SyntaxKind::Search => "Search", + SyntaxKind::SecondP => "SecondP", + SyntaxKind::Security => "Security", + SyntaxKind::Select => "Select", + SyntaxKind::Sequence => "Sequence", + SyntaxKind::Sequences => "Sequences", + SyntaxKind::Serializable => "Serializable", + SyntaxKind::Server => "Server", + SyntaxKind::Session => "Session", + SyntaxKind::SessionUser => "SessionUser", + SyntaxKind::Set => "Set", + SyntaxKind::Sets => "Sets", + SyntaxKind::Setof => "Setof", + SyntaxKind::Share => "Share", + SyntaxKind::Show => "Show", + SyntaxKind::Similar => "Similar", + SyntaxKind::Simple => "Simple", + SyntaxKind::Skip => "Skip", + SyntaxKind::Smallint => "Smallint", + SyntaxKind::Snapshot => "Snapshot", + SyntaxKind::Some => "Some", + SyntaxKind::SqlP => "SqlP", + SyntaxKind::Stable => "Stable", + SyntaxKind::StandaloneP => "StandaloneP", + SyntaxKind::Start => "Start", + SyntaxKind::Statement => "Statement", + SyntaxKind::Statistics => "Statistics", + SyntaxKind::Stdin => "Stdin", + SyntaxKind::Stdout => "Stdout", + SyntaxKind::Storage => "Storage", + SyntaxKind::Stored => "Stored", + SyntaxKind::StrictP => "StrictP", + SyntaxKind::StripP => "StripP", + SyntaxKind::Subscription => "Subscription", + SyntaxKind::Substring => "Substring", + SyntaxKind::Support => "Support", + SyntaxKind::Symmetric => "Symmetric", + SyntaxKind::Sysid => "Sysid", + SyntaxKind::SystemP => "SystemP", + SyntaxKind::Table => "Table", + SyntaxKind::Tables => "Tables", + SyntaxKind::Tablesample => "Tablesample", + SyntaxKind::Tablespace => "Tablespace", + SyntaxKind::Temp => "Temp", + SyntaxKind::Template => "Template", + SyntaxKind::Temporary => "Temporary", + SyntaxKind::TextP => "TextP", + SyntaxKind::Then => "Then", + SyntaxKind::Ties => "Ties", + SyntaxKind::Time => "Time", + SyntaxKind::Timestamp => "Timestamp", + SyntaxKind::To => "To", + SyntaxKind::Trailing => "Trailing", + SyntaxKind::Transaction => "Transaction", + SyntaxKind::Transform => "Transform", + SyntaxKind::Treat => "Treat", + SyntaxKind::Trigger => "Trigger", + SyntaxKind::Trim => "Trim", + SyntaxKind::TrueP => "TrueP", + SyntaxKind::Truncate => "Truncate", + SyntaxKind::Trusted => "Trusted", + SyntaxKind::TypeP => "TypeP", + SyntaxKind::TypesP => "TypesP", + SyntaxKind::Uescape => "Uescape", + SyntaxKind::Unbounded => "Unbounded", + SyntaxKind::Uncommitted => "Uncommitted", + SyntaxKind::Unencrypted => "Unencrypted", + SyntaxKind::Union => "Union", + SyntaxKind::Unique => "Unique", + SyntaxKind::Unknown => "Unknown", + SyntaxKind::Unlisten => "Unlisten", + SyntaxKind::Unlogged => "Unlogged", + SyntaxKind::Until => "Until", + SyntaxKind::Update => "Update", + SyntaxKind::User => "User", + SyntaxKind::Using => "Using", + SyntaxKind::Vacuum => "Vacuum", + SyntaxKind::Valid => "Valid", + SyntaxKind::Validate => "Validate", + SyntaxKind::Validator => "Validator", + SyntaxKind::ValueP => "ValueP", + SyntaxKind::Values => "Values", + SyntaxKind::Varchar => "Varchar", + SyntaxKind::Variadic => "Variadic", + SyntaxKind::Varying => "Varying", + SyntaxKind::Verbose => "Verbose", + SyntaxKind::VersionP => "VersionP", + SyntaxKind::View => "View", + SyntaxKind::Views => "Views", + SyntaxKind::Volatile => "Volatile", + SyntaxKind::When => "When", + SyntaxKind::Where => "Where", + SyntaxKind::WhitespaceP => "WhitespaceP", + SyntaxKind::Window => "Window", + SyntaxKind::With => "With", + SyntaxKind::Within => "Within", + SyntaxKind::Without => "Without", + SyntaxKind::Work => "Work", + SyntaxKind::Wrapper => "Wrapper", + SyntaxKind::Write => "Write", + SyntaxKind::XmlP => "XmlP", + SyntaxKind::Xmlattributes => "Xmlattributes", + SyntaxKind::Xmlconcat => "Xmlconcat", + SyntaxKind::Xmlelement => "Xmlelement", + SyntaxKind::Xmlexists => "Xmlexists", + SyntaxKind::Xmlforest => "Xmlforest", + SyntaxKind::Xmlnamespaces => "Xmlnamespaces", + SyntaxKind::Xmlparse => "Xmlparse", + SyntaxKind::Xmlpi => "Xmlpi", + SyntaxKind::Xmlroot => "Xmlroot", + SyntaxKind::Xmlserialize => "Xmlserialize", + SyntaxKind::Xmltable => "Xmltable", + SyntaxKind::YearP => "YearP", + SyntaxKind::YesP => "YesP", + SyntaxKind::Zone => "Zone", + SyntaxKind::NotLa => "NotLa", + SyntaxKind::NullsLa => "NullsLa", + SyntaxKind::WithLa => "WithLa", + SyntaxKind::ModeTypeName => "ModeTypeName", + SyntaxKind::ModePlpgsqlExpr => "ModePlpgsqlExpr", + SyntaxKind::ModePlpgsqlAssign1 => "ModePlpgsqlAssign1", + SyntaxKind::ModePlpgsqlAssign2 => "ModePlpgsqlAssign2", + SyntaxKind::ModePlpgsqlAssign3 => "ModePlpgsqlAssign3", + SyntaxKind::Uminus => "Uminus", + }, + ) + } + } + #[automatically_derived] + impl ::cstree::Syntax for SyntaxKind { + fn from_raw(raw: ::cstree::RawSyntaxKind) -> Self { + if !(raw.0 < 748u32) { + { + ::core::panicking::panic_fmt( + format_args!("Invalid raw syntax kind: {0}", raw.0), + ); + } + } + unsafe { ::std::mem::transmute::<u32, SyntaxKind>(raw.0) } + } + fn into_raw(self) -> ::cstree::RawSyntaxKind { + ::cstree::RawSyntaxKind(self as u32) + } + fn static_text(self) -> ::core::option::Option<&'static str> { + match self { + SyntaxKind::SourceFile => ::core::option::Option::None, + SyntaxKind::Comment => ::core::option::Option::None, + SyntaxKind::Whitespace => ::core::option::Option::None, + SyntaxKind::Newline => ::core::option::Option::None, + SyntaxKind::Tab => ::core::option::Option::None, + SyntaxKind::Stmt => ::core::option::Option::None, + SyntaxKind::Alias => ::core::option::Option::None, + SyntaxKind::RangeVar => ::core::option::Option::None, + SyntaxKind::TableFunc => ::core::option::Option::None, + SyntaxKind::Var => ::core::option::Option::None, + SyntaxKind::Param => ::core::option::Option::None, + SyntaxKind::Aggref => ::core::option::Option::None, + SyntaxKind::GroupingFunc => ::core::option::Option::None, + SyntaxKind::WindowFunc => ::core::option::Option::None, + SyntaxKind::SubscriptingRef => ::core::option::Option::None, + SyntaxKind::FuncExpr => ::core::option::Option::None, + SyntaxKind::NamedArgExpr => ::core::option::Option::None, + SyntaxKind::OpExpr => ::core::option::Option::None, + SyntaxKind::DistinctExpr => ::core::option::Option::None, + SyntaxKind::NullIfExpr => ::core::option::Option::None, + SyntaxKind::ScalarArrayOpExpr => ::core::option::Option::None, + SyntaxKind::BoolExpr => ::core::option::Option::None, + SyntaxKind::SubLink => ::core::option::Option::None, + SyntaxKind::SubPlan => ::core::option::Option::None, + SyntaxKind::AlternativeSubPlan => ::core::option::Option::None, + SyntaxKind::FieldSelect => ::core::option::Option::None, + SyntaxKind::FieldStore => ::core::option::Option::None, + SyntaxKind::RelabelType => ::core::option::Option::None, + SyntaxKind::CoerceViaIo => ::core::option::Option::None, + SyntaxKind::ArrayCoerceExpr => ::core::option::Option::None, + SyntaxKind::ConvertRowtypeExpr => ::core::option::Option::None, + SyntaxKind::CollateExpr => ::core::option::Option::None, + SyntaxKind::CaseExpr => ::core::option::Option::None, + SyntaxKind::CaseWhen => ::core::option::Option::None, + SyntaxKind::CaseTestExpr => ::core::option::Option::None, + SyntaxKind::ArrayExpr => ::core::option::Option::None, + SyntaxKind::RowExpr => ::core::option::Option::None, + SyntaxKind::RowCompareExpr => ::core::option::Option::None, + SyntaxKind::CoalesceExpr => ::core::option::Option::None, + SyntaxKind::MinMaxExpr => ::core::option::Option::None, + SyntaxKind::SqlvalueFunction => ::core::option::Option::None, + SyntaxKind::XmlExpr => ::core::option::Option::None, + SyntaxKind::NullTest => ::core::option::Option::None, + SyntaxKind::BooleanTest => ::core::option::Option::None, + SyntaxKind::CoerceToDomain => ::core::option::Option::None, + SyntaxKind::CoerceToDomainValue => ::core::option::Option::None, + SyntaxKind::SetToDefault => ::core::option::Option::None, + SyntaxKind::CurrentOfExpr => ::core::option::Option::None, + SyntaxKind::NextValueExpr => ::core::option::Option::None, + SyntaxKind::InferenceElem => ::core::option::Option::None, + SyntaxKind::TargetEntry => ::core::option::Option::None, + SyntaxKind::RangeTblRef => ::core::option::Option::None, + SyntaxKind::JoinExpr => ::core::option::Option::None, + SyntaxKind::FromExpr => ::core::option::Option::None, + SyntaxKind::OnConflictExpr => ::core::option::Option::None, + SyntaxKind::IntoClause => ::core::option::Option::None, + SyntaxKind::MergeAction => ::core::option::Option::None, + SyntaxKind::RawStmt => ::core::option::Option::None, + SyntaxKind::Query => ::core::option::Option::None, + SyntaxKind::InsertStmt => ::core::option::Option::None, + SyntaxKind::DeleteStmt => ::core::option::Option::None, + SyntaxKind::UpdateStmt => ::core::option::Option::None, + SyntaxKind::MergeStmt => ::core::option::Option::None, + SyntaxKind::SelectStmt => ::core::option::Option::None, + SyntaxKind::ReturnStmt => ::core::option::Option::None, + SyntaxKind::PlassignStmt => ::core::option::Option::None, + SyntaxKind::AlterTableStmt => ::core::option::Option::None, + SyntaxKind::AlterTableCmd => ::core::option::Option::None, + SyntaxKind::AlterDomainStmt => ::core::option::Option::None, + SyntaxKind::SetOperationStmt => ::core::option::Option::None, + SyntaxKind::GrantStmt => ::core::option::Option::None, + SyntaxKind::GrantRoleStmt => ::core::option::Option::None, + SyntaxKind::AlterDefaultPrivilegesStmt => ::core::option::Option::None, + SyntaxKind::ClosePortalStmt => ::core::option::Option::None, + SyntaxKind::ClusterStmt => ::core::option::Option::None, + SyntaxKind::CopyStmt => ::core::option::Option::None, + SyntaxKind::CreateStmt => ::core::option::Option::None, + SyntaxKind::DefineStmt => ::core::option::Option::None, + SyntaxKind::DropStmt => ::core::option::Option::None, + SyntaxKind::TruncateStmt => ::core::option::Option::None, + SyntaxKind::CommentStmt => ::core::option::Option::None, + SyntaxKind::FetchStmt => ::core::option::Option::None, + SyntaxKind::IndexStmt => ::core::option::Option::None, + SyntaxKind::CreateFunctionStmt => ::core::option::Option::None, + SyntaxKind::AlterFunctionStmt => ::core::option::Option::None, + SyntaxKind::DoStmt => ::core::option::Option::None, + SyntaxKind::RenameStmt => ::core::option::Option::None, + SyntaxKind::RuleStmt => ::core::option::Option::None, + SyntaxKind::NotifyStmt => ::core::option::Option::None, + SyntaxKind::ListenStmt => ::core::option::Option::None, + SyntaxKind::UnlistenStmt => ::core::option::Option::None, + SyntaxKind::TransactionStmt => ::core::option::Option::None, + SyntaxKind::ViewStmt => ::core::option::Option::None, + SyntaxKind::LoadStmt => ::core::option::Option::None, + SyntaxKind::CreateDomainStmt => ::core::option::Option::None, + SyntaxKind::CreatedbStmt => ::core::option::Option::None, + SyntaxKind::DropdbStmt => ::core::option::Option::None, + SyntaxKind::VacuumStmt => ::core::option::Option::None, + SyntaxKind::ExplainStmt => ::core::option::Option::None, + SyntaxKind::CreateTableAsStmt => ::core::option::Option::None, + SyntaxKind::CreateSeqStmt => ::core::option::Option::None, + SyntaxKind::AlterSeqStmt => ::core::option::Option::None, + SyntaxKind::VariableSetStmt => ::core::option::Option::None, + SyntaxKind::VariableShowStmt => ::core::option::Option::None, + SyntaxKind::DiscardStmt => ::core::option::Option::None, + SyntaxKind::CreateTrigStmt => ::core::option::Option::None, + SyntaxKind::CreatePlangStmt => ::core::option::Option::None, + SyntaxKind::CreateRoleStmt => ::core::option::Option::None, + SyntaxKind::AlterRoleStmt => ::core::option::Option::None, + SyntaxKind::DropRoleStmt => ::core::option::Option::None, + SyntaxKind::LockStmt => ::core::option::Option::None, + SyntaxKind::ConstraintsSetStmt => ::core::option::Option::None, + SyntaxKind::ReindexStmt => ::core::option::Option::None, + SyntaxKind::CheckPointStmt => ::core::option::Option::None, + SyntaxKind::CreateSchemaStmt => ::core::option::Option::None, + SyntaxKind::AlterDatabaseStmt => ::core::option::Option::None, + SyntaxKind::AlterDatabaseRefreshCollStmt => ::core::option::Option::None, + SyntaxKind::AlterDatabaseSetStmt => ::core::option::Option::None, + SyntaxKind::AlterRoleSetStmt => ::core::option::Option::None, + SyntaxKind::CreateConversionStmt => ::core::option::Option::None, + SyntaxKind::CreateCastStmt => ::core::option::Option::None, + SyntaxKind::CreateOpClassStmt => ::core::option::Option::None, + SyntaxKind::CreateOpFamilyStmt => ::core::option::Option::None, + SyntaxKind::AlterOpFamilyStmt => ::core::option::Option::None, + SyntaxKind::PrepareStmt => ::core::option::Option::None, + SyntaxKind::ExecuteStmt => ::core::option::Option::None, + SyntaxKind::DeallocateStmt => ::core::option::Option::None, + SyntaxKind::DeclareCursorStmt => ::core::option::Option::None, + SyntaxKind::CreateTableSpaceStmt => ::core::option::Option::None, + SyntaxKind::DropTableSpaceStmt => ::core::option::Option::None, + SyntaxKind::AlterObjectDependsStmt => ::core::option::Option::None, + SyntaxKind::AlterObjectSchemaStmt => ::core::option::Option::None, + SyntaxKind::AlterOwnerStmt => ::core::option::Option::None, + SyntaxKind::AlterOperatorStmt => ::core::option::Option::None, + SyntaxKind::AlterTypeStmt => ::core::option::Option::None, + SyntaxKind::DropOwnedStmt => ::core::option::Option::None, + SyntaxKind::ReassignOwnedStmt => ::core::option::Option::None, + SyntaxKind::CompositeTypeStmt => ::core::option::Option::None, + SyntaxKind::CreateEnumStmt => ::core::option::Option::None, + SyntaxKind::CreateRangeStmt => ::core::option::Option::None, + SyntaxKind::AlterEnumStmt => ::core::option::Option::None, + SyntaxKind::AlterTsdictionaryStmt => ::core::option::Option::None, + SyntaxKind::AlterTsconfigurationStmt => ::core::option::Option::None, + SyntaxKind::CreateFdwStmt => ::core::option::Option::None, + SyntaxKind::AlterFdwStmt => ::core::option::Option::None, + SyntaxKind::CreateForeignServerStmt => ::core::option::Option::None, + SyntaxKind::AlterForeignServerStmt => ::core::option::Option::None, + SyntaxKind::CreateUserMappingStmt => ::core::option::Option::None, + SyntaxKind::AlterUserMappingStmt => ::core::option::Option::None, + SyntaxKind::DropUserMappingStmt => ::core::option::Option::None, + SyntaxKind::AlterTableSpaceOptionsStmt => ::core::option::Option::None, + SyntaxKind::AlterTableMoveAllStmt => ::core::option::Option::None, + SyntaxKind::SecLabelStmt => ::core::option::Option::None, + SyntaxKind::CreateForeignTableStmt => ::core::option::Option::None, + SyntaxKind::ImportForeignSchemaStmt => ::core::option::Option::None, + SyntaxKind::CreateExtensionStmt => ::core::option::Option::None, + SyntaxKind::AlterExtensionStmt => ::core::option::Option::None, + SyntaxKind::AlterExtensionContentsStmt => ::core::option::Option::None, + SyntaxKind::CreateEventTrigStmt => ::core::option::Option::None, + SyntaxKind::AlterEventTrigStmt => ::core::option::Option::None, + SyntaxKind::RefreshMatViewStmt => ::core::option::Option::None, + SyntaxKind::ReplicaIdentityStmt => ::core::option::Option::None, + SyntaxKind::AlterSystemStmt => ::core::option::Option::None, + SyntaxKind::CreatePolicyStmt => ::core::option::Option::None, + SyntaxKind::AlterPolicyStmt => ::core::option::Option::None, + SyntaxKind::CreateTransformStmt => ::core::option::Option::None, + SyntaxKind::CreateAmStmt => ::core::option::Option::None, + SyntaxKind::CreatePublicationStmt => ::core::option::Option::None, + SyntaxKind::AlterPublicationStmt => ::core::option::Option::None, + SyntaxKind::CreateSubscriptionStmt => ::core::option::Option::None, + SyntaxKind::AlterSubscriptionStmt => ::core::option::Option::None, + SyntaxKind::DropSubscriptionStmt => ::core::option::Option::None, + SyntaxKind::CreateStatsStmt => ::core::option::Option::None, + SyntaxKind::AlterCollationStmt => ::core::option::Option::None, + SyntaxKind::CallStmt => ::core::option::Option::None, + SyntaxKind::AlterStatsStmt => ::core::option::Option::None, + SyntaxKind::AExpr => ::core::option::Option::None, + SyntaxKind::ColumnRef => ::core::option::Option::None, + SyntaxKind::ParamRef => ::core::option::Option::None, + SyntaxKind::FuncCall => ::core::option::Option::None, + SyntaxKind::AStar => ::core::option::Option::None, + SyntaxKind::AIndices => ::core::option::Option::None, + SyntaxKind::AIndirection => ::core::option::Option::None, + SyntaxKind::AArrayExpr => ::core::option::Option::None, + SyntaxKind::ResTarget => ::core::option::Option::None, + SyntaxKind::MultiAssignRef => ::core::option::Option::None, + SyntaxKind::TypeCast => ::core::option::Option::None, + SyntaxKind::CollateClause => ::core::option::Option::None, + SyntaxKind::SortBy => ::core::option::Option::None, + SyntaxKind::WindowDef => ::core::option::Option::None, + SyntaxKind::RangeSubselect => ::core::option::Option::None, + SyntaxKind::RangeFunction => ::core::option::Option::None, + SyntaxKind::RangeTableSample => ::core::option::Option::None, + SyntaxKind::RangeTableFunc => ::core::option::Option::None, + SyntaxKind::RangeTableFuncCol => ::core::option::Option::None, + SyntaxKind::TypeName => ::core::option::Option::None, + SyntaxKind::ColumnDef => ::core::option::Option::None, + SyntaxKind::IndexElem => ::core::option::Option::None, + SyntaxKind::StatsElem => ::core::option::Option::None, + SyntaxKind::Constraint => ::core::option::Option::None, + SyntaxKind::DefElem => ::core::option::Option::None, + SyntaxKind::RangeTblEntry => ::core::option::Option::None, + SyntaxKind::RangeTblFunction => ::core::option::Option::None, + SyntaxKind::TableSampleClause => ::core::option::Option::None, + SyntaxKind::WithCheckOption => ::core::option::Option::None, + SyntaxKind::SortGroupClause => ::core::option::Option::None, + SyntaxKind::GroupingSet => ::core::option::Option::None, + SyntaxKind::WindowClause => ::core::option::Option::None, + SyntaxKind::ObjectWithArgs => ::core::option::Option::None, + SyntaxKind::AccessPriv => ::core::option::Option::None, + SyntaxKind::CreateOpClassItem => ::core::option::Option::None, + SyntaxKind::TableLikeClause => ::core::option::Option::None, + SyntaxKind::FunctionParameter => ::core::option::Option::None, + SyntaxKind::LockingClause => ::core::option::Option::None, + SyntaxKind::RowMarkClause => ::core::option::Option::None, + SyntaxKind::XmlSerialize => ::core::option::Option::None, + SyntaxKind::WithClause => ::core::option::Option::None, + SyntaxKind::InferClause => ::core::option::Option::None, + SyntaxKind::OnConflictClause => ::core::option::Option::None, + SyntaxKind::CtesearchClause => ::core::option::Option::None, + SyntaxKind::CtecycleClause => ::core::option::Option::None, + SyntaxKind::CommonTableExpr => ::core::option::Option::None, + SyntaxKind::MergeWhenClause => ::core::option::Option::None, + SyntaxKind::RoleSpec => ::core::option::Option::None, + SyntaxKind::TriggerTransition => ::core::option::Option::None, + SyntaxKind::PartitionElem => ::core::option::Option::None, + SyntaxKind::PartitionSpec => ::core::option::Option::None, + SyntaxKind::PartitionBoundSpec => ::core::option::Option::None, + SyntaxKind::PartitionRangeDatum => ::core::option::Option::None, + SyntaxKind::PartitionCmd => ::core::option::Option::None, + SyntaxKind::VacuumRelation => ::core::option::Option::None, + SyntaxKind::PublicationObjSpec => ::core::option::Option::None, + SyntaxKind::PublicationTable => ::core::option::Option::None, + SyntaxKind::InlineCodeBlock => ::core::option::Option::None, + SyntaxKind::CallContext => ::core::option::Option::None, + SyntaxKind::Integer => ::core::option::Option::None, + SyntaxKind::Float => ::core::option::Option::None, + SyntaxKind::Boolean => ::core::option::Option::None, + SyntaxKind::String => ::core::option::Option::None, + SyntaxKind::BitString => ::core::option::Option::None, + SyntaxKind::List => ::core::option::Option::None, + SyntaxKind::IntList => ::core::option::Option::None, + SyntaxKind::OidList => ::core::option::Option::None, + SyntaxKind::AConst => ::core::option::Option::None, + SyntaxKind::Nul => ::core::option::Option::None, + SyntaxKind::Ascii37 => ::core::option::Option::None, + SyntaxKind::Ascii40 => ::core::option::Option::None, + SyntaxKind::Ascii41 => ::core::option::Option::None, + SyntaxKind::Ascii42 => ::core::option::Option::None, + SyntaxKind::Ascii43 => ::core::option::Option::None, + SyntaxKind::Ascii44 => ::core::option::Option::None, + SyntaxKind::Ascii45 => ::core::option::Option::None, + SyntaxKind::Ascii46 => ::core::option::Option::None, + SyntaxKind::Ascii47 => ::core::option::Option::None, + SyntaxKind::Ascii58 => ::core::option::Option::None, + SyntaxKind::Ascii59 => ::core::option::Option::None, + SyntaxKind::Ascii60 => ::core::option::Option::None, + SyntaxKind::Ascii61 => ::core::option::Option::None, + SyntaxKind::Ascii62 => ::core::option::Option::None, + SyntaxKind::Ascii63 => ::core::option::Option::None, + SyntaxKind::Ascii91 => ::core::option::Option::None, + SyntaxKind::Ascii92 => ::core::option::Option::None, + SyntaxKind::Ascii93 => ::core::option::Option::None, + SyntaxKind::Ascii94 => ::core::option::Option::None, + SyntaxKind::Ident => ::core::option::Option::None, + SyntaxKind::Uident => ::core::option::Option::None, + SyntaxKind::Fconst => ::core::option::Option::None, + SyntaxKind::Sconst => ::core::option::Option::None, + SyntaxKind::Usconst => ::core::option::Option::None, + SyntaxKind::Bconst => ::core::option::Option::None, + SyntaxKind::Xconst => ::core::option::Option::None, + SyntaxKind::Op => ::core::option::Option::None, + SyntaxKind::Iconst => ::core::option::Option::None, + SyntaxKind::Typecast => ::core::option::Option::None, + SyntaxKind::DotDot => ::core::option::Option::None, + SyntaxKind::ColonEquals => ::core::option::Option::None, + SyntaxKind::EqualsGreater => ::core::option::Option::None, + SyntaxKind::LessEquals => ::core::option::Option::None, + SyntaxKind::GreaterEquals => ::core::option::Option::None, + SyntaxKind::NotEquals => ::core::option::Option::None, + SyntaxKind::SqlComment => ::core::option::Option::None, + SyntaxKind::CComment => ::core::option::Option::None, + SyntaxKind::AbortP => ::core::option::Option::None, + SyntaxKind::AbsoluteP => ::core::option::Option::None, + SyntaxKind::Access => ::core::option::Option::None, + SyntaxKind::Action => ::core::option::Option::None, + SyntaxKind::AddP => ::core::option::Option::None, + SyntaxKind::Admin => ::core::option::Option::None, + SyntaxKind::After => ::core::option::Option::None, + SyntaxKind::Aggregate => ::core::option::Option::None, + SyntaxKind::All => ::core::option::Option::None, + SyntaxKind::Also => ::core::option::Option::None, + SyntaxKind::Alter => ::core::option::Option::None, + SyntaxKind::Always => ::core::option::Option::None, + SyntaxKind::Analyse => ::core::option::Option::None, + SyntaxKind::Analyze => ::core::option::Option::None, + SyntaxKind::And => ::core::option::Option::None, + SyntaxKind::Any => ::core::option::Option::None, + SyntaxKind::Array => ::core::option::Option::None, + SyntaxKind::As => ::core::option::Option::None, + SyntaxKind::Asc => ::core::option::Option::None, + SyntaxKind::Asensitive => ::core::option::Option::None, + SyntaxKind::Assertion => ::core::option::Option::None, + SyntaxKind::Assignment => ::core::option::Option::None, + SyntaxKind::Asymmetric => ::core::option::Option::None, + SyntaxKind::Atomic => ::core::option::Option::None, + SyntaxKind::At => ::core::option::Option::None, + SyntaxKind::Attach => ::core::option::Option::None, + SyntaxKind::Attribute => ::core::option::Option::None, + SyntaxKind::Authorization => ::core::option::Option::None, + SyntaxKind::Backward => ::core::option::Option::None, + SyntaxKind::Before => ::core::option::Option::None, + SyntaxKind::BeginP => ::core::option::Option::None, + SyntaxKind::Between => ::core::option::Option::None, + SyntaxKind::Bigint => ::core::option::Option::None, + SyntaxKind::Binary => ::core::option::Option::None, + SyntaxKind::Bit => ::core::option::Option::None, + SyntaxKind::BooleanP => ::core::option::Option::None, + SyntaxKind::Both => ::core::option::Option::None, + SyntaxKind::Breadth => ::core::option::Option::None, + SyntaxKind::By => ::core::option::Option::None, + SyntaxKind::Cache => ::core::option::Option::None, + SyntaxKind::Call => ::core::option::Option::None, + SyntaxKind::Called => ::core::option::Option::None, + SyntaxKind::Cascade => ::core::option::Option::None, + SyntaxKind::Cascaded => ::core::option::Option::None, + SyntaxKind::Case => ::core::option::Option::None, + SyntaxKind::Cast => ::core::option::Option::None, + SyntaxKind::CatalogP => ::core::option::Option::None, + SyntaxKind::Chain => ::core::option::Option::None, + SyntaxKind::CharP => ::core::option::Option::None, + SyntaxKind::Character => ::core::option::Option::None, + SyntaxKind::Characteristics => ::core::option::Option::None, + SyntaxKind::Check => ::core::option::Option::None, + SyntaxKind::Checkpoint => ::core::option::Option::None, + SyntaxKind::Class => ::core::option::Option::None, + SyntaxKind::Close => ::core::option::Option::None, + SyntaxKind::Cluster => ::core::option::Option::None, + SyntaxKind::Coalesce => ::core::option::Option::None, + SyntaxKind::Collate => ::core::option::Option::None, + SyntaxKind::Collation => ::core::option::Option::None, + SyntaxKind::Column => ::core::option::Option::None, + SyntaxKind::Columns => ::core::option::Option::None, + SyntaxKind::Comments => ::core::option::Option::None, + SyntaxKind::Commit => ::core::option::Option::None, + SyntaxKind::Committed => ::core::option::Option::None, + SyntaxKind::Compression => ::core::option::Option::None, + SyntaxKind::Concurrently => ::core::option::Option::None, + SyntaxKind::Configuration => ::core::option::Option::None, + SyntaxKind::Conflict => ::core::option::Option::None, + SyntaxKind::Connection => ::core::option::Option::None, + SyntaxKind::Constraints => ::core::option::Option::None, + SyntaxKind::ContentP => ::core::option::Option::None, + SyntaxKind::ContinueP => ::core::option::Option::None, + SyntaxKind::ConversionP => ::core::option::Option::None, + SyntaxKind::Copy => ::core::option::Option::None, + SyntaxKind::Cost => ::core::option::Option::None, + SyntaxKind::Create => ::core::option::Option::None, + SyntaxKind::Cross => ::core::option::Option::None, + SyntaxKind::Csv => ::core::option::Option::None, + SyntaxKind::Cube => ::core::option::Option::None, + SyntaxKind::CurrentP => ::core::option::Option::None, + SyntaxKind::CurrentCatalog => ::core::option::Option::None, + SyntaxKind::CurrentDate => ::core::option::Option::None, + SyntaxKind::CurrentRole => ::core::option::Option::None, + SyntaxKind::CurrentSchema => ::core::option::Option::None, + SyntaxKind::CurrentTime => ::core::option::Option::None, + SyntaxKind::CurrentTimestamp => ::core::option::Option::None, + SyntaxKind::CurrentUser => ::core::option::Option::None, + SyntaxKind::Cursor => ::core::option::Option::None, + SyntaxKind::Cycle => ::core::option::Option::None, + SyntaxKind::DataP => ::core::option::Option::None, + SyntaxKind::Database => ::core::option::Option::None, + SyntaxKind::DayP => ::core::option::Option::None, + SyntaxKind::Deallocate => ::core::option::Option::None, + SyntaxKind::Dec => ::core::option::Option::None, + SyntaxKind::DecimalP => ::core::option::Option::None, + SyntaxKind::Declare => ::core::option::Option::None, + SyntaxKind::Default => ::core::option::Option::None, + SyntaxKind::Defaults => ::core::option::Option::None, + SyntaxKind::Deferrable => ::core::option::Option::None, + SyntaxKind::Deferred => ::core::option::Option::None, + SyntaxKind::Definer => ::core::option::Option::None, + SyntaxKind::DeleteP => ::core::option::Option::None, + SyntaxKind::Delimiter => ::core::option::Option::None, + SyntaxKind::Delimiters => ::core::option::Option::None, + SyntaxKind::Depends => ::core::option::Option::None, + SyntaxKind::Depth => ::core::option::Option::None, + SyntaxKind::Desc => ::core::option::Option::None, + SyntaxKind::Detach => ::core::option::Option::None, + SyntaxKind::Dictionary => ::core::option::Option::None, + SyntaxKind::DisableP => ::core::option::Option::None, + SyntaxKind::Discard => ::core::option::Option::None, + SyntaxKind::Distinct => ::core::option::Option::None, + SyntaxKind::Do => ::core::option::Option::None, + SyntaxKind::DocumentP => ::core::option::Option::None, + SyntaxKind::DomainP => ::core::option::Option::None, + SyntaxKind::DoubleP => ::core::option::Option::None, + SyntaxKind::Drop => ::core::option::Option::None, + SyntaxKind::Each => ::core::option::Option::None, + SyntaxKind::Else => ::core::option::Option::None, + SyntaxKind::EnableP => ::core::option::Option::None, + SyntaxKind::Encoding => ::core::option::Option::None, + SyntaxKind::Encrypted => ::core::option::Option::None, + SyntaxKind::EndP => ::core::option::Option::None, + SyntaxKind::EnumP => ::core::option::Option::None, + SyntaxKind::Escape => ::core::option::Option::None, + SyntaxKind::Event => ::core::option::Option::None, + SyntaxKind::Except => ::core::option::Option::None, + SyntaxKind::Exclude => ::core::option::Option::None, + SyntaxKind::Excluding => ::core::option::Option::None, + SyntaxKind::Exclusive => ::core::option::Option::None, + SyntaxKind::Execute => ::core::option::Option::None, + SyntaxKind::Exists => ::core::option::Option::None, + SyntaxKind::Explain => ::core::option::Option::None, + SyntaxKind::Expression => ::core::option::Option::None, + SyntaxKind::Extension => ::core::option::Option::None, + SyntaxKind::External => ::core::option::Option::None, + SyntaxKind::Extract => ::core::option::Option::None, + SyntaxKind::FalseP => ::core::option::Option::None, + SyntaxKind::Family => ::core::option::Option::None, + SyntaxKind::Fetch => ::core::option::Option::None, + SyntaxKind::Filter => ::core::option::Option::None, + SyntaxKind::Finalize => ::core::option::Option::None, + SyntaxKind::FirstP => ::core::option::Option::None, + SyntaxKind::FloatP => ::core::option::Option::None, + SyntaxKind::Following => ::core::option::Option::None, + SyntaxKind::For => ::core::option::Option::None, + SyntaxKind::Force => ::core::option::Option::None, + SyntaxKind::Foreign => ::core::option::Option::None, + SyntaxKind::Forward => ::core::option::Option::None, + SyntaxKind::Freeze => ::core::option::Option::None, + SyntaxKind::From => ::core::option::Option::None, + SyntaxKind::Full => ::core::option::Option::None, + SyntaxKind::Function => ::core::option::Option::None, + SyntaxKind::Functions => ::core::option::Option::None, + SyntaxKind::Generated => ::core::option::Option::None, + SyntaxKind::Global => ::core::option::Option::None, + SyntaxKind::Grant => ::core::option::Option::None, + SyntaxKind::Granted => ::core::option::Option::None, + SyntaxKind::Greatest => ::core::option::Option::None, + SyntaxKind::GroupP => ::core::option::Option::None, + SyntaxKind::Grouping => ::core::option::Option::None, + SyntaxKind::Groups => ::core::option::Option::None, + SyntaxKind::Handler => ::core::option::Option::None, + SyntaxKind::Having => ::core::option::Option::None, + SyntaxKind::HeaderP => ::core::option::Option::None, + SyntaxKind::Hold => ::core::option::Option::None, + SyntaxKind::HourP => ::core::option::Option::None, + SyntaxKind::IdentityP => ::core::option::Option::None, + SyntaxKind::IfP => ::core::option::Option::None, + SyntaxKind::Ilike => ::core::option::Option::None, + SyntaxKind::Immediate => ::core::option::Option::None, + SyntaxKind::Immutable => ::core::option::Option::None, + SyntaxKind::ImplicitP => ::core::option::Option::None, + SyntaxKind::ImportP => ::core::option::Option::None, + SyntaxKind::InP => ::core::option::Option::None, + SyntaxKind::Include => ::core::option::Option::None, + SyntaxKind::Including => ::core::option::Option::None, + SyntaxKind::Increment => ::core::option::Option::None, + SyntaxKind::Index => ::core::option::Option::None, + SyntaxKind::Indexes => ::core::option::Option::None, + SyntaxKind::Inherit => ::core::option::Option::None, + SyntaxKind::Inherits => ::core::option::Option::None, + SyntaxKind::Initially => ::core::option::Option::None, + SyntaxKind::InlineP => ::core::option::Option::None, + SyntaxKind::InnerP => ::core::option::Option::None, + SyntaxKind::Inout => ::core::option::Option::None, + SyntaxKind::InputP => ::core::option::Option::None, + SyntaxKind::Insensitive => ::core::option::Option::None, + SyntaxKind::Insert => ::core::option::Option::None, + SyntaxKind::Instead => ::core::option::Option::None, + SyntaxKind::IntP => ::core::option::Option::None, + SyntaxKind::Intersect => ::core::option::Option::None, + SyntaxKind::Interval => ::core::option::Option::None, + SyntaxKind::Into => ::core::option::Option::None, + SyntaxKind::Invoker => ::core::option::Option::None, + SyntaxKind::Is => ::core::option::Option::None, + SyntaxKind::Isnull => ::core::option::Option::None, + SyntaxKind::Isolation => ::core::option::Option::None, + SyntaxKind::Join => ::core::option::Option::None, + SyntaxKind::Key => ::core::option::Option::None, + SyntaxKind::Label => ::core::option::Option::None, + SyntaxKind::Language => ::core::option::Option::None, + SyntaxKind::LargeP => ::core::option::Option::None, + SyntaxKind::LastP => ::core::option::Option::None, + SyntaxKind::LateralP => ::core::option::Option::None, + SyntaxKind::Leading => ::core::option::Option::None, + SyntaxKind::Leakproof => ::core::option::Option::None, + SyntaxKind::Least => ::core::option::Option::None, + SyntaxKind::Left => ::core::option::Option::None, + SyntaxKind::Level => ::core::option::Option::None, + SyntaxKind::Like => ::core::option::Option::None, + SyntaxKind::Limit => ::core::option::Option::None, + SyntaxKind::Listen => ::core::option::Option::None, + SyntaxKind::Load => ::core::option::Option::None, + SyntaxKind::Local => ::core::option::Option::None, + SyntaxKind::Localtime => ::core::option::Option::None, + SyntaxKind::Localtimestamp => ::core::option::Option::None, + SyntaxKind::Location => ::core::option::Option::None, + SyntaxKind::LockP => ::core::option::Option::None, + SyntaxKind::Locked => ::core::option::Option::None, + SyntaxKind::Logged => ::core::option::Option::None, + SyntaxKind::Mapping => ::core::option::Option::None, + SyntaxKind::Match => ::core::option::Option::None, + SyntaxKind::Matched => ::core::option::Option::None, + SyntaxKind::Materialized => ::core::option::Option::None, + SyntaxKind::Maxvalue => ::core::option::Option::None, + SyntaxKind::Merge => ::core::option::Option::None, + SyntaxKind::Method => ::core::option::Option::None, + SyntaxKind::MinuteP => ::core::option::Option::None, + SyntaxKind::Minvalue => ::core::option::Option::None, + SyntaxKind::Mode => ::core::option::Option::None, + SyntaxKind::MonthP => ::core::option::Option::None, + SyntaxKind::Move => ::core::option::Option::None, + SyntaxKind::NameP => ::core::option::Option::None, + SyntaxKind::Names => ::core::option::Option::None, + SyntaxKind::National => ::core::option::Option::None, + SyntaxKind::Natural => ::core::option::Option::None, + SyntaxKind::Nchar => ::core::option::Option::None, + SyntaxKind::New => ::core::option::Option::None, + SyntaxKind::Next => ::core::option::Option::None, + SyntaxKind::Nfc => ::core::option::Option::None, + SyntaxKind::Nfd => ::core::option::Option::None, + SyntaxKind::Nfkc => ::core::option::Option::None, + SyntaxKind::Nfkd => ::core::option::Option::None, + SyntaxKind::No => ::core::option::Option::None, + SyntaxKind::None => ::core::option::Option::None, + SyntaxKind::Normalize => ::core::option::Option::None, + SyntaxKind::Normalized => ::core::option::Option::None, + SyntaxKind::Not => ::core::option::Option::None, + SyntaxKind::Nothing => ::core::option::Option::None, + SyntaxKind::Notify => ::core::option::Option::None, + SyntaxKind::Notnull => ::core::option::Option::None, + SyntaxKind::Nowait => ::core::option::Option::None, + SyntaxKind::NullP => ::core::option::Option::None, + SyntaxKind::Nullif => ::core::option::Option::None, + SyntaxKind::NullsP => ::core::option::Option::None, + SyntaxKind::Numeric => ::core::option::Option::None, + SyntaxKind::ObjectP => ::core::option::Option::None, + SyntaxKind::Of => ::core::option::Option::None, + SyntaxKind::Off => ::core::option::Option::None, + SyntaxKind::Offset => ::core::option::Option::None, + SyntaxKind::Oids => ::core::option::Option::None, + SyntaxKind::Old => ::core::option::Option::None, + SyntaxKind::On => ::core::option::Option::None, + SyntaxKind::Only => ::core::option::Option::None, + SyntaxKind::Operator => ::core::option::Option::None, + SyntaxKind::Option => ::core::option::Option::None, + SyntaxKind::Options => ::core::option::Option::None, + SyntaxKind::Or => ::core::option::Option::None, + SyntaxKind::Order => ::core::option::Option::None, + SyntaxKind::Ordinality => ::core::option::Option::None, + SyntaxKind::Others => ::core::option::Option::None, + SyntaxKind::OutP => ::core::option::Option::None, + SyntaxKind::OuterP => ::core::option::Option::None, + SyntaxKind::Over => ::core::option::Option::None, + SyntaxKind::Overlaps => ::core::option::Option::None, + SyntaxKind::Overlay => ::core::option::Option::None, + SyntaxKind::Overriding => ::core::option::Option::None, + SyntaxKind::Owned => ::core::option::Option::None, + SyntaxKind::Owner => ::core::option::Option::None, + SyntaxKind::Parallel => ::core::option::Option::None, + SyntaxKind::Parameter => ::core::option::Option::None, + SyntaxKind::Parser => ::core::option::Option::None, + SyntaxKind::Partial => ::core::option::Option::None, + SyntaxKind::Partition => ::core::option::Option::None, + SyntaxKind::Passing => ::core::option::Option::None, + SyntaxKind::Password => ::core::option::Option::None, + SyntaxKind::Placing => ::core::option::Option::None, + SyntaxKind::Plans => ::core::option::Option::None, + SyntaxKind::Policy => ::core::option::Option::None, + SyntaxKind::Position => ::core::option::Option::None, + SyntaxKind::Preceding => ::core::option::Option::None, + SyntaxKind::Precision => ::core::option::Option::None, + SyntaxKind::Preserve => ::core::option::Option::None, + SyntaxKind::Prepare => ::core::option::Option::None, + SyntaxKind::Prepared => ::core::option::Option::None, + SyntaxKind::Primary => ::core::option::Option::None, + SyntaxKind::Prior => ::core::option::Option::None, + SyntaxKind::Privileges => ::core::option::Option::None, + SyntaxKind::Procedural => ::core::option::Option::None, + SyntaxKind::Procedure => ::core::option::Option::None, + SyntaxKind::Procedures => ::core::option::Option::None, + SyntaxKind::Program => ::core::option::Option::None, + SyntaxKind::Publication => ::core::option::Option::None, + SyntaxKind::Quote => ::core::option::Option::None, + SyntaxKind::Range => ::core::option::Option::None, + SyntaxKind::Read => ::core::option::Option::None, + SyntaxKind::Real => ::core::option::Option::None, + SyntaxKind::Reassign => ::core::option::Option::None, + SyntaxKind::Recheck => ::core::option::Option::None, + SyntaxKind::Recursive => ::core::option::Option::None, + SyntaxKind::RefP => ::core::option::Option::None, + SyntaxKind::References => ::core::option::Option::None, + SyntaxKind::Referencing => ::core::option::Option::None, + SyntaxKind::Refresh => ::core::option::Option::None, + SyntaxKind::Reindex => ::core::option::Option::None, + SyntaxKind::RelativeP => ::core::option::Option::None, + SyntaxKind::Release => ::core::option::Option::None, + SyntaxKind::Rename => ::core::option::Option::None, + SyntaxKind::Repeatable => ::core::option::Option::None, + SyntaxKind::Replace => ::core::option::Option::None, + SyntaxKind::Replica => ::core::option::Option::None, + SyntaxKind::Reset => ::core::option::Option::None, + SyntaxKind::Restart => ::core::option::Option::None, + SyntaxKind::Restrict => ::core::option::Option::None, + SyntaxKind::Return => ::core::option::Option::None, + SyntaxKind::Returning => ::core::option::Option::None, + SyntaxKind::Returns => ::core::option::Option::None, + SyntaxKind::Revoke => ::core::option::Option::None, + SyntaxKind::Right => ::core::option::Option::None, + SyntaxKind::Role => ::core::option::Option::None, + SyntaxKind::Rollback => ::core::option::Option::None, + SyntaxKind::Rollup => ::core::option::Option::None, + SyntaxKind::Routine => ::core::option::Option::None, + SyntaxKind::Routines => ::core::option::Option::None, + SyntaxKind::Row => ::core::option::Option::None, + SyntaxKind::Rows => ::core::option::Option::None, + SyntaxKind::Rule => ::core::option::Option::None, + SyntaxKind::Savepoint => ::core::option::Option::None, + SyntaxKind::Schema => ::core::option::Option::None, + SyntaxKind::Schemas => ::core::option::Option::None, + SyntaxKind::Scroll => ::core::option::Option::None, + SyntaxKind::Search => ::core::option::Option::None, + SyntaxKind::SecondP => ::core::option::Option::None, + SyntaxKind::Security => ::core::option::Option::None, + SyntaxKind::Select => ::core::option::Option::None, + SyntaxKind::Sequence => ::core::option::Option::None, + SyntaxKind::Sequences => ::core::option::Option::None, + SyntaxKind::Serializable => ::core::option::Option::None, + SyntaxKind::Server => ::core::option::Option::None, + SyntaxKind::Session => ::core::option::Option::None, + SyntaxKind::SessionUser => ::core::option::Option::None, + SyntaxKind::Set => ::core::option::Option::None, + SyntaxKind::Sets => ::core::option::Option::None, + SyntaxKind::Setof => ::core::option::Option::None, + SyntaxKind::Share => ::core::option::Option::None, + SyntaxKind::Show => ::core::option::Option::None, + SyntaxKind::Similar => ::core::option::Option::None, + SyntaxKind::Simple => ::core::option::Option::None, + SyntaxKind::Skip => ::core::option::Option::None, + SyntaxKind::Smallint => ::core::option::Option::None, + SyntaxKind::Snapshot => ::core::option::Option::None, + SyntaxKind::Some => ::core::option::Option::None, + SyntaxKind::SqlP => ::core::option::Option::None, + SyntaxKind::Stable => ::core::option::Option::None, + SyntaxKind::StandaloneP => ::core::option::Option::None, + SyntaxKind::Start => ::core::option::Option::None, + SyntaxKind::Statement => ::core::option::Option::None, + SyntaxKind::Statistics => ::core::option::Option::None, + SyntaxKind::Stdin => ::core::option::Option::None, + SyntaxKind::Stdout => ::core::option::Option::None, + SyntaxKind::Storage => ::core::option::Option::None, + SyntaxKind::Stored => ::core::option::Option::None, + SyntaxKind::StrictP => ::core::option::Option::None, + SyntaxKind::StripP => ::core::option::Option::None, + SyntaxKind::Subscription => ::core::option::Option::None, + SyntaxKind::Substring => ::core::option::Option::None, + SyntaxKind::Support => ::core::option::Option::None, + SyntaxKind::Symmetric => ::core::option::Option::None, + SyntaxKind::Sysid => ::core::option::Option::None, + SyntaxKind::SystemP => ::core::option::Option::None, + SyntaxKind::Table => ::core::option::Option::None, + SyntaxKind::Tables => ::core::option::Option::None, + SyntaxKind::Tablesample => ::core::option::Option::None, + SyntaxKind::Tablespace => ::core::option::Option::None, + SyntaxKind::Temp => ::core::option::Option::None, + SyntaxKind::Template => ::core::option::Option::None, + SyntaxKind::Temporary => ::core::option::Option::None, + SyntaxKind::TextP => ::core::option::Option::None, + SyntaxKind::Then => ::core::option::Option::None, + SyntaxKind::Ties => ::core::option::Option::None, + SyntaxKind::Time => ::core::option::Option::None, + SyntaxKind::Timestamp => ::core::option::Option::None, + SyntaxKind::To => ::core::option::Option::None, + SyntaxKind::Trailing => ::core::option::Option::None, + SyntaxKind::Transaction => ::core::option::Option::None, + SyntaxKind::Transform => ::core::option::Option::None, + SyntaxKind::Treat => ::core::option::Option::None, + SyntaxKind::Trigger => ::core::option::Option::None, + SyntaxKind::Trim => ::core::option::Option::None, + SyntaxKind::TrueP => ::core::option::Option::None, + SyntaxKind::Truncate => ::core::option::Option::None, + SyntaxKind::Trusted => ::core::option::Option::None, + SyntaxKind::TypeP => ::core::option::Option::None, + SyntaxKind::TypesP => ::core::option::Option::None, + SyntaxKind::Uescape => ::core::option::Option::None, + SyntaxKind::Unbounded => ::core::option::Option::None, + SyntaxKind::Uncommitted => ::core::option::Option::None, + SyntaxKind::Unencrypted => ::core::option::Option::None, + SyntaxKind::Union => ::core::option::Option::None, + SyntaxKind::Unique => ::core::option::Option::None, + SyntaxKind::Unknown => ::core::option::Option::None, + SyntaxKind::Unlisten => ::core::option::Option::None, + SyntaxKind::Unlogged => ::core::option::Option::None, + SyntaxKind::Until => ::core::option::Option::None, + SyntaxKind::Update => ::core::option::Option::None, + SyntaxKind::User => ::core::option::Option::None, + SyntaxKind::Using => ::core::option::Option::None, + SyntaxKind::Vacuum => ::core::option::Option::None, + SyntaxKind::Valid => ::core::option::Option::None, + SyntaxKind::Validate => ::core::option::Option::None, + SyntaxKind::Validator => ::core::option::Option::None, + SyntaxKind::ValueP => ::core::option::Option::None, + SyntaxKind::Values => ::core::option::Option::None, + SyntaxKind::Varchar => ::core::option::Option::None, + SyntaxKind::Variadic => ::core::option::Option::None, + SyntaxKind::Varying => ::core::option::Option::None, + SyntaxKind::Verbose => ::core::option::Option::None, + SyntaxKind::VersionP => ::core::option::Option::None, + SyntaxKind::View => ::core::option::Option::None, + SyntaxKind::Views => ::core::option::Option::None, + SyntaxKind::Volatile => ::core::option::Option::None, + SyntaxKind::When => ::core::option::Option::None, + SyntaxKind::Where => ::core::option::Option::None, + SyntaxKind::WhitespaceP => ::core::option::Option::None, + SyntaxKind::Window => ::core::option::Option::None, + SyntaxKind::With => ::core::option::Option::None, + SyntaxKind::Within => ::core::option::Option::None, + SyntaxKind::Without => ::core::option::Option::None, + SyntaxKind::Work => ::core::option::Option::None, + SyntaxKind::Wrapper => ::core::option::Option::None, + SyntaxKind::Write => ::core::option::Option::None, + SyntaxKind::XmlP => ::core::option::Option::None, + SyntaxKind::Xmlattributes => ::core::option::Option::None, + SyntaxKind::Xmlconcat => ::core::option::Option::None, + SyntaxKind::Xmlelement => ::core::option::Option::None, + SyntaxKind::Xmlexists => ::core::option::Option::None, + SyntaxKind::Xmlforest => ::core::option::Option::None, + SyntaxKind::Xmlnamespaces => ::core::option::Option::None, + SyntaxKind::Xmlparse => ::core::option::Option::None, + SyntaxKind::Xmlpi => ::core::option::Option::None, + SyntaxKind::Xmlroot => ::core::option::Option::None, + SyntaxKind::Xmlserialize => ::core::option::Option::None, + SyntaxKind::Xmltable => ::core::option::Option::None, + SyntaxKind::YearP => ::core::option::Option::None, + SyntaxKind::YesP => ::core::option::Option::None, + SyntaxKind::Zone => ::core::option::Option::None, + SyntaxKind::NotLa => ::core::option::Option::None, + SyntaxKind::NullsLa => ::core::option::Option::None, + SyntaxKind::WithLa => ::core::option::Option::None, + SyntaxKind::ModeTypeName => ::core::option::Option::None, + SyntaxKind::ModePlpgsqlExpr => ::core::option::Option::None, + SyntaxKind::ModePlpgsqlAssign1 => ::core::option::Option::None, + SyntaxKind::ModePlpgsqlAssign2 => ::core::option::Option::None, + SyntaxKind::ModePlpgsqlAssign3 => ::core::option::Option::None, + SyntaxKind::Uminus => ::core::option::Option::None, + } + } + } + impl SyntaxKind { + /// Converts a `pg_query` node to a `SyntaxKind` + pub fn new_from_pg_query_node(node: &NodeEnum) -> Self { + match node { + NodeEnum::Alias(_) => SyntaxKind::Alias, + NodeEnum::RangeVar(_) => SyntaxKind::RangeVar, + NodeEnum::TableFunc(_) => SyntaxKind::TableFunc, + NodeEnum::Var(_) => SyntaxKind::Var, + NodeEnum::Param(_) => SyntaxKind::Param, + NodeEnum::Aggref(_) => SyntaxKind::Aggref, + NodeEnum::GroupingFunc(_) => SyntaxKind::GroupingFunc, + NodeEnum::WindowFunc(_) => SyntaxKind::WindowFunc, + NodeEnum::SubscriptingRef(_) => SyntaxKind::SubscriptingRef, + NodeEnum::FuncExpr(_) => SyntaxKind::FuncExpr, + NodeEnum::NamedArgExpr(_) => SyntaxKind::NamedArgExpr, + NodeEnum::OpExpr(_) => SyntaxKind::OpExpr, + NodeEnum::DistinctExpr(_) => SyntaxKind::DistinctExpr, + NodeEnum::NullIfExpr(_) => SyntaxKind::NullIfExpr, + NodeEnum::ScalarArrayOpExpr(_) => SyntaxKind::ScalarArrayOpExpr, + NodeEnum::BoolExpr(_) => SyntaxKind::BoolExpr, + NodeEnum::SubLink(_) => SyntaxKind::SubLink, + NodeEnum::SubPlan(_) => SyntaxKind::SubPlan, + NodeEnum::AlternativeSubPlan(_) => SyntaxKind::AlternativeSubPlan, + NodeEnum::FieldSelect(_) => SyntaxKind::FieldSelect, + NodeEnum::FieldStore(_) => SyntaxKind::FieldStore, + NodeEnum::RelabelType(_) => SyntaxKind::RelabelType, + NodeEnum::CoerceViaIo(_) => SyntaxKind::CoerceViaIo, + NodeEnum::ArrayCoerceExpr(_) => SyntaxKind::ArrayCoerceExpr, + NodeEnum::ConvertRowtypeExpr(_) => SyntaxKind::ConvertRowtypeExpr, + NodeEnum::CollateExpr(_) => SyntaxKind::CollateExpr, + NodeEnum::CaseExpr(_) => SyntaxKind::CaseExpr, + NodeEnum::CaseWhen(_) => SyntaxKind::CaseWhen, + NodeEnum::CaseTestExpr(_) => SyntaxKind::CaseTestExpr, + NodeEnum::ArrayExpr(_) => SyntaxKind::ArrayExpr, + NodeEnum::RowExpr(_) => SyntaxKind::RowExpr, + NodeEnum::RowCompareExpr(_) => SyntaxKind::RowCompareExpr, + NodeEnum::CoalesceExpr(_) => SyntaxKind::CoalesceExpr, + NodeEnum::MinMaxExpr(_) => SyntaxKind::MinMaxExpr, + NodeEnum::SqlvalueFunction(_) => SyntaxKind::SqlvalueFunction, + NodeEnum::XmlExpr(_) => SyntaxKind::XmlExpr, + NodeEnum::NullTest(_) => SyntaxKind::NullTest, + NodeEnum::BooleanTest(_) => SyntaxKind::BooleanTest, + NodeEnum::CoerceToDomain(_) => SyntaxKind::CoerceToDomain, + NodeEnum::CoerceToDomainValue(_) => SyntaxKind::CoerceToDomainValue, + NodeEnum::SetToDefault(_) => SyntaxKind::SetToDefault, + NodeEnum::CurrentOfExpr(_) => SyntaxKind::CurrentOfExpr, + NodeEnum::NextValueExpr(_) => SyntaxKind::NextValueExpr, + NodeEnum::InferenceElem(_) => SyntaxKind::InferenceElem, + NodeEnum::TargetEntry(_) => SyntaxKind::TargetEntry, + NodeEnum::RangeTblRef(_) => SyntaxKind::RangeTblRef, + NodeEnum::JoinExpr(_) => SyntaxKind::JoinExpr, + NodeEnum::FromExpr(_) => SyntaxKind::FromExpr, + NodeEnum::OnConflictExpr(_) => SyntaxKind::OnConflictExpr, + NodeEnum::IntoClause(_) => SyntaxKind::IntoClause, + NodeEnum::MergeAction(_) => SyntaxKind::MergeAction, + NodeEnum::RawStmt(_) => SyntaxKind::RawStmt, + NodeEnum::Query(_) => SyntaxKind::Query, + NodeEnum::InsertStmt(_) => SyntaxKind::InsertStmt, + NodeEnum::DeleteStmt(_) => SyntaxKind::DeleteStmt, + NodeEnum::UpdateStmt(_) => SyntaxKind::UpdateStmt, + NodeEnum::MergeStmt(_) => SyntaxKind::MergeStmt, + NodeEnum::SelectStmt(_) => SyntaxKind::SelectStmt, + NodeEnum::ReturnStmt(_) => SyntaxKind::ReturnStmt, + NodeEnum::PlassignStmt(_) => SyntaxKind::PlassignStmt, + NodeEnum::AlterTableStmt(_) => SyntaxKind::AlterTableStmt, + NodeEnum::AlterTableCmd(_) => SyntaxKind::AlterTableCmd, + NodeEnum::AlterDomainStmt(_) => SyntaxKind::AlterDomainStmt, + NodeEnum::SetOperationStmt(_) => SyntaxKind::SetOperationStmt, + NodeEnum::GrantStmt(_) => SyntaxKind::GrantStmt, + NodeEnum::GrantRoleStmt(_) => SyntaxKind::GrantRoleStmt, + NodeEnum::AlterDefaultPrivilegesStmt(_) => { + SyntaxKind::AlterDefaultPrivilegesStmt + } + NodeEnum::ClosePortalStmt(_) => SyntaxKind::ClosePortalStmt, + NodeEnum::ClusterStmt(_) => SyntaxKind::ClusterStmt, + NodeEnum::CopyStmt(_) => SyntaxKind::CopyStmt, + NodeEnum::CreateStmt(_) => SyntaxKind::CreateStmt, + NodeEnum::DefineStmt(_) => SyntaxKind::DefineStmt, + NodeEnum::DropStmt(_) => SyntaxKind::DropStmt, + NodeEnum::TruncateStmt(_) => SyntaxKind::TruncateStmt, + NodeEnum::CommentStmt(_) => SyntaxKind::CommentStmt, + NodeEnum::FetchStmt(_) => SyntaxKind::FetchStmt, + NodeEnum::IndexStmt(_) => SyntaxKind::IndexStmt, + NodeEnum::CreateFunctionStmt(_) => SyntaxKind::CreateFunctionStmt, + NodeEnum::AlterFunctionStmt(_) => SyntaxKind::AlterFunctionStmt, + NodeEnum::DoStmt(_) => SyntaxKind::DoStmt, + NodeEnum::RenameStmt(_) => SyntaxKind::RenameStmt, + NodeEnum::RuleStmt(_) => SyntaxKind::RuleStmt, + NodeEnum::NotifyStmt(_) => SyntaxKind::NotifyStmt, + NodeEnum::ListenStmt(_) => SyntaxKind::ListenStmt, + NodeEnum::UnlistenStmt(_) => SyntaxKind::UnlistenStmt, + NodeEnum::TransactionStmt(_) => SyntaxKind::TransactionStmt, + NodeEnum::ViewStmt(_) => SyntaxKind::ViewStmt, + NodeEnum::LoadStmt(_) => SyntaxKind::LoadStmt, + NodeEnum::CreateDomainStmt(_) => SyntaxKind::CreateDomainStmt, + NodeEnum::CreatedbStmt(_) => SyntaxKind::CreatedbStmt, + NodeEnum::DropdbStmt(_) => SyntaxKind::DropdbStmt, + NodeEnum::VacuumStmt(_) => SyntaxKind::VacuumStmt, + NodeEnum::ExplainStmt(_) => SyntaxKind::ExplainStmt, + NodeEnum::CreateTableAsStmt(_) => SyntaxKind::CreateTableAsStmt, + NodeEnum::CreateSeqStmt(_) => SyntaxKind::CreateSeqStmt, + NodeEnum::AlterSeqStmt(_) => SyntaxKind::AlterSeqStmt, + NodeEnum::VariableSetStmt(_) => SyntaxKind::VariableSetStmt, + NodeEnum::VariableShowStmt(_) => SyntaxKind::VariableShowStmt, + NodeEnum::DiscardStmt(_) => SyntaxKind::DiscardStmt, + NodeEnum::CreateTrigStmt(_) => SyntaxKind::CreateTrigStmt, + NodeEnum::CreatePlangStmt(_) => SyntaxKind::CreatePlangStmt, + NodeEnum::CreateRoleStmt(_) => SyntaxKind::CreateRoleStmt, + NodeEnum::AlterRoleStmt(_) => SyntaxKind::AlterRoleStmt, + NodeEnum::DropRoleStmt(_) => SyntaxKind::DropRoleStmt, + NodeEnum::LockStmt(_) => SyntaxKind::LockStmt, + NodeEnum::ConstraintsSetStmt(_) => SyntaxKind::ConstraintsSetStmt, + NodeEnum::ReindexStmt(_) => SyntaxKind::ReindexStmt, + NodeEnum::CheckPointStmt(_) => SyntaxKind::CheckPointStmt, + NodeEnum::CreateSchemaStmt(_) => SyntaxKind::CreateSchemaStmt, + NodeEnum::AlterDatabaseStmt(_) => SyntaxKind::AlterDatabaseStmt, + NodeEnum::AlterDatabaseRefreshCollStmt(_) => { + SyntaxKind::AlterDatabaseRefreshCollStmt + } + NodeEnum::AlterDatabaseSetStmt(_) => SyntaxKind::AlterDatabaseSetStmt, + NodeEnum::AlterRoleSetStmt(_) => SyntaxKind::AlterRoleSetStmt, + NodeEnum::CreateConversionStmt(_) => SyntaxKind::CreateConversionStmt, + NodeEnum::CreateCastStmt(_) => SyntaxKind::CreateCastStmt, + NodeEnum::CreateOpClassStmt(_) => SyntaxKind::CreateOpClassStmt, + NodeEnum::CreateOpFamilyStmt(_) => SyntaxKind::CreateOpFamilyStmt, + NodeEnum::AlterOpFamilyStmt(_) => SyntaxKind::AlterOpFamilyStmt, + NodeEnum::PrepareStmt(_) => SyntaxKind::PrepareStmt, + NodeEnum::ExecuteStmt(_) => SyntaxKind::ExecuteStmt, + NodeEnum::DeallocateStmt(_) => SyntaxKind::DeallocateStmt, + NodeEnum::DeclareCursorStmt(_) => SyntaxKind::DeclareCursorStmt, + NodeEnum::CreateTableSpaceStmt(_) => SyntaxKind::CreateTableSpaceStmt, + NodeEnum::DropTableSpaceStmt(_) => SyntaxKind::DropTableSpaceStmt, + NodeEnum::AlterObjectDependsStmt(_) => SyntaxKind::AlterObjectDependsStmt, + NodeEnum::AlterObjectSchemaStmt(_) => SyntaxKind::AlterObjectSchemaStmt, + NodeEnum::AlterOwnerStmt(_) => SyntaxKind::AlterOwnerStmt, + NodeEnum::AlterOperatorStmt(_) => SyntaxKind::AlterOperatorStmt, + NodeEnum::AlterTypeStmt(_) => SyntaxKind::AlterTypeStmt, + NodeEnum::DropOwnedStmt(_) => SyntaxKind::DropOwnedStmt, + NodeEnum::ReassignOwnedStmt(_) => SyntaxKind::ReassignOwnedStmt, + NodeEnum::CompositeTypeStmt(_) => SyntaxKind::CompositeTypeStmt, + NodeEnum::CreateEnumStmt(_) => SyntaxKind::CreateEnumStmt, + NodeEnum::CreateRangeStmt(_) => SyntaxKind::CreateRangeStmt, + NodeEnum::AlterEnumStmt(_) => SyntaxKind::AlterEnumStmt, + NodeEnum::AlterTsdictionaryStmt(_) => SyntaxKind::AlterTsdictionaryStmt, + NodeEnum::AlterTsconfigurationStmt(_) => { + SyntaxKind::AlterTsconfigurationStmt + } + NodeEnum::CreateFdwStmt(_) => SyntaxKind::CreateFdwStmt, + NodeEnum::AlterFdwStmt(_) => SyntaxKind::AlterFdwStmt, + NodeEnum::CreateForeignServerStmt(_) => { + SyntaxKind::CreateForeignServerStmt + } + NodeEnum::AlterForeignServerStmt(_) => SyntaxKind::AlterForeignServerStmt, + NodeEnum::CreateUserMappingStmt(_) => SyntaxKind::CreateUserMappingStmt, + NodeEnum::AlterUserMappingStmt(_) => SyntaxKind::AlterUserMappingStmt, + NodeEnum::DropUserMappingStmt(_) => SyntaxKind::DropUserMappingStmt, + NodeEnum::AlterTableSpaceOptionsStmt(_) => { + SyntaxKind::AlterTableSpaceOptionsStmt + } + NodeEnum::AlterTableMoveAllStmt(_) => SyntaxKind::AlterTableMoveAllStmt, + NodeEnum::SecLabelStmt(_) => SyntaxKind::SecLabelStmt, + NodeEnum::CreateForeignTableStmt(_) => SyntaxKind::CreateForeignTableStmt, + NodeEnum::ImportForeignSchemaStmt(_) => { + SyntaxKind::ImportForeignSchemaStmt + } + NodeEnum::CreateExtensionStmt(_) => SyntaxKind::CreateExtensionStmt, + NodeEnum::AlterExtensionStmt(_) => SyntaxKind::AlterExtensionStmt, + NodeEnum::AlterExtensionContentsStmt(_) => { + SyntaxKind::AlterExtensionContentsStmt + } + NodeEnum::CreateEventTrigStmt(_) => SyntaxKind::CreateEventTrigStmt, + NodeEnum::AlterEventTrigStmt(_) => SyntaxKind::AlterEventTrigStmt, + NodeEnum::RefreshMatViewStmt(_) => SyntaxKind::RefreshMatViewStmt, + NodeEnum::ReplicaIdentityStmt(_) => SyntaxKind::ReplicaIdentityStmt, + NodeEnum::AlterSystemStmt(_) => SyntaxKind::AlterSystemStmt, + NodeEnum::CreatePolicyStmt(_) => SyntaxKind::CreatePolicyStmt, + NodeEnum::AlterPolicyStmt(_) => SyntaxKind::AlterPolicyStmt, + NodeEnum::CreateTransformStmt(_) => SyntaxKind::CreateTransformStmt, + NodeEnum::CreateAmStmt(_) => SyntaxKind::CreateAmStmt, + NodeEnum::CreatePublicationStmt(_) => SyntaxKind::CreatePublicationStmt, + NodeEnum::AlterPublicationStmt(_) => SyntaxKind::AlterPublicationStmt, + NodeEnum::CreateSubscriptionStmt(_) => SyntaxKind::CreateSubscriptionStmt, + NodeEnum::AlterSubscriptionStmt(_) => SyntaxKind::AlterSubscriptionStmt, + NodeEnum::DropSubscriptionStmt(_) => SyntaxKind::DropSubscriptionStmt, + NodeEnum::CreateStatsStmt(_) => SyntaxKind::CreateStatsStmt, + NodeEnum::AlterCollationStmt(_) => SyntaxKind::AlterCollationStmt, + NodeEnum::CallStmt(_) => SyntaxKind::CallStmt, + NodeEnum::AlterStatsStmt(_) => SyntaxKind::AlterStatsStmt, + NodeEnum::AExpr(_) => SyntaxKind::AExpr, + NodeEnum::ColumnRef(_) => SyntaxKind::ColumnRef, + NodeEnum::ParamRef(_) => SyntaxKind::ParamRef, + NodeEnum::FuncCall(_) => SyntaxKind::FuncCall, + NodeEnum::AStar(_) => SyntaxKind::AStar, + NodeEnum::AIndices(_) => SyntaxKind::AIndices, + NodeEnum::AIndirection(_) => SyntaxKind::AIndirection, + NodeEnum::AArrayExpr(_) => SyntaxKind::AArrayExpr, + NodeEnum::ResTarget(_) => SyntaxKind::ResTarget, + NodeEnum::MultiAssignRef(_) => SyntaxKind::MultiAssignRef, + NodeEnum::TypeCast(_) => SyntaxKind::TypeCast, + NodeEnum::CollateClause(_) => SyntaxKind::CollateClause, + NodeEnum::SortBy(_) => SyntaxKind::SortBy, + NodeEnum::WindowDef(_) => SyntaxKind::WindowDef, + NodeEnum::RangeSubselect(_) => SyntaxKind::RangeSubselect, + NodeEnum::RangeFunction(_) => SyntaxKind::RangeFunction, + NodeEnum::RangeTableSample(_) => SyntaxKind::RangeTableSample, + NodeEnum::RangeTableFunc(_) => SyntaxKind::RangeTableFunc, + NodeEnum::RangeTableFuncCol(_) => SyntaxKind::RangeTableFuncCol, + NodeEnum::TypeName(_) => SyntaxKind::TypeName, + NodeEnum::ColumnDef(_) => SyntaxKind::ColumnDef, + NodeEnum::IndexElem(_) => SyntaxKind::IndexElem, + NodeEnum::StatsElem(_) => SyntaxKind::StatsElem, + NodeEnum::Constraint(_) => SyntaxKind::Constraint, + NodeEnum::DefElem(_) => SyntaxKind::DefElem, + NodeEnum::RangeTblEntry(_) => SyntaxKind::RangeTblEntry, + NodeEnum::RangeTblFunction(_) => SyntaxKind::RangeTblFunction, + NodeEnum::TableSampleClause(_) => SyntaxKind::TableSampleClause, + NodeEnum::WithCheckOption(_) => SyntaxKind::WithCheckOption, + NodeEnum::SortGroupClause(_) => SyntaxKind::SortGroupClause, + NodeEnum::GroupingSet(_) => SyntaxKind::GroupingSet, + NodeEnum::WindowClause(_) => SyntaxKind::WindowClause, + NodeEnum::ObjectWithArgs(_) => SyntaxKind::ObjectWithArgs, + NodeEnum::AccessPriv(_) => SyntaxKind::AccessPriv, + NodeEnum::CreateOpClassItem(_) => SyntaxKind::CreateOpClassItem, + NodeEnum::TableLikeClause(_) => SyntaxKind::TableLikeClause, + NodeEnum::FunctionParameter(_) => SyntaxKind::FunctionParameter, + NodeEnum::LockingClause(_) => SyntaxKind::LockingClause, + NodeEnum::RowMarkClause(_) => SyntaxKind::RowMarkClause, + NodeEnum::XmlSerialize(_) => SyntaxKind::XmlSerialize, + NodeEnum::WithClause(_) => SyntaxKind::WithClause, + NodeEnum::InferClause(_) => SyntaxKind::InferClause, + NodeEnum::OnConflictClause(_) => SyntaxKind::OnConflictClause, + NodeEnum::CtesearchClause(_) => SyntaxKind::CtesearchClause, + NodeEnum::CtecycleClause(_) => SyntaxKind::CtecycleClause, + NodeEnum::CommonTableExpr(_) => SyntaxKind::CommonTableExpr, + NodeEnum::MergeWhenClause(_) => SyntaxKind::MergeWhenClause, + NodeEnum::RoleSpec(_) => SyntaxKind::RoleSpec, + NodeEnum::TriggerTransition(_) => SyntaxKind::TriggerTransition, + NodeEnum::PartitionElem(_) => SyntaxKind::PartitionElem, + NodeEnum::PartitionSpec(_) => SyntaxKind::PartitionSpec, + NodeEnum::PartitionBoundSpec(_) => SyntaxKind::PartitionBoundSpec, + NodeEnum::PartitionRangeDatum(_) => SyntaxKind::PartitionRangeDatum, + NodeEnum::PartitionCmd(_) => SyntaxKind::PartitionCmd, + NodeEnum::VacuumRelation(_) => SyntaxKind::VacuumRelation, + NodeEnum::PublicationObjSpec(_) => SyntaxKind::PublicationObjSpec, + NodeEnum::PublicationTable(_) => SyntaxKind::PublicationTable, + NodeEnum::InlineCodeBlock(_) => SyntaxKind::InlineCodeBlock, + NodeEnum::CallContext(_) => SyntaxKind::CallContext, + NodeEnum::Integer(_) => SyntaxKind::Integer, + NodeEnum::Float(_) => SyntaxKind::Float, + NodeEnum::Boolean(_) => SyntaxKind::Boolean, + NodeEnum::String(_) => SyntaxKind::String, + NodeEnum::BitString(_) => SyntaxKind::BitString, + NodeEnum::List(_) => SyntaxKind::List, + NodeEnum::IntList(_) => SyntaxKind::IntList, + NodeEnum::OidList(_) => SyntaxKind::OidList, + NodeEnum::AConst(_) => SyntaxKind::AConst, + } + } + /// Converts a `pg_query` token to a `SyntaxKind` + pub fn new_from_pg_query_token(token: &ScanToken) -> Self { + match token.token { + 0 => SyntaxKind::Nul, + 37 => SyntaxKind::Ascii37, + 40 => SyntaxKind::Ascii40, + 41 => SyntaxKind::Ascii41, + 42 => SyntaxKind::Ascii42, + 43 => SyntaxKind::Ascii43, + 44 => SyntaxKind::Ascii44, + 45 => SyntaxKind::Ascii45, + 46 => SyntaxKind::Ascii46, + 47 => SyntaxKind::Ascii47, + 58 => SyntaxKind::Ascii58, + 59 => SyntaxKind::Ascii59, + 60 => SyntaxKind::Ascii60, + 61 => SyntaxKind::Ascii61, + 62 => SyntaxKind::Ascii62, + 63 => SyntaxKind::Ascii63, + 91 => SyntaxKind::Ascii91, + 92 => SyntaxKind::Ascii92, + 93 => SyntaxKind::Ascii93, + 94 => SyntaxKind::Ascii94, + 258 => SyntaxKind::Ident, + 259 => SyntaxKind::Uident, + 260 => SyntaxKind::Fconst, + 261 => SyntaxKind::Sconst, + 262 => SyntaxKind::Usconst, + 263 => SyntaxKind::Bconst, + 264 => SyntaxKind::Xconst, + 265 => SyntaxKind::Op, + 266 => SyntaxKind::Iconst, + 268 => SyntaxKind::Typecast, + 269 => SyntaxKind::DotDot, + 270 => SyntaxKind::ColonEquals, + 271 => SyntaxKind::EqualsGreater, + 272 => SyntaxKind::LessEquals, + 273 => SyntaxKind::GreaterEquals, + 274 => SyntaxKind::NotEquals, + 275 => SyntaxKind::SqlComment, + 276 => SyntaxKind::CComment, + 277 => SyntaxKind::AbortP, + 278 => SyntaxKind::AbsoluteP, + 279 => SyntaxKind::Access, + 280 => SyntaxKind::Action, + 281 => SyntaxKind::AddP, + 282 => SyntaxKind::Admin, + 283 => SyntaxKind::After, + 284 => SyntaxKind::Aggregate, + 285 => SyntaxKind::All, + 286 => SyntaxKind::Also, + 287 => SyntaxKind::Alter, + 288 => SyntaxKind::Always, + 289 => SyntaxKind::Analyse, + 290 => SyntaxKind::Analyze, + 291 => SyntaxKind::And, + 292 => SyntaxKind::Any, + 293 => SyntaxKind::Array, + 294 => SyntaxKind::As, + 295 => SyntaxKind::Asc, + 296 => SyntaxKind::Asensitive, + 297 => SyntaxKind::Assertion, + 298 => SyntaxKind::Assignment, + 299 => SyntaxKind::Asymmetric, + 300 => SyntaxKind::Atomic, + 301 => SyntaxKind::At, + 302 => SyntaxKind::Attach, + 303 => SyntaxKind::Attribute, + 304 => SyntaxKind::Authorization, + 305 => SyntaxKind::Backward, + 306 => SyntaxKind::Before, + 307 => SyntaxKind::BeginP, + 308 => SyntaxKind::Between, + 309 => SyntaxKind::Bigint, + 310 => SyntaxKind::Binary, + 311 => SyntaxKind::Bit, + 312 => SyntaxKind::BooleanP, + 313 => SyntaxKind::Both, + 314 => SyntaxKind::Breadth, + 315 => SyntaxKind::By, + 316 => SyntaxKind::Cache, + 317 => SyntaxKind::Call, + 318 => SyntaxKind::Called, + 319 => SyntaxKind::Cascade, + 320 => SyntaxKind::Cascaded, + 321 => SyntaxKind::Case, + 322 => SyntaxKind::Cast, + 323 => SyntaxKind::CatalogP, + 324 => SyntaxKind::Chain, + 325 => SyntaxKind::CharP, + 326 => SyntaxKind::Character, + 327 => SyntaxKind::Characteristics, + 328 => SyntaxKind::Check, + 329 => SyntaxKind::Checkpoint, + 330 => SyntaxKind::Class, + 331 => SyntaxKind::Close, + 332 => SyntaxKind::Cluster, + 333 => SyntaxKind::Coalesce, + 334 => SyntaxKind::Collate, + 335 => SyntaxKind::Collation, + 336 => SyntaxKind::Column, + 337 => SyntaxKind::Columns, + 339 => SyntaxKind::Comments, + 340 => SyntaxKind::Commit, + 341 => SyntaxKind::Committed, + 342 => SyntaxKind::Compression, + 343 => SyntaxKind::Concurrently, + 344 => SyntaxKind::Configuration, + 345 => SyntaxKind::Conflict, + 346 => SyntaxKind::Connection, + 348 => SyntaxKind::Constraints, + 349 => SyntaxKind::ContentP, + 350 => SyntaxKind::ContinueP, + 351 => SyntaxKind::ConversionP, + 352 => SyntaxKind::Copy, + 353 => SyntaxKind::Cost, + 354 => SyntaxKind::Create, + 355 => SyntaxKind::Cross, + 356 => SyntaxKind::Csv, + 357 => SyntaxKind::Cube, + 358 => SyntaxKind::CurrentP, + 359 => SyntaxKind::CurrentCatalog, + 360 => SyntaxKind::CurrentDate, + 361 => SyntaxKind::CurrentRole, + 362 => SyntaxKind::CurrentSchema, + 363 => SyntaxKind::CurrentTime, + 364 => SyntaxKind::CurrentTimestamp, + 365 => SyntaxKind::CurrentUser, + 366 => SyntaxKind::Cursor, + 367 => SyntaxKind::Cycle, + 368 => SyntaxKind::DataP, + 369 => SyntaxKind::Database, + 370 => SyntaxKind::DayP, + 371 => SyntaxKind::Deallocate, + 372 => SyntaxKind::Dec, + 373 => SyntaxKind::DecimalP, + 374 => SyntaxKind::Declare, + 375 => SyntaxKind::Default, + 376 => SyntaxKind::Defaults, + 377 => SyntaxKind::Deferrable, + 378 => SyntaxKind::Deferred, + 379 => SyntaxKind::Definer, + 380 => SyntaxKind::DeleteP, + 381 => SyntaxKind::Delimiter, + 382 => SyntaxKind::Delimiters, + 383 => SyntaxKind::Depends, + 384 => SyntaxKind::Depth, + 385 => SyntaxKind::Desc, + 386 => SyntaxKind::Detach, + 387 => SyntaxKind::Dictionary, + 388 => SyntaxKind::DisableP, + 389 => SyntaxKind::Discard, + 390 => SyntaxKind::Distinct, + 391 => SyntaxKind::Do, + 392 => SyntaxKind::DocumentP, + 393 => SyntaxKind::DomainP, + 394 => SyntaxKind::DoubleP, + 395 => SyntaxKind::Drop, + 396 => SyntaxKind::Each, + 397 => SyntaxKind::Else, + 398 => SyntaxKind::EnableP, + 399 => SyntaxKind::Encoding, + 400 => SyntaxKind::Encrypted, + 401 => SyntaxKind::EndP, + 402 => SyntaxKind::EnumP, + 403 => SyntaxKind::Escape, + 404 => SyntaxKind::Event, + 405 => SyntaxKind::Except, + 406 => SyntaxKind::Exclude, + 407 => SyntaxKind::Excluding, + 408 => SyntaxKind::Exclusive, + 409 => SyntaxKind::Execute, + 410 => SyntaxKind::Exists, + 411 => SyntaxKind::Explain, + 412 => SyntaxKind::Expression, + 413 => SyntaxKind::Extension, + 414 => SyntaxKind::External, + 415 => SyntaxKind::Extract, + 416 => SyntaxKind::FalseP, + 417 => SyntaxKind::Family, + 418 => SyntaxKind::Fetch, + 419 => SyntaxKind::Filter, + 420 => SyntaxKind::Finalize, + 421 => SyntaxKind::FirstP, + 422 => SyntaxKind::FloatP, + 423 => SyntaxKind::Following, + 424 => SyntaxKind::For, + 425 => SyntaxKind::Force, + 426 => SyntaxKind::Foreign, + 427 => SyntaxKind::Forward, + 428 => SyntaxKind::Freeze, + 429 => SyntaxKind::From, + 430 => SyntaxKind::Full, + 431 => SyntaxKind::Function, + 432 => SyntaxKind::Functions, + 433 => SyntaxKind::Generated, + 434 => SyntaxKind::Global, + 435 => SyntaxKind::Grant, + 436 => SyntaxKind::Granted, + 437 => SyntaxKind::Greatest, + 438 => SyntaxKind::GroupP, + 439 => SyntaxKind::Grouping, + 440 => SyntaxKind::Groups, + 441 => SyntaxKind::Handler, + 442 => SyntaxKind::Having, + 443 => SyntaxKind::HeaderP, + 444 => SyntaxKind::Hold, + 445 => SyntaxKind::HourP, + 446 => SyntaxKind::IdentityP, + 447 => SyntaxKind::IfP, + 448 => SyntaxKind::Ilike, + 449 => SyntaxKind::Immediate, + 450 => SyntaxKind::Immutable, + 451 => SyntaxKind::ImplicitP, + 452 => SyntaxKind::ImportP, + 453 => SyntaxKind::InP, + 454 => SyntaxKind::Include, + 455 => SyntaxKind::Including, + 456 => SyntaxKind::Increment, + 457 => SyntaxKind::Index, + 458 => SyntaxKind::Indexes, + 459 => SyntaxKind::Inherit, + 460 => SyntaxKind::Inherits, + 461 => SyntaxKind::Initially, + 462 => SyntaxKind::InlineP, + 463 => SyntaxKind::InnerP, + 464 => SyntaxKind::Inout, + 465 => SyntaxKind::InputP, + 466 => SyntaxKind::Insensitive, + 467 => SyntaxKind::Insert, + 468 => SyntaxKind::Instead, + 469 => SyntaxKind::IntP, + 471 => SyntaxKind::Intersect, + 472 => SyntaxKind::Interval, + 473 => SyntaxKind::Into, + 474 => SyntaxKind::Invoker, + 475 => SyntaxKind::Is, + 476 => SyntaxKind::Isnull, + 477 => SyntaxKind::Isolation, + 478 => SyntaxKind::Join, + 479 => SyntaxKind::Key, + 480 => SyntaxKind::Label, + 481 => SyntaxKind::Language, + 482 => SyntaxKind::LargeP, + 483 => SyntaxKind::LastP, + 484 => SyntaxKind::LateralP, + 485 => SyntaxKind::Leading, + 486 => SyntaxKind::Leakproof, + 487 => SyntaxKind::Least, + 488 => SyntaxKind::Left, + 489 => SyntaxKind::Level, + 490 => SyntaxKind::Like, + 491 => SyntaxKind::Limit, + 492 => SyntaxKind::Listen, + 493 => SyntaxKind::Load, + 494 => SyntaxKind::Local, + 495 => SyntaxKind::Localtime, + 496 => SyntaxKind::Localtimestamp, + 497 => SyntaxKind::Location, + 498 => SyntaxKind::LockP, + 499 => SyntaxKind::Locked, + 500 => SyntaxKind::Logged, + 501 => SyntaxKind::Mapping, + 502 => SyntaxKind::Match, + 503 => SyntaxKind::Matched, + 504 => SyntaxKind::Materialized, + 505 => SyntaxKind::Maxvalue, + 506 => SyntaxKind::Merge, + 507 => SyntaxKind::Method, + 508 => SyntaxKind::MinuteP, + 509 => SyntaxKind::Minvalue, + 510 => SyntaxKind::Mode, + 511 => SyntaxKind::MonthP, + 512 => SyntaxKind::Move, + 513 => SyntaxKind::NameP, + 514 => SyntaxKind::Names, + 515 => SyntaxKind::National, + 516 => SyntaxKind::Natural, + 517 => SyntaxKind::Nchar, + 518 => SyntaxKind::New, + 519 => SyntaxKind::Next, + 520 => SyntaxKind::Nfc, + 521 => SyntaxKind::Nfd, + 522 => SyntaxKind::Nfkc, + 523 => SyntaxKind::Nfkd, + 524 => SyntaxKind::No, + 525 => SyntaxKind::None, + 526 => SyntaxKind::Normalize, + 527 => SyntaxKind::Normalized, + 528 => SyntaxKind::Not, + 529 => SyntaxKind::Nothing, + 530 => SyntaxKind::Notify, + 531 => SyntaxKind::Notnull, + 532 => SyntaxKind::Nowait, + 533 => SyntaxKind::NullP, + 534 => SyntaxKind::Nullif, + 535 => SyntaxKind::NullsP, + 536 => SyntaxKind::Numeric, + 537 => SyntaxKind::ObjectP, + 538 => SyntaxKind::Of, + 539 => SyntaxKind::Off, + 540 => SyntaxKind::Offset, + 541 => SyntaxKind::Oids, + 542 => SyntaxKind::Old, + 543 => SyntaxKind::On, + 544 => SyntaxKind::Only, + 545 => SyntaxKind::Operator, + 546 => SyntaxKind::Option, + 547 => SyntaxKind::Options, + 548 => SyntaxKind::Or, + 549 => SyntaxKind::Order, + 550 => SyntaxKind::Ordinality, + 551 => SyntaxKind::Others, + 552 => SyntaxKind::OutP, + 553 => SyntaxKind::OuterP, + 554 => SyntaxKind::Over, + 555 => SyntaxKind::Overlaps, + 556 => SyntaxKind::Overlay, + 557 => SyntaxKind::Overriding, + 558 => SyntaxKind::Owned, + 559 => SyntaxKind::Owner, + 560 => SyntaxKind::Parallel, + 561 => SyntaxKind::Parameter, + 562 => SyntaxKind::Parser, + 563 => SyntaxKind::Partial, + 564 => SyntaxKind::Partition, + 565 => SyntaxKind::Passing, + 566 => SyntaxKind::Password, + 567 => SyntaxKind::Placing, + 568 => SyntaxKind::Plans, + 569 => SyntaxKind::Policy, + 570 => SyntaxKind::Position, + 571 => SyntaxKind::Preceding, + 572 => SyntaxKind::Precision, + 573 => SyntaxKind::Preserve, + 574 => SyntaxKind::Prepare, + 575 => SyntaxKind::Prepared, + 576 => SyntaxKind::Primary, + 577 => SyntaxKind::Prior, + 578 => SyntaxKind::Privileges, + 579 => SyntaxKind::Procedural, + 580 => SyntaxKind::Procedure, + 581 => SyntaxKind::Procedures, + 582 => SyntaxKind::Program, + 583 => SyntaxKind::Publication, + 584 => SyntaxKind::Quote, + 585 => SyntaxKind::Range, + 586 => SyntaxKind::Read, + 587 => SyntaxKind::Real, + 588 => SyntaxKind::Reassign, + 589 => SyntaxKind::Recheck, + 590 => SyntaxKind::Recursive, + 591 => SyntaxKind::RefP, + 592 => SyntaxKind::References, + 593 => SyntaxKind::Referencing, + 594 => SyntaxKind::Refresh, + 595 => SyntaxKind::Reindex, + 596 => SyntaxKind::RelativeP, + 597 => SyntaxKind::Release, + 598 => SyntaxKind::Rename, + 599 => SyntaxKind::Repeatable, + 600 => SyntaxKind::Replace, + 601 => SyntaxKind::Replica, + 602 => SyntaxKind::Reset, + 603 => SyntaxKind::Restart, + 604 => SyntaxKind::Restrict, + 605 => SyntaxKind::Return, + 606 => SyntaxKind::Returning, + 607 => SyntaxKind::Returns, + 608 => SyntaxKind::Revoke, + 609 => SyntaxKind::Right, + 610 => SyntaxKind::Role, + 611 => SyntaxKind::Rollback, + 612 => SyntaxKind::Rollup, + 613 => SyntaxKind::Routine, + 614 => SyntaxKind::Routines, + 615 => SyntaxKind::Row, + 616 => SyntaxKind::Rows, + 617 => SyntaxKind::Rule, + 618 => SyntaxKind::Savepoint, + 619 => SyntaxKind::Schema, + 620 => SyntaxKind::Schemas, + 621 => SyntaxKind::Scroll, + 622 => SyntaxKind::Search, + 623 => SyntaxKind::SecondP, + 624 => SyntaxKind::Security, + 625 => SyntaxKind::Select, + 626 => SyntaxKind::Sequence, + 627 => SyntaxKind::Sequences, + 628 => SyntaxKind::Serializable, + 629 => SyntaxKind::Server, + 630 => SyntaxKind::Session, + 631 => SyntaxKind::SessionUser, + 632 => SyntaxKind::Set, + 633 => SyntaxKind::Sets, + 634 => SyntaxKind::Setof, + 635 => SyntaxKind::Share, + 636 => SyntaxKind::Show, + 637 => SyntaxKind::Similar, + 638 => SyntaxKind::Simple, + 639 => SyntaxKind::Skip, + 640 => SyntaxKind::Smallint, + 641 => SyntaxKind::Snapshot, + 642 => SyntaxKind::Some, + 643 => SyntaxKind::SqlP, + 644 => SyntaxKind::Stable, + 645 => SyntaxKind::StandaloneP, + 646 => SyntaxKind::Start, + 647 => SyntaxKind::Statement, + 648 => SyntaxKind::Statistics, + 649 => SyntaxKind::Stdin, + 650 => SyntaxKind::Stdout, + 651 => SyntaxKind::Storage, + 652 => SyntaxKind::Stored, + 653 => SyntaxKind::StrictP, + 654 => SyntaxKind::StripP, + 655 => SyntaxKind::Subscription, + 656 => SyntaxKind::Substring, + 657 => SyntaxKind::Support, + 658 => SyntaxKind::Symmetric, + 659 => SyntaxKind::Sysid, + 660 => SyntaxKind::SystemP, + 661 => SyntaxKind::Table, + 662 => SyntaxKind::Tables, + 663 => SyntaxKind::Tablesample, + 664 => SyntaxKind::Tablespace, + 665 => SyntaxKind::Temp, + 666 => SyntaxKind::Template, + 667 => SyntaxKind::Temporary, + 668 => SyntaxKind::TextP, + 669 => SyntaxKind::Then, + 670 => SyntaxKind::Ties, + 671 => SyntaxKind::Time, + 672 => SyntaxKind::Timestamp, + 673 => SyntaxKind::To, + 674 => SyntaxKind::Trailing, + 675 => SyntaxKind::Transaction, + 676 => SyntaxKind::Transform, + 677 => SyntaxKind::Treat, + 678 => SyntaxKind::Trigger, + 679 => SyntaxKind::Trim, + 680 => SyntaxKind::TrueP, + 681 => SyntaxKind::Truncate, + 682 => SyntaxKind::Trusted, + 683 => SyntaxKind::TypeP, + 684 => SyntaxKind::TypesP, + 685 => SyntaxKind::Uescape, + 686 => SyntaxKind::Unbounded, + 687 => SyntaxKind::Uncommitted, + 688 => SyntaxKind::Unencrypted, + 689 => SyntaxKind::Union, + 690 => SyntaxKind::Unique, + 691 => SyntaxKind::Unknown, + 692 => SyntaxKind::Unlisten, + 693 => SyntaxKind::Unlogged, + 694 => SyntaxKind::Until, + 695 => SyntaxKind::Update, + 696 => SyntaxKind::User, + 697 => SyntaxKind::Using, + 698 => SyntaxKind::Vacuum, + 699 => SyntaxKind::Valid, + 700 => SyntaxKind::Validate, + 701 => SyntaxKind::Validator, + 702 => SyntaxKind::ValueP, + 703 => SyntaxKind::Values, + 704 => SyntaxKind::Varchar, + 705 => SyntaxKind::Variadic, + 706 => SyntaxKind::Varying, + 707 => SyntaxKind::Verbose, + 708 => SyntaxKind::VersionP, + 709 => SyntaxKind::View, + 710 => SyntaxKind::Views, + 711 => SyntaxKind::Volatile, + 712 => SyntaxKind::When, + 713 => SyntaxKind::Where, + 714 => SyntaxKind::WhitespaceP, + 715 => SyntaxKind::Window, + 716 => SyntaxKind::With, + 717 => SyntaxKind::Within, + 718 => SyntaxKind::Without, + 719 => SyntaxKind::Work, + 720 => SyntaxKind::Wrapper, + 721 => SyntaxKind::Write, + 722 => SyntaxKind::XmlP, + 723 => SyntaxKind::Xmlattributes, + 724 => SyntaxKind::Xmlconcat, + 725 => SyntaxKind::Xmlelement, + 726 => SyntaxKind::Xmlexists, + 727 => SyntaxKind::Xmlforest, + 728 => SyntaxKind::Xmlnamespaces, + 729 => SyntaxKind::Xmlparse, + 730 => SyntaxKind::Xmlpi, + 731 => SyntaxKind::Xmlroot, + 732 => SyntaxKind::Xmlserialize, + 733 => SyntaxKind::Xmltable, + 734 => SyntaxKind::YearP, + 735 => SyntaxKind::YesP, + 736 => SyntaxKind::Zone, + 737 => SyntaxKind::NotLa, + 738 => SyntaxKind::NullsLa, + 739 => SyntaxKind::WithLa, + 740 => SyntaxKind::ModeTypeName, + 741 => SyntaxKind::ModePlpgsqlExpr, + 742 => SyntaxKind::ModePlpgsqlAssign1, + 743 => SyntaxKind::ModePlpgsqlAssign2, + 744 => SyntaxKind::ModePlpgsqlAssign3, + 745 => SyntaxKind::Uminus, + _ => { + ::core::panicking::panic_fmt(format_args!("Unknown token")); + } + } + } + } +} diff --git a/libpg_query b/libpg_query new file mode 160000 index 00000000..9b21e329 --- /dev/null +++ b/libpg_query @@ -0,0 +1 @@ +Subproject commit 9b21e3295402a0d0ee9a50c468d426c2dbb73ee6