]> granicus.if.org Git - postgresql/commitdiff
Code review for c94e6942cefe7d20c5feed856e27f672734b1e2b.
authorRobert Haas <rhaas@postgresql.org>
Wed, 12 Apr 2017 15:13:44 +0000 (11:13 -0400)
committerRobert Haas <rhaas@postgresql.org>
Wed, 12 Apr 2017 15:35:11 +0000 (11:35 -0400)
validateCheckConstraint() shouldn't try to access the storage for
a partitioned table, because it no longer has any.  Creating a
_RETURN table on a partitioned table shouldn't be allowed, both
because there's no value in it and because trying to do so would
involve a validation scan against its nonexistent storage.

Amit Langote, reviewed by Tom Lane.  Regression test outputs
updated to pass by me.

Discussion: http://postgr.es/m/e5c3cbd3-1551-d6f8-c9e2-51777d632fd2@lab.ntt.co.jp

src/backend/commands/tablecmds.c
src/backend/rewrite/rewriteDefine.c
src/test/regress/expected/alter_table.out
src/test/regress/expected/rules.out
src/test/regress/sql/alter_table.sql
src/test/regress/sql/rules.sql

index a6a9f54b13edd9ec0c8ece93f6e117c27c9337a4..a02904c85c98c433da28378154b4c0d9dedd9060 100644 (file)
@@ -8120,8 +8120,12 @@ validateCheckConstraint(Relation rel, HeapTuple constrtup)
        bool            isnull;
        Snapshot        snapshot;
 
-       /* VALIDATE CONSTRAINT is a no-op for foreign tables */
-       if (rel->rd_rel->relkind == RELKIND_FOREIGN_TABLE)
+       /*
+        * VALIDATE CONSTRAINT is a no-op for foreign tables and partitioned
+        * tables.
+        */
+       if (rel->rd_rel->relkind == RELKIND_FOREIGN_TABLE ||
+               rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE)
                return;
 
        constrForm = (Form_pg_constraint) GETSTRUCT(constrtup);
index df32f2c3ae7fe77b73160ac3df06c6a44d77f2ec..eab3f6062d20b1e03ccb5e016d3671070939c22c 100644 (file)
@@ -422,6 +422,12 @@ DefineQueryRewrite(char *rulename,
                        HeapScanDesc scanDesc;
                        Snapshot        snapshot;
 
+                       if (event_relation->rd_rel->relkind == RELKIND_PARTITIONED_TABLE)
+                               ereport(ERROR,
+                                               (errcode(ERRCODE_WRONG_OBJECT_TYPE),
+                                                errmsg("could not convert partitioned table \"%s\" to a view",
+                                                               RelationGetRelationName(event_relation))));
+
                        snapshot = RegisterSnapshot(GetLatestSnapshot());
                        scanDesc = heap_beginscan(event_relation, snapshot, 0, NULL);
                        if (heap_getnext(scanDesc, ForwardScanDirection) != NULL)
index 2227f2d97700cdbf1f4527c9a8dee4b11b910cca..883a5c9864fc26398723d69606357dafa3e8f210 100644 (file)
@@ -3372,3 +3372,9 @@ ERROR:  partition constraint is violated by some row
 -- cleanup
 drop table p;
 drop table p1;
+-- validate constraint on partitioned tables should only scan leaf partitions
+create table parted_validate_test (a int) partition by list (a);
+create table parted_validate_test_1 partition of parted_validate_test for values in (0, 1);
+alter table parted_validate_test add constraint parted_validate_test_chka check (a > 0) not valid;
+alter table parted_validate_test validate constraint parted_validate_test_chka;
+drop table parted_validate_test;
index f55c8c47eb5a795be445869c2b7e979460662ea9..b2779d9698a50afd1a392abe428e7d103a5a5966 100644 (file)
@@ -2574,6 +2574,11 @@ select reltoastrelid, relkind, relfrozenxid
 (1 row)
 
 drop view fooview;
+-- trying to convert a partitioned table to view is not allowed
+create table fooview (x int, y text) partition by list (x);
+create rule "_RETURN" as on select to fooview do instead
+  select 1 as x, 'aaa'::text as y;
+ERROR:  could not convert partitioned table "fooview" to a view
 --
 -- check for planner problems with complex inherited UPDATES
 --
index 8cd6786a90a76d33a0d54f824da80fcf7e36ca17..eb1b4b536ffa7c26abb608f41073e710f230d159 100644 (file)
@@ -2228,3 +2228,10 @@ alter table p attach partition p1 for values from (1, 2) to (1, 10);
 -- cleanup
 drop table p;
 drop table p1;
+
+-- validate constraint on partitioned tables should only scan leaf partitions
+create table parted_validate_test (a int) partition by list (a);
+create table parted_validate_test_1 partition of parted_validate_test for values in (0, 1);
+alter table parted_validate_test add constraint parted_validate_test_chka check (a > 0) not valid;
+alter table parted_validate_test validate constraint parted_validate_test_chka;
+drop table parted_validate_test;
index d4a61813e4499e5c58cec858fbe8ba966f0c2b6d..4fff26621632db41ce59e362a861c86523a2b387 100644 (file)
@@ -898,6 +898,11 @@ select reltoastrelid, relkind, relfrozenxid
 
 drop view fooview;
 
+-- trying to convert a partitioned table to view is not allowed
+create table fooview (x int, y text) partition by list (x);
+create rule "_RETURN" as on select to fooview do instead
+  select 1 as x, 'aaa'::text as y;
+
 --
 -- check for planner problems with complex inherited UPDATES
 --