From 02af7857e5694b13c21401d1982ac21d31e27dee Mon Sep 17 00:00:00 2001 From: Robert Haas Date: Tue, 11 Apr 2017 13:17:22 -0400 Subject: [PATCH] Allow a rule on partitioned table to be renamed. 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 | 4 +++- src/test/regress/expected/rules.out | 7 +++++++ src/test/regress/sql/rules.sql | 8 ++++++++ 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/src/backend/rewrite/rewriteDefine.c b/src/backend/rewrite/rewriteDefine.c index 86d588bba5..df32f2c3ae 100644 --- a/src/backend/rewrite/rewriteDefine.c +++ b/src/backend/rewrite/rewriteDefine.c @@ -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))); diff --git a/src/test/regress/expected/rules.out b/src/test/regress/expected/rules.out index cba82bb114..f55c8c47eb 100644 --- a/src/test/regress/expected/rules.out +++ b/src/test/regress/expected/rules.out @@ -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; diff --git a/src/test/regress/sql/rules.sql b/src/test/regress/sql/rules.sql index dcff0de2a5..d4a61813e4 100644 --- a/src/test/regress/sql/rules.sql +++ b/src/test/regress/sql/rules.sql @@ -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;