From fa3cacc50c3eb4f1a069c5ed3bc81fe6a86d6818 Mon Sep 17 00:00:00 2001 From: amit 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 for table 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