diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2023-05-07 11:01:15 -0400 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2023-05-07 11:01:15 -0400 |
commit | 41e2c52fd6ebed6eff4184f68048813cc8886ec1 (patch) | |
tree | fe03231b5098a9935a6880ef13de27a4e8c526c1 /src/test | |
parent | 58f5edf849900bc248b7c909ca17da7287306c41 (diff) | |
download | postgresql-41e2c52fd6ebed6eff4184f68048813cc8886ec1.tar.gz |
Add ruleutils support for decompiling MERGE commands.
This was overlooked when MERGE was added, but it's essential
support for MERGE in new-style SQL functions.
Alvaro Herrera
Discussion: https://postgr.es/m/3579737.1683293801@sss.pgh.pa.us
Diffstat (limited to 'src/test')
-rw-r--r-- | src/test/regress/expected/rules.out | 85 | ||||
-rw-r--r-- | src/test/regress/sql/rules.sql | 49 |
2 files changed, 134 insertions, 0 deletions
diff --git a/src/test/regress/expected/rules.out b/src/test/regress/expected/rules.out index 69957687fe..764b827372 100644 --- a/src/test/regress/expected/rules.out +++ b/src/test/regress/expected/rules.out @@ -3585,6 +3585,91 @@ MERGE INTO rule_merge2 t USING (SELECT 1 AS a) s DELETE WHEN NOT MATCHED THEN INSERT VALUES (s.a, ''); +-- test deparsing +CREATE TABLE sf_target(id int, data text, filling int[]); +CREATE FUNCTION merge_sf_test() + RETURNS void + LANGUAGE sql +BEGIN ATOMIC + MERGE INTO sf_target t + USING rule_merge1 s + ON (s.a = t.id) +WHEN MATCHED + AND (s.a + t.id) = 42 + THEN UPDATE SET data = repeat(t.data, s.a) || s.b, id = length(s.b) +WHEN NOT MATCHED + AND (s.b IS NOT NULL) + THEN INSERT (data, id) + VALUES (s.b, s.a) +WHEN MATCHED + AND length(s.b || t.data) > 10 + THEN UPDATE SET data = s.b +WHEN MATCHED + AND s.a > 200 + THEN UPDATE SET filling[s.a] = t.id +WHEN MATCHED + AND s.a > 100 + THEN DELETE +WHEN MATCHED + THEN DO NOTHING +WHEN NOT MATCHED + AND s.a > 200 + THEN INSERT DEFAULT VALUES +WHEN NOT MATCHED + AND s.a > 100 + THEN INSERT (id, data) OVERRIDING USER VALUE + VALUES (s.a, DEFAULT) +WHEN NOT MATCHED + AND s.a > 0 + THEN INSERT + VALUES (s.a, s.b, DEFAULT) +WHEN NOT MATCHED + THEN INSERT (filling[1], id) + VALUES (s.a, s.a); +END; +\sf merge_sf_test +CREATE OR REPLACE FUNCTION public.merge_sf_test() + RETURNS void + LANGUAGE sql +BEGIN ATOMIC + MERGE INTO sf_target t + USING rule_merge1 s + ON (s.a = t.id) + WHEN MATCHED + AND ((s.a + t.id) = 42) + THEN UPDATE SET data = (repeat(t.data, s.a) || s.b), id = length(s.b) + WHEN NOT MATCHED + AND (s.b IS NOT NULL) + THEN INSERT (data, id) + VALUES (s.b, s.a) + WHEN MATCHED + AND (length((s.b || t.data)) > 10) + THEN UPDATE SET data = s.b + WHEN MATCHED + AND (s.a > 200) + THEN UPDATE SET filling[s.a] = t.id + WHEN MATCHED + AND (s.a > 100) + THEN DELETE + WHEN MATCHED + THEN DO NOTHING + WHEN NOT MATCHED + AND (s.a > 200) + THEN INSERT DEFAULT VALUES + WHEN NOT MATCHED + AND (s.a > 100) + THEN INSERT (id, data) OVERRIDING USER VALUE + VALUES (s.a, DEFAULT) + WHEN NOT MATCHED + AND (s.a > 0) + THEN INSERT (id, data, filling) + VALUES (s.a, s.b, DEFAULT) + WHEN NOT MATCHED + THEN INSERT (filling[1], id) + VALUES (s.a, s.a); +END +DROP FUNCTION merge_sf_test; +DROP TABLE sf_target; -- -- Test enabling/disabling -- diff --git a/src/test/regress/sql/rules.sql b/src/test/regress/sql/rules.sql index 4caab3434b..8b7e255dcd 100644 --- a/src/test/regress/sql/rules.sql +++ b/src/test/regress/sql/rules.sql @@ -1277,6 +1277,55 @@ MERGE INTO rule_merge2 t USING (SELECT 1 AS a) s WHEN NOT MATCHED THEN INSERT VALUES (s.a, ''); +-- test deparsing +CREATE TABLE sf_target(id int, data text, filling int[]); + +CREATE FUNCTION merge_sf_test() + RETURNS void + LANGUAGE sql +BEGIN ATOMIC + MERGE INTO sf_target t + USING rule_merge1 s + ON (s.a = t.id) +WHEN MATCHED + AND (s.a + t.id) = 42 + THEN UPDATE SET data = repeat(t.data, s.a) || s.b, id = length(s.b) +WHEN NOT MATCHED + AND (s.b IS NOT NULL) + THEN INSERT (data, id) + VALUES (s.b, s.a) +WHEN MATCHED + AND length(s.b || t.data) > 10 + THEN UPDATE SET data = s.b +WHEN MATCHED + AND s.a > 200 + THEN UPDATE SET filling[s.a] = t.id +WHEN MATCHED + AND s.a > 100 + THEN DELETE +WHEN MATCHED + THEN DO NOTHING +WHEN NOT MATCHED + AND s.a > 200 + THEN INSERT DEFAULT VALUES +WHEN NOT MATCHED + AND s.a > 100 + THEN INSERT (id, data) OVERRIDING USER VALUE + VALUES (s.a, DEFAULT) +WHEN NOT MATCHED + AND s.a > 0 + THEN INSERT + VALUES (s.a, s.b, DEFAULT) +WHEN NOT MATCHED + THEN INSERT (filling[1], id) + VALUES (s.a, s.a); +END; + +\sf merge_sf_test + +DROP FUNCTION merge_sf_test; +DROP TABLE sf_target; + -- -- Test enabling/disabling -- |