Enhance regression test for issue 7891 to verify planner's handling of local and reference tables

pull/7897/head
Mehmet Yilmaz 2025-02-12 18:28:28 +00:00 committed by Mehmet YILMAZ
parent f96f1fe115
commit 262a9b611e
2 changed files with 39 additions and 77 deletions

View File

@ -1,3 +1,6 @@
-- This construct has been used as a regression test to ensure that the planner
-- correctly distinguishes between "local" and "reference" tables, avoiding an erroneous 0-task plan.
-- https://github.com/citusdata/citus/issues/7891
CREATE SCHEMA issue_7891;
SET search_path TO issue_7891;
@ -62,61 +65,8 @@ SELECT 't2_ref data' AS label, * FROM t2_ref;
-- Historically might produce a 0-task plan if the planner incorrectly fails to
-- treat t4_pg/t2_ref as local/reference.
--
--- EXPLAIN of update (problem scenario) ---
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE t6_pg
SET vkey = 43
WHERE EXISTS (
SELECT (SELECT c15 FROM t2_ref)
FROM t4_pg
);
QUERY PLAN
---------------------------------------------------------------------
Custom Scan (Citus Adaptive)
Task Count: 1
Tasks Shown: All
-> Task
Query: UPDATE issue_7891.t6_pg SET vkey = 43 WHERE (EXISTS (SELECT (SELECT t2_ref.c15 FROM (SELECT NULL::integer AS vkey, NULL::integer AS pkey, NULL::timestamp without time zone AS c15 WHERE false) t2_ref(vkey, pkey, c15)) AS c15 FROM issue_7891.t4_pg))
Node: host=localhost port=xxxxx dbname=regression
-> Update on issue_7891.t6_pg
InitPlan 1
-> Seq Scan on issue_7891.t4_pg
-> Result
Output: 43, t6_pg.ctid
One-Time Filter: (InitPlan 1).col1
-> Seq Scan on issue_7891.t6_pg
Output: t6_pg.ctid
(14 rows)
--- EXPLAIN reversing subquery usage ---
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE t6_pg
SET vkey = 43
WHERE EXISTS (
SELECT (SELECT c22 FROM t4_pg)
FROM t2_ref
);
QUERY PLAN
---------------------------------------------------------------------
Custom Scan (Citus Adaptive)
Task Count: 1
Tasks Shown: All
-> Task
Query: UPDATE issue_7891.t6_pg SET vkey = 43 WHERE (EXISTS (SELECT (SELECT t4_pg.c22 FROM issue_7891.t4_pg) AS c22 FROM issue_7891.t2_ref_363177 t2_ref))
Node: host=localhost port=xxxxx dbname=regression
-> Update on issue_7891.t6_pg
InitPlan 1
-> Seq Scan on issue_7891.t2_ref_363177 t2_ref
-> Result
Output: 43, t6_pg.ctid
One-Time Filter: (InitPlan 1).col1
-> Seq Scan on issue_7891.t6_pg
Output: t6_pg.ctid
(14 rows)
-- Now actually do the update to confirm it works
-- The outer subquery iterates over every row in table t4_pg.
UPDATE t6_pg
SET vkey = 43
WHERE EXISTS (
@ -132,9 +82,23 @@ SELECT 't6_pg after' AS label, * FROM t6_pg;
(1 row)
-- The outer subquery iterates over rows from the reference table t2_ref
UPDATE t6_pg
SET vkey = 43
WHERE EXISTS (
SELECT (SELECT c22 FROM t4_pg)
FROM t2_ref
);
ERROR: relation "issue_7891.t6_pg" does not exist
CONTEXT: while executing command on localhost:xxxxx
-- Show final data
SELECT 't6_pg after' AS label, * FROM t6_pg;
label | vkey | pkey | c26
---------------------------------------------------------------------
t6_pg after | 43 | 12000 |
(1 row)
SET client_min_messages TO WARNING;
DROP SCHEMA issue_7891 CASCADE;
NOTICE: drop cascades to 4 other objects
DETAIL: drop cascades to table t2_ref
drop cascades to table t4_pg
drop cascades to table t6_pg
drop cascades to table t2_ref_363177

View File

@ -1,3 +1,6 @@
-- This construct has been used as a regression test to ensure that the planner
-- correctly distinguishes between "local" and "reference" tables, avoiding an erroneous 0-task plan.
-- https://github.com/citusdata/citus/issues/7891
CREATE SCHEMA issue_7891;
SET search_path TO issue_7891;
@ -42,25 +45,8 @@ SELECT 't2_ref data' AS label, * FROM t2_ref;
-- Historically might produce a 0-task plan if the planner incorrectly fails to
-- treat t4_pg/t2_ref as local/reference.
--
--- EXPLAIN of update (problem scenario) ---
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE t6_pg
SET vkey = 43
WHERE EXISTS (
SELECT (SELECT c15 FROM t2_ref)
FROM t4_pg
);
--- EXPLAIN reversing subquery usage ---
EXPLAIN (VERBOSE, COSTS OFF)
UPDATE t6_pg
SET vkey = 43
WHERE EXISTS (
SELECT (SELECT c22 FROM t4_pg)
FROM t2_ref
);
-- Now actually do the update to confirm it works
-- The outer subquery iterates over every row in table t4_pg.
UPDATE t6_pg
SET vkey = 43
WHERE EXISTS (
@ -71,4 +57,16 @@ UPDATE t6_pg
-- Show final data
SELECT 't6_pg after' AS label, * FROM t6_pg;
-- The outer subquery iterates over rows from the reference table t2_ref
UPDATE t6_pg
SET vkey = 43
WHERE EXISTS (
SELECT (SELECT c22 FROM t4_pg)
FROM t2_ref
);
-- Show final data
SELECT 't6_pg after' AS label, * FROM t6_pg;
SET client_min_messages TO WARNING;
DROP SCHEMA issue_7891 CASCADE;