From 85a8c3a4b60f430ba30d58427558f1686251b8b5 Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Wed, 14 Jul 2021 17:15:31 +0900 Subject: [PATCH] Fix unexpected error messages for various flavors of ALTER TABLE Some commands of ALTER TABLE could fail with the following error: ERROR: "tab" is of the wrong type This error is unexpected, as all the code paths leading to ATWrongRelkindError() should use a supported set of relkinds to generate correct error messages. This commit closes the gap with such mistakes, by adding all the missing relkind combinations. Tests are added to check all the problems found. Note that some combinations are not used, but these are left around as it could have an impact on applications relying on this code. 2ed532e has done a much larger refactoring on HEAD to make such error messages easier to manage in the long-term, so nothing is needed there. Author: Kyotaro Horiguchi Reviewed-by: Peter Eisentraut, Ahsan Hadi, Michael Paquier Discussion: https://postgr.es/m/20210216.181415.368926598204753659.horikyota.ntt@gmail.com Backpatch-through: 11 --- src/backend/commands/tablecmds.c | 6 ++++++ src/test/regress/expected/alter_table.out | 5 +++++ src/test/regress/expected/foreign_data.out | 2 ++ src/test/regress/sql/alter_table.sql | 5 +++++ src/test/regress/sql/foreign_data.sql | 1 + 5 files changed, 19 insertions(+) diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c index 8ef23f64422..73d7935d5b0 100644 --- a/src/backend/commands/tablecmds.c +++ b/src/backend/commands/tablecmds.c @@ -5082,6 +5082,9 @@ ATWrongRelkindError(Relation rel, int allowed_targets) case ATT_TABLE | ATT_MATVIEW | ATT_INDEX: msg = _("\"%s\" is not a table, materialized view, or index"); break; + case ATT_TABLE | ATT_MATVIEW | ATT_INDEX | ATT_PARTITIONED_INDEX: + msg = _("\"%s\" is not a table, materialized view, index, or partitioned index"); + break; case ATT_TABLE | ATT_MATVIEW | ATT_FOREIGN_TABLE: msg = _("\"%s\" is not a table, materialized view, or foreign table"); break; @@ -5094,6 +5097,9 @@ ATWrongRelkindError(Relation rel, int allowed_targets) case ATT_TABLE | ATT_MATVIEW | ATT_INDEX | ATT_FOREIGN_TABLE: msg = _("\"%s\" is not a table, materialized view, index, or foreign table"); break; + case ATT_TABLE | ATT_PARTITIONED_INDEX: + msg = _("\"%s\" is not a table or partitioned index"); + break; case ATT_VIEW: msg = _("\"%s\" is not a view"); break; diff --git a/src/test/regress/expected/alter_table.out b/src/test/regress/expected/alter_table.out index f925eafebf3..9709202ec73 100644 --- a/src/test/regress/expected/alter_table.out +++ b/src/test/regress/expected/alter_table.out @@ -3974,6 +3974,11 @@ ERROR: remainder for hash partition must be less than modulus ALTER TABLE hash_parted ATTACH PARTITION fail_part FOR VALUES WITH (MODULUS 3, REMAINDER 2); ERROR: every hash partition modulus must be a factor of the next larger modulus DROP TABLE fail_part; +-- fails with incorrect object type +CREATE VIEW at_v1 AS SELECT 1 as a; +ALTER TABLE at_v1 ATTACH PARTITION dummy default; +ERROR: "at_v1" is not a partitioned table or index +DROP VIEW at_v1; -- -- DETACH PARTITION -- diff --git a/src/test/regress/expected/foreign_data.out b/src/test/regress/expected/foreign_data.out index d613d8e0916..b391c63801d 100644 --- a/src/test/regress/expected/foreign_data.out +++ b/src/test/regress/expected/foreign_data.out @@ -885,6 +885,8 @@ ALTER FOREIGN TABLE ft1 DROP COLUMN c9; ALTER FOREIGN TABLE ft1 SET SCHEMA foreign_schema; ALTER FOREIGN TABLE ft1 SET TABLESPACE ts; -- ERROR ERROR: relation "ft1" does not exist +ALTER FOREIGN TABLE foreign_schema.ft1 SET TABLESPACE ts; -- ERROR +ERROR: "ft1" is not a table, materialized view, index, or partitioned index ALTER FOREIGN TABLE foreign_schema.ft1 RENAME c1 TO foreign_column_1; ALTER FOREIGN TABLE foreign_schema.ft1 RENAME TO foreign_table_1; \d foreign_schema.foreign_table_1 diff --git a/src/test/regress/sql/alter_table.sql b/src/test/regress/sql/alter_table.sql index 1978248dc5d..8e30947666c 100644 --- a/src/test/regress/sql/alter_table.sql +++ b/src/test/regress/sql/alter_table.sql @@ -2581,6 +2581,11 @@ ALTER TABLE hash_parted ATTACH PARTITION fail_part FOR VALUES WITH (MODULUS 8, R ALTER TABLE hash_parted ATTACH PARTITION fail_part FOR VALUES WITH (MODULUS 3, REMAINDER 2); DROP TABLE fail_part; +-- fails with incorrect object type +CREATE VIEW at_v1 AS SELECT 1 as a; +ALTER TABLE at_v1 ATTACH PARTITION dummy default; +DROP VIEW at_v1; + -- -- DETACH PARTITION -- diff --git a/src/test/regress/sql/foreign_data.sql b/src/test/regress/sql/foreign_data.sql index 0c36208e4cd..3ac53fba06d 100644 --- a/src/test/regress/sql/foreign_data.sql +++ b/src/test/regress/sql/foreign_data.sql @@ -410,6 +410,7 @@ ALTER FOREIGN TABLE ft1 DROP COLUMN IF EXISTS no_column; ALTER FOREIGN TABLE ft1 DROP COLUMN c9; ALTER FOREIGN TABLE ft1 SET SCHEMA foreign_schema; ALTER FOREIGN TABLE ft1 SET TABLESPACE ts; -- ERROR +ALTER FOREIGN TABLE foreign_schema.ft1 SET TABLESPACE ts; -- ERROR ALTER FOREIGN TABLE foreign_schema.ft1 RENAME c1 TO foreign_column_1; ALTER FOREIGN TABLE foreign_schema.ft1 RENAME TO foreign_table_1; \d foreign_schema.foreign_table_1 -- 2.39.5