From ce9915d4271bf4b1e1ca9a74e14342d5f418156c Mon Sep 17 00:00:00 2001 From: Mehmet Yilmaz Date: Wed, 19 Feb 2025 13:51:16 +0000 Subject: [PATCH] Enhance test data for issue 7891 by adding sample entries and implementing DELETE and MERGE operations to validate reference table handling --- src/test/regress/expected/issue_7891.out | 91 ++++++++++++++++++++++-- src/test/regress/sql/issue_7891.sql | 65 ++++++++++++++++- 2 files changed, 147 insertions(+), 9 deletions(-) diff --git a/src/test/regress/expected/issue_7891.out b/src/test/regress/expected/issue_7891.out index 35ee369c6e4..a143a2e631b 100644 --- a/src/test/regress/expected/issue_7891.out +++ b/src/test/regress/expected/issue_7891.out @@ -41,17 +41,22 @@ SELECT create_reference_table('t2_ref'); (1 row) -- Insert sample data -INSERT INTO t6_pg (vkey, pkey, c26) VALUES (2, 12000, ''); +INSERT INTO t6_pg (vkey, pkey, c26) VALUES + (2, 12000, 'initial'), + (3, 13000, 'will_be_deleted'), + (4, 14000, 'to_merge'); INSERT INTO t4_pg (vkey, pkey, c22, c23, c24) VALUES (5, 15000, 0.0, ']]?', MAKE_TIMESTAMP(2071, 10, 26, 16, 20, 5)); INSERT INTO t2_ref (vkey, pkey, c15) VALUES (14, 24000, NULL::timestamp); -- Show initial data SELECT 't6_pg before' AS label, * FROM t6_pg; - label | vkey | pkey | c26 + label | vkey | pkey | c26 --------------------------------------------------------------------- - t6_pg before | 2 | 12000 | -(1 row) + t6_pg before | 2 | 12000 | initial + t6_pg before | 3 | 13000 | will_be_deleted + t6_pg before | 4 | 14000 | to_merge +(3 rows) SELECT 't4_pg data' AS label, * FROM t4_pg; label | vkey | pkey | c22 | c23 | c24 @@ -77,11 +82,83 @@ UPDATE t6_pg SELECT (SELECT c15 FROM t2_ref) FROM t4_pg ); --- Show final data SELECT 't6_pg after' AS label, * FROM t6_pg; - label | vkey | pkey | c26 + label | vkey | pkey | c26 +--------------------------------------------------------------------- + t6_pg after | 43 | 12000 | initial + t6_pg after | 43 | 13000 | will_be_deleted + t6_pg after | 43 | 14000 | to_merge +(3 rows) + +-- +-- DELETE with a similar nested subquery approach +-- Here, let's delete any rows for which t4_pg is non-empty (like a trivial check). +-- We'll specifically target the row with c26='will_be_deleted' to confirm it's removed. +-- +DELETE FROM t6_pg + WHERE EXISTS ( + SELECT (SELECT c15 FROM t2_ref) + FROM t4_pg + ) + AND c26 = 'will_be_deleted'; +SELECT 't6_pg after DELETE' AS label, * FROM t6_pg; + label | vkey | pkey | c26 +--------------------------------------------------------------------- + t6_pg after DELETE | 43 | 12000 | initial + t6_pg after DELETE | 43 | 14000 | to_merge +(2 rows) + +-- +-- We'll merge from t4_pg into t6_pg. The merge will update c26 for pkey=14000. +-- +MERGE INTO t6_pg AS tgt +USING t4_pg AS src +ON (tgt.pkey = 14000) -- trivial condition to "match" row pkey=14000 +WHEN MATCHED THEN + UPDATE SET c26 = 'merged_' || (SELECT pkey FROM t2_ref WHERE pkey=24000 LIMIT 1) +WHEN NOT MATCHED THEN + INSERT (vkey, pkey, c26) + VALUES (99, src.pkey, 'inserted_via_merge'); +ERROR: non-IMMUTABLE functions are not yet supported in MERGE sql with distributed tables +MERGE INTO t6_pg AS tgt +USING t4_pg AS src + ON (tgt.pkey = src.pkey) +WHEN MATCHED THEN + UPDATE SET c26 = 'merged_value' +WHEN NOT MATCHED THEN + INSERT (vkey, pkey, c26) + VALUES (src.vkey, src.pkey, 'inserted_via_merge'); +SELECT 't6_pg after MERGE' AS label, * FROM t6_pg; + label | vkey | pkey | c26 +--------------------------------------------------------------------- + t6_pg after MERGE | 43 | 12000 | initial + t6_pg after MERGE | 43 | 14000 | to_merge + t6_pg after MERGE | 5 | 15000 | inserted_via_merge +(3 rows) + +-- +-- Update the REFERENCE table itself and verify the change +-- This is to ensure that the reference table is correctly handled. +UPDATE t2_ref + SET c15 = '2099-01-01 00:00:00'::timestamp + WHERE pkey = 24000; +SELECT 't2_ref after self-update' AS label, * FROM t2_ref; + label | vkey | pkey | c15 +--------------------------------------------------------------------- + t2_ref after self-update | 14 | 24000 | Thu Jan 01 00:00:00 2099 +(1 row) + +UPDATE t2_ref + SET c15 = '2099-01-01 00:00:00'::timestamp + WHERE EXISTS ( + SELECT 1 + FROM t4_pg + ); +ERROR: relation t4_pg is not distributed +SELECT 't2_ref after UPDATE' AS label, * FROM t2_ref; + label | vkey | pkey | c15 --------------------------------------------------------------------- - t6_pg after | 43 | 12000 | + t2_ref after UPDATE | 14 | 24000 | Thu Jan 01 00:00:00 2099 (1 row) -- Cleanup diff --git a/src/test/regress/sql/issue_7891.sql b/src/test/regress/sql/issue_7891.sql index 5a9f2af5b43..3a5d2c0c85a 100644 --- a/src/test/regress/sql/issue_7891.sql +++ b/src/test/regress/sql/issue_7891.sql @@ -41,7 +41,10 @@ CREATE TABLE t6_pg ( SELECT create_reference_table('t2_ref'); -- Insert sample data -INSERT INTO t6_pg (vkey, pkey, c26) VALUES (2, 12000, ''); +INSERT INTO t6_pg (vkey, pkey, c26) VALUES + (2, 12000, 'initial'), + (3, 13000, 'will_be_deleted'), + (4, 14000, 'to_merge'); INSERT INTO t4_pg (vkey, pkey, c22, c23, c24) VALUES (5, 15000, 0.0, ']]?', MAKE_TIMESTAMP(2071, 10, 26, 16, 20, 5)); INSERT INTO t2_ref (vkey, pkey, c15) @@ -66,9 +69,67 @@ UPDATE t6_pg FROM t4_pg ); --- Show final data SELECT 't6_pg after' AS label, * FROM t6_pg; +-- +-- DELETE with a similar nested subquery approach +-- Here, let's delete any rows for which t4_pg is non-empty (like a trivial check). +-- We'll specifically target the row with c26='will_be_deleted' to confirm it's removed. +-- +DELETE FROM t6_pg + WHERE EXISTS ( + SELECT (SELECT c15 FROM t2_ref) + FROM t4_pg + ) + AND c26 = 'will_be_deleted'; + +SELECT 't6_pg after DELETE' AS label, * FROM t6_pg; + +-- +-- We'll merge from t4_pg into t6_pg. The merge will update c26 for pkey=14000. +-- +MERGE INTO t6_pg AS tgt +USING t4_pg AS src +ON (tgt.pkey = 14000) +WHEN MATCHED THEN + UPDATE SET c26 = 'merged_' || (SELECT pkey FROM t2_ref WHERE pkey=24000 LIMIT 1) +WHEN NOT MATCHED THEN + INSERT (vkey, pkey, c26) + VALUES (99, src.pkey, 'inserted_via_merge'); + +MERGE INTO t6_pg AS tgt +USING t4_pg AS src + ON (tgt.pkey = src.pkey) +WHEN MATCHED THEN + UPDATE SET c26 = 'merged_value' +WHEN NOT MATCHED THEN + INSERT (vkey, pkey, c26) + VALUES (src.vkey, src.pkey, 'inserted_via_merge'); + + + +SELECT 't6_pg after MERGE' AS label, * FROM t6_pg; + +-- +-- Update the REFERENCE table itself and verify the change +-- This is to ensure that the reference table is correctly handled. + +UPDATE t2_ref + SET c15 = '2099-01-01 00:00:00'::timestamp + WHERE pkey = 24000; + +SELECT 't2_ref after self-update' AS label, * FROM t2_ref; + + +UPDATE t2_ref + SET c15 = '2099-01-01 00:00:00'::timestamp + WHERE EXISTS ( + SELECT 1 + FROM t4_pg + ); + +SELECT 't2_ref after UPDATE' AS label, * FROM t2_ref; + -- Cleanup SET client_min_messages TO WARNING; DROP SCHEMA issue_7891 CASCADE;