diff --git a/Cargo.lock b/Cargo.lock index c3987381..0a3f40f2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -182,29 +182,6 @@ version = "1.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06" -[[package]] -name = "bindgen" -version = "0.66.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2b84e06fc203107bfbad243f4aba2af864eb7db3b1cf46ea0a023b0b433d2a7" -dependencies = [ - "bitflags 2.9.3", - "cexpr", - "clang-sys", - "lazy_static", - "lazycell", - "log", - "peeking_take_while", - "prettyplease", - "proc-macro2", - "quote", - "regex", - "rustc-hash 1.1.0", - "shlex", - "syn 2.0.106", - "which", -] - [[package]] name = "bitflags" version = "1.3.2" @@ -280,15 +257,6 @@ dependencies = [ "shlex", ] -[[package]] -name = "cexpr" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" -dependencies = [ - "nom", -] - [[package]] name = "cfg-if" version = "1.0.3" @@ -301,17 +269,6 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" -[[package]] -name = "clang-sys" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4" -dependencies = [ - "glob", - "libc", - "libloading", -] - [[package]] name = "clap" version = "4.5.46" @@ -769,12 +726,6 @@ version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" -[[package]] -name = "fixedbitset" -version = "0.5.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d674e81391d1e1ab681a28d99df07927c6d4aa5b027d7da16ba32d1d21ecd99" - [[package]] name = "fnv" version = "1.0.7" @@ -811,12 +762,6 @@ dependencies = [ "percent-encoding", ] -[[package]] -name = "fs_extra" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" - [[package]] name = "futures-channel" version = "0.3.31" @@ -997,15 +942,6 @@ dependencies = [ "digest", ] -[[package]] -name = "home" -version = "0.5.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589533453244b0995c858700322199b2becb13b627df2851f64a2775d024abcf" -dependencies = [ - "windows-sys 0.59.0", -] - [[package]] name = "html-escape" version = "0.2.13" @@ -1255,15 +1191,6 @@ version = "1.70.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" -[[package]] -name = "itertools" -version = "0.10.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" -dependencies = [ - "either", -] - [[package]] name = "itertools" version = "0.14.0" @@ -1333,28 +1260,12 @@ dependencies = [ "spin", ] -[[package]] -name = "lazycell" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" - [[package]] name = "libc" version = "0.2.175" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a82ae493e598baaea5209805c49bbf2ea7de956d50d7da0da1164f9c6d28543" -[[package]] -name = "libloading" -version = "0.8.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07033963ba89ebaf1584d767badaa2e8fcec21aedea6b8c0346d487d49c28667" -dependencies = [ - "cfg-if", - "windows-targets 0.53.3", -] - [[package]] name = "libm" version = "0.2.16" @@ -1371,12 +1282,6 @@ dependencies = [ "text-size", ] -[[package]] -name = "linux-raw-sys" -version = "0.4.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" - [[package]] name = "linux-raw-sys" version = "0.9.4" @@ -1461,12 +1366,6 @@ dependencies = [ "walkdir", ] -[[package]] -name = "minimal-lexical" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" - [[package]] name = "miniz_oxide" version = "0.8.9" @@ -1487,12 +1386,6 @@ dependencies = [ "windows-sys 0.59.0", ] -[[package]] -name = "multimap" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d87ecb2933e8aeadb3e3a02b828fed80a7528047e68b4f424523a0981a3a084" - [[package]] name = "native-tls" version = "0.2.14" @@ -1516,16 +1409,6 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2bf50223579dc7cdcfb3bfcacf7069ff68243f8c363f62ffa99cf000a6b9c451" -[[package]] -name = "nom" -version = "7.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" -dependencies = [ - "memchr", - "minimal-lexical", -] - [[package]] name = "normalize-line-endings" version = "0.3.0" @@ -1761,12 +1644,6 @@ dependencies = [ "windows-link 0.2.1", ] -[[package]] -name = "peeking_take_while" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099" - [[package]] name = "pem" version = "3.0.5" @@ -1792,34 +1669,6 @@ version = "2.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" -[[package]] -name = "petgraph" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3672b37090dbd86368a4145bc067582552b29c27377cad4e0a306c97f9bd7772" -dependencies = [ - "fixedbitset", - "indexmap", -] - -[[package]] -name = "pg_query" -version = "6.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ca6fdb8f9d32182abf17328789f87f305dd8c8ce5bf48c5aa2b5cffc94e1c04" -dependencies = [ - "bindgen", - "cc", - "fs_extra", - "glob", - "itertools 0.10.5", - "prost", - "prost-build", - "serde", - "serde_json", - "thiserror 1.0.69", -] - [[package]] name = "pin-project-lite" version = "0.2.16" @@ -1889,16 +1738,6 @@ dependencies = [ "zerocopy", ] -[[package]] -name = "prettyplease" -version = "0.2.37" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" -dependencies = [ - "proc-macro2", - "syn 2.0.106", -] - [[package]] name = "primeorder" version = "0.13.6" @@ -1939,58 +1778,6 @@ dependencies = [ "unicode-ident", ] -[[package]] -name = "prost" -version = "0.13.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2796faa41db3ec313a31f7624d9286acf277b52de526150b7e69f3debf891ee5" -dependencies = [ - "bytes", - "prost-derive", -] - -[[package]] -name = "prost-build" -version = "0.13.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be769465445e8c1474e9c5dac2018218498557af32d9ed057325ec9a41ae81bf" -dependencies = [ - "heck 0.5.0", - "itertools 0.14.0", - "log", - "multimap", - "once_cell", - "petgraph", - "prettyplease", - "prost", - "prost-types", - "regex", - "syn 2.0.106", - "tempfile", -] - -[[package]] -name = "prost-derive" -version = "0.13.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a56d757972c98b346a9b766e3f02746cde6dd1cd1d1d563472929fdd74bec4d" -dependencies = [ - "anyhow", - "itertools 0.14.0", - "proc-macro2", - "quote", - "syn 2.0.106", -] - -[[package]] -name = "prost-types" -version = "0.13.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52c2c1bf36ddb1a1c396b3601a3cec27c2462e45f07c386894ec3ccf5332bd16" -dependencies = [ - "prost", -] - [[package]] name = "quote" version = "1.0.40" @@ -2204,19 +1991,6 @@ dependencies = [ "semver", ] -[[package]] -name = "rustix" -version = "0.38.44" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" -dependencies = [ - "bitflags 2.9.3", - "errno", - "libc", - "linux-raw-sys 0.4.15", - "windows-sys 0.59.0", -] - [[package]] name = "rustix" version = "1.0.8" @@ -2226,7 +2000,7 @@ dependencies = [ "bitflags 2.9.3", "errno", "libc", - "linux-raw-sys 0.9.4", + "linux-raw-sys", "windows-sys 0.60.2", ] @@ -2487,7 +2261,7 @@ checksum = "297f631f50729c8c99b84667867963997ec0b50f32b2a7dbcab828ef0541e8bb" dependencies = [ "num-bigint", "num-traits", - "thiserror 2.0.16", + "thiserror", "time", ] @@ -2622,7 +2396,7 @@ name = "squawk-fmt" version = "2.44.0" dependencies = [ "insta", - "itertools 0.14.0", + "itertools", "squawk-syntax", "tiny_pretty", ] @@ -2645,7 +2419,7 @@ dependencies = [ "annotate-snippets", "etcetera", "insta", - "itertools 0.14.0", + "itertools", "la-arena", "line-index", "log", @@ -2691,7 +2465,6 @@ dependencies = [ "dir-test", "drop_bomb", "insta", - "pg_query", "squawk-lexer", "xshell", ] @@ -2875,7 +2648,7 @@ dependencies = [ "fastrand", "getrandom 0.3.3", "once_cell", - "rustix 1.0.8", + "rustix", "windows-sys 0.60.2", ] @@ -2919,33 +2692,13 @@ version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "144f754d318415ac792f9d69fc87abbbfc043ce2ef041c60f16ad828f638717d" -[[package]] -name = "thiserror" -version = "1.0.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" -dependencies = [ - "thiserror-impl 1.0.69", -] - [[package]] name = "thiserror" version = "2.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3467d614147380f2e4e374161426ff399c91084acd2363eaf549172b3d5e60c0" dependencies = [ - "thiserror-impl 2.0.16", -] - -[[package]] -name = "thiserror-impl" -version = "1.0.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.106", + "thiserror-impl", ] [[package]] @@ -3329,18 +3082,6 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "which" -version = "4.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7" -dependencies = [ - "either", - "home", - "once_cell", - "rustix 0.38.44", -] - [[package]] name = "winapi" version = "0.3.9" diff --git a/Cargo.toml b/Cargo.toml index ea46e046..03dfccb0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -35,7 +35,6 @@ toml = "0.5.9" dir-test = "0.4" drop_bomb = "0.1.5" camino = "1.1.9" -pg_query = "6.1.0" rowan = "0.15.15" salsa = "0.26.0" smol_str = "0.3.2" diff --git a/crates/squawk_parser/Cargo.toml b/crates/squawk_parser/Cargo.toml index d5938943..ab68b341 100644 --- a/crates/squawk_parser/Cargo.toml +++ b/crates/squawk_parser/Cargo.toml @@ -22,7 +22,6 @@ drop_bomb.workspace = true insta.workspace = true dir-test.workspace = true camino.workspace = true -pg_query.workspace = true xshell.workspace = true annotate-snippets.workspace = true diff --git a/crates/squawk_parser/tests/data/ok/alter_table.sql b/crates/squawk_parser/tests/data/ok/alter_table.sql index 7e275fa3..c01b7985 100644 --- a/crates/squawk_parser/tests/data/ok/alter_table.sql +++ b/crates/squawk_parser/tests/data/ok/alter_table.sql @@ -269,3 +269,10 @@ alter table t detach partition f finalize; alter table foo add constraint foo_bar_id_fkey foreign key (bar_id) references bar (id) on update cascade on delete cascade; + + +alter table t alter c set expression as ( a > b ); + +alter table t set access method default; + +alter table t add foreign key (a, b) references t1 match partial; diff --git a/crates/squawk_parser/tests/data/ok/alter_table_pg17.sql b/crates/squawk_parser/tests/data/ok/alter_table_pg17.sql deleted file mode 100644 index 257b3b72..00000000 --- a/crates/squawk_parser/tests/data/ok/alter_table_pg17.sql +++ /dev/null @@ -1,6 +0,0 @@ - -alter table t alter c set expression as ( a > b ); - -alter table t set access method default; - -alter table t add foreign key (a, b) references t1 match partial; diff --git a/crates/squawk_parser/tests/data/ok/create_foreign_table.sql b/crates/squawk_parser/tests/data/ok/create_foreign_table.sql index 0cfa4706..43fac4eb 100644 --- a/crates/squawk_parser/tests/data/ok/create_foreign_table.sql +++ b/crates/squawk_parser/tests/data/ok/create_foreign_table.sql @@ -71,3 +71,19 @@ create foreign table cal.event_types ( options ( object 'event-types' ); + +-- like clause is >=pg18 +create foreign table u ( + like t +) server s; + +-- like clause is >=pg18 +create foreign table remote_users ( + like local_users + including defaults + including constraints + excluding generated + excluding statistics + excluding all +) server remote_server; + diff --git a/crates/squawk_parser/tests/data/ok/create_foreign_table_pg18.sql b/crates/squawk_parser/tests/data/ok/create_foreign_table_pg18.sql deleted file mode 100644 index 540d6582..00000000 --- a/crates/squawk_parser/tests/data/ok/create_foreign_table_pg18.sql +++ /dev/null @@ -1,15 +0,0 @@ --- like clause is >=pg18 -create foreign table u ( - like t -) server s; - --- like clause is >=pg18 -create foreign table remote_users ( - like local_users - including defaults - including constraints - excluding generated - excluding statistics - excluding all -) server remote_server; - diff --git a/crates/squawk_parser/tests/data/ok/create_table.sql b/crates/squawk_parser/tests/data/ok/create_table.sql index 5f11e8ae..c2749e92 100644 --- a/crates/squawk_parser/tests/data/ok/create_table.sql +++ b/crates/squawk_parser/tests/data/ok/create_table.sql @@ -355,3 +355,46 @@ create table t ( create table operator ( x int ); + +-- match partial not implemented yet +create table t ( + a int, + b int references foo.bar ( bar ) match partial + on delete no action + on update set null ( a, b ) +); + + +-- temporal_foreign_key +CREATE TABLE orders ( + id int8 generated BY DEFAULT AS IDENTITY, + address_id int8 NOT NULL, + address_valid_at tstzrange NOT NULL, + content text, + CONSTRAINT order_address FOREIGN KEY ( address_id, PERIOD address_valid_at ) REFERENCES addresses ( id, PERIOD valid_range ) +); + +-- unique_constraint_without_overlaps +create table t ( + a int, + b text, + unique (a without overlaps) +); + + +-- primary key without overlaps +create table t ( + a text, + b text, + c text, + constraint pk + primary key (a, b, c without overlaps) +); + +-- temporal_primary_key +CREATE TABLE addresses ( + id int8 generated BY DEFAULT AS IDENTITY, + valid_range tstzrange NOT NULL DEFAULT tstzrange(now(), 'infinity', '[)'), + recipient text NOT NULL, + PRIMARY KEY (id, valid_range WITHOUT OVERLAPS) +); diff --git a/crates/squawk_parser/tests/data/ok/create_table_pg17.sql b/crates/squawk_parser/tests/data/ok/create_table_pg17.sql deleted file mode 100644 index d6a847db..00000000 --- a/crates/squawk_parser/tests/data/ok/create_table_pg17.sql +++ /dev/null @@ -1,42 +0,0 @@ --- match partial not implemented yet -create table t ( - a int, - b int references foo.bar ( bar ) match partial - on delete no action - on update set null ( a, b ) -); - - --- temporal_foreign_key -CREATE TABLE orders ( - id int8 generated BY DEFAULT AS IDENTITY, - address_id int8 NOT NULL, - address_valid_at tstzrange NOT NULL, - content text, - CONSTRAINT order_address FOREIGN KEY ( address_id, PERIOD address_valid_at ) REFERENCES addresses ( id, PERIOD valid_range ) -); - --- unique_constraint_without_overlaps -create table t ( - a int, - b text, - unique (a without overlaps) -); - - --- primary key without overlaps -create table t ( - a text, - b text, - c text, - constraint pk - primary key (a, b, c without overlaps) -); - --- temporal_primary_key -CREATE TABLE addresses ( - id int8 generated BY DEFAULT AS IDENTITY, - valid_range tstzrange NOT NULL DEFAULT tstzrange(now(), 'infinity', '[)'), - recipient text NOT NULL, - PRIMARY KEY (id, valid_range WITHOUT OVERLAPS) -); diff --git a/crates/squawk_parser/tests/data/ok/insert.sql b/crates/squawk_parser/tests/data/ok/insert.sql index 94169cae..8e4628b9 100644 --- a/crates/squawk_parser/tests/data/ok/insert.sql +++ b/crates/squawk_parser/tests/data/ok/insert.sql @@ -119,3 +119,7 @@ select * from u join i on conflict = conflict on conflict on constraint temporal_rng_pk do nothing; + +-- on conflict do select +INSERT INTO t (a) VALUES (1) + ON CONFLICT (a) DO SELECT FOR UPDATE WHERE a > 0 RETURNING *; diff --git a/crates/squawk_parser/tests/data/ok/insert_pg18.sql b/crates/squawk_parser/tests/data/ok/insert_pg18.sql deleted file mode 100644 index 7c3f7bc8..00000000 --- a/crates/squawk_parser/tests/data/ok/insert_pg18.sql +++ /dev/null @@ -1,3 +0,0 @@ --- on conflict do select -INSERT INTO t (a) VALUES (1) - ON CONFLICT (a) DO SELECT FOR UPDATE WHERE a > 0 RETURNING *; diff --git a/crates/squawk_parser/tests/data/ok/merge.sql b/crates/squawk_parser/tests/data/ok/merge.sql index 3d7ca328..da448883 100644 --- a/crates/squawk_parser/tests/data/ok/merge.sql +++ b/crates/squawk_parser/tests/data/ok/merge.sql @@ -67,3 +67,165 @@ merge into t do nothing when matched then do nothing; + + +-- when_clauses_all +merge into t + using u + on t.id = u.id + when not matched then + do nothing + when matched then + do nothing + when not matched by source then + do nothing; + +-- when_clauses_all_with_conditions +merge into t + using u on true + when matched and foo = bar then + do nothing + when not matched by source and bar = foo then + do nothing + when not matched and buzz = bar then + do nothing; + +-- returning_all +merge into t + using u + on t.id = u.id + when not matched then + do nothing + when matched then + do nothing + when not matched by source then + do nothing + returning *; + +-- returning_many +merge into t + using u + on t.id = u.id + when not matched then + do nothing + when matched then + do nothing + when not matched by source then + do nothing + returning *, u as bar, t b, merge_action(), t.*; + +-- merge_insert_simple +merge into t + using u + on t.id = u.id + when not matched then + insert + default values; + +-- merge_insert_default +merge into t + using u + on t.id = u.id + when not matched then + insert (a, b, c) + overriding user value + default values; + +-- merge_insert_values +merge into t + using u + on t.id = u.id + when not matched then + insert + overriding system value + values (1, 2, default, 3, 10 * 10 + 2); + +-- merge_update +merge into t + using u + on t.id = u.id + when matched then + update set + a = default, + b = 1, + c = d, + e = (select 1), + f = row(1, 2, default), + g = (1, 2, default), + h = (default) + when not matched by source then + update set foo = bar; + +-- merge_delete +merge into t + using u + on t.id = u.id + when matched then + delete + when not matched by source then + delete; + +-- with_select +with t as (select 1, 2, 3) +merge into u + using t + on t.id = u.id + when matched then + do nothing; + +-- doc_example_1 +MERGE INTO customer_account ca +USING recent_transactions t +ON t.customer_id = ca.customer_id +WHEN MATCHED THEN + UPDATE SET balance = balance + transaction_value +WHEN NOT MATCHED THEN + INSERT (customer_id, balance) + VALUES (t.customer_id, t.transaction_value); + +-- doc_example_2 +MERGE INTO customer_account ca +USING (SELECT customer_id, transaction_value FROM recent_transactions) AS t +ON t.customer_id = ca.customer_id +WHEN MATCHED THEN + UPDATE SET balance = balance + transaction_value +WHEN NOT MATCHED THEN + INSERT (customer_id, balance) + VALUES (t.customer_id, t.transaction_value); + +-- doc_example_3 +MERGE INTO wines w +USING wine_stock_changes s +ON s.winename = w.winename +WHEN NOT MATCHED AND s.stock_delta > 0 THEN + INSERT VALUES(s.winename, s.stock_delta) +WHEN MATCHED AND w.stock + s.stock_delta > 0 THEN + UPDATE SET stock = w.stock + s.stock_delta +WHEN MATCHED THEN + DELETE +RETURNING merge_action(), w.*; + +-- doc_example_4 +MERGE INTO wines w +USING new_wine_list s +ON s.winename = w.winename +WHEN NOT MATCHED BY TARGET THEN + INSERT VALUES(s.winename, s.stock) +WHEN MATCHED AND w.stock != s.stock THEN + UPDATE SET stock = s.stock +WHEN NOT MATCHED BY SOURCE THEN + DELETE; + +-- cross_join_data_source +merge into t + using u cross join v + on t.id = u.id + when matched then + do nothing; + +-- natural join +merge into t + using u natural join v + on t.id = u.id + when matched then + do nothing; diff --git a/crates/squawk_parser/tests/data/ok/merge_pg17.sql b/crates/squawk_parser/tests/data/ok/merge_pg17.sql deleted file mode 100644 index 812fa397..00000000 --- a/crates/squawk_parser/tests/data/ok/merge_pg17.sql +++ /dev/null @@ -1,161 +0,0 @@ - --- when_clauses_all -merge into t - using u - on t.id = u.id - when not matched then - do nothing - when matched then - do nothing - when not matched by source then - do nothing; - --- when_clauses_all_with_conditions -merge into t - using u on true - when matched and foo = bar then - do nothing - when not matched by source and bar = foo then - do nothing - when not matched and buzz = bar then - do nothing; - --- returning_all -merge into t - using u - on t.id = u.id - when not matched then - do nothing - when matched then - do nothing - when not matched by source then - do nothing - returning *; - --- returning_many -merge into t - using u - on t.id = u.id - when not matched then - do nothing - when matched then - do nothing - when not matched by source then - do nothing - returning *, u as bar, t b, merge_action(), t.*; - --- merge_insert_simple -merge into t - using u - on t.id = u.id - when not matched then - insert - default values; - --- merge_insert_default -merge into t - using u - on t.id = u.id - when not matched then - insert (a, b, c) - overriding user value - default values; - --- merge_insert_values -merge into t - using u - on t.id = u.id - when not matched then - insert - overriding system value - values (1, 2, default, 3, 10 * 10 + 2); - --- merge_update -merge into t - using u - on t.id = u.id - when matched then - update set - a = default, - b = 1, - c = d, - e = (select 1), - f = row(1, 2, default), - g = (1, 2, default), - h = (default) - when not matched by source then - update set foo = bar; - --- merge_delete -merge into t - using u - on t.id = u.id - when matched then - delete - when not matched by source then - delete; - --- with_select -with t as (select 1, 2, 3) -merge into u - using t - on t.id = u.id - when matched then - do nothing; - --- doc_example_1 -MERGE INTO customer_account ca -USING recent_transactions t -ON t.customer_id = ca.customer_id -WHEN MATCHED THEN - UPDATE SET balance = balance + transaction_value -WHEN NOT MATCHED THEN - INSERT (customer_id, balance) - VALUES (t.customer_id, t.transaction_value); - --- doc_example_2 -MERGE INTO customer_account ca -USING (SELECT customer_id, transaction_value FROM recent_transactions) AS t -ON t.customer_id = ca.customer_id -WHEN MATCHED THEN - UPDATE SET balance = balance + transaction_value -WHEN NOT MATCHED THEN - INSERT (customer_id, balance) - VALUES (t.customer_id, t.transaction_value); - --- doc_example_3 -MERGE INTO wines w -USING wine_stock_changes s -ON s.winename = w.winename -WHEN NOT MATCHED AND s.stock_delta > 0 THEN - INSERT VALUES(s.winename, s.stock_delta) -WHEN MATCHED AND w.stock + s.stock_delta > 0 THEN - UPDATE SET stock = w.stock + s.stock_delta -WHEN MATCHED THEN - DELETE -RETURNING merge_action(), w.*; - --- doc_example_4 -MERGE INTO wines w -USING new_wine_list s -ON s.winename = w.winename -WHEN NOT MATCHED BY TARGET THEN - INSERT VALUES(s.winename, s.stock) -WHEN MATCHED AND w.stock != s.stock THEN - UPDATE SET stock = s.stock -WHEN NOT MATCHED BY SOURCE THEN - DELETE; - --- cross_join_data_source -merge into t - using u cross join v - on t.id = u.id - when matched then - do nothing; - --- natural join -merge into t - using u natural join v - on t.id = u.id - when matched then - do nothing; diff --git a/crates/squawk_parser/tests/data/ok/schemas.sql b/crates/squawk_parser/tests/data/ok/schemas.sql index a9079f07..98040ae4 100644 --- a/crates/squawk_parser/tests/data/ok/schemas.sql +++ b/crates/squawk_parser/tests/data/ok/schemas.sql @@ -76,3 +76,5 @@ select operator(-) 4; select operator(a.b.-) 4; + +set catalog 'foo'; diff --git a/crates/squawk_parser/tests/data/ok/schemas_pg17.sql b/crates/squawk_parser/tests/data/ok/schemas_pg17.sql deleted file mode 100644 index 902fb421..00000000 --- a/crates/squawk_parser/tests/data/ok/schemas_pg17.sql +++ /dev/null @@ -1 +0,0 @@ -set catalog 'foo'; diff --git a/crates/squawk_parser/tests/data/ok/select_casts.sql b/crates/squawk_parser/tests/data/ok/select_casts.sql index 644ec00a..fddbeb72 100644 --- a/crates/squawk_parser/tests/data/ok/select_casts.sql +++ b/crates/squawk_parser/tests/data/ok/select_casts.sql @@ -278,3 +278,5 @@ select boolean 'false'; select foo.bar '100'; select foo.bar(10, 2) '100'; select pg_catalog.varchar(100) '{123}'; + +select foo[10].bar(10, 2) '100'; diff --git a/crates/squawk_parser/tests/data/ok/select_casts_pg17.sql b/crates/squawk_parser/tests/data/ok/select_casts_pg17.sql deleted file mode 100644 index 8a24dae6..00000000 --- a/crates/squawk_parser/tests/data/ok/select_casts_pg17.sql +++ /dev/null @@ -1 +0,0 @@ -select foo[10].bar(10, 2) '100'; diff --git a/crates/squawk_parser/tests/data/ok/select_cte.sql b/crates/squawk_parser/tests/data/ok/select_cte.sql index 8f4f3982..826d5102 100644 --- a/crates/squawk_parser/tests/data/ok/select_cte.sql +++ b/crates/squawk_parser/tests/data/ok/select_cte.sql @@ -137,3 +137,9 @@ WHERE notification_id IN ( -- paren select cte with t as (select 1) (select 1); + +-- group by all +with x as ( + select * from t group by all +) +select * from x; diff --git a/crates/squawk_parser/tests/data/ok/select_cte_pg19.sql b/crates/squawk_parser/tests/data/ok/select_cte_pg19.sql deleted file mode 100644 index d5ed3a86..00000000 --- a/crates/squawk_parser/tests/data/ok/select_cte_pg19.sql +++ /dev/null @@ -1,5 +0,0 @@ --- group by all -with x as ( - select * from t group by all -) -select * from x; diff --git a/crates/squawk_parser/tests/data/ok/select_funcs.sql b/crates/squawk_parser/tests/data/ok/select_funcs.sql index b2c74146..66381d74 100644 --- a/crates/squawk_parser/tests/data/ok/select_funcs.sql +++ b/crates/squawk_parser/tests/data/ok/select_funcs.sql @@ -253,3 +253,114 @@ select max(a) over w_name from t; -- window clause select * from t window owner as (order by a), w2 as (order by b); -- ^^^^^ make sure we allow using keywords + + +-- json_table +SELECT jt.* FROM + my_films, + JSON_TABLE (js, '$.favorites[*]' COLUMNS ( + id FOR ORDINALITY, + kind text PATH '$.kind', + title text PATH '$.films[*].title' WITH WRAPPER, + director text PATH '$.films[*].director' WITH WRAPPER)) AS jt; + +-- json_table_nested_path +SELECT jt.* FROM + my_films, + JSON_TABLE ( js, '$.favorites[*] ? (@.films[*].director == $filter)' + PASSING 'Alfred Hitchcock' AS filter + COLUMNS ( + id FOR ORDINALITY, + kind text PATH '$.kind', + NESTED PATH '$.films[*]' COLUMNS ( + title text FORMAT JSON PATH '$.title' OMIT QUOTES, + director text PATH '$.director' KEEP QUOTES))) AS jt; + +-- json_table_without_filter +SELECT jt.* FROM + my_films, + JSON_TABLE ( js, '$.favorites[*]' + COLUMNS ( + id FOR ORDINALITY, + kind text PATH '$.kind', + NESTED PATH '$.films[*]' COLUMNS ( + title text FORMAT JSON PATH '$.title' OMIT QUOTES, + director text PATH '$.director' KEEP QUOTES))) AS jt; + +-- json_table_union +SELECT * FROM JSON_TABLE ( +'{"favorites": + {"movies": + [{"name": "One", "director": "John Doe"}, + {"name": "Two", "director": "Don Joe"}], + "books": + [{"name": "Mystery", "authors": [{"name": "Brown Dan"}]}, + {"name": "Wonder", "authors": [{"name": "Jun Murakami"}, {"name":"Craig Doe"}]}] +}}'::json, '$.favorites[*]' +COLUMNS ( + user_id FOR ORDINALITY, + NESTED '$.movies[*]' + COLUMNS ( + movie_id FOR ORDINALITY, + mname text PATH '$.name', + director text), + NESTED '$.books[*]' + COLUMNS ( + book_id FOR ORDINALITY, + bname text PATH '$.name', + NESTED '$.authors[*]' + COLUMNS ( + author_id FOR ORDINALITY, + author_name text PATH '$.name')))); + +-- json +select json(a format json); +select json(a format json with unique keys); +select json(a format json with unique); +select json(a format json without unique keys); +select json(a format json without unique); + +-- json_serialize +select json_serialize(a); +select json_serialize(a format json); +select json_serialize(a returning foo); +select json_serialize(a format json returning foo format json); + +-- json_query +select json_query(a, b with wrapper); +select json_query( + a format json, + b passing c as foo, + d as bar + returning text + format json + with unconditional array wrapper + keep quotes on scalar string + unknown on empty + empty array on error +); + + +-- json_exists +select json_exists(a, b); +select json_exists( + a format json, + b passing c as d + default z on error +); + +-- doc examples +select JSON_EXISTS(jsonb '{"key1": [1,2,3]}', 'strict $.key1[*] ? (@ > $x)' PASSING 2 AS x); +select JSON_EXISTS(jsonb '{"a": [1,2,3]}', 'lax $.a[5]' ERROR ON ERROR); +select JSON_EXISTS(jsonb '{"a": [1,2,3]}', 'strict $.a[5]' ERROR ON ERROR); + +-- json_value +select json_value(a, b); +select json_value( + a format json, + b passing c as d + returning foo format json + unknown on empty + default z on error +); + diff --git a/crates/squawk_parser/tests/data/ok/select_funcs_pg17.sql b/crates/squawk_parser/tests/data/ok/select_funcs_pg17.sql deleted file mode 100644 index d5b63315..00000000 --- a/crates/squawk_parser/tests/data/ok/select_funcs_pg17.sql +++ /dev/null @@ -1,110 +0,0 @@ - --- json_table -SELECT jt.* FROM - my_films, - JSON_TABLE (js, '$.favorites[*]' COLUMNS ( - id FOR ORDINALITY, - kind text PATH '$.kind', - title text PATH '$.films[*].title' WITH WRAPPER, - director text PATH '$.films[*].director' WITH WRAPPER)) AS jt; - --- json_table_nested_path -SELECT jt.* FROM - my_films, - JSON_TABLE ( js, '$.favorites[*] ? (@.films[*].director == $filter)' - PASSING 'Alfred Hitchcock' AS filter - COLUMNS ( - id FOR ORDINALITY, - kind text PATH '$.kind', - NESTED PATH '$.films[*]' COLUMNS ( - title text FORMAT JSON PATH '$.title' OMIT QUOTES, - director text PATH '$.director' KEEP QUOTES))) AS jt; - --- json_table_without_filter -SELECT jt.* FROM - my_films, - JSON_TABLE ( js, '$.favorites[*]' - COLUMNS ( - id FOR ORDINALITY, - kind text PATH '$.kind', - NESTED PATH '$.films[*]' COLUMNS ( - title text FORMAT JSON PATH '$.title' OMIT QUOTES, - director text PATH '$.director' KEEP QUOTES))) AS jt; - --- json_table_union -SELECT * FROM JSON_TABLE ( -'{"favorites": - {"movies": - [{"name": "One", "director": "John Doe"}, - {"name": "Two", "director": "Don Joe"}], - "books": - [{"name": "Mystery", "authors": [{"name": "Brown Dan"}]}, - {"name": "Wonder", "authors": [{"name": "Jun Murakami"}, {"name":"Craig Doe"}]}] -}}'::json, '$.favorites[*]' -COLUMNS ( - user_id FOR ORDINALITY, - NESTED '$.movies[*]' - COLUMNS ( - movie_id FOR ORDINALITY, - mname text PATH '$.name', - director text), - NESTED '$.books[*]' - COLUMNS ( - book_id FOR ORDINALITY, - bname text PATH '$.name', - NESTED '$.authors[*]' - COLUMNS ( - author_id FOR ORDINALITY, - author_name text PATH '$.name')))); - --- json -select json(a format json); -select json(a format json with unique keys); -select json(a format json with unique); -select json(a format json without unique keys); -select json(a format json without unique); - --- json_serialize -select json_serialize(a); -select json_serialize(a format json); -select json_serialize(a returning foo); -select json_serialize(a format json returning foo format json); - --- json_query -select json_query(a, b with wrapper); -select json_query( - a format json, - b passing c as foo, - d as bar - returning text - format json - with unconditional array wrapper - keep quotes on scalar string - unknown on empty - empty array on error -); - - --- json_exists -select json_exists(a, b); -select json_exists( - a format json, - b passing c as d - default z on error -); - --- doc examples -select JSON_EXISTS(jsonb '{"key1": [1,2,3]}', 'strict $.key1[*] ? (@ > $x)' PASSING 2 AS x); -select JSON_EXISTS(jsonb '{"a": [1,2,3]}', 'lax $.a[5]' ERROR ON ERROR); -select JSON_EXISTS(jsonb '{"a": [1,2,3]}', 'strict $.a[5]' ERROR ON ERROR); - --- json_value -select json_value(a, b); -select json_value( - a format json, - b passing c as d - returning foo format json - unknown on empty - default z on error -); - diff --git a/crates/squawk_parser/tests/data/ok/update.sql b/crates/squawk_parser/tests/data/ok/update.sql index 6f6bddb9..75109426 100644 --- a/crates/squawk_parser/tests/data/ok/update.sql +++ b/crates/squawk_parser/tests/data/ok/update.sql @@ -89,3 +89,15 @@ UPDATE work_item SET status = 'failed' FROM exceeded_max_retries AS emr WHERE work_item.ctid = emr.ctid; + +-- returning_with_old_new +UPDATE inventory +SET quantity = quantity - 5 +WHERE product_id = 456 +RETURNING WITH (OLD AS before, NEW AS after) + before.quantity AS previous_quantity, + after.quantity AS current_quantity, + after.quantity - before.quantity AS change; + +update t set x = 1 +returning with (old as o, new as n) o.*, n.*; diff --git a/crates/squawk_parser/tests/data/ok/update_pg18.sql b/crates/squawk_parser/tests/data/ok/update_pg18.sql deleted file mode 100644 index 458896ae..00000000 --- a/crates/squawk_parser/tests/data/ok/update_pg18.sql +++ /dev/null @@ -1,11 +0,0 @@ --- returning_with_old_new -UPDATE inventory -SET quantity = quantity - 5 -WHERE product_id = 456 -RETURNING WITH (OLD AS before, NEW AS after) - before.quantity AS previous_quantity, - after.quantity AS current_quantity, - after.quantity - before.quantity AS change; - -update t set x = 1 -returning with (old as o, new as n) o.*, n.*; diff --git a/crates/squawk_parser/tests/snapshots/tests__alter_table_ok.snap b/crates/squawk_parser/tests/snapshots/tests__alter_table_ok.snap index 1c0922df..d814966b 100644 --- a/crates/squawk_parser/tests/snapshots/tests__alter_table_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__alter_table_ok.snap @@ -3925,4 +3925,107 @@ SOURCE_FILE WHITESPACE " " CASCADE_KW "cascade" SEMICOLON ";" + WHITESPACE "\n\n\n" + ALTER_TABLE + ALTER_KW "alter" + WHITESPACE " " + TABLE_KW "table" + WHITESPACE " " + RELATION_NAME + PATH + PATH_SEGMENT + NAME_REF + IDENT "t" + WHITESPACE " " + ALTER_COLUMN + ALTER_KW "alter" + WHITESPACE " " + NAME_REF + IDENT "c" + WHITESPACE " " + SET_EXPRESSION + SET_KW "set" + WHITESPACE " " + EXPRESSION_KW "expression" + WHITESPACE " " + AS_KW "as" + WHITESPACE " " + L_PAREN "(" + WHITESPACE " " + BIN_EXPR + NAME_REF + IDENT "a" + WHITESPACE " " + R_ANGLE ">" + WHITESPACE " " + NAME_REF + IDENT "b" + WHITESPACE " " + R_PAREN ")" + SEMICOLON ";" + WHITESPACE "\n\n" + ALTER_TABLE + ALTER_KW "alter" + WHITESPACE " " + TABLE_KW "table" + WHITESPACE " " + RELATION_NAME + PATH + PATH_SEGMENT + NAME_REF + IDENT "t" + WHITESPACE " " + SET_ACCESS_METHOD + SET_KW "set" + WHITESPACE " " + ACCESS_KW "access" + WHITESPACE " " + METHOD_KW "method" + WHITESPACE " " + DEFAULT_KW "default" + SEMICOLON ";" + WHITESPACE "\n\n" + ALTER_TABLE + ALTER_KW "alter" + WHITESPACE " " + TABLE_KW "table" + WHITESPACE " " + RELATION_NAME + PATH + PATH_SEGMENT + NAME_REF + IDENT "t" + WHITESPACE " " + ADD_CONSTRAINT + ADD_KW "add" + WHITESPACE " " + FOREIGN_KEY_CONSTRAINT + FOREIGN_KW "foreign" + WHITESPACE " " + KEY_KW "key" + WHITESPACE " " + COLUMN_LIST + L_PAREN "(" + COLUMN + NAME_REF + IDENT "a" + COMMA "," + WHITESPACE " " + COLUMN + NAME_REF + IDENT "b" + R_PAREN ")" + WHITESPACE " " + REFERENCES_KW "references" + WHITESPACE " " + PATH + PATH_SEGMENT + NAME_REF + IDENT "t1" + WHITESPACE " " + MATCH_PARTIAL + MATCH_KW "match" + WHITESPACE " " + PARTIAL_KW "partial" + SEMICOLON ";" WHITESPACE "\n" diff --git a/crates/squawk_parser/tests/snapshots/tests__alter_table_pg17_ok.snap b/crates/squawk_parser/tests/snapshots/tests__alter_table_pg17_ok.snap deleted file mode 100644 index 08f3cab7..00000000 --- a/crates/squawk_parser/tests/snapshots/tests__alter_table_pg17_ok.snap +++ /dev/null @@ -1,109 +0,0 @@ ---- -source: crates/squawk_parser/tests/tests.rs -input_file: crates/squawk_parser/tests/data/ok/alter_table_pg17.sql ---- -SOURCE_FILE - WHITESPACE "\n" - ALTER_TABLE - ALTER_KW "alter" - WHITESPACE " " - TABLE_KW "table" - WHITESPACE " " - RELATION_NAME - PATH - PATH_SEGMENT - NAME_REF - IDENT "t" - WHITESPACE " " - ALTER_COLUMN - ALTER_KW "alter" - WHITESPACE " " - NAME_REF - IDENT "c" - WHITESPACE " " - SET_EXPRESSION - SET_KW "set" - WHITESPACE " " - EXPRESSION_KW "expression" - WHITESPACE " " - AS_KW "as" - WHITESPACE " " - L_PAREN "(" - WHITESPACE " " - BIN_EXPR - NAME_REF - IDENT "a" - WHITESPACE " " - R_ANGLE ">" - WHITESPACE " " - NAME_REF - IDENT "b" - WHITESPACE " " - R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n\n" - ALTER_TABLE - ALTER_KW "alter" - WHITESPACE " " - TABLE_KW "table" - WHITESPACE " " - RELATION_NAME - PATH - PATH_SEGMENT - NAME_REF - IDENT "t" - WHITESPACE " " - SET_ACCESS_METHOD - SET_KW "set" - WHITESPACE " " - ACCESS_KW "access" - WHITESPACE " " - METHOD_KW "method" - WHITESPACE " " - DEFAULT_KW "default" - SEMICOLON ";" - WHITESPACE "\n\n" - ALTER_TABLE - ALTER_KW "alter" - WHITESPACE " " - TABLE_KW "table" - WHITESPACE " " - RELATION_NAME - PATH - PATH_SEGMENT - NAME_REF - IDENT "t" - WHITESPACE " " - ADD_CONSTRAINT - ADD_KW "add" - WHITESPACE " " - FOREIGN_KEY_CONSTRAINT - FOREIGN_KW "foreign" - WHITESPACE " " - KEY_KW "key" - WHITESPACE " " - COLUMN_LIST - L_PAREN "(" - COLUMN - NAME_REF - IDENT "a" - COMMA "," - WHITESPACE " " - COLUMN - NAME_REF - IDENT "b" - R_PAREN ")" - WHITESPACE " " - REFERENCES_KW "references" - WHITESPACE " " - PATH - PATH_SEGMENT - NAME_REF - IDENT "t1" - WHITESPACE " " - MATCH_PARTIAL - MATCH_KW "match" - WHITESPACE " " - PARTIAL_KW "partial" - SEMICOLON ";" - WHITESPACE "\n" diff --git a/crates/squawk_parser/tests/snapshots/tests__create_foreign_table_ok.snap b/crates/squawk_parser/tests/snapshots/tests__create_foreign_table_ok.snap index dba3a546..dea7b7f9 100644 --- a/crates/squawk_parser/tests/snapshots/tests__create_foreign_table_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__create_foreign_table_ok.snap @@ -661,4 +661,97 @@ SOURCE_FILE WHITESPACE "\n " R_PAREN ")" SEMICOLON ";" + WHITESPACE "\n\n" + COMMENT "-- like clause is >=pg18" WHITESPACE "\n" + CREATE_FOREIGN_TABLE + CREATE_KW "create" + WHITESPACE " " + FOREIGN_KW "foreign" + WHITESPACE " " + TABLE_KW "table" + WHITESPACE " " + PATH + PATH_SEGMENT + NAME + IDENT "u" + WHITESPACE " " + TABLE_ARG_LIST + L_PAREN "(" + WHITESPACE "\n " + LIKE_CLAUSE + LIKE_KW "like" + WHITESPACE " " + PATH + PATH_SEGMENT + NAME_REF + IDENT "t" + WHITESPACE "\n" + R_PAREN ")" + WHITESPACE " " + SERVER_NAME + SERVER_KW "server" + WHITESPACE " " + NAME_REF + IDENT "s" + SEMICOLON ";" + WHITESPACE "\n\n" + COMMENT "-- like clause is >=pg18" + WHITESPACE "\n" + CREATE_FOREIGN_TABLE + CREATE_KW "create" + WHITESPACE " " + FOREIGN_KW "foreign" + WHITESPACE " " + TABLE_KW "table" + WHITESPACE " " + PATH + PATH_SEGMENT + NAME + IDENT "remote_users" + WHITESPACE " " + TABLE_ARG_LIST + L_PAREN "(" + WHITESPACE "\n " + LIKE_CLAUSE + LIKE_KW "like" + WHITESPACE " " + PATH + PATH_SEGMENT + NAME_REF + IDENT "local_users" + WHITESPACE "\n " + LIKE_OPTION + INCLUDING_KW "including" + WHITESPACE " " + DEFAULTS_KW "defaults" + WHITESPACE "\n " + LIKE_OPTION + INCLUDING_KW "including" + WHITESPACE " " + CONSTRAINTS_KW "constraints" + WHITESPACE "\n " + LIKE_OPTION + EXCLUDING_KW "excluding" + WHITESPACE " " + GENERATED_KW "generated" + WHITESPACE "\n " + LIKE_OPTION + EXCLUDING_KW "excluding" + WHITESPACE " " + STATISTICS_KW "statistics" + WHITESPACE "\n " + LIKE_OPTION + EXCLUDING_KW "excluding" + WHITESPACE " " + ALL_KW "all" + WHITESPACE "\n" + R_PAREN ")" + WHITESPACE " " + SERVER_NAME + SERVER_KW "server" + WHITESPACE " " + NAME_REF + IDENT "remote_server" + SEMICOLON ";" + WHITESPACE "\n\n" diff --git a/crates/squawk_parser/tests/snapshots/tests__create_foreign_table_pg18_ok.snap b/crates/squawk_parser/tests/snapshots/tests__create_foreign_table_pg18_ok.snap deleted file mode 100644 index 8da7b894..00000000 --- a/crates/squawk_parser/tests/snapshots/tests__create_foreign_table_pg18_ok.snap +++ /dev/null @@ -1,98 +0,0 @@ ---- -source: crates/squawk_parser/tests/tests.rs -input_file: crates/squawk_parser/tests/data/ok/create_foreign_table_pg18.sql ---- -SOURCE_FILE - COMMENT "-- like clause is >=pg18" - WHITESPACE "\n" - CREATE_FOREIGN_TABLE - CREATE_KW "create" - WHITESPACE " " - FOREIGN_KW "foreign" - WHITESPACE " " - TABLE_KW "table" - WHITESPACE " " - PATH - PATH_SEGMENT - NAME - IDENT "u" - WHITESPACE " " - TABLE_ARG_LIST - L_PAREN "(" - WHITESPACE "\n " - LIKE_CLAUSE - LIKE_KW "like" - WHITESPACE " " - PATH - PATH_SEGMENT - NAME_REF - IDENT "t" - WHITESPACE "\n" - R_PAREN ")" - WHITESPACE " " - SERVER_NAME - SERVER_KW "server" - WHITESPACE " " - NAME_REF - IDENT "s" - SEMICOLON ";" - WHITESPACE "\n\n" - COMMENT "-- like clause is >=pg18" - WHITESPACE "\n" - CREATE_FOREIGN_TABLE - CREATE_KW "create" - WHITESPACE " " - FOREIGN_KW "foreign" - WHITESPACE " " - TABLE_KW "table" - WHITESPACE " " - PATH - PATH_SEGMENT - NAME - IDENT "remote_users" - WHITESPACE " " - TABLE_ARG_LIST - L_PAREN "(" - WHITESPACE "\n " - LIKE_CLAUSE - LIKE_KW "like" - WHITESPACE " " - PATH - PATH_SEGMENT - NAME_REF - IDENT "local_users" - WHITESPACE "\n " - LIKE_OPTION - INCLUDING_KW "including" - WHITESPACE " " - DEFAULTS_KW "defaults" - WHITESPACE "\n " - LIKE_OPTION - INCLUDING_KW "including" - WHITESPACE " " - CONSTRAINTS_KW "constraints" - WHITESPACE "\n " - LIKE_OPTION - EXCLUDING_KW "excluding" - WHITESPACE " " - GENERATED_KW "generated" - WHITESPACE "\n " - LIKE_OPTION - EXCLUDING_KW "excluding" - WHITESPACE " " - STATISTICS_KW "statistics" - WHITESPACE "\n " - LIKE_OPTION - EXCLUDING_KW "excluding" - WHITESPACE " " - ALL_KW "all" - WHITESPACE "\n" - R_PAREN ")" - WHITESPACE " " - SERVER_NAME - SERVER_KW "server" - WHITESPACE " " - NAME_REF - IDENT "remote_server" - SEMICOLON ";" - WHITESPACE "\n\n" diff --git a/crates/squawk_parser/tests/snapshots/tests__create_table_ok.snap b/crates/squawk_parser/tests/snapshots/tests__create_table_ok.snap index 36e4b3c9..4431718b 100644 --- a/crates/squawk_parser/tests/snapshots/tests__create_table_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__create_table_ok.snap @@ -3444,4 +3444,489 @@ SOURCE_FILE WHITESPACE "\n" R_PAREN ")" SEMICOLON ";" + WHITESPACE "\n\n" + CREATE_TABLE + COMMENT "-- match partial not implemented yet" + WHITESPACE "\n" + CREATE_KW "create" + WHITESPACE " " + TABLE_KW "table" + WHITESPACE " " + PATH + PATH_SEGMENT + NAME + IDENT "t" + WHITESPACE " " + TABLE_ARG_LIST + L_PAREN "(" + WHITESPACE "\n " + COLUMN + NAME + IDENT "a" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + INT_KW "int" + COMMA "," + WHITESPACE "\n " + COLUMN + NAME + IDENT "b" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + INT_KW "int" + WHITESPACE " " + REFERENCES_CONSTRAINT + REFERENCES_KW "references" + WHITESPACE " " + PATH + PATH + PATH_SEGMENT + NAME_REF + IDENT "foo" + DOT "." + PATH_SEGMENT + NAME_REF + IDENT "bar" + WHITESPACE " " + L_PAREN "(" + WHITESPACE " " + NAME_REF + IDENT "bar" + WHITESPACE " " + R_PAREN ")" + WHITESPACE " " + MATCH_PARTIAL + MATCH_KW "match" + WHITESPACE " " + PARTIAL_KW "partial" + WHITESPACE "\n " + ON_DELETE_ACTION + ON_KW "on" + WHITESPACE " " + DELETE_KW "delete" + WHITESPACE " " + NO_ACTION + NO_KW "no" + WHITESPACE " " + ACTION_KW "action" + WHITESPACE "\n " + ON_UPDATE_ACTION + ON_KW "on" + WHITESPACE " " + UPDATE_KW "update" + WHITESPACE " " + SET_NULL_COLUMNS + SET_KW "set" + WHITESPACE " " + NULL_KW "null" + WHITESPACE " " + COLUMN_LIST + L_PAREN "(" + WHITESPACE " " + COLUMN + NAME_REF + IDENT "a" + COMMA "," + WHITESPACE " " + COLUMN + NAME_REF + IDENT "b" + WHITESPACE " " + R_PAREN ")" + WHITESPACE "\n" + R_PAREN ")" + SEMICOLON ";" + WHITESPACE "\n\n\n" + CREATE_TABLE + COMMENT "-- temporal_foreign_key" + WHITESPACE "\n" + CREATE_KW "CREATE" + WHITESPACE " " + TABLE_KW "TABLE" + WHITESPACE " " + PATH + PATH_SEGMENT + NAME + IDENT "orders" + WHITESPACE " " + TABLE_ARG_LIST + L_PAREN "(" + WHITESPACE "\n " + COLUMN + NAME + IDENT "id" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + IDENT "int8" + WHITESPACE " " + GENERATED_CONSTRAINT + GENERATED_KW "generated" + WHITESPACE " " + BY_KW "BY" + WHITESPACE " " + DEFAULT_KW "DEFAULT" + WHITESPACE " " + AS_KW "AS" + WHITESPACE " " + IDENTITY_KW "IDENTITY" + COMMA "," + WHITESPACE "\n " + COLUMN + NAME + IDENT "address_id" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + IDENT "int8" + WHITESPACE " " + NOT_NULL_CONSTRAINT + NOT_KW "NOT" + WHITESPACE " " + NULL_KW "NULL" + COMMA "," + WHITESPACE "\n " + COLUMN + NAME + IDENT "address_valid_at" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + IDENT "tstzrange" + WHITESPACE " " + NOT_NULL_CONSTRAINT + NOT_KW "NOT" + WHITESPACE " " + NULL_KW "NULL" + COMMA "," + WHITESPACE "\n " + COLUMN + NAME + CONTENT_KW "content" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + TEXT_KW "text" + COMMA "," + WHITESPACE "\n " + FOREIGN_KEY_CONSTRAINT + CONSTRAINT_NAME + CONSTRAINT_KW "CONSTRAINT" + WHITESPACE " " + NAME + IDENT "order_address" + WHITESPACE " " + FOREIGN_KW "FOREIGN" + WHITESPACE " " + KEY_KW "KEY" + WHITESPACE " " + COLUMN_LIST + L_PAREN "(" + WHITESPACE " " + COLUMN + NAME_REF + IDENT "address_id" + COMMA "," + WHITESPACE " " + COLUMN + PERIOD_KW "PERIOD" + WHITESPACE " " + NAME_REF + IDENT "address_valid_at" + WHITESPACE " " + R_PAREN ")" + WHITESPACE " " + REFERENCES_KW "REFERENCES" + WHITESPACE " " + PATH + PATH_SEGMENT + NAME_REF + IDENT "addresses" + WHITESPACE " " + COLUMN_LIST + L_PAREN "(" + WHITESPACE " " + COLUMN + NAME_REF + IDENT "id" + COMMA "," + WHITESPACE " " + COLUMN + PERIOD_KW "PERIOD" + WHITESPACE " " + NAME_REF + IDENT "valid_range" + WHITESPACE " " + R_PAREN ")" + WHITESPACE "\n" + R_PAREN ")" + SEMICOLON ";" + WHITESPACE "\n\n" + CREATE_TABLE + COMMENT "-- unique_constraint_without_overlaps" + WHITESPACE "\n" + CREATE_KW "create" + WHITESPACE " " + TABLE_KW "table" + WHITESPACE " " + PATH + PATH_SEGMENT + NAME + IDENT "t" + WHITESPACE " " + TABLE_ARG_LIST + L_PAREN "(" + WHITESPACE "\n " + COLUMN + NAME + IDENT "a" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + INT_KW "int" + COMMA "," + WHITESPACE "\n " + COLUMN + NAME + IDENT "b" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + TEXT_KW "text" + COMMA "," + WHITESPACE "\n " + UNIQUE_CONSTRAINT + UNIQUE_KW "unique" + WHITESPACE " " + COLUMN_LIST + L_PAREN "(" + COLUMN + NAME_REF + IDENT "a" + WHITESPACE " " + WITHOUT_KW "without" + WHITESPACE " " + OVERLAPS_KW "overlaps" + R_PAREN ")" + WHITESPACE "\n" + R_PAREN ")" + SEMICOLON ";" + WHITESPACE "\n\n\n" + CREATE_TABLE + COMMENT "-- primary key without overlaps" + WHITESPACE "\n" + CREATE_KW "create" + WHITESPACE " " + TABLE_KW "table" + WHITESPACE " " + PATH + PATH_SEGMENT + NAME + IDENT "t" + WHITESPACE " " + TABLE_ARG_LIST + L_PAREN "(" + WHITESPACE "\n " + COLUMN + NAME + IDENT "a" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + TEXT_KW "text" + COMMA "," + WHITESPACE "\n " + COLUMN + NAME + IDENT "b" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + TEXT_KW "text" + COMMA "," + WHITESPACE "\n " + COLUMN + NAME + IDENT "c" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + TEXT_KW "text" + COMMA "," + WHITESPACE "\n " + PRIMARY_KEY_CONSTRAINT + CONSTRAINT_NAME + CONSTRAINT_KW "constraint" + WHITESPACE " " + NAME + IDENT "pk" + WHITESPACE " \n " + PRIMARY_KW "primary" + WHITESPACE " " + KEY_KW "key" + WHITESPACE " " + COLUMN_LIST + L_PAREN "(" + COLUMN + NAME_REF + IDENT "a" + COMMA "," + WHITESPACE " " + COLUMN + NAME_REF + IDENT "b" + COMMA "," + WHITESPACE " " + COLUMN + NAME_REF + IDENT "c" + WHITESPACE " " + WITHOUT_KW "without" + WHITESPACE " " + OVERLAPS_KW "overlaps" + R_PAREN ")" + WHITESPACE "\n" + R_PAREN ")" + SEMICOLON ";" + WHITESPACE "\n\n" + CREATE_TABLE + COMMENT "-- temporal_primary_key" + WHITESPACE "\n" + CREATE_KW "CREATE" + WHITESPACE " " + TABLE_KW "TABLE" + WHITESPACE " " + PATH + PATH_SEGMENT + NAME + IDENT "addresses" + WHITESPACE " " + TABLE_ARG_LIST + L_PAREN "(" + WHITESPACE "\n " + COLUMN + NAME + IDENT "id" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + IDENT "int8" + WHITESPACE " " + GENERATED_CONSTRAINT + GENERATED_KW "generated" + WHITESPACE " " + BY_KW "BY" + WHITESPACE " " + DEFAULT_KW "DEFAULT" + WHITESPACE " " + AS_KW "AS" + WHITESPACE " " + IDENTITY_KW "IDENTITY" + COMMA "," + WHITESPACE "\n " + COLUMN + NAME + IDENT "valid_range" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + IDENT "tstzrange" + WHITESPACE " " + NOT_NULL_CONSTRAINT + NOT_KW "NOT" + WHITESPACE " " + NULL_KW "NULL" + WHITESPACE " " + DEFAULT_CONSTRAINT + DEFAULT_KW "DEFAULT" + WHITESPACE " " + CALL_EXPR + NAME_REF + IDENT "tstzrange" + ARG_LIST + L_PAREN "(" + CALL_EXPR + NAME_REF + IDENT "now" + ARG_LIST + L_PAREN "(" + R_PAREN ")" + COMMA "," + WHITESPACE " " + LITERAL + STRING "'infinity'" + COMMA "," + WHITESPACE " " + LITERAL + STRING "'[)'" + R_PAREN ")" + COMMA "," + WHITESPACE "\n " + COLUMN + NAME + IDENT "recipient" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + TEXT_KW "text" + WHITESPACE " " + NOT_NULL_CONSTRAINT + NOT_KW "NOT" + WHITESPACE " " + NULL_KW "NULL" + COMMA "," + WHITESPACE "\n " + PRIMARY_KEY_CONSTRAINT + PRIMARY_KW "PRIMARY" + WHITESPACE " " + KEY_KW "KEY" + WHITESPACE " " + COLUMN_LIST + L_PAREN "(" + COLUMN + NAME_REF + IDENT "id" + COMMA "," + WHITESPACE " " + COLUMN + NAME_REF + IDENT "valid_range" + WHITESPACE " " + WITHOUT_KW "WITHOUT" + WHITESPACE " " + OVERLAPS_KW "OVERLAPS" + R_PAREN ")" + WHITESPACE "\n" + R_PAREN ")" + SEMICOLON ";" WHITESPACE "\n" diff --git a/crates/squawk_parser/tests/snapshots/tests__create_table_pg17_ok.snap b/crates/squawk_parser/tests/snapshots/tests__create_table_pg17_ok.snap deleted file mode 100644 index 1dc4a3cc..00000000 --- a/crates/squawk_parser/tests/snapshots/tests__create_table_pg17_ok.snap +++ /dev/null @@ -1,490 +0,0 @@ ---- -source: crates/squawk_parser/tests/tests.rs -input_file: crates/squawk_parser/tests/data/ok/create_table_pg17.sql ---- -SOURCE_FILE - CREATE_TABLE - COMMENT "-- match partial not implemented yet" - WHITESPACE "\n" - CREATE_KW "create" - WHITESPACE " " - TABLE_KW "table" - WHITESPACE " " - PATH - PATH_SEGMENT - NAME - IDENT "t" - WHITESPACE " " - TABLE_ARG_LIST - L_PAREN "(" - WHITESPACE "\n " - COLUMN - NAME - IDENT "a" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - INT_KW "int" - COMMA "," - WHITESPACE "\n " - COLUMN - NAME - IDENT "b" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - INT_KW "int" - WHITESPACE " " - REFERENCES_CONSTRAINT - REFERENCES_KW "references" - WHITESPACE " " - PATH - PATH - PATH_SEGMENT - NAME_REF - IDENT "foo" - DOT "." - PATH_SEGMENT - NAME_REF - IDENT "bar" - WHITESPACE " " - L_PAREN "(" - WHITESPACE " " - NAME_REF - IDENT "bar" - WHITESPACE " " - R_PAREN ")" - WHITESPACE " " - MATCH_PARTIAL - MATCH_KW "match" - WHITESPACE " " - PARTIAL_KW "partial" - WHITESPACE "\n " - ON_DELETE_ACTION - ON_KW "on" - WHITESPACE " " - DELETE_KW "delete" - WHITESPACE " " - NO_ACTION - NO_KW "no" - WHITESPACE " " - ACTION_KW "action" - WHITESPACE "\n " - ON_UPDATE_ACTION - ON_KW "on" - WHITESPACE " " - UPDATE_KW "update" - WHITESPACE " " - SET_NULL_COLUMNS - SET_KW "set" - WHITESPACE " " - NULL_KW "null" - WHITESPACE " " - COLUMN_LIST - L_PAREN "(" - WHITESPACE " " - COLUMN - NAME_REF - IDENT "a" - COMMA "," - WHITESPACE " " - COLUMN - NAME_REF - IDENT "b" - WHITESPACE " " - R_PAREN ")" - WHITESPACE "\n" - R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n\n\n" - CREATE_TABLE - COMMENT "-- temporal_foreign_key" - WHITESPACE "\n" - CREATE_KW "CREATE" - WHITESPACE " " - TABLE_KW "TABLE" - WHITESPACE " " - PATH - PATH_SEGMENT - NAME - IDENT "orders" - WHITESPACE " " - TABLE_ARG_LIST - L_PAREN "(" - WHITESPACE "\n " - COLUMN - NAME - IDENT "id" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - IDENT "int8" - WHITESPACE " " - GENERATED_CONSTRAINT - GENERATED_KW "generated" - WHITESPACE " " - BY_KW "BY" - WHITESPACE " " - DEFAULT_KW "DEFAULT" - WHITESPACE " " - AS_KW "AS" - WHITESPACE " " - IDENTITY_KW "IDENTITY" - COMMA "," - WHITESPACE "\n " - COLUMN - NAME - IDENT "address_id" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - IDENT "int8" - WHITESPACE " " - NOT_NULL_CONSTRAINT - NOT_KW "NOT" - WHITESPACE " " - NULL_KW "NULL" - COMMA "," - WHITESPACE "\n " - COLUMN - NAME - IDENT "address_valid_at" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - IDENT "tstzrange" - WHITESPACE " " - NOT_NULL_CONSTRAINT - NOT_KW "NOT" - WHITESPACE " " - NULL_KW "NULL" - COMMA "," - WHITESPACE "\n " - COLUMN - NAME - CONTENT_KW "content" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - TEXT_KW "text" - COMMA "," - WHITESPACE "\n " - FOREIGN_KEY_CONSTRAINT - CONSTRAINT_NAME - CONSTRAINT_KW "CONSTRAINT" - WHITESPACE " " - NAME - IDENT "order_address" - WHITESPACE " " - FOREIGN_KW "FOREIGN" - WHITESPACE " " - KEY_KW "KEY" - WHITESPACE " " - COLUMN_LIST - L_PAREN "(" - WHITESPACE " " - COLUMN - NAME_REF - IDENT "address_id" - COMMA "," - WHITESPACE " " - COLUMN - PERIOD_KW "PERIOD" - WHITESPACE " " - NAME_REF - IDENT "address_valid_at" - WHITESPACE " " - R_PAREN ")" - WHITESPACE " " - REFERENCES_KW "REFERENCES" - WHITESPACE " " - PATH - PATH_SEGMENT - NAME_REF - IDENT "addresses" - WHITESPACE " " - COLUMN_LIST - L_PAREN "(" - WHITESPACE " " - COLUMN - NAME_REF - IDENT "id" - COMMA "," - WHITESPACE " " - COLUMN - PERIOD_KW "PERIOD" - WHITESPACE " " - NAME_REF - IDENT "valid_range" - WHITESPACE " " - R_PAREN ")" - WHITESPACE "\n" - R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n\n" - CREATE_TABLE - COMMENT "-- unique_constraint_without_overlaps" - WHITESPACE "\n" - CREATE_KW "create" - WHITESPACE " " - TABLE_KW "table" - WHITESPACE " " - PATH - PATH_SEGMENT - NAME - IDENT "t" - WHITESPACE " " - TABLE_ARG_LIST - L_PAREN "(" - WHITESPACE "\n " - COLUMN - NAME - IDENT "a" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - INT_KW "int" - COMMA "," - WHITESPACE "\n " - COLUMN - NAME - IDENT "b" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - TEXT_KW "text" - COMMA "," - WHITESPACE "\n " - UNIQUE_CONSTRAINT - UNIQUE_KW "unique" - WHITESPACE " " - COLUMN_LIST - L_PAREN "(" - COLUMN - NAME_REF - IDENT "a" - WHITESPACE " " - WITHOUT_KW "without" - WHITESPACE " " - OVERLAPS_KW "overlaps" - R_PAREN ")" - WHITESPACE "\n" - R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n\n\n" - CREATE_TABLE - COMMENT "-- primary key without overlaps" - WHITESPACE "\n" - CREATE_KW "create" - WHITESPACE " " - TABLE_KW "table" - WHITESPACE " " - PATH - PATH_SEGMENT - NAME - IDENT "t" - WHITESPACE " " - TABLE_ARG_LIST - L_PAREN "(" - WHITESPACE "\n " - COLUMN - NAME - IDENT "a" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - TEXT_KW "text" - COMMA "," - WHITESPACE "\n " - COLUMN - NAME - IDENT "b" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - TEXT_KW "text" - COMMA "," - WHITESPACE "\n " - COLUMN - NAME - IDENT "c" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - TEXT_KW "text" - COMMA "," - WHITESPACE "\n " - PRIMARY_KEY_CONSTRAINT - CONSTRAINT_NAME - CONSTRAINT_KW "constraint" - WHITESPACE " " - NAME - IDENT "pk" - WHITESPACE " \n " - PRIMARY_KW "primary" - WHITESPACE " " - KEY_KW "key" - WHITESPACE " " - COLUMN_LIST - L_PAREN "(" - COLUMN - NAME_REF - IDENT "a" - COMMA "," - WHITESPACE " " - COLUMN - NAME_REF - IDENT "b" - COMMA "," - WHITESPACE " " - COLUMN - NAME_REF - IDENT "c" - WHITESPACE " " - WITHOUT_KW "without" - WHITESPACE " " - OVERLAPS_KW "overlaps" - R_PAREN ")" - WHITESPACE "\n" - R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n\n" - CREATE_TABLE - COMMENT "-- temporal_primary_key" - WHITESPACE "\n" - CREATE_KW "CREATE" - WHITESPACE " " - TABLE_KW "TABLE" - WHITESPACE " " - PATH - PATH_SEGMENT - NAME - IDENT "addresses" - WHITESPACE " " - TABLE_ARG_LIST - L_PAREN "(" - WHITESPACE "\n " - COLUMN - NAME - IDENT "id" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - IDENT "int8" - WHITESPACE " " - GENERATED_CONSTRAINT - GENERATED_KW "generated" - WHITESPACE " " - BY_KW "BY" - WHITESPACE " " - DEFAULT_KW "DEFAULT" - WHITESPACE " " - AS_KW "AS" - WHITESPACE " " - IDENTITY_KW "IDENTITY" - COMMA "," - WHITESPACE "\n " - COLUMN - NAME - IDENT "valid_range" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - IDENT "tstzrange" - WHITESPACE " " - NOT_NULL_CONSTRAINT - NOT_KW "NOT" - WHITESPACE " " - NULL_KW "NULL" - WHITESPACE " " - DEFAULT_CONSTRAINT - DEFAULT_KW "DEFAULT" - WHITESPACE " " - CALL_EXPR - NAME_REF - IDENT "tstzrange" - ARG_LIST - L_PAREN "(" - CALL_EXPR - NAME_REF - IDENT "now" - ARG_LIST - L_PAREN "(" - R_PAREN ")" - COMMA "," - WHITESPACE " " - LITERAL - STRING "'infinity'" - COMMA "," - WHITESPACE " " - LITERAL - STRING "'[)'" - R_PAREN ")" - COMMA "," - WHITESPACE "\n " - COLUMN - NAME - IDENT "recipient" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - TEXT_KW "text" - WHITESPACE " " - NOT_NULL_CONSTRAINT - NOT_KW "NOT" - WHITESPACE " " - NULL_KW "NULL" - COMMA "," - WHITESPACE "\n " - PRIMARY_KEY_CONSTRAINT - PRIMARY_KW "PRIMARY" - WHITESPACE " " - KEY_KW "KEY" - WHITESPACE " " - COLUMN_LIST - L_PAREN "(" - COLUMN - NAME_REF - IDENT "id" - COMMA "," - WHITESPACE " " - COLUMN - NAME_REF - IDENT "valid_range" - WHITESPACE " " - WITHOUT_KW "WITHOUT" - WHITESPACE " " - OVERLAPS_KW "OVERLAPS" - R_PAREN ")" - WHITESPACE "\n" - R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n" diff --git a/crates/squawk_parser/tests/snapshots/tests__insert_ok.snap b/crates/squawk_parser/tests/snapshots/tests__insert_ok.snap index c6374af1..818d161b 100644 --- a/crates/squawk_parser/tests/snapshots/tests__insert_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__insert_ok.snap @@ -1701,4 +1701,76 @@ SOURCE_FILE WHITESPACE " " NOTHING_KW "nothing" SEMICOLON ";" + WHITESPACE "\n\n" + COMMENT "-- on conflict do select" + WHITESPACE "\n" + INSERT + INSERT_KW "INSERT" + WHITESPACE " " + INTO_KW "INTO" + WHITESPACE " " + PATH + PATH_SEGMENT + NAME_REF + IDENT "t" + WHITESPACE " " + COLUMN_LIST + L_PAREN "(" + COLUMN + NAME_REF + IDENT "a" + R_PAREN ")" + WHITESPACE " " + VALUES + VALUES_KW "VALUES" + WHITESPACE " " + ROW_LIST + ROW + L_PAREN "(" + LITERAL + INT_NUMBER "1" + R_PAREN ")" + WHITESPACE "\n " + ON_CONFLICT_CLAUSE + ON_KW "ON" + WHITESPACE " " + CONFLICT_KW "CONFLICT" + WHITESPACE " " + CONFLICT_ON_INDEX + CONFLICT_INDEX_ITEM_LIST + L_PAREN "(" + CONFLICT_INDEX_ITEM + NAME_REF + IDENT "a" + R_PAREN ")" + WHITESPACE " " + CONFLICT_DO_SELECT + DO_KW "DO" + WHITESPACE " " + SELECT_KW "SELECT" + WHITESPACE " " + LOCKING_CLAUSE + FOR_KW "FOR" + WHITESPACE " " + UPDATE_KW "UPDATE" + WHITESPACE " " + WHERE_CLAUSE + WHERE_KW "WHERE" + WHITESPACE " " + BIN_EXPR + NAME_REF + IDENT "a" + WHITESPACE " " + R_ANGLE ">" + WHITESPACE " " + LITERAL + INT_NUMBER "0" + WHITESPACE " " + RETURNING_CLAUSE + RETURNING_KW "RETURNING" + WHITESPACE " " + TARGET_LIST + TARGET + STAR "*" + SEMICOLON ";" WHITESPACE "\n" diff --git a/crates/squawk_parser/tests/snapshots/tests__insert_pg18_ok.snap b/crates/squawk_parser/tests/snapshots/tests__insert_pg18_ok.snap deleted file mode 100644 index 8e8c68ef..00000000 --- a/crates/squawk_parser/tests/snapshots/tests__insert_pg18_ok.snap +++ /dev/null @@ -1,77 +0,0 @@ ---- -source: crates/squawk_parser/tests/tests.rs -input_file: crates/squawk_parser/tests/data/ok/insert_pg18.sql ---- -SOURCE_FILE - COMMENT "-- on conflict do select" - WHITESPACE "\n" - INSERT - INSERT_KW "INSERT" - WHITESPACE " " - INTO_KW "INTO" - WHITESPACE " " - PATH - PATH_SEGMENT - NAME_REF - IDENT "t" - WHITESPACE " " - COLUMN_LIST - L_PAREN "(" - COLUMN - NAME_REF - IDENT "a" - R_PAREN ")" - WHITESPACE " " - VALUES - VALUES_KW "VALUES" - WHITESPACE " " - ROW_LIST - ROW - L_PAREN "(" - LITERAL - INT_NUMBER "1" - R_PAREN ")" - WHITESPACE "\n " - ON_CONFLICT_CLAUSE - ON_KW "ON" - WHITESPACE " " - CONFLICT_KW "CONFLICT" - WHITESPACE " " - CONFLICT_ON_INDEX - CONFLICT_INDEX_ITEM_LIST - L_PAREN "(" - CONFLICT_INDEX_ITEM - NAME_REF - IDENT "a" - R_PAREN ")" - WHITESPACE " " - CONFLICT_DO_SELECT - DO_KW "DO" - WHITESPACE " " - SELECT_KW "SELECT" - WHITESPACE " " - LOCKING_CLAUSE - FOR_KW "FOR" - WHITESPACE " " - UPDATE_KW "UPDATE" - WHITESPACE " " - WHERE_CLAUSE - WHERE_KW "WHERE" - WHITESPACE " " - BIN_EXPR - NAME_REF - IDENT "a" - WHITESPACE " " - R_ANGLE ">" - WHITESPACE " " - LITERAL - INT_NUMBER "0" - WHITESPACE " " - RETURNING_CLAUSE - RETURNING_KW "RETURNING" - WHITESPACE " " - TARGET_LIST - TARGET - STAR "*" - SEMICOLON ";" - WHITESPACE "\n" diff --git a/crates/squawk_parser/tests/snapshots/tests__merge_ok.snap b/crates/squawk_parser/tests/snapshots/tests__merge_ok.snap index fff4b3ff..96cfc137 100644 --- a/crates/squawk_parser/tests/snapshots/tests__merge_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__merge_ok.snap @@ -665,4 +665,1747 @@ SOURCE_FILE WHITESPACE " " NOTHING_KW "nothing" SEMICOLON ";" + WHITESPACE "\n\n\n" + COMMENT "-- when_clauses_all" + WHITESPACE "\n" + MERGE + MERGE_KW "merge" + WHITESPACE " " + INTO_KW "into" + WHITESPACE " " + RELATION_NAME + PATH + PATH_SEGMENT + NAME_REF + IDENT "t" + WHITESPACE "\n " + USING_ON_CLAUSE + USING_KW "using" + WHITESPACE " " + FROM_ITEM + NAME_REF + IDENT "u" + WHITESPACE "\n " + ON_CLAUSE + ON_KW "on" + WHITESPACE " " + BIN_EXPR + FIELD_EXPR + NAME_REF + IDENT "t" + DOT "." + NAME_REF + IDENT "id" + WHITESPACE " " + EQ "=" + WHITESPACE " " + FIELD_EXPR + NAME_REF + IDENT "u" + DOT "." + NAME_REF + IDENT "id" + WHITESPACE "\n " + MERGE_WHEN_NOT_MATCHED_TARGET + WHEN_KW "when" + WHITESPACE " " + NOT_KW "not" + WHITESPACE " " + MATCHED_KW "matched" + WHITESPACE " " + THEN_KW "then" + WHITESPACE "\n " + MERGE_DO_NOTHING + DO_KW "do" + WHITESPACE " " + NOTHING_KW "nothing" + WHITESPACE "\n " + MERGE_WHEN_MATCHED + WHEN_KW "when" + WHITESPACE " " + MATCHED_KW "matched" + WHITESPACE " " + THEN_KW "then" + WHITESPACE " \n " + MERGE_DO_NOTHING + DO_KW "do" + WHITESPACE " " + NOTHING_KW "nothing" + WHITESPACE "\n " + MERGE_WHEN_NOT_MATCHED_SOURCE + WHEN_KW "when" + WHITESPACE " " + NOT_KW "not" + WHITESPACE " " + MATCHED_KW "matched" + WHITESPACE " " + BY_KW "by" + WHITESPACE " " + SOURCE_KW "source" + WHITESPACE " " + THEN_KW "then" + WHITESPACE "\n " + MERGE_DO_NOTHING + DO_KW "do" + WHITESPACE " " + NOTHING_KW "nothing" + SEMICOLON ";" + WHITESPACE "\n\n" + COMMENT "-- when_clauses_all_with_conditions" + WHITESPACE "\n" + MERGE + MERGE_KW "merge" + WHITESPACE " " + INTO_KW "into" + WHITESPACE " " + RELATION_NAME + PATH + PATH_SEGMENT + NAME_REF + IDENT "t" + WHITESPACE "\n " + USING_ON_CLAUSE + USING_KW "using" + WHITESPACE " " + FROM_ITEM + NAME_REF + IDENT "u" + WHITESPACE " " + ON_CLAUSE + ON_KW "on" + WHITESPACE " " + LITERAL + TRUE_KW "true" + WHITESPACE "\n " + MERGE_WHEN_MATCHED + WHEN_KW "when" + WHITESPACE " " + MATCHED_KW "matched" + WHITESPACE " " + AND_KW "and" + WHITESPACE " " + BIN_EXPR + NAME_REF + IDENT "foo" + WHITESPACE " " + EQ "=" + WHITESPACE " " + NAME_REF + IDENT "bar" + WHITESPACE " " + THEN_KW "then" + WHITESPACE "\n " + MERGE_DO_NOTHING + DO_KW "do" + WHITESPACE " " + NOTHING_KW "nothing" + WHITESPACE "\n " + MERGE_WHEN_NOT_MATCHED_SOURCE + WHEN_KW "when" + WHITESPACE " " + NOT_KW "not" + WHITESPACE " " + MATCHED_KW "matched" + WHITESPACE " " + BY_KW "by" + WHITESPACE " " + SOURCE_KW "source" + WHITESPACE " " + AND_KW "and" + WHITESPACE " " + BIN_EXPR + NAME_REF + IDENT "bar" + WHITESPACE " " + EQ "=" + WHITESPACE " " + NAME_REF + IDENT "foo" + WHITESPACE " " + THEN_KW "then" + WHITESPACE "\n " + MERGE_DO_NOTHING + DO_KW "do" + WHITESPACE " " + NOTHING_KW "nothing" + WHITESPACE "\n " + MERGE_WHEN_NOT_MATCHED_TARGET + WHEN_KW "when" + WHITESPACE " " + NOT_KW "not" + WHITESPACE " " + MATCHED_KW "matched" + WHITESPACE " " + AND_KW "and" + WHITESPACE " " + BIN_EXPR + NAME_REF + IDENT "buzz" + WHITESPACE " " + EQ "=" + WHITESPACE " " + NAME_REF + IDENT "bar" + WHITESPACE " " + THEN_KW "then" + WHITESPACE " \n " + MERGE_DO_NOTHING + DO_KW "do" + WHITESPACE " " + NOTHING_KW "nothing" + SEMICOLON ";" + WHITESPACE "\n\n" + COMMENT "-- returning_all" + WHITESPACE "\n" + MERGE + MERGE_KW "merge" + WHITESPACE " " + INTO_KW "into" + WHITESPACE " " + RELATION_NAME + PATH + PATH_SEGMENT + NAME_REF + IDENT "t" + WHITESPACE "\n " + USING_ON_CLAUSE + USING_KW "using" + WHITESPACE " " + FROM_ITEM + NAME_REF + IDENT "u" + WHITESPACE "\n " + ON_CLAUSE + ON_KW "on" + WHITESPACE " " + BIN_EXPR + FIELD_EXPR + NAME_REF + IDENT "t" + DOT "." + NAME_REF + IDENT "id" + WHITESPACE " " + EQ "=" + WHITESPACE " " + FIELD_EXPR + NAME_REF + IDENT "u" + DOT "." + NAME_REF + IDENT "id" + WHITESPACE "\n " + MERGE_WHEN_NOT_MATCHED_TARGET + WHEN_KW "when" + WHITESPACE " " + NOT_KW "not" + WHITESPACE " " + MATCHED_KW "matched" + WHITESPACE " " + THEN_KW "then" + WHITESPACE "\n " + MERGE_DO_NOTHING + DO_KW "do" + WHITESPACE " " + NOTHING_KW "nothing" + WHITESPACE "\n " + MERGE_WHEN_MATCHED + WHEN_KW "when" + WHITESPACE " " + MATCHED_KW "matched" + WHITESPACE " " + THEN_KW "then" + WHITESPACE " \n " + MERGE_DO_NOTHING + DO_KW "do" + WHITESPACE " " + NOTHING_KW "nothing" + WHITESPACE "\n " + MERGE_WHEN_NOT_MATCHED_SOURCE + WHEN_KW "when" + WHITESPACE " " + NOT_KW "not" + WHITESPACE " " + MATCHED_KW "matched" + WHITESPACE " " + BY_KW "by" + WHITESPACE " " + SOURCE_KW "source" + WHITESPACE " " + THEN_KW "then" + WHITESPACE "\n " + MERGE_DO_NOTHING + DO_KW "do" + WHITESPACE " " + NOTHING_KW "nothing" + WHITESPACE "\n " + RETURNING_CLAUSE + RETURNING_KW "returning" + WHITESPACE " " + TARGET_LIST + TARGET + STAR "*" + SEMICOLON ";" + WHITESPACE "\n\n" + COMMENT "-- returning_many" + WHITESPACE "\n" + MERGE + MERGE_KW "merge" + WHITESPACE " " + INTO_KW "into" + WHITESPACE " " + RELATION_NAME + PATH + PATH_SEGMENT + NAME_REF + IDENT "t" + WHITESPACE "\n " + USING_ON_CLAUSE + USING_KW "using" + WHITESPACE " " + FROM_ITEM + NAME_REF + IDENT "u" + WHITESPACE "\n " + ON_CLAUSE + ON_KW "on" + WHITESPACE " " + BIN_EXPR + FIELD_EXPR + NAME_REF + IDENT "t" + DOT "." + NAME_REF + IDENT "id" + WHITESPACE " " + EQ "=" + WHITESPACE " " + FIELD_EXPR + NAME_REF + IDENT "u" + DOT "." + NAME_REF + IDENT "id" + WHITESPACE "\n " + MERGE_WHEN_NOT_MATCHED_TARGET + WHEN_KW "when" + WHITESPACE " " + NOT_KW "not" + WHITESPACE " " + MATCHED_KW "matched" + WHITESPACE " " + THEN_KW "then" + WHITESPACE "\n " + MERGE_DO_NOTHING + DO_KW "do" + WHITESPACE " " + NOTHING_KW "nothing" + WHITESPACE "\n " + MERGE_WHEN_MATCHED + WHEN_KW "when" + WHITESPACE " " + MATCHED_KW "matched" + WHITESPACE " " + THEN_KW "then" + WHITESPACE " \n " + MERGE_DO_NOTHING + DO_KW "do" + WHITESPACE " " + NOTHING_KW "nothing" + WHITESPACE "\n " + MERGE_WHEN_NOT_MATCHED_SOURCE + WHEN_KW "when" + WHITESPACE " " + NOT_KW "not" + WHITESPACE " " + MATCHED_KW "matched" + WHITESPACE " " + BY_KW "by" + WHITESPACE " " + SOURCE_KW "source" + WHITESPACE " " + THEN_KW "then" + WHITESPACE "\n " + MERGE_DO_NOTHING + DO_KW "do" + WHITESPACE " " + NOTHING_KW "nothing" + WHITESPACE "\n " + RETURNING_CLAUSE + RETURNING_KW "returning" + WHITESPACE " " + TARGET_LIST + TARGET + STAR "*" + COMMA "," + WHITESPACE " " + TARGET + NAME_REF + IDENT "u" + WHITESPACE " " + AS_NAME + AS_KW "as" + WHITESPACE " " + NAME + IDENT "bar" + COMMA "," + WHITESPACE " " + TARGET + NAME_REF + IDENT "t" + WHITESPACE " " + AS_NAME + NAME + IDENT "b" + COMMA "," + WHITESPACE " " + TARGET + CALL_EXPR + NAME_REF + MERGE_ACTION_KW "merge_action" + ARG_LIST + L_PAREN "(" + R_PAREN ")" + COMMA "," + WHITESPACE " " + TARGET + FIELD_EXPR + NAME_REF + IDENT "t" + DOT "." + STAR "*" + SEMICOLON ";" + WHITESPACE "\n\n" + COMMENT "-- merge_insert_simple" + WHITESPACE "\n" + MERGE + MERGE_KW "merge" + WHITESPACE " " + INTO_KW "into" + WHITESPACE " " + RELATION_NAME + PATH + PATH_SEGMENT + NAME_REF + IDENT "t" + WHITESPACE "\n " + USING_ON_CLAUSE + USING_KW "using" + WHITESPACE " " + FROM_ITEM + NAME_REF + IDENT "u" + WHITESPACE "\n " + ON_CLAUSE + ON_KW "on" + WHITESPACE " " + BIN_EXPR + FIELD_EXPR + NAME_REF + IDENT "t" + DOT "." + NAME_REF + IDENT "id" + WHITESPACE " " + EQ "=" + WHITESPACE " " + FIELD_EXPR + NAME_REF + IDENT "u" + DOT "." + NAME_REF + IDENT "id" + WHITESPACE "\n " + MERGE_WHEN_NOT_MATCHED_TARGET + WHEN_KW "when" + WHITESPACE " " + NOT_KW "not" + WHITESPACE " " + MATCHED_KW "matched" + WHITESPACE " " + THEN_KW "then" + WHITESPACE "\n " + MERGE_INSERT + INSERT_KW "insert" + WHITESPACE "\n " + DEFAULT_KW "default" + WHITESPACE " " + VALUES_KW "values" + SEMICOLON ";" + WHITESPACE "\n\n" + COMMENT "-- merge_insert_default" + WHITESPACE "\n" + MERGE + MERGE_KW "merge" + WHITESPACE " " + INTO_KW "into" + WHITESPACE " " + RELATION_NAME + PATH + PATH_SEGMENT + NAME_REF + IDENT "t" + WHITESPACE "\n " + USING_ON_CLAUSE + USING_KW "using" + WHITESPACE " " + FROM_ITEM + NAME_REF + IDENT "u" + WHITESPACE "\n " + ON_CLAUSE + ON_KW "on" + WHITESPACE " " + BIN_EXPR + FIELD_EXPR + NAME_REF + IDENT "t" + DOT "." + NAME_REF + IDENT "id" + WHITESPACE " " + EQ "=" + WHITESPACE " " + FIELD_EXPR + NAME_REF + IDENT "u" + DOT "." + NAME_REF + IDENT "id" + WHITESPACE "\n " + MERGE_WHEN_NOT_MATCHED_TARGET + WHEN_KW "when" + WHITESPACE " " + NOT_KW "not" + WHITESPACE " " + MATCHED_KW "matched" + WHITESPACE " " + THEN_KW "then" + WHITESPACE "\n " + MERGE_INSERT + INSERT_KW "insert" + WHITESPACE " " + COLUMN_LIST + L_PAREN "(" + COLUMN + NAME_REF + IDENT "a" + COMMA "," + WHITESPACE " " + COLUMN + NAME_REF + IDENT "b" + COMMA "," + WHITESPACE " " + COLUMN + NAME_REF + IDENT "c" + R_PAREN ")" + WHITESPACE "\n " + OVERRIDING_KW "overriding" + WHITESPACE " " + USER_KW "user" + WHITESPACE " " + VALUE_KW "value" + WHITESPACE "\n " + DEFAULT_KW "default" + WHITESPACE " " + VALUES_KW "values" + SEMICOLON ";" + WHITESPACE "\n\n" + COMMENT "-- merge_insert_values" + WHITESPACE "\n" + MERGE + MERGE_KW "merge" + WHITESPACE " " + INTO_KW "into" + WHITESPACE " " + RELATION_NAME + PATH + PATH_SEGMENT + NAME_REF + IDENT "t" + WHITESPACE "\n " + USING_ON_CLAUSE + USING_KW "using" + WHITESPACE " " + FROM_ITEM + NAME_REF + IDENT "u" + WHITESPACE "\n " + ON_CLAUSE + ON_KW "on" + WHITESPACE " " + BIN_EXPR + FIELD_EXPR + NAME_REF + IDENT "t" + DOT "." + NAME_REF + IDENT "id" + WHITESPACE " " + EQ "=" + WHITESPACE " " + FIELD_EXPR + NAME_REF + IDENT "u" + DOT "." + NAME_REF + IDENT "id" + WHITESPACE "\n " + MERGE_WHEN_NOT_MATCHED_TARGET + WHEN_KW "when" + WHITESPACE " " + NOT_KW "not" + WHITESPACE " " + MATCHED_KW "matched" + WHITESPACE " " + THEN_KW "then" + WHITESPACE "\n " + MERGE_INSERT + INSERT_KW "insert" + WHITESPACE "\n " + OVERRIDING_KW "overriding" + WHITESPACE " " + SYSTEM_KW "system" + WHITESPACE " " + VALUE_KW "value" + WHITESPACE "\n " + VALUES + VALUES_KW "values" + WHITESPACE " " + ROW_LIST + ROW + L_PAREN "(" + LITERAL + INT_NUMBER "1" + COMMA "," + WHITESPACE " " + LITERAL + INT_NUMBER "2" + COMMA "," + WHITESPACE " " + LITERAL + DEFAULT_KW "default" + COMMA "," + WHITESPACE " " + LITERAL + INT_NUMBER "3" + COMMA "," + WHITESPACE " " + BIN_EXPR + BIN_EXPR + LITERAL + INT_NUMBER "10" + WHITESPACE " " + STAR "*" + WHITESPACE " " + LITERAL + INT_NUMBER "10" + WHITESPACE " " + PLUS "+" + WHITESPACE " " + LITERAL + INT_NUMBER "2" + R_PAREN ")" + SEMICOLON ";" + WHITESPACE "\n\n" + COMMENT "-- merge_update" + WHITESPACE "\n" + MERGE + MERGE_KW "merge" + WHITESPACE " " + INTO_KW "into" + WHITESPACE " " + RELATION_NAME + PATH + PATH_SEGMENT + NAME_REF + IDENT "t" + WHITESPACE "\n " + USING_ON_CLAUSE + USING_KW "using" + WHITESPACE " " + FROM_ITEM + NAME_REF + IDENT "u" + WHITESPACE "\n " + ON_CLAUSE + ON_KW "on" + WHITESPACE " " + BIN_EXPR + FIELD_EXPR + NAME_REF + IDENT "t" + DOT "." + NAME_REF + IDENT "id" + WHITESPACE " " + EQ "=" + WHITESPACE " " + FIELD_EXPR + NAME_REF + IDENT "u" + DOT "." + NAME_REF + IDENT "id" + WHITESPACE "\n " + MERGE_WHEN_MATCHED + WHEN_KW "when" + WHITESPACE " " + MATCHED_KW "matched" + WHITESPACE " " + THEN_KW "then" + WHITESPACE "\n " + MERGE_UPDATE + UPDATE_KW "update" + WHITESPACE " " + SET_CLAUSE + SET_KW "set" + WHITESPACE "\n " + SET_COLUMN_LIST + SET_SINGLE_COLUMN + COLUMN + NAME_REF + IDENT "a" + WHITESPACE " " + EQ "=" + WHITESPACE " " + SET_EXPR + DEFAULT_KW "default" + COMMA "," + WHITESPACE "\n " + SET_SINGLE_COLUMN + COLUMN + NAME_REF + IDENT "b" + WHITESPACE " " + EQ "=" + WHITESPACE " " + SET_EXPR + LITERAL + INT_NUMBER "1" + COMMA "," + WHITESPACE "\n " + SET_SINGLE_COLUMN + COLUMN + NAME_REF + IDENT "c" + WHITESPACE " " + EQ "=" + WHITESPACE " " + SET_EXPR + NAME_REF + IDENT "d" + COMMA "," + WHITESPACE "\n " + SET_SINGLE_COLUMN + COLUMN + NAME_REF + IDENT "e" + WHITESPACE " " + EQ "=" + WHITESPACE " " + SET_EXPR + PAREN_EXPR + L_PAREN "(" + SELECT + SELECT_CLAUSE + SELECT_KW "select" + WHITESPACE " " + TARGET_LIST + TARGET + LITERAL + INT_NUMBER "1" + R_PAREN ")" + COMMA "," + WHITESPACE "\n " + SET_SINGLE_COLUMN + COLUMN + NAME_REF + IDENT "f" + WHITESPACE " " + EQ "=" + WHITESPACE " " + SET_EXPR + CALL_EXPR + NAME_REF + ROW_KW "row" + ARG_LIST + L_PAREN "(" + LITERAL + INT_NUMBER "1" + COMMA "," + WHITESPACE " " + LITERAL + INT_NUMBER "2" + COMMA "," + WHITESPACE " " + LITERAL + DEFAULT_KW "default" + R_PAREN ")" + COMMA "," + WHITESPACE "\n " + SET_SINGLE_COLUMN + COLUMN + NAME_REF + IDENT "g" + WHITESPACE " " + EQ "=" + WHITESPACE " " + SET_EXPR + TUPLE_EXPR + L_PAREN "(" + LITERAL + INT_NUMBER "1" + COMMA "," + WHITESPACE " " + LITERAL + INT_NUMBER "2" + COMMA "," + WHITESPACE " " + LITERAL + DEFAULT_KW "default" + R_PAREN ")" + COMMA "," + WHITESPACE "\n " + SET_SINGLE_COLUMN + COLUMN + NAME_REF + IDENT "h" + WHITESPACE " " + EQ "=" + WHITESPACE " " + SET_EXPR + PAREN_EXPR + L_PAREN "(" + LITERAL + DEFAULT_KW "default" + R_PAREN ")" + WHITESPACE "\n " + MERGE_WHEN_NOT_MATCHED_SOURCE + WHEN_KW "when" + WHITESPACE " " + NOT_KW "not" + WHITESPACE " " + MATCHED_KW "matched" + WHITESPACE " " + BY_KW "by" + WHITESPACE " " + SOURCE_KW "source" + WHITESPACE " " + THEN_KW "then" + WHITESPACE "\n " + MERGE_UPDATE + UPDATE_KW "update" + WHITESPACE " " + SET_CLAUSE + SET_KW "set" + WHITESPACE " " + SET_COLUMN_LIST + SET_SINGLE_COLUMN + COLUMN + NAME_REF + IDENT "foo" + WHITESPACE " " + EQ "=" + WHITESPACE " " + SET_EXPR + NAME_REF + IDENT "bar" + SEMICOLON ";" + WHITESPACE "\n\n" + COMMENT "-- merge_delete" + WHITESPACE "\n" + MERGE + MERGE_KW "merge" + WHITESPACE " " + INTO_KW "into" + WHITESPACE " " + RELATION_NAME + PATH + PATH_SEGMENT + NAME_REF + IDENT "t" + WHITESPACE "\n " + USING_ON_CLAUSE + USING_KW "using" + WHITESPACE " " + FROM_ITEM + NAME_REF + IDENT "u" + WHITESPACE "\n " + ON_CLAUSE + ON_KW "on" + WHITESPACE " " + BIN_EXPR + FIELD_EXPR + NAME_REF + IDENT "t" + DOT "." + NAME_REF + IDENT "id" + WHITESPACE " " + EQ "=" + WHITESPACE " " + FIELD_EXPR + NAME_REF + IDENT "u" + DOT "." + NAME_REF + IDENT "id" + WHITESPACE "\n " + MERGE_WHEN_MATCHED + WHEN_KW "when" + WHITESPACE " " + MATCHED_KW "matched" + WHITESPACE " " + THEN_KW "then" + WHITESPACE "\n " + MERGE_DELETE + DELETE_KW "delete" + WHITESPACE "\n " + MERGE_WHEN_NOT_MATCHED_SOURCE + WHEN_KW "when" + WHITESPACE " " + NOT_KW "not" + WHITESPACE " " + MATCHED_KW "matched" + WHITESPACE " " + BY_KW "by" + WHITESPACE " " + SOURCE_KW "source" + WHITESPACE " " + THEN_KW "then" + WHITESPACE "\n " + MERGE_DELETE + DELETE_KW "delete" + SEMICOLON ";" + WHITESPACE "\n\n" + COMMENT "-- with_select" + WHITESPACE "\n" + MERGE + WITH_CLAUSE + WITH_KW "with" + WHITESPACE " " + WITH_TABLE + NAME + IDENT "t" + WHITESPACE " " + AS_KW "as" + WHITESPACE " " + L_PAREN "(" + SELECT + SELECT_CLAUSE + SELECT_KW "select" + WHITESPACE " " + TARGET_LIST + TARGET + LITERAL + INT_NUMBER "1" + COMMA "," + WHITESPACE " " + TARGET + LITERAL + INT_NUMBER "2" + COMMA "," + WHITESPACE " " + TARGET + LITERAL + INT_NUMBER "3" + R_PAREN ")" + WHITESPACE "\n" + MERGE_KW "merge" + WHITESPACE " " + INTO_KW "into" + WHITESPACE " " + RELATION_NAME + PATH + PATH_SEGMENT + NAME_REF + IDENT "u" + WHITESPACE "\n " + USING_ON_CLAUSE + USING_KW "using" + WHITESPACE " " + FROM_ITEM + NAME_REF + IDENT "t" + WHITESPACE "\n " + ON_CLAUSE + ON_KW "on" + WHITESPACE " " + BIN_EXPR + FIELD_EXPR + NAME_REF + IDENT "t" + DOT "." + NAME_REF + IDENT "id" + WHITESPACE " " + EQ "=" + WHITESPACE " " + FIELD_EXPR + NAME_REF + IDENT "u" + DOT "." + NAME_REF + IDENT "id" + WHITESPACE "\n " + MERGE_WHEN_MATCHED + WHEN_KW "when" + WHITESPACE " " + MATCHED_KW "matched" + WHITESPACE " " + THEN_KW "then" + WHITESPACE "\n " + MERGE_DO_NOTHING + DO_KW "do" + WHITESPACE " " + NOTHING_KW "nothing" + SEMICOLON ";" + WHITESPACE "\n\n" + COMMENT "-- doc_example_1" + WHITESPACE "\n" + MERGE + MERGE_KW "MERGE" + WHITESPACE " " + INTO_KW "INTO" + WHITESPACE " " + RELATION_NAME + PATH + PATH_SEGMENT + NAME_REF + IDENT "customer_account" + WHITESPACE " " + ALIAS + NAME + IDENT "ca" + WHITESPACE "\n" + USING_ON_CLAUSE + USING_KW "USING" + WHITESPACE " " + FROM_ITEM + NAME_REF + IDENT "recent_transactions" + WHITESPACE " " + ALIAS + NAME + IDENT "t" + WHITESPACE "\n" + ON_CLAUSE + ON_KW "ON" + WHITESPACE " " + BIN_EXPR + FIELD_EXPR + NAME_REF + IDENT "t" + DOT "." + NAME_REF + IDENT "customer_id" + WHITESPACE " " + EQ "=" + WHITESPACE " " + FIELD_EXPR + NAME_REF + IDENT "ca" + DOT "." + NAME_REF + IDENT "customer_id" + WHITESPACE "\n" + MERGE_WHEN_MATCHED + WHEN_KW "WHEN" + WHITESPACE " " + MATCHED_KW "MATCHED" + WHITESPACE " " + THEN_KW "THEN" + WHITESPACE "\n " + MERGE_UPDATE + UPDATE_KW "UPDATE" + WHITESPACE " " + SET_CLAUSE + SET_KW "SET" + WHITESPACE " " + SET_COLUMN_LIST + SET_SINGLE_COLUMN + COLUMN + NAME_REF + IDENT "balance" + WHITESPACE " " + EQ "=" + WHITESPACE " " + SET_EXPR + BIN_EXPR + NAME_REF + IDENT "balance" + WHITESPACE " " + PLUS "+" + WHITESPACE " " + NAME_REF + IDENT "transaction_value" + WHITESPACE "\n" + MERGE_WHEN_NOT_MATCHED_TARGET + WHEN_KW "WHEN" + WHITESPACE " " + NOT_KW "NOT" + WHITESPACE " " + MATCHED_KW "MATCHED" + WHITESPACE " " + THEN_KW "THEN" + WHITESPACE "\n " + MERGE_INSERT + INSERT_KW "INSERT" + WHITESPACE " " + COLUMN_LIST + L_PAREN "(" + COLUMN + NAME_REF + IDENT "customer_id" + COMMA "," + WHITESPACE " " + COLUMN + NAME_REF + IDENT "balance" + R_PAREN ")" + WHITESPACE "\n " + VALUES + VALUES_KW "VALUES" + WHITESPACE " " + ROW_LIST + ROW + L_PAREN "(" + FIELD_EXPR + NAME_REF + IDENT "t" + DOT "." + NAME_REF + IDENT "customer_id" + COMMA "," + WHITESPACE " " + FIELD_EXPR + NAME_REF + IDENT "t" + DOT "." + NAME_REF + IDENT "transaction_value" + R_PAREN ")" + SEMICOLON ";" + WHITESPACE "\n\n" + COMMENT "-- doc_example_2" + WHITESPACE "\n" + MERGE + MERGE_KW "MERGE" + WHITESPACE " " + INTO_KW "INTO" + WHITESPACE " " + RELATION_NAME + PATH + PATH_SEGMENT + NAME_REF + IDENT "customer_account" + WHITESPACE " " + ALIAS + NAME + IDENT "ca" + WHITESPACE "\n" + USING_ON_CLAUSE + USING_KW "USING" + WHITESPACE " " + FROM_ITEM + PAREN_SELECT + L_PAREN "(" + SELECT + SELECT_CLAUSE + SELECT_KW "SELECT" + WHITESPACE " " + TARGET_LIST + TARGET + NAME_REF + IDENT "customer_id" + COMMA "," + WHITESPACE " " + TARGET + NAME_REF + IDENT "transaction_value" + WHITESPACE " " + FROM_CLAUSE + FROM_KW "FROM" + WHITESPACE " " + FROM_ITEM + NAME_REF + IDENT "recent_transactions" + R_PAREN ")" + WHITESPACE " " + ALIAS + AS_KW "AS" + WHITESPACE " " + NAME + IDENT "t" + WHITESPACE "\n" + ON_CLAUSE + ON_KW "ON" + WHITESPACE " " + BIN_EXPR + FIELD_EXPR + NAME_REF + IDENT "t" + DOT "." + NAME_REF + IDENT "customer_id" + WHITESPACE " " + EQ "=" + WHITESPACE " " + FIELD_EXPR + NAME_REF + IDENT "ca" + DOT "." + NAME_REF + IDENT "customer_id" + WHITESPACE "\n" + MERGE_WHEN_MATCHED + WHEN_KW "WHEN" + WHITESPACE " " + MATCHED_KW "MATCHED" + WHITESPACE " " + THEN_KW "THEN" + WHITESPACE "\n " + MERGE_UPDATE + UPDATE_KW "UPDATE" + WHITESPACE " " + SET_CLAUSE + SET_KW "SET" + WHITESPACE " " + SET_COLUMN_LIST + SET_SINGLE_COLUMN + COLUMN + NAME_REF + IDENT "balance" + WHITESPACE " " + EQ "=" + WHITESPACE " " + SET_EXPR + BIN_EXPR + NAME_REF + IDENT "balance" + WHITESPACE " " + PLUS "+" + WHITESPACE " " + NAME_REF + IDENT "transaction_value" + WHITESPACE "\n" + MERGE_WHEN_NOT_MATCHED_TARGET + WHEN_KW "WHEN" + WHITESPACE " " + NOT_KW "NOT" + WHITESPACE " " + MATCHED_KW "MATCHED" + WHITESPACE " " + THEN_KW "THEN" + WHITESPACE "\n " + MERGE_INSERT + INSERT_KW "INSERT" + WHITESPACE " " + COLUMN_LIST + L_PAREN "(" + COLUMN + NAME_REF + IDENT "customer_id" + COMMA "," + WHITESPACE " " + COLUMN + NAME_REF + IDENT "balance" + R_PAREN ")" + WHITESPACE "\n " + VALUES + VALUES_KW "VALUES" + WHITESPACE " " + ROW_LIST + ROW + L_PAREN "(" + FIELD_EXPR + NAME_REF + IDENT "t" + DOT "." + NAME_REF + IDENT "customer_id" + COMMA "," + WHITESPACE " " + FIELD_EXPR + NAME_REF + IDENT "t" + DOT "." + NAME_REF + IDENT "transaction_value" + R_PAREN ")" + SEMICOLON ";" + WHITESPACE "\n\n" + COMMENT "-- doc_example_3" + WHITESPACE "\n" + MERGE + MERGE_KW "MERGE" + WHITESPACE " " + INTO_KW "INTO" + WHITESPACE " " + RELATION_NAME + PATH + PATH_SEGMENT + NAME_REF + IDENT "wines" + WHITESPACE " " + ALIAS + NAME + IDENT "w" + WHITESPACE "\n" + USING_ON_CLAUSE + USING_KW "USING" + WHITESPACE " " + FROM_ITEM + NAME_REF + IDENT "wine_stock_changes" + WHITESPACE " " + ALIAS + NAME + IDENT "s" + WHITESPACE "\n" + ON_CLAUSE + ON_KW "ON" + WHITESPACE " " + BIN_EXPR + FIELD_EXPR + NAME_REF + IDENT "s" + DOT "." + NAME_REF + IDENT "winename" + WHITESPACE " " + EQ "=" + WHITESPACE " " + FIELD_EXPR + NAME_REF + IDENT "w" + DOT "." + NAME_REF + IDENT "winename" + WHITESPACE "\n" + MERGE_WHEN_NOT_MATCHED_TARGET + WHEN_KW "WHEN" + WHITESPACE " " + NOT_KW "NOT" + WHITESPACE " " + MATCHED_KW "MATCHED" + WHITESPACE " " + AND_KW "AND" + WHITESPACE " " + BIN_EXPR + FIELD_EXPR + NAME_REF + IDENT "s" + DOT "." + NAME_REF + IDENT "stock_delta" + WHITESPACE " " + R_ANGLE ">" + WHITESPACE " " + LITERAL + INT_NUMBER "0" + WHITESPACE " " + THEN_KW "THEN" + WHITESPACE "\n " + MERGE_INSERT + INSERT_KW "INSERT" + WHITESPACE " " + VALUES + VALUES_KW "VALUES" + ROW_LIST + ROW + L_PAREN "(" + FIELD_EXPR + NAME_REF + IDENT "s" + DOT "." + NAME_REF + IDENT "winename" + COMMA "," + WHITESPACE " " + FIELD_EXPR + NAME_REF + IDENT "s" + DOT "." + NAME_REF + IDENT "stock_delta" + R_PAREN ")" + WHITESPACE "\n" + MERGE_WHEN_MATCHED + WHEN_KW "WHEN" + WHITESPACE " " + MATCHED_KW "MATCHED" + WHITESPACE " " + AND_KW "AND" + WHITESPACE " " + BIN_EXPR + BIN_EXPR + FIELD_EXPR + NAME_REF + IDENT "w" + DOT "." + NAME_REF + IDENT "stock" + WHITESPACE " " + PLUS "+" + WHITESPACE " " + FIELD_EXPR + NAME_REF + IDENT "s" + DOT "." + NAME_REF + IDENT "stock_delta" + WHITESPACE " " + R_ANGLE ">" + WHITESPACE " " + LITERAL + INT_NUMBER "0" + WHITESPACE " " + THEN_KW "THEN" + WHITESPACE "\n " + MERGE_UPDATE + UPDATE_KW "UPDATE" + WHITESPACE " " + SET_CLAUSE + SET_KW "SET" + WHITESPACE " " + SET_COLUMN_LIST + SET_SINGLE_COLUMN + COLUMN + NAME_REF + IDENT "stock" + WHITESPACE " " + EQ "=" + WHITESPACE " " + SET_EXPR + BIN_EXPR + FIELD_EXPR + NAME_REF + IDENT "w" + DOT "." + NAME_REF + IDENT "stock" + WHITESPACE " " + PLUS "+" + WHITESPACE " " + FIELD_EXPR + NAME_REF + IDENT "s" + DOT "." + NAME_REF + IDENT "stock_delta" + WHITESPACE "\n" + MERGE_WHEN_MATCHED + WHEN_KW "WHEN" + WHITESPACE " " + MATCHED_KW "MATCHED" + WHITESPACE " " + THEN_KW "THEN" + WHITESPACE "\n " + MERGE_DELETE + DELETE_KW "DELETE" + WHITESPACE "\n" + RETURNING_CLAUSE + RETURNING_KW "RETURNING" + WHITESPACE " " + TARGET_LIST + TARGET + CALL_EXPR + NAME_REF + MERGE_ACTION_KW "merge_action" + ARG_LIST + L_PAREN "(" + R_PAREN ")" + COMMA "," + WHITESPACE " " + TARGET + FIELD_EXPR + NAME_REF + IDENT "w" + DOT "." + STAR "*" + SEMICOLON ";" + WHITESPACE "\n\n" + COMMENT "-- doc_example_4" + WHITESPACE "\n" + MERGE + MERGE_KW "MERGE" + WHITESPACE " " + INTO_KW "INTO" + WHITESPACE " " + RELATION_NAME + PATH + PATH_SEGMENT + NAME_REF + IDENT "wines" + WHITESPACE " " + ALIAS + NAME + IDENT "w" + WHITESPACE "\n" + USING_ON_CLAUSE + USING_KW "USING" + WHITESPACE " " + FROM_ITEM + NAME_REF + IDENT "new_wine_list" + WHITESPACE " " + ALIAS + NAME + IDENT "s" + WHITESPACE "\n" + ON_CLAUSE + ON_KW "ON" + WHITESPACE " " + BIN_EXPR + FIELD_EXPR + NAME_REF + IDENT "s" + DOT "." + NAME_REF + IDENT "winename" + WHITESPACE " " + EQ "=" + WHITESPACE " " + FIELD_EXPR + NAME_REF + IDENT "w" + DOT "." + NAME_REF + IDENT "winename" + WHITESPACE "\n" + MERGE_WHEN_NOT_MATCHED_TARGET + WHEN_KW "WHEN" + WHITESPACE " " + NOT_KW "NOT" + WHITESPACE " " + MATCHED_KW "MATCHED" + WHITESPACE " " + BY_KW "BY" + WHITESPACE " " + TARGET_KW "TARGET" + WHITESPACE " " + THEN_KW "THEN" + WHITESPACE "\n " + MERGE_INSERT + INSERT_KW "INSERT" + WHITESPACE " " + VALUES + VALUES_KW "VALUES" + ROW_LIST + ROW + L_PAREN "(" + FIELD_EXPR + NAME_REF + IDENT "s" + DOT "." + NAME_REF + IDENT "winename" + COMMA "," + WHITESPACE " " + FIELD_EXPR + NAME_REF + IDENT "s" + DOT "." + NAME_REF + IDENT "stock" + R_PAREN ")" + WHITESPACE "\n" + MERGE_WHEN_MATCHED + WHEN_KW "WHEN" + WHITESPACE " " + MATCHED_KW "MATCHED" + WHITESPACE " " + AND_KW "AND" + WHITESPACE " " + BIN_EXPR + FIELD_EXPR + NAME_REF + IDENT "w" + DOT "." + NAME_REF + IDENT "stock" + WHITESPACE " " + NEQ "!=" + WHITESPACE " " + FIELD_EXPR + NAME_REF + IDENT "s" + DOT "." + NAME_REF + IDENT "stock" + WHITESPACE " " + THEN_KW "THEN" + WHITESPACE "\n " + MERGE_UPDATE + UPDATE_KW "UPDATE" + WHITESPACE " " + SET_CLAUSE + SET_KW "SET" + WHITESPACE " " + SET_COLUMN_LIST + SET_SINGLE_COLUMN + COLUMN + NAME_REF + IDENT "stock" + WHITESPACE " " + EQ "=" + WHITESPACE " " + SET_EXPR + FIELD_EXPR + NAME_REF + IDENT "s" + DOT "." + NAME_REF + IDENT "stock" + WHITESPACE "\n" + MERGE_WHEN_NOT_MATCHED_SOURCE + WHEN_KW "WHEN" + WHITESPACE " " + NOT_KW "NOT" + WHITESPACE " " + MATCHED_KW "MATCHED" + WHITESPACE " " + BY_KW "BY" + WHITESPACE " " + SOURCE_KW "SOURCE" + WHITESPACE " " + THEN_KW "THEN" + WHITESPACE "\n " + MERGE_DELETE + DELETE_KW "DELETE" + SEMICOLON ";" + WHITESPACE "\n\n" + COMMENT "-- cross_join_data_source" + WHITESPACE "\n" + MERGE + MERGE_KW "merge" + WHITESPACE " " + INTO_KW "into" + WHITESPACE " " + RELATION_NAME + PATH + PATH_SEGMENT + NAME_REF + IDENT "t" + WHITESPACE "\n " + USING_ON_CLAUSE + USING_KW "using" + WHITESPACE " " + JOIN_EXPR + FROM_ITEM + NAME_REF + IDENT "u" + WHITESPACE " " + JOIN + JOIN_CROSS + CROSS_KW "cross" + WHITESPACE " " + JOIN_KW "join" + WHITESPACE " " + FROM_ITEM + NAME_REF + IDENT "v" + WHITESPACE "\n " + ON_CLAUSE + ON_KW "on" + WHITESPACE " " + BIN_EXPR + FIELD_EXPR + NAME_REF + IDENT "t" + DOT "." + NAME_REF + IDENT "id" + WHITESPACE " " + EQ "=" + WHITESPACE " " + FIELD_EXPR + NAME_REF + IDENT "u" + DOT "." + NAME_REF + IDENT "id" + WHITESPACE "\n " + MERGE_WHEN_MATCHED + WHEN_KW "when" + WHITESPACE " " + MATCHED_KW "matched" + WHITESPACE " " + THEN_KW "then" + WHITESPACE "\n " + MERGE_DO_NOTHING + DO_KW "do" + WHITESPACE " " + NOTHING_KW "nothing" + SEMICOLON ";" + WHITESPACE "\n\n" + COMMENT "-- natural join" + WHITESPACE "\n" + MERGE + MERGE_KW "merge" + WHITESPACE " " + INTO_KW "into" + WHITESPACE " " + RELATION_NAME + PATH + PATH_SEGMENT + NAME_REF + IDENT "t" + WHITESPACE "\n " + USING_ON_CLAUSE + USING_KW "using" + WHITESPACE " " + JOIN_EXPR + FROM_ITEM + NAME_REF + IDENT "u" + WHITESPACE " " + JOIN + NATURAL_KW "natural" + WHITESPACE " " + JOIN_INNER + JOIN_KW "join" + WHITESPACE " " + FROM_ITEM + NAME_REF + IDENT "v" + WHITESPACE "\n " + ON_CLAUSE + ON_KW "on" + WHITESPACE " " + BIN_EXPR + FIELD_EXPR + NAME_REF + IDENT "t" + DOT "." + NAME_REF + IDENT "id" + WHITESPACE " " + EQ "=" + WHITESPACE " " + FIELD_EXPR + NAME_REF + IDENT "u" + DOT "." + NAME_REF + IDENT "id" + WHITESPACE "\n " + MERGE_WHEN_MATCHED + WHEN_KW "when" + WHITESPACE " " + MATCHED_KW "matched" + WHITESPACE " " + THEN_KW "then" + WHITESPACE "\n " + MERGE_DO_NOTHING + DO_KW "do" + WHITESPACE " " + NOTHING_KW "nothing" + SEMICOLON ";" WHITESPACE "\n" diff --git a/crates/squawk_parser/tests/snapshots/tests__merge_pg17_ok.snap b/crates/squawk_parser/tests/snapshots/tests__merge_pg17_ok.snap deleted file mode 100644 index b0d12713..00000000 --- a/crates/squawk_parser/tests/snapshots/tests__merge_pg17_ok.snap +++ /dev/null @@ -1,1749 +0,0 @@ ---- -source: crates/squawk_parser/tests/tests.rs -input_file: crates/squawk_parser/tests/data/ok/merge_pg17.sql ---- -SOURCE_FILE - WHITESPACE "\n" - COMMENT "-- when_clauses_all" - WHITESPACE "\n" - MERGE - MERGE_KW "merge" - WHITESPACE " " - INTO_KW "into" - WHITESPACE " " - RELATION_NAME - PATH - PATH_SEGMENT - NAME_REF - IDENT "t" - WHITESPACE "\n " - USING_ON_CLAUSE - USING_KW "using" - WHITESPACE " " - FROM_ITEM - NAME_REF - IDENT "u" - WHITESPACE "\n " - ON_CLAUSE - ON_KW "on" - WHITESPACE " " - BIN_EXPR - FIELD_EXPR - NAME_REF - IDENT "t" - DOT "." - NAME_REF - IDENT "id" - WHITESPACE " " - EQ "=" - WHITESPACE " " - FIELD_EXPR - NAME_REF - IDENT "u" - DOT "." - NAME_REF - IDENT "id" - WHITESPACE "\n " - MERGE_WHEN_NOT_MATCHED_TARGET - WHEN_KW "when" - WHITESPACE " " - NOT_KW "not" - WHITESPACE " " - MATCHED_KW "matched" - WHITESPACE " " - THEN_KW "then" - WHITESPACE "\n " - MERGE_DO_NOTHING - DO_KW "do" - WHITESPACE " " - NOTHING_KW "nothing" - WHITESPACE "\n " - MERGE_WHEN_MATCHED - WHEN_KW "when" - WHITESPACE " " - MATCHED_KW "matched" - WHITESPACE " " - THEN_KW "then" - WHITESPACE " \n " - MERGE_DO_NOTHING - DO_KW "do" - WHITESPACE " " - NOTHING_KW "nothing" - WHITESPACE "\n " - MERGE_WHEN_NOT_MATCHED_SOURCE - WHEN_KW "when" - WHITESPACE " " - NOT_KW "not" - WHITESPACE " " - MATCHED_KW "matched" - WHITESPACE " " - BY_KW "by" - WHITESPACE " " - SOURCE_KW "source" - WHITESPACE " " - THEN_KW "then" - WHITESPACE "\n " - MERGE_DO_NOTHING - DO_KW "do" - WHITESPACE " " - NOTHING_KW "nothing" - SEMICOLON ";" - WHITESPACE "\n\n" - COMMENT "-- when_clauses_all_with_conditions" - WHITESPACE "\n" - MERGE - MERGE_KW "merge" - WHITESPACE " " - INTO_KW "into" - WHITESPACE " " - RELATION_NAME - PATH - PATH_SEGMENT - NAME_REF - IDENT "t" - WHITESPACE "\n " - USING_ON_CLAUSE - USING_KW "using" - WHITESPACE " " - FROM_ITEM - NAME_REF - IDENT "u" - WHITESPACE " " - ON_CLAUSE - ON_KW "on" - WHITESPACE " " - LITERAL - TRUE_KW "true" - WHITESPACE "\n " - MERGE_WHEN_MATCHED - WHEN_KW "when" - WHITESPACE " " - MATCHED_KW "matched" - WHITESPACE " " - AND_KW "and" - WHITESPACE " " - BIN_EXPR - NAME_REF - IDENT "foo" - WHITESPACE " " - EQ "=" - WHITESPACE " " - NAME_REF - IDENT "bar" - WHITESPACE " " - THEN_KW "then" - WHITESPACE "\n " - MERGE_DO_NOTHING - DO_KW "do" - WHITESPACE " " - NOTHING_KW "nothing" - WHITESPACE "\n " - MERGE_WHEN_NOT_MATCHED_SOURCE - WHEN_KW "when" - WHITESPACE " " - NOT_KW "not" - WHITESPACE " " - MATCHED_KW "matched" - WHITESPACE " " - BY_KW "by" - WHITESPACE " " - SOURCE_KW "source" - WHITESPACE " " - AND_KW "and" - WHITESPACE " " - BIN_EXPR - NAME_REF - IDENT "bar" - WHITESPACE " " - EQ "=" - WHITESPACE " " - NAME_REF - IDENT "foo" - WHITESPACE " " - THEN_KW "then" - WHITESPACE "\n " - MERGE_DO_NOTHING - DO_KW "do" - WHITESPACE " " - NOTHING_KW "nothing" - WHITESPACE "\n " - MERGE_WHEN_NOT_MATCHED_TARGET - WHEN_KW "when" - WHITESPACE " " - NOT_KW "not" - WHITESPACE " " - MATCHED_KW "matched" - WHITESPACE " " - AND_KW "and" - WHITESPACE " " - BIN_EXPR - NAME_REF - IDENT "buzz" - WHITESPACE " " - EQ "=" - WHITESPACE " " - NAME_REF - IDENT "bar" - WHITESPACE " " - THEN_KW "then" - WHITESPACE " \n " - MERGE_DO_NOTHING - DO_KW "do" - WHITESPACE " " - NOTHING_KW "nothing" - SEMICOLON ";" - WHITESPACE "\n\n" - COMMENT "-- returning_all" - WHITESPACE "\n" - MERGE - MERGE_KW "merge" - WHITESPACE " " - INTO_KW "into" - WHITESPACE " " - RELATION_NAME - PATH - PATH_SEGMENT - NAME_REF - IDENT "t" - WHITESPACE "\n " - USING_ON_CLAUSE - USING_KW "using" - WHITESPACE " " - FROM_ITEM - NAME_REF - IDENT "u" - WHITESPACE "\n " - ON_CLAUSE - ON_KW "on" - WHITESPACE " " - BIN_EXPR - FIELD_EXPR - NAME_REF - IDENT "t" - DOT "." - NAME_REF - IDENT "id" - WHITESPACE " " - EQ "=" - WHITESPACE " " - FIELD_EXPR - NAME_REF - IDENT "u" - DOT "." - NAME_REF - IDENT "id" - WHITESPACE "\n " - MERGE_WHEN_NOT_MATCHED_TARGET - WHEN_KW "when" - WHITESPACE " " - NOT_KW "not" - WHITESPACE " " - MATCHED_KW "matched" - WHITESPACE " " - THEN_KW "then" - WHITESPACE "\n " - MERGE_DO_NOTHING - DO_KW "do" - WHITESPACE " " - NOTHING_KW "nothing" - WHITESPACE "\n " - MERGE_WHEN_MATCHED - WHEN_KW "when" - WHITESPACE " " - MATCHED_KW "matched" - WHITESPACE " " - THEN_KW "then" - WHITESPACE " \n " - MERGE_DO_NOTHING - DO_KW "do" - WHITESPACE " " - NOTHING_KW "nothing" - WHITESPACE "\n " - MERGE_WHEN_NOT_MATCHED_SOURCE - WHEN_KW "when" - WHITESPACE " " - NOT_KW "not" - WHITESPACE " " - MATCHED_KW "matched" - WHITESPACE " " - BY_KW "by" - WHITESPACE " " - SOURCE_KW "source" - WHITESPACE " " - THEN_KW "then" - WHITESPACE "\n " - MERGE_DO_NOTHING - DO_KW "do" - WHITESPACE " " - NOTHING_KW "nothing" - WHITESPACE "\n " - RETURNING_CLAUSE - RETURNING_KW "returning" - WHITESPACE " " - TARGET_LIST - TARGET - STAR "*" - SEMICOLON ";" - WHITESPACE "\n\n" - COMMENT "-- returning_many" - WHITESPACE "\n" - MERGE - MERGE_KW "merge" - WHITESPACE " " - INTO_KW "into" - WHITESPACE " " - RELATION_NAME - PATH - PATH_SEGMENT - NAME_REF - IDENT "t" - WHITESPACE "\n " - USING_ON_CLAUSE - USING_KW "using" - WHITESPACE " " - FROM_ITEM - NAME_REF - IDENT "u" - WHITESPACE "\n " - ON_CLAUSE - ON_KW "on" - WHITESPACE " " - BIN_EXPR - FIELD_EXPR - NAME_REF - IDENT "t" - DOT "." - NAME_REF - IDENT "id" - WHITESPACE " " - EQ "=" - WHITESPACE " " - FIELD_EXPR - NAME_REF - IDENT "u" - DOT "." - NAME_REF - IDENT "id" - WHITESPACE "\n " - MERGE_WHEN_NOT_MATCHED_TARGET - WHEN_KW "when" - WHITESPACE " " - NOT_KW "not" - WHITESPACE " " - MATCHED_KW "matched" - WHITESPACE " " - THEN_KW "then" - WHITESPACE "\n " - MERGE_DO_NOTHING - DO_KW "do" - WHITESPACE " " - NOTHING_KW "nothing" - WHITESPACE "\n " - MERGE_WHEN_MATCHED - WHEN_KW "when" - WHITESPACE " " - MATCHED_KW "matched" - WHITESPACE " " - THEN_KW "then" - WHITESPACE " \n " - MERGE_DO_NOTHING - DO_KW "do" - WHITESPACE " " - NOTHING_KW "nothing" - WHITESPACE "\n " - MERGE_WHEN_NOT_MATCHED_SOURCE - WHEN_KW "when" - WHITESPACE " " - NOT_KW "not" - WHITESPACE " " - MATCHED_KW "matched" - WHITESPACE " " - BY_KW "by" - WHITESPACE " " - SOURCE_KW "source" - WHITESPACE " " - THEN_KW "then" - WHITESPACE "\n " - MERGE_DO_NOTHING - DO_KW "do" - WHITESPACE " " - NOTHING_KW "nothing" - WHITESPACE "\n " - RETURNING_CLAUSE - RETURNING_KW "returning" - WHITESPACE " " - TARGET_LIST - TARGET - STAR "*" - COMMA "," - WHITESPACE " " - TARGET - NAME_REF - IDENT "u" - WHITESPACE " " - AS_NAME - AS_KW "as" - WHITESPACE " " - NAME - IDENT "bar" - COMMA "," - WHITESPACE " " - TARGET - NAME_REF - IDENT "t" - WHITESPACE " " - AS_NAME - NAME - IDENT "b" - COMMA "," - WHITESPACE " " - TARGET - CALL_EXPR - NAME_REF - MERGE_ACTION_KW "merge_action" - ARG_LIST - L_PAREN "(" - R_PAREN ")" - COMMA "," - WHITESPACE " " - TARGET - FIELD_EXPR - NAME_REF - IDENT "t" - DOT "." - STAR "*" - SEMICOLON ";" - WHITESPACE "\n\n" - COMMENT "-- merge_insert_simple" - WHITESPACE "\n" - MERGE - MERGE_KW "merge" - WHITESPACE " " - INTO_KW "into" - WHITESPACE " " - RELATION_NAME - PATH - PATH_SEGMENT - NAME_REF - IDENT "t" - WHITESPACE "\n " - USING_ON_CLAUSE - USING_KW "using" - WHITESPACE " " - FROM_ITEM - NAME_REF - IDENT "u" - WHITESPACE "\n " - ON_CLAUSE - ON_KW "on" - WHITESPACE " " - BIN_EXPR - FIELD_EXPR - NAME_REF - IDENT "t" - DOT "." - NAME_REF - IDENT "id" - WHITESPACE " " - EQ "=" - WHITESPACE " " - FIELD_EXPR - NAME_REF - IDENT "u" - DOT "." - NAME_REF - IDENT "id" - WHITESPACE "\n " - MERGE_WHEN_NOT_MATCHED_TARGET - WHEN_KW "when" - WHITESPACE " " - NOT_KW "not" - WHITESPACE " " - MATCHED_KW "matched" - WHITESPACE " " - THEN_KW "then" - WHITESPACE "\n " - MERGE_INSERT - INSERT_KW "insert" - WHITESPACE "\n " - DEFAULT_KW "default" - WHITESPACE " " - VALUES_KW "values" - SEMICOLON ";" - WHITESPACE "\n\n" - COMMENT "-- merge_insert_default" - WHITESPACE "\n" - MERGE - MERGE_KW "merge" - WHITESPACE " " - INTO_KW "into" - WHITESPACE " " - RELATION_NAME - PATH - PATH_SEGMENT - NAME_REF - IDENT "t" - WHITESPACE "\n " - USING_ON_CLAUSE - USING_KW "using" - WHITESPACE " " - FROM_ITEM - NAME_REF - IDENT "u" - WHITESPACE "\n " - ON_CLAUSE - ON_KW "on" - WHITESPACE " " - BIN_EXPR - FIELD_EXPR - NAME_REF - IDENT "t" - DOT "." - NAME_REF - IDENT "id" - WHITESPACE " " - EQ "=" - WHITESPACE " " - FIELD_EXPR - NAME_REF - IDENT "u" - DOT "." - NAME_REF - IDENT "id" - WHITESPACE "\n " - MERGE_WHEN_NOT_MATCHED_TARGET - WHEN_KW "when" - WHITESPACE " " - NOT_KW "not" - WHITESPACE " " - MATCHED_KW "matched" - WHITESPACE " " - THEN_KW "then" - WHITESPACE "\n " - MERGE_INSERT - INSERT_KW "insert" - WHITESPACE " " - COLUMN_LIST - L_PAREN "(" - COLUMN - NAME_REF - IDENT "a" - COMMA "," - WHITESPACE " " - COLUMN - NAME_REF - IDENT "b" - COMMA "," - WHITESPACE " " - COLUMN - NAME_REF - IDENT "c" - R_PAREN ")" - WHITESPACE "\n " - OVERRIDING_KW "overriding" - WHITESPACE " " - USER_KW "user" - WHITESPACE " " - VALUE_KW "value" - WHITESPACE "\n " - DEFAULT_KW "default" - WHITESPACE " " - VALUES_KW "values" - SEMICOLON ";" - WHITESPACE "\n\n" - COMMENT "-- merge_insert_values" - WHITESPACE "\n" - MERGE - MERGE_KW "merge" - WHITESPACE " " - INTO_KW "into" - WHITESPACE " " - RELATION_NAME - PATH - PATH_SEGMENT - NAME_REF - IDENT "t" - WHITESPACE "\n " - USING_ON_CLAUSE - USING_KW "using" - WHITESPACE " " - FROM_ITEM - NAME_REF - IDENT "u" - WHITESPACE "\n " - ON_CLAUSE - ON_KW "on" - WHITESPACE " " - BIN_EXPR - FIELD_EXPR - NAME_REF - IDENT "t" - DOT "." - NAME_REF - IDENT "id" - WHITESPACE " " - EQ "=" - WHITESPACE " " - FIELD_EXPR - NAME_REF - IDENT "u" - DOT "." - NAME_REF - IDENT "id" - WHITESPACE "\n " - MERGE_WHEN_NOT_MATCHED_TARGET - WHEN_KW "when" - WHITESPACE " " - NOT_KW "not" - WHITESPACE " " - MATCHED_KW "matched" - WHITESPACE " " - THEN_KW "then" - WHITESPACE "\n " - MERGE_INSERT - INSERT_KW "insert" - WHITESPACE "\n " - OVERRIDING_KW "overriding" - WHITESPACE " " - SYSTEM_KW "system" - WHITESPACE " " - VALUE_KW "value" - WHITESPACE "\n " - VALUES - VALUES_KW "values" - WHITESPACE " " - ROW_LIST - ROW - L_PAREN "(" - LITERAL - INT_NUMBER "1" - COMMA "," - WHITESPACE " " - LITERAL - INT_NUMBER "2" - COMMA "," - WHITESPACE " " - LITERAL - DEFAULT_KW "default" - COMMA "," - WHITESPACE " " - LITERAL - INT_NUMBER "3" - COMMA "," - WHITESPACE " " - BIN_EXPR - BIN_EXPR - LITERAL - INT_NUMBER "10" - WHITESPACE " " - STAR "*" - WHITESPACE " " - LITERAL - INT_NUMBER "10" - WHITESPACE " " - PLUS "+" - WHITESPACE " " - LITERAL - INT_NUMBER "2" - R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n\n" - COMMENT "-- merge_update" - WHITESPACE "\n" - MERGE - MERGE_KW "merge" - WHITESPACE " " - INTO_KW "into" - WHITESPACE " " - RELATION_NAME - PATH - PATH_SEGMENT - NAME_REF - IDENT "t" - WHITESPACE "\n " - USING_ON_CLAUSE - USING_KW "using" - WHITESPACE " " - FROM_ITEM - NAME_REF - IDENT "u" - WHITESPACE "\n " - ON_CLAUSE - ON_KW "on" - WHITESPACE " " - BIN_EXPR - FIELD_EXPR - NAME_REF - IDENT "t" - DOT "." - NAME_REF - IDENT "id" - WHITESPACE " " - EQ "=" - WHITESPACE " " - FIELD_EXPR - NAME_REF - IDENT "u" - DOT "." - NAME_REF - IDENT "id" - WHITESPACE "\n " - MERGE_WHEN_MATCHED - WHEN_KW "when" - WHITESPACE " " - MATCHED_KW "matched" - WHITESPACE " " - THEN_KW "then" - WHITESPACE "\n " - MERGE_UPDATE - UPDATE_KW "update" - WHITESPACE " " - SET_CLAUSE - SET_KW "set" - WHITESPACE "\n " - SET_COLUMN_LIST - SET_SINGLE_COLUMN - COLUMN - NAME_REF - IDENT "a" - WHITESPACE " " - EQ "=" - WHITESPACE " " - SET_EXPR - DEFAULT_KW "default" - COMMA "," - WHITESPACE "\n " - SET_SINGLE_COLUMN - COLUMN - NAME_REF - IDENT "b" - WHITESPACE " " - EQ "=" - WHITESPACE " " - SET_EXPR - LITERAL - INT_NUMBER "1" - COMMA "," - WHITESPACE "\n " - SET_SINGLE_COLUMN - COLUMN - NAME_REF - IDENT "c" - WHITESPACE " " - EQ "=" - WHITESPACE " " - SET_EXPR - NAME_REF - IDENT "d" - COMMA "," - WHITESPACE "\n " - SET_SINGLE_COLUMN - COLUMN - NAME_REF - IDENT "e" - WHITESPACE " " - EQ "=" - WHITESPACE " " - SET_EXPR - PAREN_EXPR - L_PAREN "(" - SELECT - SELECT_CLAUSE - SELECT_KW "select" - WHITESPACE " " - TARGET_LIST - TARGET - LITERAL - INT_NUMBER "1" - R_PAREN ")" - COMMA "," - WHITESPACE "\n " - SET_SINGLE_COLUMN - COLUMN - NAME_REF - IDENT "f" - WHITESPACE " " - EQ "=" - WHITESPACE " " - SET_EXPR - CALL_EXPR - NAME_REF - ROW_KW "row" - ARG_LIST - L_PAREN "(" - LITERAL - INT_NUMBER "1" - COMMA "," - WHITESPACE " " - LITERAL - INT_NUMBER "2" - COMMA "," - WHITESPACE " " - LITERAL - DEFAULT_KW "default" - R_PAREN ")" - COMMA "," - WHITESPACE "\n " - SET_SINGLE_COLUMN - COLUMN - NAME_REF - IDENT "g" - WHITESPACE " " - EQ "=" - WHITESPACE " " - SET_EXPR - TUPLE_EXPR - L_PAREN "(" - LITERAL - INT_NUMBER "1" - COMMA "," - WHITESPACE " " - LITERAL - INT_NUMBER "2" - COMMA "," - WHITESPACE " " - LITERAL - DEFAULT_KW "default" - R_PAREN ")" - COMMA "," - WHITESPACE "\n " - SET_SINGLE_COLUMN - COLUMN - NAME_REF - IDENT "h" - WHITESPACE " " - EQ "=" - WHITESPACE " " - SET_EXPR - PAREN_EXPR - L_PAREN "(" - LITERAL - DEFAULT_KW "default" - R_PAREN ")" - WHITESPACE "\n " - MERGE_WHEN_NOT_MATCHED_SOURCE - WHEN_KW "when" - WHITESPACE " " - NOT_KW "not" - WHITESPACE " " - MATCHED_KW "matched" - WHITESPACE " " - BY_KW "by" - WHITESPACE " " - SOURCE_KW "source" - WHITESPACE " " - THEN_KW "then" - WHITESPACE "\n " - MERGE_UPDATE - UPDATE_KW "update" - WHITESPACE " " - SET_CLAUSE - SET_KW "set" - WHITESPACE " " - SET_COLUMN_LIST - SET_SINGLE_COLUMN - COLUMN - NAME_REF - IDENT "foo" - WHITESPACE " " - EQ "=" - WHITESPACE " " - SET_EXPR - NAME_REF - IDENT "bar" - SEMICOLON ";" - WHITESPACE "\n\n" - COMMENT "-- merge_delete" - WHITESPACE "\n" - MERGE - MERGE_KW "merge" - WHITESPACE " " - INTO_KW "into" - WHITESPACE " " - RELATION_NAME - PATH - PATH_SEGMENT - NAME_REF - IDENT "t" - WHITESPACE "\n " - USING_ON_CLAUSE - USING_KW "using" - WHITESPACE " " - FROM_ITEM - NAME_REF - IDENT "u" - WHITESPACE "\n " - ON_CLAUSE - ON_KW "on" - WHITESPACE " " - BIN_EXPR - FIELD_EXPR - NAME_REF - IDENT "t" - DOT "." - NAME_REF - IDENT "id" - WHITESPACE " " - EQ "=" - WHITESPACE " " - FIELD_EXPR - NAME_REF - IDENT "u" - DOT "." - NAME_REF - IDENT "id" - WHITESPACE "\n " - MERGE_WHEN_MATCHED - WHEN_KW "when" - WHITESPACE " " - MATCHED_KW "matched" - WHITESPACE " " - THEN_KW "then" - WHITESPACE "\n " - MERGE_DELETE - DELETE_KW "delete" - WHITESPACE "\n " - MERGE_WHEN_NOT_MATCHED_SOURCE - WHEN_KW "when" - WHITESPACE " " - NOT_KW "not" - WHITESPACE " " - MATCHED_KW "matched" - WHITESPACE " " - BY_KW "by" - WHITESPACE " " - SOURCE_KW "source" - WHITESPACE " " - THEN_KW "then" - WHITESPACE "\n " - MERGE_DELETE - DELETE_KW "delete" - SEMICOLON ";" - WHITESPACE "\n\n" - COMMENT "-- with_select" - WHITESPACE "\n" - MERGE - WITH_CLAUSE - WITH_KW "with" - WHITESPACE " " - WITH_TABLE - NAME - IDENT "t" - WHITESPACE " " - AS_KW "as" - WHITESPACE " " - L_PAREN "(" - SELECT - SELECT_CLAUSE - SELECT_KW "select" - WHITESPACE " " - TARGET_LIST - TARGET - LITERAL - INT_NUMBER "1" - COMMA "," - WHITESPACE " " - TARGET - LITERAL - INT_NUMBER "2" - COMMA "," - WHITESPACE " " - TARGET - LITERAL - INT_NUMBER "3" - R_PAREN ")" - WHITESPACE "\n" - MERGE_KW "merge" - WHITESPACE " " - INTO_KW "into" - WHITESPACE " " - RELATION_NAME - PATH - PATH_SEGMENT - NAME_REF - IDENT "u" - WHITESPACE "\n " - USING_ON_CLAUSE - USING_KW "using" - WHITESPACE " " - FROM_ITEM - NAME_REF - IDENT "t" - WHITESPACE "\n " - ON_CLAUSE - ON_KW "on" - WHITESPACE " " - BIN_EXPR - FIELD_EXPR - NAME_REF - IDENT "t" - DOT "." - NAME_REF - IDENT "id" - WHITESPACE " " - EQ "=" - WHITESPACE " " - FIELD_EXPR - NAME_REF - IDENT "u" - DOT "." - NAME_REF - IDENT "id" - WHITESPACE "\n " - MERGE_WHEN_MATCHED - WHEN_KW "when" - WHITESPACE " " - MATCHED_KW "matched" - WHITESPACE " " - THEN_KW "then" - WHITESPACE "\n " - MERGE_DO_NOTHING - DO_KW "do" - WHITESPACE " " - NOTHING_KW "nothing" - SEMICOLON ";" - WHITESPACE "\n\n" - COMMENT "-- doc_example_1" - WHITESPACE "\n" - MERGE - MERGE_KW "MERGE" - WHITESPACE " " - INTO_KW "INTO" - WHITESPACE " " - RELATION_NAME - PATH - PATH_SEGMENT - NAME_REF - IDENT "customer_account" - WHITESPACE " " - ALIAS - NAME - IDENT "ca" - WHITESPACE "\n" - USING_ON_CLAUSE - USING_KW "USING" - WHITESPACE " " - FROM_ITEM - NAME_REF - IDENT "recent_transactions" - WHITESPACE " " - ALIAS - NAME - IDENT "t" - WHITESPACE "\n" - ON_CLAUSE - ON_KW "ON" - WHITESPACE " " - BIN_EXPR - FIELD_EXPR - NAME_REF - IDENT "t" - DOT "." - NAME_REF - IDENT "customer_id" - WHITESPACE " " - EQ "=" - WHITESPACE " " - FIELD_EXPR - NAME_REF - IDENT "ca" - DOT "." - NAME_REF - IDENT "customer_id" - WHITESPACE "\n" - MERGE_WHEN_MATCHED - WHEN_KW "WHEN" - WHITESPACE " " - MATCHED_KW "MATCHED" - WHITESPACE " " - THEN_KW "THEN" - WHITESPACE "\n " - MERGE_UPDATE - UPDATE_KW "UPDATE" - WHITESPACE " " - SET_CLAUSE - SET_KW "SET" - WHITESPACE " " - SET_COLUMN_LIST - SET_SINGLE_COLUMN - COLUMN - NAME_REF - IDENT "balance" - WHITESPACE " " - EQ "=" - WHITESPACE " " - SET_EXPR - BIN_EXPR - NAME_REF - IDENT "balance" - WHITESPACE " " - PLUS "+" - WHITESPACE " " - NAME_REF - IDENT "transaction_value" - WHITESPACE "\n" - MERGE_WHEN_NOT_MATCHED_TARGET - WHEN_KW "WHEN" - WHITESPACE " " - NOT_KW "NOT" - WHITESPACE " " - MATCHED_KW "MATCHED" - WHITESPACE " " - THEN_KW "THEN" - WHITESPACE "\n " - MERGE_INSERT - INSERT_KW "INSERT" - WHITESPACE " " - COLUMN_LIST - L_PAREN "(" - COLUMN - NAME_REF - IDENT "customer_id" - COMMA "," - WHITESPACE " " - COLUMN - NAME_REF - IDENT "balance" - R_PAREN ")" - WHITESPACE "\n " - VALUES - VALUES_KW "VALUES" - WHITESPACE " " - ROW_LIST - ROW - L_PAREN "(" - FIELD_EXPR - NAME_REF - IDENT "t" - DOT "." - NAME_REF - IDENT "customer_id" - COMMA "," - WHITESPACE " " - FIELD_EXPR - NAME_REF - IDENT "t" - DOT "." - NAME_REF - IDENT "transaction_value" - R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n\n" - COMMENT "-- doc_example_2" - WHITESPACE "\n" - MERGE - MERGE_KW "MERGE" - WHITESPACE " " - INTO_KW "INTO" - WHITESPACE " " - RELATION_NAME - PATH - PATH_SEGMENT - NAME_REF - IDENT "customer_account" - WHITESPACE " " - ALIAS - NAME - IDENT "ca" - WHITESPACE "\n" - USING_ON_CLAUSE - USING_KW "USING" - WHITESPACE " " - FROM_ITEM - PAREN_SELECT - L_PAREN "(" - SELECT - SELECT_CLAUSE - SELECT_KW "SELECT" - WHITESPACE " " - TARGET_LIST - TARGET - NAME_REF - IDENT "customer_id" - COMMA "," - WHITESPACE " " - TARGET - NAME_REF - IDENT "transaction_value" - WHITESPACE " " - FROM_CLAUSE - FROM_KW "FROM" - WHITESPACE " " - FROM_ITEM - NAME_REF - IDENT "recent_transactions" - R_PAREN ")" - WHITESPACE " " - ALIAS - AS_KW "AS" - WHITESPACE " " - NAME - IDENT "t" - WHITESPACE "\n" - ON_CLAUSE - ON_KW "ON" - WHITESPACE " " - BIN_EXPR - FIELD_EXPR - NAME_REF - IDENT "t" - DOT "." - NAME_REF - IDENT "customer_id" - WHITESPACE " " - EQ "=" - WHITESPACE " " - FIELD_EXPR - NAME_REF - IDENT "ca" - DOT "." - NAME_REF - IDENT "customer_id" - WHITESPACE "\n" - MERGE_WHEN_MATCHED - WHEN_KW "WHEN" - WHITESPACE " " - MATCHED_KW "MATCHED" - WHITESPACE " " - THEN_KW "THEN" - WHITESPACE "\n " - MERGE_UPDATE - UPDATE_KW "UPDATE" - WHITESPACE " " - SET_CLAUSE - SET_KW "SET" - WHITESPACE " " - SET_COLUMN_LIST - SET_SINGLE_COLUMN - COLUMN - NAME_REF - IDENT "balance" - WHITESPACE " " - EQ "=" - WHITESPACE " " - SET_EXPR - BIN_EXPR - NAME_REF - IDENT "balance" - WHITESPACE " " - PLUS "+" - WHITESPACE " " - NAME_REF - IDENT "transaction_value" - WHITESPACE "\n" - MERGE_WHEN_NOT_MATCHED_TARGET - WHEN_KW "WHEN" - WHITESPACE " " - NOT_KW "NOT" - WHITESPACE " " - MATCHED_KW "MATCHED" - WHITESPACE " " - THEN_KW "THEN" - WHITESPACE "\n " - MERGE_INSERT - INSERT_KW "INSERT" - WHITESPACE " " - COLUMN_LIST - L_PAREN "(" - COLUMN - NAME_REF - IDENT "customer_id" - COMMA "," - WHITESPACE " " - COLUMN - NAME_REF - IDENT "balance" - R_PAREN ")" - WHITESPACE "\n " - VALUES - VALUES_KW "VALUES" - WHITESPACE " " - ROW_LIST - ROW - L_PAREN "(" - FIELD_EXPR - NAME_REF - IDENT "t" - DOT "." - NAME_REF - IDENT "customer_id" - COMMA "," - WHITESPACE " " - FIELD_EXPR - NAME_REF - IDENT "t" - DOT "." - NAME_REF - IDENT "transaction_value" - R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n\n" - COMMENT "-- doc_example_3" - WHITESPACE "\n" - MERGE - MERGE_KW "MERGE" - WHITESPACE " " - INTO_KW "INTO" - WHITESPACE " " - RELATION_NAME - PATH - PATH_SEGMENT - NAME_REF - IDENT "wines" - WHITESPACE " " - ALIAS - NAME - IDENT "w" - WHITESPACE "\n" - USING_ON_CLAUSE - USING_KW "USING" - WHITESPACE " " - FROM_ITEM - NAME_REF - IDENT "wine_stock_changes" - WHITESPACE " " - ALIAS - NAME - IDENT "s" - WHITESPACE "\n" - ON_CLAUSE - ON_KW "ON" - WHITESPACE " " - BIN_EXPR - FIELD_EXPR - NAME_REF - IDENT "s" - DOT "." - NAME_REF - IDENT "winename" - WHITESPACE " " - EQ "=" - WHITESPACE " " - FIELD_EXPR - NAME_REF - IDENT "w" - DOT "." - NAME_REF - IDENT "winename" - WHITESPACE "\n" - MERGE_WHEN_NOT_MATCHED_TARGET - WHEN_KW "WHEN" - WHITESPACE " " - NOT_KW "NOT" - WHITESPACE " " - MATCHED_KW "MATCHED" - WHITESPACE " " - AND_KW "AND" - WHITESPACE " " - BIN_EXPR - FIELD_EXPR - NAME_REF - IDENT "s" - DOT "." - NAME_REF - IDENT "stock_delta" - WHITESPACE " " - R_ANGLE ">" - WHITESPACE " " - LITERAL - INT_NUMBER "0" - WHITESPACE " " - THEN_KW "THEN" - WHITESPACE "\n " - MERGE_INSERT - INSERT_KW "INSERT" - WHITESPACE " " - VALUES - VALUES_KW "VALUES" - ROW_LIST - ROW - L_PAREN "(" - FIELD_EXPR - NAME_REF - IDENT "s" - DOT "." - NAME_REF - IDENT "winename" - COMMA "," - WHITESPACE " " - FIELD_EXPR - NAME_REF - IDENT "s" - DOT "." - NAME_REF - IDENT "stock_delta" - R_PAREN ")" - WHITESPACE "\n" - MERGE_WHEN_MATCHED - WHEN_KW "WHEN" - WHITESPACE " " - MATCHED_KW "MATCHED" - WHITESPACE " " - AND_KW "AND" - WHITESPACE " " - BIN_EXPR - BIN_EXPR - FIELD_EXPR - NAME_REF - IDENT "w" - DOT "." - NAME_REF - IDENT "stock" - WHITESPACE " " - PLUS "+" - WHITESPACE " " - FIELD_EXPR - NAME_REF - IDENT "s" - DOT "." - NAME_REF - IDENT "stock_delta" - WHITESPACE " " - R_ANGLE ">" - WHITESPACE " " - LITERAL - INT_NUMBER "0" - WHITESPACE " " - THEN_KW "THEN" - WHITESPACE "\n " - MERGE_UPDATE - UPDATE_KW "UPDATE" - WHITESPACE " " - SET_CLAUSE - SET_KW "SET" - WHITESPACE " " - SET_COLUMN_LIST - SET_SINGLE_COLUMN - COLUMN - NAME_REF - IDENT "stock" - WHITESPACE " " - EQ "=" - WHITESPACE " " - SET_EXPR - BIN_EXPR - FIELD_EXPR - NAME_REF - IDENT "w" - DOT "." - NAME_REF - IDENT "stock" - WHITESPACE " " - PLUS "+" - WHITESPACE " " - FIELD_EXPR - NAME_REF - IDENT "s" - DOT "." - NAME_REF - IDENT "stock_delta" - WHITESPACE "\n" - MERGE_WHEN_MATCHED - WHEN_KW "WHEN" - WHITESPACE " " - MATCHED_KW "MATCHED" - WHITESPACE " " - THEN_KW "THEN" - WHITESPACE "\n " - MERGE_DELETE - DELETE_KW "DELETE" - WHITESPACE "\n" - RETURNING_CLAUSE - RETURNING_KW "RETURNING" - WHITESPACE " " - TARGET_LIST - TARGET - CALL_EXPR - NAME_REF - MERGE_ACTION_KW "merge_action" - ARG_LIST - L_PAREN "(" - R_PAREN ")" - COMMA "," - WHITESPACE " " - TARGET - FIELD_EXPR - NAME_REF - IDENT "w" - DOT "." - STAR "*" - SEMICOLON ";" - WHITESPACE "\n\n" - COMMENT "-- doc_example_4" - WHITESPACE "\n" - MERGE - MERGE_KW "MERGE" - WHITESPACE " " - INTO_KW "INTO" - WHITESPACE " " - RELATION_NAME - PATH - PATH_SEGMENT - NAME_REF - IDENT "wines" - WHITESPACE " " - ALIAS - NAME - IDENT "w" - WHITESPACE "\n" - USING_ON_CLAUSE - USING_KW "USING" - WHITESPACE " " - FROM_ITEM - NAME_REF - IDENT "new_wine_list" - WHITESPACE " " - ALIAS - NAME - IDENT "s" - WHITESPACE "\n" - ON_CLAUSE - ON_KW "ON" - WHITESPACE " " - BIN_EXPR - FIELD_EXPR - NAME_REF - IDENT "s" - DOT "." - NAME_REF - IDENT "winename" - WHITESPACE " " - EQ "=" - WHITESPACE " " - FIELD_EXPR - NAME_REF - IDENT "w" - DOT "." - NAME_REF - IDENT "winename" - WHITESPACE "\n" - MERGE_WHEN_NOT_MATCHED_TARGET - WHEN_KW "WHEN" - WHITESPACE " " - NOT_KW "NOT" - WHITESPACE " " - MATCHED_KW "MATCHED" - WHITESPACE " " - BY_KW "BY" - WHITESPACE " " - TARGET_KW "TARGET" - WHITESPACE " " - THEN_KW "THEN" - WHITESPACE "\n " - MERGE_INSERT - INSERT_KW "INSERT" - WHITESPACE " " - VALUES - VALUES_KW "VALUES" - ROW_LIST - ROW - L_PAREN "(" - FIELD_EXPR - NAME_REF - IDENT "s" - DOT "." - NAME_REF - IDENT "winename" - COMMA "," - WHITESPACE " " - FIELD_EXPR - NAME_REF - IDENT "s" - DOT "." - NAME_REF - IDENT "stock" - R_PAREN ")" - WHITESPACE "\n" - MERGE_WHEN_MATCHED - WHEN_KW "WHEN" - WHITESPACE " " - MATCHED_KW "MATCHED" - WHITESPACE " " - AND_KW "AND" - WHITESPACE " " - BIN_EXPR - FIELD_EXPR - NAME_REF - IDENT "w" - DOT "." - NAME_REF - IDENT "stock" - WHITESPACE " " - NEQ "!=" - WHITESPACE " " - FIELD_EXPR - NAME_REF - IDENT "s" - DOT "." - NAME_REF - IDENT "stock" - WHITESPACE " " - THEN_KW "THEN" - WHITESPACE "\n " - MERGE_UPDATE - UPDATE_KW "UPDATE" - WHITESPACE " " - SET_CLAUSE - SET_KW "SET" - WHITESPACE " " - SET_COLUMN_LIST - SET_SINGLE_COLUMN - COLUMN - NAME_REF - IDENT "stock" - WHITESPACE " " - EQ "=" - WHITESPACE " " - SET_EXPR - FIELD_EXPR - NAME_REF - IDENT "s" - DOT "." - NAME_REF - IDENT "stock" - WHITESPACE "\n" - MERGE_WHEN_NOT_MATCHED_SOURCE - WHEN_KW "WHEN" - WHITESPACE " " - NOT_KW "NOT" - WHITESPACE " " - MATCHED_KW "MATCHED" - WHITESPACE " " - BY_KW "BY" - WHITESPACE " " - SOURCE_KW "SOURCE" - WHITESPACE " " - THEN_KW "THEN" - WHITESPACE "\n " - MERGE_DELETE - DELETE_KW "DELETE" - SEMICOLON ";" - WHITESPACE "\n\n" - COMMENT "-- cross_join_data_source" - WHITESPACE "\n" - MERGE - MERGE_KW "merge" - WHITESPACE " " - INTO_KW "into" - WHITESPACE " " - RELATION_NAME - PATH - PATH_SEGMENT - NAME_REF - IDENT "t" - WHITESPACE "\n " - USING_ON_CLAUSE - USING_KW "using" - WHITESPACE " " - JOIN_EXPR - FROM_ITEM - NAME_REF - IDENT "u" - WHITESPACE " " - JOIN - JOIN_CROSS - CROSS_KW "cross" - WHITESPACE " " - JOIN_KW "join" - WHITESPACE " " - FROM_ITEM - NAME_REF - IDENT "v" - WHITESPACE "\n " - ON_CLAUSE - ON_KW "on" - WHITESPACE " " - BIN_EXPR - FIELD_EXPR - NAME_REF - IDENT "t" - DOT "." - NAME_REF - IDENT "id" - WHITESPACE " " - EQ "=" - WHITESPACE " " - FIELD_EXPR - NAME_REF - IDENT "u" - DOT "." - NAME_REF - IDENT "id" - WHITESPACE "\n " - MERGE_WHEN_MATCHED - WHEN_KW "when" - WHITESPACE " " - MATCHED_KW "matched" - WHITESPACE " " - THEN_KW "then" - WHITESPACE "\n " - MERGE_DO_NOTHING - DO_KW "do" - WHITESPACE " " - NOTHING_KW "nothing" - SEMICOLON ";" - WHITESPACE "\n\n" - COMMENT "-- natural join" - WHITESPACE "\n" - MERGE - MERGE_KW "merge" - WHITESPACE " " - INTO_KW "into" - WHITESPACE " " - RELATION_NAME - PATH - PATH_SEGMENT - NAME_REF - IDENT "t" - WHITESPACE "\n " - USING_ON_CLAUSE - USING_KW "using" - WHITESPACE " " - JOIN_EXPR - FROM_ITEM - NAME_REF - IDENT "u" - WHITESPACE " " - JOIN - NATURAL_KW "natural" - WHITESPACE " " - JOIN_INNER - JOIN_KW "join" - WHITESPACE " " - FROM_ITEM - NAME_REF - IDENT "v" - WHITESPACE "\n " - ON_CLAUSE - ON_KW "on" - WHITESPACE " " - BIN_EXPR - FIELD_EXPR - NAME_REF - IDENT "t" - DOT "." - NAME_REF - IDENT "id" - WHITESPACE " " - EQ "=" - WHITESPACE " " - FIELD_EXPR - NAME_REF - IDENT "u" - DOT "." - NAME_REF - IDENT "id" - WHITESPACE "\n " - MERGE_WHEN_MATCHED - WHEN_KW "when" - WHITESPACE " " - MATCHED_KW "matched" - WHITESPACE " " - THEN_KW "then" - WHITESPACE "\n " - MERGE_DO_NOTHING - DO_KW "do" - WHITESPACE " " - NOTHING_KW "nothing" - SEMICOLON ";" - WHITESPACE "\n" diff --git a/crates/squawk_parser/tests/snapshots/tests__schemas_ok.snap b/crates/squawk_parser/tests/snapshots/tests__schemas_ok.snap index b2d7dd75..1254e45e 100644 --- a/crates/squawk_parser/tests/snapshots/tests__schemas_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__schemas_ok.snap @@ -725,4 +725,13 @@ SOURCE_FILE LITERAL INT_NUMBER "4" SEMICOLON ";" - WHITESPACE "\n\n" + WHITESPACE "\n\n\n" + SET + SET_KW "set" + WHITESPACE " " + CATALOG_KW "catalog" + WHITESPACE " " + LITERAL + STRING "'foo'" + SEMICOLON ";" + WHITESPACE "\n" diff --git a/crates/squawk_parser/tests/snapshots/tests__schemas_pg17_ok.snap b/crates/squawk_parser/tests/snapshots/tests__schemas_pg17_ok.snap deleted file mode 100644 index 41eded25..00000000 --- a/crates/squawk_parser/tests/snapshots/tests__schemas_pg17_ok.snap +++ /dev/null @@ -1,14 +0,0 @@ ---- -source: crates/squawk_parser/tests/tests.rs -input_file: crates/squawk_parser/tests/data/ok/schemas_pg17.sql ---- -SOURCE_FILE - SET - SET_KW "set" - WHITESPACE " " - CATALOG_KW "catalog" - WHITESPACE " " - LITERAL - STRING "'foo'" - SEMICOLON ";" - WHITESPACE "\n" diff --git a/crates/squawk_parser/tests/snapshots/tests__select_casts_ok.snap b/crates/squawk_parser/tests/snapshots/tests__select_casts_ok.snap index cbf01e68..97b04b7e 100644 --- a/crates/squawk_parser/tests/snapshots/tests__select_casts_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__select_casts_ok.snap @@ -4054,4 +4054,38 @@ SOURCE_FILE LITERAL STRING "'{123}'" SEMICOLON ";" + WHITESPACE "\n\n" + SELECT + SELECT_CLAUSE + SELECT_KW "select" + WHITESPACE " " + TARGET_LIST + TARGET + CAST_EXPR + EXPR_TYPE + CALL_EXPR + FIELD_EXPR + INDEX_EXPR + NAME_REF + IDENT "foo" + L_BRACK "[" + LITERAL + INT_NUMBER "10" + R_BRACK "]" + DOT "." + NAME_REF + IDENT "bar" + ARG_LIST + L_PAREN "(" + LITERAL + INT_NUMBER "10" + COMMA "," + WHITESPACE " " + LITERAL + INT_NUMBER "2" + R_PAREN ")" + WHITESPACE " " + LITERAL + STRING "'100'" + SEMICOLON ";" WHITESPACE "\n" diff --git a/crates/squawk_parser/tests/snapshots/tests__select_casts_pg17_ok.snap b/crates/squawk_parser/tests/snapshots/tests__select_casts_pg17_ok.snap deleted file mode 100644 index ba820c4e..00000000 --- a/crates/squawk_parser/tests/snapshots/tests__select_casts_pg17_ok.snap +++ /dev/null @@ -1,39 +0,0 @@ ---- -source: crates/squawk_parser/tests/tests.rs -input_file: crates/squawk_parser/tests/data/ok/select_casts_pg17.sql ---- -SOURCE_FILE - SELECT - SELECT_CLAUSE - SELECT_KW "select" - WHITESPACE " " - TARGET_LIST - TARGET - CAST_EXPR - EXPR_TYPE - CALL_EXPR - FIELD_EXPR - INDEX_EXPR - NAME_REF - IDENT "foo" - L_BRACK "[" - LITERAL - INT_NUMBER "10" - R_BRACK "]" - DOT "." - NAME_REF - IDENT "bar" - ARG_LIST - L_PAREN "(" - LITERAL - INT_NUMBER "10" - COMMA "," - WHITESPACE " " - LITERAL - INT_NUMBER "2" - R_PAREN ")" - WHITESPACE " " - LITERAL - STRING "'100'" - SEMICOLON ";" - WHITESPACE "\n" diff --git a/crates/squawk_parser/tests/snapshots/tests__select_cte_ok.snap b/crates/squawk_parser/tests/snapshots/tests__select_cte_ok.snap index f1a42ac6..5b8c33d3 100644 --- a/crates/squawk_parser/tests/snapshots/tests__select_cte_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__select_cte_ok.snap @@ -1510,4 +1510,57 @@ SOURCE_FILE INT_NUMBER "1" R_PAREN ")" SEMICOLON ";" + WHITESPACE "\n\n" + COMMENT "-- group by all" + WHITESPACE "\n" + SELECT + WITH_CLAUSE + WITH_KW "with" + WHITESPACE " " + WITH_TABLE + NAME + IDENT "x" + WHITESPACE " " + AS_KW "as" + WHITESPACE " " + L_PAREN "(" + WHITESPACE "\n " + SELECT + SELECT_CLAUSE + SELECT_KW "select" + WHITESPACE " " + TARGET_LIST + TARGET + STAR "*" + WHITESPACE " " + FROM_CLAUSE + FROM_KW "from" + WHITESPACE " " + FROM_ITEM + NAME_REF + IDENT "t" + WHITESPACE " " + GROUP_BY_CLAUSE + GROUP_KW "group" + WHITESPACE " " + BY_KW "by" + WHITESPACE " " + ALL_KW "all" + WHITESPACE "\n" + R_PAREN ")" + WHITESPACE "\n" + SELECT_CLAUSE + SELECT_KW "select" + WHITESPACE " " + TARGET_LIST + TARGET + STAR "*" + WHITESPACE " " + FROM_CLAUSE + FROM_KW "from" + WHITESPACE " " + FROM_ITEM + NAME_REF + IDENT "x" + SEMICOLON ";" WHITESPACE "\n" diff --git a/crates/squawk_parser/tests/snapshots/tests__select_cte_pg19_ok.snap b/crates/squawk_parser/tests/snapshots/tests__select_cte_pg19_ok.snap deleted file mode 100644 index c7533e6a..00000000 --- a/crates/squawk_parser/tests/snapshots/tests__select_cte_pg19_ok.snap +++ /dev/null @@ -1,58 +0,0 @@ ---- -source: crates/squawk_parser/tests/tests.rs -input_file: crates/squawk_parser/tests/data/ok/select_cte_pg19.sql ---- -SOURCE_FILE - COMMENT "-- group by all" - WHITESPACE "\n" - SELECT - WITH_CLAUSE - WITH_KW "with" - WHITESPACE " " - WITH_TABLE - NAME - IDENT "x" - WHITESPACE " " - AS_KW "as" - WHITESPACE " " - L_PAREN "(" - WHITESPACE "\n " - SELECT - SELECT_CLAUSE - SELECT_KW "select" - WHITESPACE " " - TARGET_LIST - TARGET - STAR "*" - WHITESPACE " " - FROM_CLAUSE - FROM_KW "from" - WHITESPACE " " - FROM_ITEM - NAME_REF - IDENT "t" - WHITESPACE " " - GROUP_BY_CLAUSE - GROUP_KW "group" - WHITESPACE " " - BY_KW "by" - WHITESPACE " " - ALL_KW "all" - WHITESPACE "\n" - R_PAREN ")" - WHITESPACE "\n" - SELECT_CLAUSE - SELECT_KW "select" - WHITESPACE " " - TARGET_LIST - TARGET - STAR "*" - WHITESPACE " " - FROM_CLAUSE - FROM_KW "from" - WHITESPACE " " - FROM_ITEM - NAME_REF - IDENT "x" - SEMICOLON ";" - WHITESPACE "\n" diff --git a/crates/squawk_parser/tests/snapshots/tests__select_funcs_ok.snap b/crates/squawk_parser/tests/snapshots/tests__select_funcs_ok.snap index aeb71a4f..e4a5c9ac 100644 --- a/crates/squawk_parser/tests/snapshots/tests__select_funcs_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__select_funcs_ok.snap @@ -3823,4 +3823,1200 @@ SOURCE_FILE SEMICOLON ";" WHITESPACE "\n" COMMENT "-- ^^^^^ make sure we allow using keywords" + WHITESPACE "\n\n\n" + COMMENT "-- json_table" + WHITESPACE "\n" + SELECT + SELECT_CLAUSE + SELECT_KW "SELECT" + WHITESPACE " " + TARGET_LIST + TARGET + FIELD_EXPR + NAME_REF + IDENT "jt" + DOT "." + STAR "*" + WHITESPACE " " + FROM_CLAUSE + FROM_KW "FROM" + WHITESPACE "\n " + FROM_ITEM + NAME_REF + IDENT "my_films" + COMMA "," + WHITESPACE "\n " + FROM_ITEM + JSON_TABLE + JSON_TABLE_KW "JSON_TABLE" + WHITESPACE " " + L_PAREN "(" + NAME_REF + IDENT "js" + COMMA "," + WHITESPACE " " + LITERAL + STRING "'$.favorites[*]'" + WHITESPACE " " + JSON_TABLE_COLUMN_LIST + COLUMNS_KW "COLUMNS" + WHITESPACE " " + L_PAREN "(" + WHITESPACE "\n " + JSON_TABLE_COLUMN + NAME + IDENT "id" + WHITESPACE " " + FOR_KW "FOR" + WHITESPACE " " + ORDINALITY_KW "ORDINALITY" + COMMA "," + WHITESPACE "\n " + JSON_TABLE_COLUMN + NAME + IDENT "kind" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + TEXT_KW "text" + WHITESPACE " " + JSON_PATH_CLAUSE + PATH_KW "PATH" + WHITESPACE " " + LITERAL + STRING "'$.kind'" + COMMA "," + WHITESPACE "\n " + JSON_TABLE_COLUMN + NAME + IDENT "title" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + TEXT_KW "text" + WHITESPACE " " + JSON_PATH_CLAUSE + PATH_KW "PATH" + WHITESPACE " " + LITERAL + STRING "'$.films[*].title'" + WHITESPACE " " + JSON_WRAPPER_BEHAVIOR_CLAUSE + WITH_KW "WITH" + WHITESPACE " " + WRAPPER_KW "WRAPPER" + COMMA "," + WHITESPACE "\n " + JSON_TABLE_COLUMN + NAME + IDENT "director" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + TEXT_KW "text" + WHITESPACE " " + JSON_PATH_CLAUSE + PATH_KW "PATH" + WHITESPACE " " + LITERAL + STRING "'$.films[*].director'" + WHITESPACE " " + JSON_WRAPPER_BEHAVIOR_CLAUSE + WITH_KW "WITH" + WHITESPACE " " + WRAPPER_KW "WRAPPER" + R_PAREN ")" + R_PAREN ")" + WHITESPACE " " + ALIAS + AS_KW "AS" + WHITESPACE " " + NAME + IDENT "jt" + SEMICOLON ";" + WHITESPACE "\n\n" + COMMENT "-- json_table_nested_path" + WHITESPACE "\n" + SELECT + SELECT_CLAUSE + SELECT_KW "SELECT" + WHITESPACE " " + TARGET_LIST + TARGET + FIELD_EXPR + NAME_REF + IDENT "jt" + DOT "." + STAR "*" + WHITESPACE " " + FROM_CLAUSE + FROM_KW "FROM" + WHITESPACE "\n " + FROM_ITEM + NAME_REF + IDENT "my_films" + COMMA "," + WHITESPACE "\n " + FROM_ITEM + JSON_TABLE + JSON_TABLE_KW "JSON_TABLE" + WHITESPACE " " + L_PAREN "(" + WHITESPACE " " + NAME_REF + IDENT "js" + COMMA "," + WHITESPACE " " + LITERAL + STRING "'$.favorites[*] ? (@.films[*].director == $filter)'" + WHITESPACE "\n " + JSON_PASSING_CLAUSE + PASSING_KW "PASSING" + WHITESPACE " " + JSON_PASSING_ARG + LITERAL + STRING "'Alfred Hitchcock'" + WHITESPACE " " + AS_KW "AS" + WHITESPACE " " + NAME + FILTER_KW "filter" + WHITESPACE "\n " + JSON_TABLE_COLUMN_LIST + COLUMNS_KW "COLUMNS" + WHITESPACE " " + L_PAREN "(" + WHITESPACE "\n " + JSON_TABLE_COLUMN + NAME + IDENT "id" + WHITESPACE " " + FOR_KW "FOR" + WHITESPACE " " + ORDINALITY_KW "ORDINALITY" + COMMA "," + WHITESPACE "\n " + JSON_TABLE_COLUMN + NAME + IDENT "kind" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + TEXT_KW "text" + WHITESPACE " " + JSON_PATH_CLAUSE + PATH_KW "PATH" + WHITESPACE " " + LITERAL + STRING "'$.kind'" + COMMA "," + WHITESPACE "\n " + JSON_TABLE_COLUMN + NESTED_KW "NESTED" + WHITESPACE " " + PATH_KW "PATH" + WHITESPACE " " + LITERAL + STRING "'$.films[*]'" + WHITESPACE " " + JSON_TABLE_COLUMN_LIST + COLUMNS_KW "COLUMNS" + WHITESPACE " " + L_PAREN "(" + WHITESPACE "\n " + JSON_TABLE_COLUMN + NAME + IDENT "title" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + TEXT_KW "text" + WHITESPACE " " + JSON_FORMAT_CLAUSE + FORMAT_KW "FORMAT" + WHITESPACE " " + JSON_KW "JSON" + WHITESPACE " " + JSON_PATH_CLAUSE + PATH_KW "PATH" + WHITESPACE " " + LITERAL + STRING "'$.title'" + WHITESPACE " " + JSON_QUOTES_CLAUSE + OMIT_KW "OMIT" + WHITESPACE " " + QUOTES_KW "QUOTES" + COMMA "," + WHITESPACE "\n " + JSON_TABLE_COLUMN + NAME + IDENT "director" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + TEXT_KW "text" + WHITESPACE " " + JSON_PATH_CLAUSE + PATH_KW "PATH" + WHITESPACE " " + LITERAL + STRING "'$.director'" + WHITESPACE " " + JSON_QUOTES_CLAUSE + KEEP_KW "KEEP" + WHITESPACE " " + QUOTES_KW "QUOTES" + R_PAREN ")" + R_PAREN ")" + R_PAREN ")" + WHITESPACE " " + ALIAS + AS_KW "AS" + WHITESPACE " " + NAME + IDENT "jt" + SEMICOLON ";" + WHITESPACE "\n\n" + COMMENT "-- json_table_without_filter" + WHITESPACE "\n" + SELECT + SELECT_CLAUSE + SELECT_KW "SELECT" + WHITESPACE " " + TARGET_LIST + TARGET + FIELD_EXPR + NAME_REF + IDENT "jt" + DOT "." + STAR "*" + WHITESPACE " " + FROM_CLAUSE + FROM_KW "FROM" + WHITESPACE "\n " + FROM_ITEM + NAME_REF + IDENT "my_films" + COMMA "," + WHITESPACE "\n " + FROM_ITEM + JSON_TABLE + JSON_TABLE_KW "JSON_TABLE" + WHITESPACE " " + L_PAREN "(" + WHITESPACE " " + NAME_REF + IDENT "js" + COMMA "," + WHITESPACE " " + LITERAL + STRING "'$.favorites[*]'" + WHITESPACE "\n " + JSON_TABLE_COLUMN_LIST + COLUMNS_KW "COLUMNS" + WHITESPACE " " + L_PAREN "(" + WHITESPACE "\n " + JSON_TABLE_COLUMN + NAME + IDENT "id" + WHITESPACE " " + FOR_KW "FOR" + WHITESPACE " " + ORDINALITY_KW "ORDINALITY" + COMMA "," + WHITESPACE "\n " + JSON_TABLE_COLUMN + NAME + IDENT "kind" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + TEXT_KW "text" + WHITESPACE " " + JSON_PATH_CLAUSE + PATH_KW "PATH" + WHITESPACE " " + LITERAL + STRING "'$.kind'" + COMMA "," + WHITESPACE "\n " + JSON_TABLE_COLUMN + NESTED_KW "NESTED" + WHITESPACE " " + PATH_KW "PATH" + WHITESPACE " " + LITERAL + STRING "'$.films[*]'" + WHITESPACE " " + JSON_TABLE_COLUMN_LIST + COLUMNS_KW "COLUMNS" + WHITESPACE " " + L_PAREN "(" + WHITESPACE "\n " + JSON_TABLE_COLUMN + NAME + IDENT "title" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + TEXT_KW "text" + WHITESPACE " " + JSON_FORMAT_CLAUSE + FORMAT_KW "FORMAT" + WHITESPACE " " + JSON_KW "JSON" + WHITESPACE " " + JSON_PATH_CLAUSE + PATH_KW "PATH" + WHITESPACE " " + LITERAL + STRING "'$.title'" + WHITESPACE " " + JSON_QUOTES_CLAUSE + OMIT_KW "OMIT" + WHITESPACE " " + QUOTES_KW "QUOTES" + COMMA "," + WHITESPACE "\n " + JSON_TABLE_COLUMN + NAME + IDENT "director" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + TEXT_KW "text" + WHITESPACE " " + JSON_PATH_CLAUSE + PATH_KW "PATH" + WHITESPACE " " + LITERAL + STRING "'$.director'" + WHITESPACE " " + JSON_QUOTES_CLAUSE + KEEP_KW "KEEP" + WHITESPACE " " + QUOTES_KW "QUOTES" + R_PAREN ")" + R_PAREN ")" + R_PAREN ")" + WHITESPACE " " + ALIAS + AS_KW "AS" + WHITESPACE " " + NAME + IDENT "jt" + SEMICOLON ";" + WHITESPACE "\n\n" + COMMENT "-- json_table_union" + WHITESPACE "\n" + SELECT + SELECT_CLAUSE + SELECT_KW "SELECT" + WHITESPACE " " + TARGET_LIST + TARGET + STAR "*" + WHITESPACE " " + FROM_CLAUSE + FROM_KW "FROM" + WHITESPACE " " + FROM_ITEM + JSON_TABLE + JSON_TABLE_KW "JSON_TABLE" + WHITESPACE " " + L_PAREN "(" + WHITESPACE "\n" + CAST_EXPR + LITERAL + STRING "'{\"favorites\":\n {\"movies\":\n [{\"name\": \"One\", \"director\": \"John Doe\"},\n {\"name\": \"Two\", \"director\": \"Don Joe\"}],\n \"books\":\n [{\"name\": \"Mystery\", \"authors\": [{\"name\": \"Brown Dan\"}]},\n {\"name\": \"Wonder\", \"authors\": [{\"name\": \"Jun Murakami\"}, {\"name\":\"Craig Doe\"}]}]\n}}'" + COLON_COLON + COLON ":" + COLON ":" + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + JSON_KW "json" + COMMA "," + WHITESPACE " " + LITERAL + STRING "'$.favorites[*]'" + WHITESPACE "\n" + JSON_TABLE_COLUMN_LIST + COLUMNS_KW "COLUMNS" + WHITESPACE " " + L_PAREN "(" + WHITESPACE "\n " + JSON_TABLE_COLUMN + NAME + IDENT "user_id" + WHITESPACE " " + FOR_KW "FOR" + WHITESPACE " " + ORDINALITY_KW "ORDINALITY" + COMMA "," + WHITESPACE "\n " + JSON_TABLE_COLUMN + NESTED_KW "NESTED" + WHITESPACE " " + LITERAL + STRING "'$.movies[*]'" + WHITESPACE "\n " + JSON_TABLE_COLUMN_LIST + COLUMNS_KW "COLUMNS" + WHITESPACE " " + L_PAREN "(" + WHITESPACE "\n " + JSON_TABLE_COLUMN + NAME + IDENT "movie_id" + WHITESPACE " " + FOR_KW "FOR" + WHITESPACE " " + ORDINALITY_KW "ORDINALITY" + COMMA "," + WHITESPACE "\n " + JSON_TABLE_COLUMN + NAME + IDENT "mname" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + TEXT_KW "text" + WHITESPACE " " + JSON_PATH_CLAUSE + PATH_KW "PATH" + WHITESPACE " " + LITERAL + STRING "'$.name'" + COMMA "," + WHITESPACE "\n " + JSON_TABLE_COLUMN + NAME + IDENT "director" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + TEXT_KW "text" + R_PAREN ")" + COMMA "," + WHITESPACE "\n " + JSON_TABLE_COLUMN + NESTED_KW "NESTED" + WHITESPACE " " + LITERAL + STRING "'$.books[*]'" + WHITESPACE "\n " + JSON_TABLE_COLUMN_LIST + COLUMNS_KW "COLUMNS" + WHITESPACE " " + L_PAREN "(" + WHITESPACE "\n " + JSON_TABLE_COLUMN + NAME + IDENT "book_id" + WHITESPACE " " + FOR_KW "FOR" + WHITESPACE " " + ORDINALITY_KW "ORDINALITY" + COMMA "," + WHITESPACE "\n " + JSON_TABLE_COLUMN + NAME + IDENT "bname" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + TEXT_KW "text" + WHITESPACE " " + JSON_PATH_CLAUSE + PATH_KW "PATH" + WHITESPACE " " + LITERAL + STRING "'$.name'" + COMMA "," + WHITESPACE "\n " + JSON_TABLE_COLUMN + NESTED_KW "NESTED" + WHITESPACE " " + LITERAL + STRING "'$.authors[*]'" + WHITESPACE "\n " + JSON_TABLE_COLUMN_LIST + COLUMNS_KW "COLUMNS" + WHITESPACE " " + L_PAREN "(" + WHITESPACE "\n " + JSON_TABLE_COLUMN + NAME + IDENT "author_id" + WHITESPACE " " + FOR_KW "FOR" + WHITESPACE " " + ORDINALITY_KW "ORDINALITY" + COMMA "," + WHITESPACE "\n " + JSON_TABLE_COLUMN + NAME + IDENT "author_name" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + TEXT_KW "text" + WHITESPACE " " + JSON_PATH_CLAUSE + PATH_KW "PATH" + WHITESPACE " " + LITERAL + STRING "'$.name'" + R_PAREN ")" + R_PAREN ")" + R_PAREN ")" + R_PAREN ")" + SEMICOLON ";" + WHITESPACE "\n\n" + COMMENT "-- json" + WHITESPACE "\n" + SELECT + SELECT_CLAUSE + SELECT_KW "select" + WHITESPACE " " + TARGET_LIST + TARGET + CALL_EXPR + JSON_FN + JSON_KW "json" + L_PAREN "(" + NAME_REF + IDENT "a" + WHITESPACE " " + JSON_FORMAT_CLAUSE + FORMAT_KW "format" + WHITESPACE " " + JSON_KW "json" + R_PAREN ")" + SEMICOLON ";" + WHITESPACE "\n" + SELECT + SELECT_CLAUSE + SELECT_KW "select" + WHITESPACE " " + TARGET_LIST + TARGET + CALL_EXPR + JSON_FN + JSON_KW "json" + L_PAREN "(" + NAME_REF + IDENT "a" + WHITESPACE " " + JSON_FORMAT_CLAUSE + FORMAT_KW "format" + WHITESPACE " " + JSON_KW "json" + WHITESPACE " " + JSON_KEYS_UNIQUE_CLAUSE + WITH_KW "with" + WHITESPACE " " + UNIQUE_KW "unique" + WHITESPACE " " + KEYS_KW "keys" + R_PAREN ")" + SEMICOLON ";" + WHITESPACE "\n" + SELECT + SELECT_CLAUSE + SELECT_KW "select" + WHITESPACE " " + TARGET_LIST + TARGET + CALL_EXPR + JSON_FN + JSON_KW "json" + L_PAREN "(" + NAME_REF + IDENT "a" + WHITESPACE " " + JSON_FORMAT_CLAUSE + FORMAT_KW "format" + WHITESPACE " " + JSON_KW "json" + WHITESPACE " " + JSON_KEYS_UNIQUE_CLAUSE + WITH_KW "with" + WHITESPACE " " + UNIQUE_KW "unique" + R_PAREN ")" + SEMICOLON ";" + WHITESPACE "\n" + SELECT + SELECT_CLAUSE + SELECT_KW "select" + WHITESPACE " " + TARGET_LIST + TARGET + CALL_EXPR + JSON_FN + JSON_KW "json" + L_PAREN "(" + NAME_REF + IDENT "a" + WHITESPACE " " + JSON_FORMAT_CLAUSE + FORMAT_KW "format" + WHITESPACE " " + JSON_KW "json" + WHITESPACE " " + JSON_KEYS_UNIQUE_CLAUSE + WITHOUT_KW "without" + WHITESPACE " " + UNIQUE_KW "unique" + WHITESPACE " " + KEYS_KW "keys" + R_PAREN ")" + SEMICOLON ";" + WHITESPACE "\n" + SELECT + SELECT_CLAUSE + SELECT_KW "select" + WHITESPACE " " + TARGET_LIST + TARGET + CALL_EXPR + JSON_FN + JSON_KW "json" + L_PAREN "(" + NAME_REF + IDENT "a" + WHITESPACE " " + JSON_FORMAT_CLAUSE + FORMAT_KW "format" + WHITESPACE " " + JSON_KW "json" + WHITESPACE " " + JSON_KEYS_UNIQUE_CLAUSE + WITHOUT_KW "without" + WHITESPACE " " + UNIQUE_KW "unique" + R_PAREN ")" + SEMICOLON ";" + WHITESPACE "\n\n" + COMMENT "-- json_serialize" + WHITESPACE "\n" + SELECT + SELECT_CLAUSE + SELECT_KW "select" + WHITESPACE " " + TARGET_LIST + TARGET + CALL_EXPR + JSON_SERIALIZE_FN + JSON_SERIALIZE_KW "json_serialize" + L_PAREN "(" + NAME_REF + IDENT "a" + R_PAREN ")" + SEMICOLON ";" + WHITESPACE "\n" + SELECT + SELECT_CLAUSE + SELECT_KW "select" + WHITESPACE " " + TARGET_LIST + TARGET + CALL_EXPR + JSON_SERIALIZE_FN + JSON_SERIALIZE_KW "json_serialize" + L_PAREN "(" + NAME_REF + IDENT "a" + WHITESPACE " " + JSON_FORMAT_CLAUSE + FORMAT_KW "format" + WHITESPACE " " + JSON_KW "json" + R_PAREN ")" + SEMICOLON ";" + WHITESPACE "\n" + SELECT + SELECT_CLAUSE + SELECT_KW "select" + WHITESPACE " " + TARGET_LIST + TARGET + CALL_EXPR + JSON_SERIALIZE_FN + JSON_SERIALIZE_KW "json_serialize" + L_PAREN "(" + NAME_REF + IDENT "a" + WHITESPACE " " + JSON_RETURNING_CLAUSE + RETURNING_KW "returning" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + IDENT "foo" + R_PAREN ")" + SEMICOLON ";" + WHITESPACE "\n" + SELECT + SELECT_CLAUSE + SELECT_KW "select" + WHITESPACE " " + TARGET_LIST + TARGET + CALL_EXPR + JSON_SERIALIZE_FN + JSON_SERIALIZE_KW "json_serialize" + L_PAREN "(" + NAME_REF + IDENT "a" + WHITESPACE " " + JSON_FORMAT_CLAUSE + FORMAT_KW "format" + WHITESPACE " " + JSON_KW "json" + WHITESPACE " " + JSON_RETURNING_CLAUSE + RETURNING_KW "returning" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + IDENT "foo" + WHITESPACE " " + JSON_FORMAT_CLAUSE + FORMAT_KW "format" + WHITESPACE " " + JSON_KW "json" + R_PAREN ")" + SEMICOLON ";" + WHITESPACE "\n\n" + COMMENT "-- json_query" + WHITESPACE "\n" + SELECT + SELECT_CLAUSE + SELECT_KW "select" + WHITESPACE " " + TARGET_LIST + TARGET + CALL_EXPR + JSON_QUERY_FN + JSON_QUERY_KW "json_query" + L_PAREN "(" + NAME_REF + IDENT "a" + COMMA "," + WHITESPACE " " + NAME_REF + IDENT "b" + WHITESPACE " " + JSON_WRAPPER_BEHAVIOR_CLAUSE + WITH_KW "with" + WHITESPACE " " + WRAPPER_KW "wrapper" + R_PAREN ")" + SEMICOLON ";" + WHITESPACE "\n" + SELECT + SELECT_CLAUSE + SELECT_KW "select" + WHITESPACE " " + TARGET_LIST + TARGET + CALL_EXPR + JSON_QUERY_FN + JSON_QUERY_KW "json_query" + L_PAREN "(" + WHITESPACE "\n " + NAME_REF + IDENT "a" + WHITESPACE " " + JSON_FORMAT_CLAUSE + FORMAT_KW "format" + WHITESPACE " " + JSON_KW "json" + COMMA "," + WHITESPACE " \n " + NAME_REF + IDENT "b" + WHITESPACE " " + JSON_PASSING_CLAUSE + PASSING_KW "passing" + WHITESPACE " " + JSON_PASSING_ARG + NAME_REF + IDENT "c" + WHITESPACE " " + AS_KW "as" + WHITESPACE " " + NAME + IDENT "foo" + COMMA "," + WHITESPACE " \n " + JSON_PASSING_ARG + NAME_REF + IDENT "d" + WHITESPACE " " + AS_KW "as" + WHITESPACE " " + NAME + IDENT "bar" + WHITESPACE " \n " + JSON_RETURNING_CLAUSE + RETURNING_KW "returning" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + TEXT_KW "text" + WHITESPACE " \n " + JSON_FORMAT_CLAUSE + FORMAT_KW "format" + WHITESPACE " " + JSON_KW "json" + WHITESPACE " \n " + JSON_WRAPPER_BEHAVIOR_CLAUSE + WITH_KW "with" + WHITESPACE " " + UNCONDITIONAL_KW "unconditional" + WHITESPACE " " + ARRAY_KW "array" + WHITESPACE " " + WRAPPER_KW "wrapper" + WHITESPACE "\n " + JSON_QUOTES_CLAUSE + KEEP_KW "keep" + WHITESPACE " " + QUOTES_KW "quotes" + WHITESPACE " " + ON_KW "on" + WHITESPACE " " + SCALAR_KW "scalar" + WHITESPACE " " + STRING_KW "string" + WHITESPACE "\n " + JSON_ON_EMPTY_CLAUSE + JSON_BEHAVIOR_UNKNOWN + UNKNOWN_KW "unknown" + WHITESPACE " " + ON_KW "on" + WHITESPACE " " + EMPTY_KW "empty" + WHITESPACE "\n " + JSON_ON_ERROR_CLAUSE + JSON_BEHAVIOR_EMPTY_ARRAY + EMPTY_KW "empty" + WHITESPACE " " + ARRAY_KW "array" + WHITESPACE " " + ON_KW "on" + WHITESPACE " " + ERROR_KW "error" + WHITESPACE "\n" + R_PAREN ")" + SEMICOLON ";" + WHITESPACE "\n\n\n" + COMMENT "-- json_exists" + WHITESPACE "\n" + SELECT + SELECT_CLAUSE + SELECT_KW "select" + WHITESPACE " " + TARGET_LIST + TARGET + CALL_EXPR + JSON_EXISTS_FN + JSON_EXISTS_KW "json_exists" + L_PAREN "(" + NAME_REF + IDENT "a" + COMMA "," + WHITESPACE " " + NAME_REF + IDENT "b" + R_PAREN ")" + SEMICOLON ";" + WHITESPACE "\n" + SELECT + SELECT_CLAUSE + SELECT_KW "select" + WHITESPACE " " + TARGET_LIST + TARGET + CALL_EXPR + JSON_EXISTS_FN + JSON_EXISTS_KW "json_exists" + L_PAREN "(" + WHITESPACE "\n " + NAME_REF + IDENT "a" + WHITESPACE " " + JSON_FORMAT_CLAUSE + FORMAT_KW "format" + WHITESPACE " " + JSON_KW "json" + COMMA "," + WHITESPACE "\n " + NAME_REF + IDENT "b" + WHITESPACE " " + JSON_PASSING_CLAUSE + PASSING_KW "passing" + WHITESPACE " " + JSON_PASSING_ARG + NAME_REF + IDENT "c" + WHITESPACE " " + AS_KW "as" + WHITESPACE " " + NAME + IDENT "d" + WHITESPACE "\n " + JSON_ON_ERROR_CLAUSE + JSON_BEHAVIOR_DEFAULT + DEFAULT_KW "default" + WHITESPACE " " + NAME_REF + IDENT "z" + WHITESPACE " " + ON_KW "on" + WHITESPACE " " + ERROR_KW "error" + WHITESPACE "\n" + R_PAREN ")" + SEMICOLON ";" + WHITESPACE "\n\n" + COMMENT "-- doc examples" + WHITESPACE "\n" + SELECT + SELECT_CLAUSE + SELECT_KW "select" + WHITESPACE " " + TARGET_LIST + TARGET + CALL_EXPR + JSON_EXISTS_FN + JSON_EXISTS_KW "JSON_EXISTS" + L_PAREN "(" + CAST_EXPR + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + IDENT "jsonb" + WHITESPACE " " + LITERAL + STRING "'{\"key1\": [1,2,3]}'" + COMMA "," + WHITESPACE " " + LITERAL + STRING "'strict $.key1[*] ? (@ > $x)'" + WHITESPACE " " + JSON_PASSING_CLAUSE + PASSING_KW "PASSING" + WHITESPACE " " + JSON_PASSING_ARG + LITERAL + INT_NUMBER "2" + WHITESPACE " " + AS_KW "AS" + WHITESPACE " " + NAME + IDENT "x" + R_PAREN ")" + SEMICOLON ";" + WHITESPACE "\n" + SELECT + SELECT_CLAUSE + SELECT_KW "select" + WHITESPACE " " + TARGET_LIST + TARGET + CALL_EXPR + JSON_EXISTS_FN + JSON_EXISTS_KW "JSON_EXISTS" + L_PAREN "(" + CAST_EXPR + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + IDENT "jsonb" + WHITESPACE " " + LITERAL + STRING "'{\"a\": [1,2,3]}'" + COMMA "," + WHITESPACE " " + LITERAL + STRING "'lax $.a[5]'" + WHITESPACE " " + JSON_ON_ERROR_CLAUSE + JSON_BEHAVIOR_ERROR + ERROR_KW "ERROR" + WHITESPACE " " + ON_KW "ON" + WHITESPACE " " + ERROR_KW "ERROR" + R_PAREN ")" + SEMICOLON ";" + WHITESPACE "\n" + SELECT + SELECT_CLAUSE + SELECT_KW "select" + WHITESPACE " " + TARGET_LIST + TARGET + CALL_EXPR + JSON_EXISTS_FN + JSON_EXISTS_KW "JSON_EXISTS" + L_PAREN "(" + CAST_EXPR + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + IDENT "jsonb" + WHITESPACE " " + LITERAL + STRING "'{\"a\": [1,2,3]}'" + COMMA "," + WHITESPACE " " + LITERAL + STRING "'strict $.a[5]'" + WHITESPACE " " + JSON_ON_ERROR_CLAUSE + JSON_BEHAVIOR_ERROR + ERROR_KW "ERROR" + WHITESPACE " " + ON_KW "ON" + WHITESPACE " " + ERROR_KW "ERROR" + R_PAREN ")" + SEMICOLON ";" + WHITESPACE "\n\n" + COMMENT "-- json_value" + WHITESPACE "\n" + SELECT + SELECT_CLAUSE + SELECT_KW "select" + WHITESPACE " " + TARGET_LIST + TARGET + CALL_EXPR + JSON_VALUE_FN + JSON_VALUE_KW "json_value" + L_PAREN "(" + NAME_REF + IDENT "a" + COMMA "," + WHITESPACE " " + NAME_REF + IDENT "b" + R_PAREN ")" + SEMICOLON ";" WHITESPACE "\n" + SELECT + SELECT_CLAUSE + SELECT_KW "select" + WHITESPACE " " + TARGET_LIST + TARGET + CALL_EXPR + JSON_VALUE_FN + JSON_VALUE_KW "json_value" + L_PAREN "(" + WHITESPACE "\n " + NAME_REF + IDENT "a" + WHITESPACE " " + JSON_FORMAT_CLAUSE + FORMAT_KW "format" + WHITESPACE " " + JSON_KW "json" + COMMA "," + WHITESPACE "\n " + NAME_REF + IDENT "b" + WHITESPACE " " + JSON_PASSING_CLAUSE + PASSING_KW "passing" + WHITESPACE " " + JSON_PASSING_ARG + NAME_REF + IDENT "c" + WHITESPACE " " + AS_KW "as" + WHITESPACE " " + NAME + IDENT "d" + WHITESPACE "\n " + JSON_RETURNING_CLAUSE + RETURNING_KW "returning" + WHITESPACE " " + PATH_TYPE + PATH + PATH_SEGMENT + NAME_REF + IDENT "foo" + WHITESPACE " " + JSON_FORMAT_CLAUSE + FORMAT_KW "format" + WHITESPACE " " + JSON_KW "json" + WHITESPACE "\n " + JSON_ON_EMPTY_CLAUSE + JSON_BEHAVIOR_UNKNOWN + UNKNOWN_KW "unknown" + WHITESPACE " " + ON_KW "on" + WHITESPACE " " + EMPTY_KW "empty" + WHITESPACE "\n " + JSON_ON_ERROR_CLAUSE + JSON_BEHAVIOR_DEFAULT + DEFAULT_KW "default" + WHITESPACE " " + NAME_REF + IDENT "z" + WHITESPACE " " + ON_KW "on" + WHITESPACE " " + ERROR_KW "error" + WHITESPACE "\n" + R_PAREN ")" + SEMICOLON ";" + WHITESPACE "\n\n" diff --git a/crates/squawk_parser/tests/snapshots/tests__select_funcs_pg17_ok.snap b/crates/squawk_parser/tests/snapshots/tests__select_funcs_pg17_ok.snap deleted file mode 100644 index dbad24f2..00000000 --- a/crates/squawk_parser/tests/snapshots/tests__select_funcs_pg17_ok.snap +++ /dev/null @@ -1,1202 +0,0 @@ ---- -source: crates/squawk_parser/tests/tests.rs -input_file: crates/squawk_parser/tests/data/ok/select_funcs_pg17.sql ---- -SOURCE_FILE - WHITESPACE "\n" - COMMENT "-- json_table" - WHITESPACE "\n" - SELECT - SELECT_CLAUSE - SELECT_KW "SELECT" - WHITESPACE " " - TARGET_LIST - TARGET - FIELD_EXPR - NAME_REF - IDENT "jt" - DOT "." - STAR "*" - WHITESPACE " " - FROM_CLAUSE - FROM_KW "FROM" - WHITESPACE "\n " - FROM_ITEM - NAME_REF - IDENT "my_films" - COMMA "," - WHITESPACE "\n " - FROM_ITEM - JSON_TABLE - JSON_TABLE_KW "JSON_TABLE" - WHITESPACE " " - L_PAREN "(" - NAME_REF - IDENT "js" - COMMA "," - WHITESPACE " " - LITERAL - STRING "'$.favorites[*]'" - WHITESPACE " " - JSON_TABLE_COLUMN_LIST - COLUMNS_KW "COLUMNS" - WHITESPACE " " - L_PAREN "(" - WHITESPACE "\n " - JSON_TABLE_COLUMN - NAME - IDENT "id" - WHITESPACE " " - FOR_KW "FOR" - WHITESPACE " " - ORDINALITY_KW "ORDINALITY" - COMMA "," - WHITESPACE "\n " - JSON_TABLE_COLUMN - NAME - IDENT "kind" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - TEXT_KW "text" - WHITESPACE " " - JSON_PATH_CLAUSE - PATH_KW "PATH" - WHITESPACE " " - LITERAL - STRING "'$.kind'" - COMMA "," - WHITESPACE "\n " - JSON_TABLE_COLUMN - NAME - IDENT "title" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - TEXT_KW "text" - WHITESPACE " " - JSON_PATH_CLAUSE - PATH_KW "PATH" - WHITESPACE " " - LITERAL - STRING "'$.films[*].title'" - WHITESPACE " " - JSON_WRAPPER_BEHAVIOR_CLAUSE - WITH_KW "WITH" - WHITESPACE " " - WRAPPER_KW "WRAPPER" - COMMA "," - WHITESPACE "\n " - JSON_TABLE_COLUMN - NAME - IDENT "director" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - TEXT_KW "text" - WHITESPACE " " - JSON_PATH_CLAUSE - PATH_KW "PATH" - WHITESPACE " " - LITERAL - STRING "'$.films[*].director'" - WHITESPACE " " - JSON_WRAPPER_BEHAVIOR_CLAUSE - WITH_KW "WITH" - WHITESPACE " " - WRAPPER_KW "WRAPPER" - R_PAREN ")" - R_PAREN ")" - WHITESPACE " " - ALIAS - AS_KW "AS" - WHITESPACE " " - NAME - IDENT "jt" - SEMICOLON ";" - WHITESPACE "\n\n" - COMMENT "-- json_table_nested_path" - WHITESPACE "\n" - SELECT - SELECT_CLAUSE - SELECT_KW "SELECT" - WHITESPACE " " - TARGET_LIST - TARGET - FIELD_EXPR - NAME_REF - IDENT "jt" - DOT "." - STAR "*" - WHITESPACE " " - FROM_CLAUSE - FROM_KW "FROM" - WHITESPACE "\n " - FROM_ITEM - NAME_REF - IDENT "my_films" - COMMA "," - WHITESPACE "\n " - FROM_ITEM - JSON_TABLE - JSON_TABLE_KW "JSON_TABLE" - WHITESPACE " " - L_PAREN "(" - WHITESPACE " " - NAME_REF - IDENT "js" - COMMA "," - WHITESPACE " " - LITERAL - STRING "'$.favorites[*] ? (@.films[*].director == $filter)'" - WHITESPACE "\n " - JSON_PASSING_CLAUSE - PASSING_KW "PASSING" - WHITESPACE " " - JSON_PASSING_ARG - LITERAL - STRING "'Alfred Hitchcock'" - WHITESPACE " " - AS_KW "AS" - WHITESPACE " " - NAME - FILTER_KW "filter" - WHITESPACE "\n " - JSON_TABLE_COLUMN_LIST - COLUMNS_KW "COLUMNS" - WHITESPACE " " - L_PAREN "(" - WHITESPACE "\n " - JSON_TABLE_COLUMN - NAME - IDENT "id" - WHITESPACE " " - FOR_KW "FOR" - WHITESPACE " " - ORDINALITY_KW "ORDINALITY" - COMMA "," - WHITESPACE "\n " - JSON_TABLE_COLUMN - NAME - IDENT "kind" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - TEXT_KW "text" - WHITESPACE " " - JSON_PATH_CLAUSE - PATH_KW "PATH" - WHITESPACE " " - LITERAL - STRING "'$.kind'" - COMMA "," - WHITESPACE "\n " - JSON_TABLE_COLUMN - NESTED_KW "NESTED" - WHITESPACE " " - PATH_KW "PATH" - WHITESPACE " " - LITERAL - STRING "'$.films[*]'" - WHITESPACE " " - JSON_TABLE_COLUMN_LIST - COLUMNS_KW "COLUMNS" - WHITESPACE " " - L_PAREN "(" - WHITESPACE "\n " - JSON_TABLE_COLUMN - NAME - IDENT "title" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - TEXT_KW "text" - WHITESPACE " " - JSON_FORMAT_CLAUSE - FORMAT_KW "FORMAT" - WHITESPACE " " - JSON_KW "JSON" - WHITESPACE " " - JSON_PATH_CLAUSE - PATH_KW "PATH" - WHITESPACE " " - LITERAL - STRING "'$.title'" - WHITESPACE " " - JSON_QUOTES_CLAUSE - OMIT_KW "OMIT" - WHITESPACE " " - QUOTES_KW "QUOTES" - COMMA "," - WHITESPACE "\n " - JSON_TABLE_COLUMN - NAME - IDENT "director" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - TEXT_KW "text" - WHITESPACE " " - JSON_PATH_CLAUSE - PATH_KW "PATH" - WHITESPACE " " - LITERAL - STRING "'$.director'" - WHITESPACE " " - JSON_QUOTES_CLAUSE - KEEP_KW "KEEP" - WHITESPACE " " - QUOTES_KW "QUOTES" - R_PAREN ")" - R_PAREN ")" - R_PAREN ")" - WHITESPACE " " - ALIAS - AS_KW "AS" - WHITESPACE " " - NAME - IDENT "jt" - SEMICOLON ";" - WHITESPACE "\n\n" - COMMENT "-- json_table_without_filter" - WHITESPACE "\n" - SELECT - SELECT_CLAUSE - SELECT_KW "SELECT" - WHITESPACE " " - TARGET_LIST - TARGET - FIELD_EXPR - NAME_REF - IDENT "jt" - DOT "." - STAR "*" - WHITESPACE " " - FROM_CLAUSE - FROM_KW "FROM" - WHITESPACE "\n " - FROM_ITEM - NAME_REF - IDENT "my_films" - COMMA "," - WHITESPACE "\n " - FROM_ITEM - JSON_TABLE - JSON_TABLE_KW "JSON_TABLE" - WHITESPACE " " - L_PAREN "(" - WHITESPACE " " - NAME_REF - IDENT "js" - COMMA "," - WHITESPACE " " - LITERAL - STRING "'$.favorites[*]'" - WHITESPACE "\n " - JSON_TABLE_COLUMN_LIST - COLUMNS_KW "COLUMNS" - WHITESPACE " " - L_PAREN "(" - WHITESPACE "\n " - JSON_TABLE_COLUMN - NAME - IDENT "id" - WHITESPACE " " - FOR_KW "FOR" - WHITESPACE " " - ORDINALITY_KW "ORDINALITY" - COMMA "," - WHITESPACE "\n " - JSON_TABLE_COLUMN - NAME - IDENT "kind" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - TEXT_KW "text" - WHITESPACE " " - JSON_PATH_CLAUSE - PATH_KW "PATH" - WHITESPACE " " - LITERAL - STRING "'$.kind'" - COMMA "," - WHITESPACE "\n " - JSON_TABLE_COLUMN - NESTED_KW "NESTED" - WHITESPACE " " - PATH_KW "PATH" - WHITESPACE " " - LITERAL - STRING "'$.films[*]'" - WHITESPACE " " - JSON_TABLE_COLUMN_LIST - COLUMNS_KW "COLUMNS" - WHITESPACE " " - L_PAREN "(" - WHITESPACE "\n " - JSON_TABLE_COLUMN - NAME - IDENT "title" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - TEXT_KW "text" - WHITESPACE " " - JSON_FORMAT_CLAUSE - FORMAT_KW "FORMAT" - WHITESPACE " " - JSON_KW "JSON" - WHITESPACE " " - JSON_PATH_CLAUSE - PATH_KW "PATH" - WHITESPACE " " - LITERAL - STRING "'$.title'" - WHITESPACE " " - JSON_QUOTES_CLAUSE - OMIT_KW "OMIT" - WHITESPACE " " - QUOTES_KW "QUOTES" - COMMA "," - WHITESPACE "\n " - JSON_TABLE_COLUMN - NAME - IDENT "director" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - TEXT_KW "text" - WHITESPACE " " - JSON_PATH_CLAUSE - PATH_KW "PATH" - WHITESPACE " " - LITERAL - STRING "'$.director'" - WHITESPACE " " - JSON_QUOTES_CLAUSE - KEEP_KW "KEEP" - WHITESPACE " " - QUOTES_KW "QUOTES" - R_PAREN ")" - R_PAREN ")" - R_PAREN ")" - WHITESPACE " " - ALIAS - AS_KW "AS" - WHITESPACE " " - NAME - IDENT "jt" - SEMICOLON ";" - WHITESPACE "\n\n" - COMMENT "-- json_table_union" - WHITESPACE "\n" - SELECT - SELECT_CLAUSE - SELECT_KW "SELECT" - WHITESPACE " " - TARGET_LIST - TARGET - STAR "*" - WHITESPACE " " - FROM_CLAUSE - FROM_KW "FROM" - WHITESPACE " " - FROM_ITEM - JSON_TABLE - JSON_TABLE_KW "JSON_TABLE" - WHITESPACE " " - L_PAREN "(" - WHITESPACE "\n" - CAST_EXPR - LITERAL - STRING "'{\"favorites\":\n {\"movies\":\n [{\"name\": \"One\", \"director\": \"John Doe\"},\n {\"name\": \"Two\", \"director\": \"Don Joe\"}],\n \"books\":\n [{\"name\": \"Mystery\", \"authors\": [{\"name\": \"Brown Dan\"}]},\n {\"name\": \"Wonder\", \"authors\": [{\"name\": \"Jun Murakami\"}, {\"name\":\"Craig Doe\"}]}]\n}}'" - COLON_COLON - COLON ":" - COLON ":" - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - JSON_KW "json" - COMMA "," - WHITESPACE " " - LITERAL - STRING "'$.favorites[*]'" - WHITESPACE "\n" - JSON_TABLE_COLUMN_LIST - COLUMNS_KW "COLUMNS" - WHITESPACE " " - L_PAREN "(" - WHITESPACE "\n " - JSON_TABLE_COLUMN - NAME - IDENT "user_id" - WHITESPACE " " - FOR_KW "FOR" - WHITESPACE " " - ORDINALITY_KW "ORDINALITY" - COMMA "," - WHITESPACE "\n " - JSON_TABLE_COLUMN - NESTED_KW "NESTED" - WHITESPACE " " - LITERAL - STRING "'$.movies[*]'" - WHITESPACE "\n " - JSON_TABLE_COLUMN_LIST - COLUMNS_KW "COLUMNS" - WHITESPACE " " - L_PAREN "(" - WHITESPACE "\n " - JSON_TABLE_COLUMN - NAME - IDENT "movie_id" - WHITESPACE " " - FOR_KW "FOR" - WHITESPACE " " - ORDINALITY_KW "ORDINALITY" - COMMA "," - WHITESPACE "\n " - JSON_TABLE_COLUMN - NAME - IDENT "mname" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - TEXT_KW "text" - WHITESPACE " " - JSON_PATH_CLAUSE - PATH_KW "PATH" - WHITESPACE " " - LITERAL - STRING "'$.name'" - COMMA "," - WHITESPACE "\n " - JSON_TABLE_COLUMN - NAME - IDENT "director" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - TEXT_KW "text" - R_PAREN ")" - COMMA "," - WHITESPACE "\n " - JSON_TABLE_COLUMN - NESTED_KW "NESTED" - WHITESPACE " " - LITERAL - STRING "'$.books[*]'" - WHITESPACE "\n " - JSON_TABLE_COLUMN_LIST - COLUMNS_KW "COLUMNS" - WHITESPACE " " - L_PAREN "(" - WHITESPACE "\n " - JSON_TABLE_COLUMN - NAME - IDENT "book_id" - WHITESPACE " " - FOR_KW "FOR" - WHITESPACE " " - ORDINALITY_KW "ORDINALITY" - COMMA "," - WHITESPACE "\n " - JSON_TABLE_COLUMN - NAME - IDENT "bname" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - TEXT_KW "text" - WHITESPACE " " - JSON_PATH_CLAUSE - PATH_KW "PATH" - WHITESPACE " " - LITERAL - STRING "'$.name'" - COMMA "," - WHITESPACE "\n " - JSON_TABLE_COLUMN - NESTED_KW "NESTED" - WHITESPACE " " - LITERAL - STRING "'$.authors[*]'" - WHITESPACE "\n " - JSON_TABLE_COLUMN_LIST - COLUMNS_KW "COLUMNS" - WHITESPACE " " - L_PAREN "(" - WHITESPACE "\n " - JSON_TABLE_COLUMN - NAME - IDENT "author_id" - WHITESPACE " " - FOR_KW "FOR" - WHITESPACE " " - ORDINALITY_KW "ORDINALITY" - COMMA "," - WHITESPACE "\n " - JSON_TABLE_COLUMN - NAME - IDENT "author_name" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - TEXT_KW "text" - WHITESPACE " " - JSON_PATH_CLAUSE - PATH_KW "PATH" - WHITESPACE " " - LITERAL - STRING "'$.name'" - R_PAREN ")" - R_PAREN ")" - R_PAREN ")" - R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n\n" - COMMENT "-- json" - WHITESPACE "\n" - SELECT - SELECT_CLAUSE - SELECT_KW "select" - WHITESPACE " " - TARGET_LIST - TARGET - CALL_EXPR - JSON_FN - JSON_KW "json" - L_PAREN "(" - NAME_REF - IDENT "a" - WHITESPACE " " - JSON_FORMAT_CLAUSE - FORMAT_KW "format" - WHITESPACE " " - JSON_KW "json" - R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n" - SELECT - SELECT_CLAUSE - SELECT_KW "select" - WHITESPACE " " - TARGET_LIST - TARGET - CALL_EXPR - JSON_FN - JSON_KW "json" - L_PAREN "(" - NAME_REF - IDENT "a" - WHITESPACE " " - JSON_FORMAT_CLAUSE - FORMAT_KW "format" - WHITESPACE " " - JSON_KW "json" - WHITESPACE " " - JSON_KEYS_UNIQUE_CLAUSE - WITH_KW "with" - WHITESPACE " " - UNIQUE_KW "unique" - WHITESPACE " " - KEYS_KW "keys" - R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n" - SELECT - SELECT_CLAUSE - SELECT_KW "select" - WHITESPACE " " - TARGET_LIST - TARGET - CALL_EXPR - JSON_FN - JSON_KW "json" - L_PAREN "(" - NAME_REF - IDENT "a" - WHITESPACE " " - JSON_FORMAT_CLAUSE - FORMAT_KW "format" - WHITESPACE " " - JSON_KW "json" - WHITESPACE " " - JSON_KEYS_UNIQUE_CLAUSE - WITH_KW "with" - WHITESPACE " " - UNIQUE_KW "unique" - R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n" - SELECT - SELECT_CLAUSE - SELECT_KW "select" - WHITESPACE " " - TARGET_LIST - TARGET - CALL_EXPR - JSON_FN - JSON_KW "json" - L_PAREN "(" - NAME_REF - IDENT "a" - WHITESPACE " " - JSON_FORMAT_CLAUSE - FORMAT_KW "format" - WHITESPACE " " - JSON_KW "json" - WHITESPACE " " - JSON_KEYS_UNIQUE_CLAUSE - WITHOUT_KW "without" - WHITESPACE " " - UNIQUE_KW "unique" - WHITESPACE " " - KEYS_KW "keys" - R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n" - SELECT - SELECT_CLAUSE - SELECT_KW "select" - WHITESPACE " " - TARGET_LIST - TARGET - CALL_EXPR - JSON_FN - JSON_KW "json" - L_PAREN "(" - NAME_REF - IDENT "a" - WHITESPACE " " - JSON_FORMAT_CLAUSE - FORMAT_KW "format" - WHITESPACE " " - JSON_KW "json" - WHITESPACE " " - JSON_KEYS_UNIQUE_CLAUSE - WITHOUT_KW "without" - WHITESPACE " " - UNIQUE_KW "unique" - R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n\n" - COMMENT "-- json_serialize" - WHITESPACE "\n" - SELECT - SELECT_CLAUSE - SELECT_KW "select" - WHITESPACE " " - TARGET_LIST - TARGET - CALL_EXPR - JSON_SERIALIZE_FN - JSON_SERIALIZE_KW "json_serialize" - L_PAREN "(" - NAME_REF - IDENT "a" - R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n" - SELECT - SELECT_CLAUSE - SELECT_KW "select" - WHITESPACE " " - TARGET_LIST - TARGET - CALL_EXPR - JSON_SERIALIZE_FN - JSON_SERIALIZE_KW "json_serialize" - L_PAREN "(" - NAME_REF - IDENT "a" - WHITESPACE " " - JSON_FORMAT_CLAUSE - FORMAT_KW "format" - WHITESPACE " " - JSON_KW "json" - R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n" - SELECT - SELECT_CLAUSE - SELECT_KW "select" - WHITESPACE " " - TARGET_LIST - TARGET - CALL_EXPR - JSON_SERIALIZE_FN - JSON_SERIALIZE_KW "json_serialize" - L_PAREN "(" - NAME_REF - IDENT "a" - WHITESPACE " " - JSON_RETURNING_CLAUSE - RETURNING_KW "returning" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - IDENT "foo" - R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n" - SELECT - SELECT_CLAUSE - SELECT_KW "select" - WHITESPACE " " - TARGET_LIST - TARGET - CALL_EXPR - JSON_SERIALIZE_FN - JSON_SERIALIZE_KW "json_serialize" - L_PAREN "(" - NAME_REF - IDENT "a" - WHITESPACE " " - JSON_FORMAT_CLAUSE - FORMAT_KW "format" - WHITESPACE " " - JSON_KW "json" - WHITESPACE " " - JSON_RETURNING_CLAUSE - RETURNING_KW "returning" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - IDENT "foo" - WHITESPACE " " - JSON_FORMAT_CLAUSE - FORMAT_KW "format" - WHITESPACE " " - JSON_KW "json" - R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n\n" - COMMENT "-- json_query" - WHITESPACE "\n" - SELECT - SELECT_CLAUSE - SELECT_KW "select" - WHITESPACE " " - TARGET_LIST - TARGET - CALL_EXPR - JSON_QUERY_FN - JSON_QUERY_KW "json_query" - L_PAREN "(" - NAME_REF - IDENT "a" - COMMA "," - WHITESPACE " " - NAME_REF - IDENT "b" - WHITESPACE " " - JSON_WRAPPER_BEHAVIOR_CLAUSE - WITH_KW "with" - WHITESPACE " " - WRAPPER_KW "wrapper" - R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n" - SELECT - SELECT_CLAUSE - SELECT_KW "select" - WHITESPACE " " - TARGET_LIST - TARGET - CALL_EXPR - JSON_QUERY_FN - JSON_QUERY_KW "json_query" - L_PAREN "(" - WHITESPACE "\n " - NAME_REF - IDENT "a" - WHITESPACE " " - JSON_FORMAT_CLAUSE - FORMAT_KW "format" - WHITESPACE " " - JSON_KW "json" - COMMA "," - WHITESPACE " \n " - NAME_REF - IDENT "b" - WHITESPACE " " - JSON_PASSING_CLAUSE - PASSING_KW "passing" - WHITESPACE " " - JSON_PASSING_ARG - NAME_REF - IDENT "c" - WHITESPACE " " - AS_KW "as" - WHITESPACE " " - NAME - IDENT "foo" - COMMA "," - WHITESPACE " \n " - JSON_PASSING_ARG - NAME_REF - IDENT "d" - WHITESPACE " " - AS_KW "as" - WHITESPACE " " - NAME - IDENT "bar" - WHITESPACE " \n " - JSON_RETURNING_CLAUSE - RETURNING_KW "returning" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - TEXT_KW "text" - WHITESPACE " \n " - JSON_FORMAT_CLAUSE - FORMAT_KW "format" - WHITESPACE " " - JSON_KW "json" - WHITESPACE " \n " - JSON_WRAPPER_BEHAVIOR_CLAUSE - WITH_KW "with" - WHITESPACE " " - UNCONDITIONAL_KW "unconditional" - WHITESPACE " " - ARRAY_KW "array" - WHITESPACE " " - WRAPPER_KW "wrapper" - WHITESPACE "\n " - JSON_QUOTES_CLAUSE - KEEP_KW "keep" - WHITESPACE " " - QUOTES_KW "quotes" - WHITESPACE " " - ON_KW "on" - WHITESPACE " " - SCALAR_KW "scalar" - WHITESPACE " " - STRING_KW "string" - WHITESPACE "\n " - JSON_ON_EMPTY_CLAUSE - JSON_BEHAVIOR_UNKNOWN - UNKNOWN_KW "unknown" - WHITESPACE " " - ON_KW "on" - WHITESPACE " " - EMPTY_KW "empty" - WHITESPACE "\n " - JSON_ON_ERROR_CLAUSE - JSON_BEHAVIOR_EMPTY_ARRAY - EMPTY_KW "empty" - WHITESPACE " " - ARRAY_KW "array" - WHITESPACE " " - ON_KW "on" - WHITESPACE " " - ERROR_KW "error" - WHITESPACE "\n" - R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n\n\n" - COMMENT "-- json_exists" - WHITESPACE "\n" - SELECT - SELECT_CLAUSE - SELECT_KW "select" - WHITESPACE " " - TARGET_LIST - TARGET - CALL_EXPR - JSON_EXISTS_FN - JSON_EXISTS_KW "json_exists" - L_PAREN "(" - NAME_REF - IDENT "a" - COMMA "," - WHITESPACE " " - NAME_REF - IDENT "b" - R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n" - SELECT - SELECT_CLAUSE - SELECT_KW "select" - WHITESPACE " " - TARGET_LIST - TARGET - CALL_EXPR - JSON_EXISTS_FN - JSON_EXISTS_KW "json_exists" - L_PAREN "(" - WHITESPACE "\n " - NAME_REF - IDENT "a" - WHITESPACE " " - JSON_FORMAT_CLAUSE - FORMAT_KW "format" - WHITESPACE " " - JSON_KW "json" - COMMA "," - WHITESPACE "\n " - NAME_REF - IDENT "b" - WHITESPACE " " - JSON_PASSING_CLAUSE - PASSING_KW "passing" - WHITESPACE " " - JSON_PASSING_ARG - NAME_REF - IDENT "c" - WHITESPACE " " - AS_KW "as" - WHITESPACE " " - NAME - IDENT "d" - WHITESPACE "\n " - JSON_ON_ERROR_CLAUSE - JSON_BEHAVIOR_DEFAULT - DEFAULT_KW "default" - WHITESPACE " " - NAME_REF - IDENT "z" - WHITESPACE " " - ON_KW "on" - WHITESPACE " " - ERROR_KW "error" - WHITESPACE "\n" - R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n\n" - COMMENT "-- doc examples" - WHITESPACE "\n" - SELECT - SELECT_CLAUSE - SELECT_KW "select" - WHITESPACE " " - TARGET_LIST - TARGET - CALL_EXPR - JSON_EXISTS_FN - JSON_EXISTS_KW "JSON_EXISTS" - L_PAREN "(" - CAST_EXPR - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - IDENT "jsonb" - WHITESPACE " " - LITERAL - STRING "'{\"key1\": [1,2,3]}'" - COMMA "," - WHITESPACE " " - LITERAL - STRING "'strict $.key1[*] ? (@ > $x)'" - WHITESPACE " " - JSON_PASSING_CLAUSE - PASSING_KW "PASSING" - WHITESPACE " " - JSON_PASSING_ARG - LITERAL - INT_NUMBER "2" - WHITESPACE " " - AS_KW "AS" - WHITESPACE " " - NAME - IDENT "x" - R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n" - SELECT - SELECT_CLAUSE - SELECT_KW "select" - WHITESPACE " " - TARGET_LIST - TARGET - CALL_EXPR - JSON_EXISTS_FN - JSON_EXISTS_KW "JSON_EXISTS" - L_PAREN "(" - CAST_EXPR - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - IDENT "jsonb" - WHITESPACE " " - LITERAL - STRING "'{\"a\": [1,2,3]}'" - COMMA "," - WHITESPACE " " - LITERAL - STRING "'lax $.a[5]'" - WHITESPACE " " - JSON_ON_ERROR_CLAUSE - JSON_BEHAVIOR_ERROR - ERROR_KW "ERROR" - WHITESPACE " " - ON_KW "ON" - WHITESPACE " " - ERROR_KW "ERROR" - R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n" - SELECT - SELECT_CLAUSE - SELECT_KW "select" - WHITESPACE " " - TARGET_LIST - TARGET - CALL_EXPR - JSON_EXISTS_FN - JSON_EXISTS_KW "JSON_EXISTS" - L_PAREN "(" - CAST_EXPR - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - IDENT "jsonb" - WHITESPACE " " - LITERAL - STRING "'{\"a\": [1,2,3]}'" - COMMA "," - WHITESPACE " " - LITERAL - STRING "'strict $.a[5]'" - WHITESPACE " " - JSON_ON_ERROR_CLAUSE - JSON_BEHAVIOR_ERROR - ERROR_KW "ERROR" - WHITESPACE " " - ON_KW "ON" - WHITESPACE " " - ERROR_KW "ERROR" - R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n\n" - COMMENT "-- json_value" - WHITESPACE "\n" - SELECT - SELECT_CLAUSE - SELECT_KW "select" - WHITESPACE " " - TARGET_LIST - TARGET - CALL_EXPR - JSON_VALUE_FN - JSON_VALUE_KW "json_value" - L_PAREN "(" - NAME_REF - IDENT "a" - COMMA "," - WHITESPACE " " - NAME_REF - IDENT "b" - R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n" - SELECT - SELECT_CLAUSE - SELECT_KW "select" - WHITESPACE " " - TARGET_LIST - TARGET - CALL_EXPR - JSON_VALUE_FN - JSON_VALUE_KW "json_value" - L_PAREN "(" - WHITESPACE "\n " - NAME_REF - IDENT "a" - WHITESPACE " " - JSON_FORMAT_CLAUSE - FORMAT_KW "format" - WHITESPACE " " - JSON_KW "json" - COMMA "," - WHITESPACE "\n " - NAME_REF - IDENT "b" - WHITESPACE " " - JSON_PASSING_CLAUSE - PASSING_KW "passing" - WHITESPACE " " - JSON_PASSING_ARG - NAME_REF - IDENT "c" - WHITESPACE " " - AS_KW "as" - WHITESPACE " " - NAME - IDENT "d" - WHITESPACE "\n " - JSON_RETURNING_CLAUSE - RETURNING_KW "returning" - WHITESPACE " " - PATH_TYPE - PATH - PATH_SEGMENT - NAME_REF - IDENT "foo" - WHITESPACE " " - JSON_FORMAT_CLAUSE - FORMAT_KW "format" - WHITESPACE " " - JSON_KW "json" - WHITESPACE "\n " - JSON_ON_EMPTY_CLAUSE - JSON_BEHAVIOR_UNKNOWN - UNKNOWN_KW "unknown" - WHITESPACE " " - ON_KW "on" - WHITESPACE " " - EMPTY_KW "empty" - WHITESPACE "\n " - JSON_ON_ERROR_CLAUSE - JSON_BEHAVIOR_DEFAULT - DEFAULT_KW "default" - WHITESPACE " " - NAME_REF - IDENT "z" - WHITESPACE " " - ON_KW "on" - WHITESPACE " " - ERROR_KW "error" - WHITESPACE "\n" - R_PAREN ")" - SEMICOLON ";" - WHITESPACE "\n\n" diff --git a/crates/squawk_parser/tests/snapshots/tests__update_ok.snap b/crates/squawk_parser/tests/snapshots/tests__update_ok.snap index a3d65013..6186dac2 100644 --- a/crates/squawk_parser/tests/snapshots/tests__update_ok.snap +++ b/crates/squawk_parser/tests/snapshots/tests__update_ok.snap @@ -1417,4 +1417,195 @@ SOURCE_FILE NAME_REF IDENT "ctid" SEMICOLON ";" + WHITESPACE "\n\n\n" + COMMENT "-- returning_with_old_new" + WHITESPACE "\n" + UPDATE + UPDATE_KW "UPDATE" + WHITESPACE " " + RELATION_NAME + PATH + PATH_SEGMENT + NAME_REF + IDENT "inventory" + WHITESPACE "\n" + SET_CLAUSE + SET_KW "SET" + WHITESPACE " " + SET_COLUMN_LIST + SET_SINGLE_COLUMN + COLUMN + NAME_REF + IDENT "quantity" + WHITESPACE " " + EQ "=" + WHITESPACE " " + SET_EXPR + BIN_EXPR + NAME_REF + IDENT "quantity" + WHITESPACE " " + MINUS "-" + WHITESPACE " " + LITERAL + INT_NUMBER "5" + WHITESPACE "\n" + WHERE_CLAUSE + WHERE_KW "WHERE" + WHITESPACE " " + BIN_EXPR + NAME_REF + IDENT "product_id" + WHITESPACE " " + EQ "=" + WHITESPACE " " + LITERAL + INT_NUMBER "456" + WHITESPACE "\n" + RETURNING_CLAUSE + RETURNING_KW "RETURNING" + WHITESPACE " " + RETURNING_OPTION_LIST + WITH_KW "WITH" + WHITESPACE " " + L_PAREN "(" + RETURNING_OPTION + OLD_KW "OLD" + WHITESPACE " " + AS_KW "AS" + WHITESPACE " " + NAME + BEFORE_KW "before" + COMMA "," + WHITESPACE " " + RETURNING_OPTION + NEW_KW "NEW" + WHITESPACE " " + AS_KW "AS" + WHITESPACE " " + NAME + AFTER_KW "after" + R_PAREN ")" + WHITESPACE "\n " + TARGET_LIST + TARGET + FIELD_EXPR + NAME_REF + BEFORE_KW "before" + DOT "." + NAME_REF + IDENT "quantity" + WHITESPACE " " + AS_NAME + AS_KW "AS" + WHITESPACE " " + NAME + IDENT "previous_quantity" + COMMA "," + WHITESPACE "\n " + TARGET + FIELD_EXPR + NAME_REF + AFTER_KW "after" + DOT "." + NAME_REF + IDENT "quantity" + WHITESPACE " " + AS_NAME + AS_KW "AS" + WHITESPACE " " + NAME + IDENT "current_quantity" + COMMA "," + WHITESPACE "\n " + TARGET + BIN_EXPR + FIELD_EXPR + NAME_REF + AFTER_KW "after" + DOT "." + NAME_REF + IDENT "quantity" + WHITESPACE " " + MINUS "-" + WHITESPACE " " + FIELD_EXPR + NAME_REF + BEFORE_KW "before" + DOT "." + NAME_REF + IDENT "quantity" + WHITESPACE " " + AS_NAME + AS_KW "AS" + WHITESPACE " " + NAME + IDENT "change" + SEMICOLON ";" WHITESPACE "\n\n" + UPDATE + UPDATE_KW "update" + WHITESPACE " " + RELATION_NAME + PATH + PATH_SEGMENT + NAME_REF + IDENT "t" + WHITESPACE " " + SET_CLAUSE + SET_KW "set" + WHITESPACE " " + SET_COLUMN_LIST + SET_SINGLE_COLUMN + COLUMN + NAME_REF + IDENT "x" + WHITESPACE " " + EQ "=" + WHITESPACE " " + SET_EXPR + LITERAL + INT_NUMBER "1" + WHITESPACE " \n" + RETURNING_CLAUSE + RETURNING_KW "returning" + WHITESPACE " " + RETURNING_OPTION_LIST + WITH_KW "with" + WHITESPACE " " + L_PAREN "(" + RETURNING_OPTION + OLD_KW "old" + WHITESPACE " " + AS_KW "as" + WHITESPACE " " + NAME + IDENT "o" + COMMA "," + WHITESPACE " " + RETURNING_OPTION + NEW_KW "new" + WHITESPACE " " + AS_KW "as" + WHITESPACE " " + NAME + IDENT "n" + R_PAREN ")" + WHITESPACE " " + TARGET_LIST + TARGET + FIELD_EXPR + NAME_REF + IDENT "o" + DOT "." + STAR "*" + COMMA "," + WHITESPACE " " + TARGET + FIELD_EXPR + NAME_REF + IDENT "n" + DOT "." + STAR "*" + SEMICOLON ";" + WHITESPACE "\n" diff --git a/crates/squawk_parser/tests/snapshots/tests__update_pg18_ok.snap b/crates/squawk_parser/tests/snapshots/tests__update_pg18_ok.snap deleted file mode 100644 index 8a062c5b..00000000 --- a/crates/squawk_parser/tests/snapshots/tests__update_pg18_ok.snap +++ /dev/null @@ -1,196 +0,0 @@ ---- -source: crates/squawk_parser/tests/tests.rs -input_file: crates/squawk_parser/tests/data/ok/update_pg18.sql ---- -SOURCE_FILE - COMMENT "-- returning_with_old_new" - WHITESPACE "\n" - UPDATE - UPDATE_KW "UPDATE" - WHITESPACE " " - RELATION_NAME - PATH - PATH_SEGMENT - NAME_REF - IDENT "inventory" - WHITESPACE "\n" - SET_CLAUSE - SET_KW "SET" - WHITESPACE " " - SET_COLUMN_LIST - SET_SINGLE_COLUMN - COLUMN - NAME_REF - IDENT "quantity" - WHITESPACE " " - EQ "=" - WHITESPACE " " - SET_EXPR - BIN_EXPR - NAME_REF - IDENT "quantity" - WHITESPACE " " - MINUS "-" - WHITESPACE " " - LITERAL - INT_NUMBER "5" - WHITESPACE "\n" - WHERE_CLAUSE - WHERE_KW "WHERE" - WHITESPACE " " - BIN_EXPR - NAME_REF - IDENT "product_id" - WHITESPACE " " - EQ "=" - WHITESPACE " " - LITERAL - INT_NUMBER "456" - WHITESPACE "\n" - RETURNING_CLAUSE - RETURNING_KW "RETURNING" - WHITESPACE " " - RETURNING_OPTION_LIST - WITH_KW "WITH" - WHITESPACE " " - L_PAREN "(" - RETURNING_OPTION - OLD_KW "OLD" - WHITESPACE " " - AS_KW "AS" - WHITESPACE " " - NAME - BEFORE_KW "before" - COMMA "," - WHITESPACE " " - RETURNING_OPTION - NEW_KW "NEW" - WHITESPACE " " - AS_KW "AS" - WHITESPACE " " - NAME - AFTER_KW "after" - R_PAREN ")" - WHITESPACE "\n " - TARGET_LIST - TARGET - FIELD_EXPR - NAME_REF - BEFORE_KW "before" - DOT "." - NAME_REF - IDENT "quantity" - WHITESPACE " " - AS_NAME - AS_KW "AS" - WHITESPACE " " - NAME - IDENT "previous_quantity" - COMMA "," - WHITESPACE "\n " - TARGET - FIELD_EXPR - NAME_REF - AFTER_KW "after" - DOT "." - NAME_REF - IDENT "quantity" - WHITESPACE " " - AS_NAME - AS_KW "AS" - WHITESPACE " " - NAME - IDENT "current_quantity" - COMMA "," - WHITESPACE "\n " - TARGET - BIN_EXPR - FIELD_EXPR - NAME_REF - AFTER_KW "after" - DOT "." - NAME_REF - IDENT "quantity" - WHITESPACE " " - MINUS "-" - WHITESPACE " " - FIELD_EXPR - NAME_REF - BEFORE_KW "before" - DOT "." - NAME_REF - IDENT "quantity" - WHITESPACE " " - AS_NAME - AS_KW "AS" - WHITESPACE " " - NAME - IDENT "change" - SEMICOLON ";" - WHITESPACE "\n\n" - UPDATE - UPDATE_KW "update" - WHITESPACE " " - RELATION_NAME - PATH - PATH_SEGMENT - NAME_REF - IDENT "t" - WHITESPACE " " - SET_CLAUSE - SET_KW "set" - WHITESPACE " " - SET_COLUMN_LIST - SET_SINGLE_COLUMN - COLUMN - NAME_REF - IDENT "x" - WHITESPACE " " - EQ "=" - WHITESPACE " " - SET_EXPR - LITERAL - INT_NUMBER "1" - WHITESPACE " \n" - RETURNING_CLAUSE - RETURNING_KW "returning" - WHITESPACE " " - RETURNING_OPTION_LIST - WITH_KW "with" - WHITESPACE " " - L_PAREN "(" - RETURNING_OPTION - OLD_KW "old" - WHITESPACE " " - AS_KW "as" - WHITESPACE " " - NAME - IDENT "o" - COMMA "," - WHITESPACE " " - RETURNING_OPTION - NEW_KW "new" - WHITESPACE " " - AS_KW "as" - WHITESPACE " " - NAME - IDENT "n" - R_PAREN ")" - WHITESPACE " " - TARGET_LIST - TARGET - FIELD_EXPR - NAME_REF - IDENT "o" - DOT "." - STAR "*" - COMMA "," - WHITESPACE " " - TARGET - FIELD_EXPR - NAME_REF - IDENT "n" - DOT "." - STAR "*" - SEMICOLON ";" - WHITESPACE "\n" diff --git a/crates/squawk_parser/tests/tests.rs b/crates/squawk_parser/tests/tests.rs index 72694dbc..d0ac60a8 100644 --- a/crates/squawk_parser/tests/tests.rs +++ b/crates/squawk_parser/tests/tests.rs @@ -34,17 +34,6 @@ fn parser_ok(fixture: Fixture<&str>) { errors.is_none(), "tests defined in the `ok` can't have parser errors." ); - // // skipping pg17/pg18/pg19 specific stuff since our parser isn't using the latest parser - // if !test_name.ends_with("pg17") && !test_name.ends_with("pg18") && !test_name.ends_with("pg19") - // { - // let pg_result = pg_query::parse(content); - // if let Err(e) = &pg_result { - // assert!( - // &pg_result.is_ok(), - // "tests defined in the `ok` can't have Postgres parser errors. Found {e}", - // ); - // } - // } } #[dir_test(