v1-0001-Make-rename_constraint_internal-invalidate-relcac.patch

text/plain

Filename: v1-0001-Make-rename_constraint_internal-invalidate-relcac.patch
Type: text/plain
Part: 0
Message: Re: Errors creating partitioned tables from existing using (LIKE <table>) after renaming table constraints

Patch

Format: format-patch
Series: patch v1-0001
Subject: Make rename_constraint_internal invalidate relcache
File+
src/backend/commands/tablecmds.c 3 0
src/test/regress/expected/alter_table.out 12 0
src/test/regress/sql/alter_table.sql 6 0
From fa3cacc50c3eb4f1a069c5ed3bc81fe6a86d6818 Mon Sep 17 00:00:00 2001
From: amit <amitlangote09@gmail.com>
Date: Thu, 13 Dec 2018 17:56:24 +0900
Subject: [PATCH v1] Make rename_constraint_internal invalidate relcache

In the absence of this, subsequent commands that refer to the old
name via relcache, fail with "constraint <old name> for table
<table name> does not exist" error.
---
 src/backend/commands/tablecmds.c          |  3 +++
 src/test/regress/expected/alter_table.out | 12 ++++++++++++
 src/test/regress/sql/alter_table.sql      |  6 ++++++
 3 files changed, 21 insertions(+)

diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c
index d6d0de1b01..6ec0d6487b 100644
--- a/src/backend/commands/tablecmds.c
+++ b/src/backend/commands/tablecmds.c
@@ -3019,7 +3019,10 @@ rename_constraint_internal(Oid myrelid,
 	ReleaseSysCache(tuple);
 
 	if (targetrelation)
+	{
 		relation_close(targetrelation, NoLock); /* close rel but keep lock */
+		CacheInvalidateRelcache(targetrelation);
+	}
 
 	return address;
 }
diff --git a/src/test/regress/expected/alter_table.out b/src/test/regress/expected/alter_table.out
index 38ede0a473..2d19f4b9e9 100644
--- a/src/test/regress/expected/alter_table.out
+++ b/src/test/regress/expected/alter_table.out
@@ -393,6 +393,18 @@ ALTER TABLE IF EXISTS constraint_not_exist RENAME CONSTRAINT con3 TO con3foo; --
 NOTICE:  relation "constraint_not_exist" does not exist, skipping
 ALTER TABLE IF EXISTS constraint_rename_test ADD CONSTRAINT con4 UNIQUE (a);
 NOTICE:  relation "constraint_rename_test" does not exist, skipping
+-- renaming constraint should reflect the change immediately
+CREATE TABLE constraint_rename_cache_reset_test (a int, CONSTRAINT chk_a CHECK (a > 0));
+ALTER TABLE constraint_rename_cache_reset_test RENAME CONSTRAINT chk_a TO chk_a_gt_zero;
+CREATE TABLE like_constraint_rename_cache_reset_test (LIKE constraint_rename_cache_reset_test INCLUDING ALL);
+\d like_constraint_rename_cache_reset_test
+Table "public.like_constraint_rename_cache_reset_test"
+ Column |  Type   | Collation | Nullable | Default 
+--------+---------+-----------+----------+---------
+ a      | integer |           |          | 
+Check constraints:
+    "chk_a_gt_zero" CHECK (a > 0)
+
 -- FOREIGN KEY CONSTRAINT adding TEST
 CREATE TABLE attmp2 (a int primary key);
 CREATE TABLE attmp3 (a int, b int);
diff --git a/src/test/regress/sql/alter_table.sql b/src/test/regress/sql/alter_table.sql
index 137f2d8ed0..dd625d5ac3 100644
--- a/src/test/regress/sql/alter_table.sql
+++ b/src/test/regress/sql/alter_table.sql
@@ -289,6 +289,12 @@ DROP TABLE constraint_rename_test;
 ALTER TABLE IF EXISTS constraint_not_exist RENAME CONSTRAINT con3 TO con3foo; -- ok
 ALTER TABLE IF EXISTS constraint_rename_test ADD CONSTRAINT con4 UNIQUE (a);
 
+-- renaming constraint should reflect the change immediately
+CREATE TABLE constraint_rename_cache_reset_test (a int, CONSTRAINT chk_a CHECK (a > 0));
+ALTER TABLE constraint_rename_cache_reset_test RENAME CONSTRAINT chk_a TO chk_a_gt_zero;
+CREATE TABLE like_constraint_rename_cache_reset_test (LIKE constraint_rename_cache_reset_test INCLUDING ALL);
+\d like_constraint_rename_cache_reset_test
+
 -- FOREIGN KEY CONSTRAINT adding TEST
 
 CREATE TABLE attmp2 (a int primary key);
-- 
2.11.0