From: Tom Lane Date: Tue, 11 May 2004 02:21:39 +0000 (+0000) Subject: Repair recalculation failure for nested sub-SELECTs, per bug report from X-Git-Tag: REL8_0_0BETA1~664 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=1697568d5771fde6ad77db18b9445f5420c190c9;p=postgresql Repair recalculation failure for nested sub-SELECTs, per bug report from Didier Moens. Bug is new in 7.4, and was caused by not updating everyplace I should've when replacing locParam markers by allParam. Add a regression test to catch related errors in future. --- diff --git a/src/backend/optimizer/plan/planner.c b/src/backend/optimizer/plan/planner.c index c3cfe4be71..e094620d62 100644 --- a/src/backend/optimizer/plan/planner.c +++ b/src/backend/optimizer/plan/planner.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/optimizer/plan/planner.c,v 1.168 2004/04/07 18:17:24 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/optimizer/plan/planner.c,v 1.169 2004/05/11 02:21:37 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -343,6 +343,9 @@ subquery_planner(Query *parse, double tuple_fraction) plan->extParam = bms_add_members(plan->extParam, initplan->plan->extParam); + /* allParam must include all members of extParam */ + plan->allParam = bms_add_members(plan->allParam, + plan->extParam); initplan_cost += initplan->plan->total_cost; } diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out index f7b8297809..fb80fb0a50 100644 --- a/src/test/regress/expected/subselect.out +++ b/src/test/regress/expected/subselect.out @@ -201,3 +201,78 @@ select count(distinct ss.ten) from 10 (1 row) +-- +-- Test case to catch problems with multiply nested sub-SELECTs not getting +-- recalculated properly. Per bug report from Didier Moens. +-- +CREATE TABLE orderstest ( + approver_ref integer, + po_ref integer, + ordercancelled boolean +); +INSERT INTO orderstest VALUES (1, 1, false); +INSERT INTO orderstest VALUES (66, 5, false); +INSERT INTO orderstest VALUES (66, 6, false); +INSERT INTO orderstest VALUES (66, 7, false); +INSERT INTO orderstest VALUES (66, 1, true); +INSERT INTO orderstest VALUES (66, 8, false); +INSERT INTO orderstest VALUES (66, 1, false); +INSERT INTO orderstest VALUES (77, 1, false); +INSERT INTO orderstest VALUES (1, 1, false); +INSERT INTO orderstest VALUES (66, 1, false); +INSERT INTO orderstest VALUES (1, 1, false); +CREATE VIEW orders_view AS +SELECT *, +(SELECT CASE + WHEN ord.approver_ref=1 THEN '---' ELSE 'Approved' + END) AS "Approved", +(SELECT CASE + WHEN ord.ordercancelled + THEN 'Cancelled' + ELSE + (SELECT CASE + WHEN ord.po_ref=1 + THEN + (SELECT CASE + WHEN ord.approver_ref=1 + THEN '---' + ELSE 'Approved' + END) + ELSE 'PO' + END) +END) AS "Status", +(CASE + WHEN ord.ordercancelled + THEN 'Cancelled' + ELSE + (CASE + WHEN ord.po_ref=1 + THEN + (CASE + WHEN ord.approver_ref=1 + THEN '---' + ELSE 'Approved' + END) + ELSE 'PO' + END) +END) AS "Status_OK" +FROM orderstest ord; +SELECT * FROM orders_view; + approver_ref | po_ref | ordercancelled | Approved | Status | Status_OK +--------------+--------+----------------+----------+-----------+----------- + 1 | 1 | f | --- | --- | --- + 66 | 5 | f | Approved | PO | PO + 66 | 6 | f | Approved | PO | PO + 66 | 7 | f | Approved | PO | PO + 66 | 1 | t | Approved | Cancelled | Cancelled + 66 | 8 | f | Approved | PO | PO + 66 | 1 | f | Approved | Approved | Approved + 77 | 1 | f | Approved | Approved | Approved + 1 | 1 | f | --- | --- | --- + 66 | 1 | f | Approved | Approved | Approved + 1 | 1 | f | --- | --- | --- +(11 rows) + +DROP TABLE orderstest cascade; +NOTICE: drop cascades to rule _RETURN on view orders_view +NOTICE: drop cascades to view orders_view diff --git a/src/test/regress/sql/subselect.sql b/src/test/regress/sql/subselect.sql index 5ff9d1cf87..be3a0a87b5 100644 --- a/src/test/regress/sql/subselect.sql +++ b/src/test/regress/sql/subselect.sql @@ -93,3 +93,67 @@ select count(*) from select count(distinct ss.ten) from (select ten from tenk1 a where unique1 IN (select distinct hundred from tenk1 b)) ss; + +-- +-- Test case to catch problems with multiply nested sub-SELECTs not getting +-- recalculated properly. Per bug report from Didier Moens. +-- + +CREATE TABLE orderstest ( + approver_ref integer, + po_ref integer, + ordercancelled boolean +); + +INSERT INTO orderstest VALUES (1, 1, false); +INSERT INTO orderstest VALUES (66, 5, false); +INSERT INTO orderstest VALUES (66, 6, false); +INSERT INTO orderstest VALUES (66, 7, false); +INSERT INTO orderstest VALUES (66, 1, true); +INSERT INTO orderstest VALUES (66, 8, false); +INSERT INTO orderstest VALUES (66, 1, false); +INSERT INTO orderstest VALUES (77, 1, false); +INSERT INTO orderstest VALUES (1, 1, false); +INSERT INTO orderstest VALUES (66, 1, false); +INSERT INTO orderstest VALUES (1, 1, false); + +CREATE VIEW orders_view AS +SELECT *, +(SELECT CASE + WHEN ord.approver_ref=1 THEN '---' ELSE 'Approved' + END) AS "Approved", +(SELECT CASE + WHEN ord.ordercancelled + THEN 'Cancelled' + ELSE + (SELECT CASE + WHEN ord.po_ref=1 + THEN + (SELECT CASE + WHEN ord.approver_ref=1 + THEN '---' + ELSE 'Approved' + END) + ELSE 'PO' + END) +END) AS "Status", +(CASE + WHEN ord.ordercancelled + THEN 'Cancelled' + ELSE + (CASE + WHEN ord.po_ref=1 + THEN + (CASE + WHEN ord.approver_ref=1 + THEN '---' + ELSE 'Approved' + END) + ELSE 'PO' + END) +END) AS "Status_OK" +FROM orderstest ord; + +SELECT * FROM orders_view; + +DROP TABLE orderstest cascade;