]> granicus.if.org Git - postgresql/commitdiff
Allow a rule on partitioned table to be renamed.
authorRobert Haas <rhaas@postgresql.org>
Tue, 11 Apr 2017 17:17:22 +0000 (13:17 -0400)
committerRobert Haas <rhaas@postgresql.org>
Tue, 11 Apr 2017 17:17:22 +0000 (13:17 -0400)
Commit f0e44751d7175fa3394da2c8f85e3ceb3cdbfe63 should have updated
this code, but did not.

Amit Langote

Discussion: http://postgr.es/m/52d9c443-ec78-5c8a-7a77-0f34aad12b82@lab.ntt.co.jp

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

index 86d588bba531cd9f56fb60d067f4ba471e7273ab..df32f2c3ae7fe77b73160ac3df06c6a44d77f2ec 100644 (file)
@@ -900,7 +900,9 @@ RangeVarCallbackForRenameRule(const RangeVar *rv, Oid relid, Oid oldrelid,
        form = (Form_pg_class) GETSTRUCT(tuple);
 
        /* only tables and views can have rules */
-       if (form->relkind != RELKIND_RELATION && form->relkind != RELKIND_VIEW)
+       if (form->relkind != RELKIND_RELATION &&
+               form->relkind != RELKIND_VIEW &&
+               form->relkind != RELKIND_PARTITIONED_TABLE)
                ereport(ERROR,
                                (errcode(ERRCODE_WRONG_OBJECT_TYPE),
                                 errmsg("\"%s\" is not a table or view", rv->relname)));
index cba82bb1144722387750d18a71326ff2d515a788..f55c8c47eb5a795be445869c2b7e979460662ea9 100644 (file)
@@ -3216,3 +3216,10 @@ SELECT pg_get_function_arg_default('pg_class'::regclass, 0);
  
 (1 row)
 
+-- test rename for a rule defined on a partitioned table
+CREATE TABLE parted_table (a int) PARTITION BY LIST (a);
+CREATE TABLE parted_table_1 PARTITION OF parted_table FOR VALUES IN (1);
+CREATE RULE parted_table_insert AS ON INSERT to parted_table
+    DO INSTEAD INSERT INTO parted_table_1 VALUES (NEW.*);
+ALTER RULE parted_table_insert ON parted_table RENAME TO parted_table_insert_redirect;
+DROP TABLE parted_table;
index dcff0de2a516d233b3d7cba0269c35c9692b8ddb..d4a61813e4499e5c58cec858fbe8ba966f0c2b6d 100644 (file)
@@ -1158,3 +1158,11 @@ SELECT pg_get_function_identity_arguments(0);
 SELECT pg_get_function_result(0);
 SELECT pg_get_function_arg_default(0, 0);
 SELECT pg_get_function_arg_default('pg_class'::regclass, 0);
+
+-- test rename for a rule defined on a partitioned table
+CREATE TABLE parted_table (a int) PARTITION BY LIST (a);
+CREATE TABLE parted_table_1 PARTITION OF parted_table FOR VALUES IN (1);
+CREATE RULE parted_table_insert AS ON INSERT to parted_table
+    DO INSTEAD INSERT INTO parted_table_1 VALUES (NEW.*);
+ALTER RULE parted_table_insert ON parted_table RENAME TO parted_table_insert_redirect;
+DROP TABLE parted_table;