From efbcea9956fef31e5c793d34f8ac92ecbd78e977 Mon Sep 17 00:00:00 2001 From: amit Date: Fri, 14 Dec 2018 10:32:19 +0900 Subject: [PATCH] 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 --- 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 6bbd906c0b..27f2530804 100644 --- a/src/backend/commands/tablecmds.c +++ b/src/backend/commands/tablecmds.c @@ -2428,7 +2428,10 @@ rename_constraint_internal(Oid myrelid, ReleaseSysCache(tuple); if (targetrelation) + { relation_close(targetrelation, NoLock); /* close rel but keep lock */ + CacheInvalidateRelcache(targetrelation); + } return constraintOid; } diff --git a/src/test/regress/expected/alter_table.out b/src/test/regress/expected/alter_table.out index b9f9cf58e0..4923ea97aa 100644 --- a/src/test/regress/expected/alter_table.out +++ b/src/test/regress/expected/alter_table.out @@ -340,6 +340,18 @@ DROP TABLE constraint_rename_test2; DROP TABLE constraint_rename_test; 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 | Modifiers +--------+---------+----------- + a | integer | +Check constraints: + "chk_a_gt_zero" CHECK (a > 0) + -- FOREIGN KEY CONSTRAINT adding TEST CREATE TABLE tmp2 (a int primary key); CREATE TABLE tmp3 (a int, b int); diff --git a/src/test/regress/sql/alter_table.sql b/src/test/regress/sql/alter_table.sql index 7e29b4855c..e9b92196f2 100644 --- a/src/test/regress/sql/alter_table.sql +++ b/src/test/regress/sql/alter_table.sql @@ -250,6 +250,12 @@ DROP TABLE constraint_rename_test2; DROP TABLE constraint_rename_test; 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 tmp2 (a int primary key); -- 2.11.0