]> granicus.if.org Git - postgresql/commitdiff
Process withCheckOption exprs in setrefs.c
authorStephen Frost <sfrost@snowman.net>
Tue, 23 Sep 2014 00:22:16 +0000 (20:22 -0400)
committerStephen Frost <sfrost@snowman.net>
Tue, 23 Sep 2014 00:22:16 +0000 (20:22 -0400)
While withCheckOption exprs had been handled in many cases by
happenstance, they need to be handled during set_plan_references and
more specifically down in set_plan_refs for ModifyTable plan nodes.
This is to ensure that the opfuncid's are set for operators referenced
in the withCheckOption exprs.

Identified as an issue by Thom Brown

Patch by Dean Rasheed

Back-patch to 9.4, where withCheckOption was introduced.

src/backend/optimizer/plan/setrefs.c
src/test/regress/expected/updatable_views.out
src/test/regress/sql/updatable_views.sql

index 768c5c7670415d25084b1259d7ef0c6f91fb948d..a273e32c29a894ca193e52139ac5caa785ddd8c6 100644 (file)
@@ -693,6 +693,9 @@ set_plan_refs(PlannerInfo *root, Plan *plan, int rtoffset)
                                Assert(splan->plan.targetlist == NIL);
                                Assert(splan->plan.qual == NIL);
 
+                               splan->withCheckOptionLists =
+                                       fix_scan_list(root, splan->withCheckOptionLists, rtoffset);
+
                                if (splan->returningLists)
                                {
                                        List       *newRL = NIL;
index 6576c474510fc4ca007a222ceb41291a4a4fc37d..9ed48962b3e4c0055f12207c7879ea15572c7c53 100644 (file)
@@ -1567,6 +1567,26 @@ NOTICE:  drop cascades to 3 other objects
 DETAIL:  drop cascades to view rw_view1
 drop cascades to view rw_view2
 drop cascades to view rw_view3
+-- WITH CHECK OPTION with scalar array ops
+CREATE TABLE base_tbl (a int, b int[]);
+CREATE VIEW rw_view1 AS SELECT * FROM base_tbl WHERE a = ANY (b)
+  WITH CHECK OPTION;
+INSERT INTO rw_view1 VALUES (1, ARRAY[1,2,3]); -- ok
+INSERT INTO rw_view1 VALUES (10, ARRAY[4,5]); -- should fail
+ERROR:  new row violates WITH CHECK OPTION for view "rw_view1"
+DETAIL:  Failing row contains (10, {4,5}).
+UPDATE rw_view1 SET b[2] = -b[2] WHERE a = 1; -- ok
+UPDATE rw_view1 SET b[1] = -b[1] WHERE a = 1; -- should fail
+ERROR:  new row violates WITH CHECK OPTION for view "rw_view1"
+DETAIL:  Failing row contains (1, {-1,-2,3}).
+PREPARE ins(int, int[]) AS INSERT INTO rw_view1 VALUES($1, $2);
+EXECUTE ins(2, ARRAY[1,2,3]); -- ok
+EXECUTE ins(10, ARRAY[4,5]); -- should fail
+ERROR:  new row violates WITH CHECK OPTION for view "rw_view1"
+DETAIL:  Failing row contains (10, {4,5}).
+DEALLOCATE PREPARE ins;
+DROP TABLE base_tbl CASCADE;
+NOTICE:  drop cascades to view rw_view1
 -- WITH CHECK OPTION with subquery
 CREATE TABLE base_tbl (a int);
 CREATE TABLE ref_tbl (a int PRIMARY KEY);
index c072fca6be2b7e12afb95bbb694b2de679c09094..60c7e292212547cb0f6a36abc9fa3537c374faf7 100644 (file)
@@ -707,6 +707,25 @@ INSERT INTO rw_view3 VALUES (3); -- ok
 
 DROP TABLE base_tbl CASCADE;
 
+-- WITH CHECK OPTION with scalar array ops
+
+CREATE TABLE base_tbl (a int, b int[]);
+CREATE VIEW rw_view1 AS SELECT * FROM base_tbl WHERE a = ANY (b)
+  WITH CHECK OPTION;
+
+INSERT INTO rw_view1 VALUES (1, ARRAY[1,2,3]); -- ok
+INSERT INTO rw_view1 VALUES (10, ARRAY[4,5]); -- should fail
+
+UPDATE rw_view1 SET b[2] = -b[2] WHERE a = 1; -- ok
+UPDATE rw_view1 SET b[1] = -b[1] WHERE a = 1; -- should fail
+
+PREPARE ins(int, int[]) AS INSERT INTO rw_view1 VALUES($1, $2);
+EXECUTE ins(2, ARRAY[1,2,3]); -- ok
+EXECUTE ins(10, ARRAY[4,5]); -- should fail
+DEALLOCATE PREPARE ins;
+
+DROP TABLE base_tbl CASCADE;
+
 -- WITH CHECK OPTION with subquery
 
 CREATE TABLE base_tbl (a int);