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