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
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