ERROR: "ft1" is of the wrong type.
Hello,
If I invoked a wrong ALTER TABLE command like this, I would see an
unexpected error.
=# ALTER TABLE <foreign table> ATTACH PARTITION ....
ERROR: "ft1" is of the wrong type
The cause is that ATWrongRelkidError doesn't handle ATT_TABLE |
ATT_ATT_PARTITIONED_INDEX.
After checking all callers of ATSimplePermissions, I found that;
The two below are no longer used.
ATT_TABLE | ATT_VIEW
ATT_TABLE | ATT_MATVIEW | ATT_INDEX
The four below are not handled.
ATT_TABLE | ATT_MATVIEW | ATT_INDEX | ATT_PARTITIONED_INDEX:
ATT_TABLE | ATT_MATVIEW | ATT_INDEX | ATT_PARTITIONED_INDEX | ATT_FOREIGN_TABLE
ATT_TABLE | ATT_PARTITIONED_INDEX:
ATT_INDEX:
The attached is just fixing that. I tried to make it generic but
didn't find a clean and translatable way.
Also I found that only three cases in the function are excecised by
make check.
ATT_TABLE : foreign_data, indexing checks
ATT_TABLE | ATT_FOREIGN_TABLE : alter_table
ATT_TABLE | ATT_COMPOSITE_TYPE | ATT_FOREIGN_TABLE : alter_table
I'm not sure it's worth the trouble so the attached doesn't do
anything for that.
Versions back to PG11 have similar but different mistakes.
PG11, 12:
the two below are not used
ATT_TABLE | ATT_VIEW
ATT_TABLE | ATT_MATVIEW | ATT_INDEX
the two below are not handled
ATT_TABLE | ATT_MATVIEW | ATT_INDEX | ATT_PARTITIONED_INDEX
ATT_TABLE | ATT_PARTITIONED_INDEX
PG13:
the two below are not used
ATT_TABLE | ATT_VIEW
ATT_TABLE | ATT_MATVIEW | ATT_INDEX
the three below are not handled
ATT_TABLE | ATT_MATVIEW | ATT_INDEX | ATT_PARTITIONED_INDEX
ATT_TABLE | ATT_MATVIEW | ATT_INDEX | ATT_PARTITIONED_INDEX | ATT_FOREIGN_TABLE
ATT_TABLE | ATT_PARTITIONED_INDEX
PG10:
ATT_TABLE | ATT_VIEW is not used
(all values are handled)
So the attached are the patches for PG11, 12, 13 and master.
It seems that the case lines in the function are intended to be in the
ATT_*'s definition order, but some of the them are out of that
order. However, I didn't reorder existing lines in the attached. I
didn't check the value itself is correct for the callers.
regareds.
--
Kyotaro Horiguchi
NTT Open Source Software Center
Attachments:
fix_ATWrongRelKindError_pg11.patchtext/x-patch; charset=us-asciiDownload
diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c
index a149ca044c..cf572a7c58 100644
--- a/src/backend/commands/tablecmds.c
+++ b/src/backend/commands/tablecmds.c
@@ -5063,9 +5063,6 @@ ATWrongRelkindError(Relation rel, int allowed_targets)
case ATT_TABLE:
msg = _("\"%s\" is not a table");
break;
- case ATT_TABLE | ATT_VIEW:
- msg = _("\"%s\" is not a table or view");
- break;
case ATT_TABLE | ATT_VIEW | ATT_FOREIGN_TABLE:
msg = _("\"%s\" is not a table, view, or foreign table");
break;
@@ -5075,8 +5072,8 @@ ATWrongRelkindError(Relation rel, int allowed_targets)
case ATT_TABLE | ATT_MATVIEW:
msg = _("\"%s\" is not a table or materialized view");
break;
- case ATT_TABLE | ATT_MATVIEW | ATT_INDEX:
- msg = _("\"%s\" is not a table, materialized view, or index");
+ 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");
@@ -5090,6 +5087,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;
fix_ATWrongRelKindError_pg12.patchtext/x-patch; charset=us-asciiDownload
diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c
index 6f4a3e70a4..6c15a4e034 100644
--- a/src/backend/commands/tablecmds.c
+++ b/src/backend/commands/tablecmds.c
@@ -5350,9 +5350,6 @@ ATWrongRelkindError(Relation rel, int allowed_targets)
case ATT_TABLE:
msg = _("\"%s\" is not a table");
break;
- case ATT_TABLE | ATT_VIEW:
- msg = _("\"%s\" is not a table or view");
- break;
case ATT_TABLE | ATT_VIEW | ATT_FOREIGN_TABLE:
msg = _("\"%s\" is not a table, view, or foreign table");
break;
@@ -5362,8 +5359,8 @@ ATWrongRelkindError(Relation rel, int allowed_targets)
case ATT_TABLE | ATT_MATVIEW:
msg = _("\"%s\" is not a table or materialized view");
break;
- case ATT_TABLE | ATT_MATVIEW | ATT_INDEX:
- msg = _("\"%s\" is not a table, materialized view, or index");
+ 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");
@@ -5377,6 +5374,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;
fix_ATWrongRelKindError_pg13.patchtext/x-patch; charset=us-asciiDownload
diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c
index faba264135..fb49dbadc8 100644
--- a/src/backend/commands/tablecmds.c
+++ b/src/backend/commands/tablecmds.c
@@ -5627,9 +5627,6 @@ ATWrongRelkindError(Relation rel, int allowed_targets)
case ATT_TABLE:
msg = _("\"%s\" is not a table");
break;
- case ATT_TABLE | ATT_VIEW:
- msg = _("\"%s\" is not a table or view");
- break;
case ATT_TABLE | ATT_VIEW | ATT_FOREIGN_TABLE:
msg = _("\"%s\" is not a table, view, or foreign table");
break;
@@ -5639,8 +5636,11 @@ ATWrongRelkindError(Relation rel, int allowed_targets)
case ATT_TABLE | ATT_MATVIEW:
msg = _("\"%s\" is not a table or materialized view");
break;
- case ATT_TABLE | ATT_MATVIEW | ATT_INDEX:
- msg = _("\"%s\" is not a table, materialized view, or index");
+ 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_INDEX | ATT_PARTITIONED_INDEX | ATT_FOREIGN_TABLE:
+ msg = _("\"%s\" is not a table, materialized view, index, partitioned index, or foreign table");
break;
case ATT_TABLE | ATT_MATVIEW | ATT_FOREIGN_TABLE:
msg = _("\"%s\" is not a table, materialized view, or foreign table");
@@ -5654,6 +5654,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;
fix_ATWrongRelKindError.patchtext/x-patch; charset=us-asciiDownload
diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c
index 420991e315..2b30dee333 100644
--- a/src/backend/commands/tablecmds.c
+++ b/src/backend/commands/tablecmds.c
@@ -5753,9 +5753,6 @@ ATWrongRelkindError(Relation rel, int allowed_targets)
case ATT_TABLE:
msg = _("\"%s\" is not a table");
break;
- case ATT_TABLE | ATT_VIEW:
- msg = _("\"%s\" is not a table or view");
- break;
case ATT_TABLE | ATT_VIEW | ATT_FOREIGN_TABLE:
msg = _("\"%s\" is not a table, view, or foreign table");
break;
@@ -5765,9 +5762,12 @@ ATWrongRelkindError(Relation rel, int allowed_targets)
case ATT_TABLE | ATT_MATVIEW:
msg = _("\"%s\" is not a table or materialized view");
break;
- case ATT_TABLE | ATT_MATVIEW | ATT_INDEX:
- msg = _("\"%s\" is not a table, materialized view, or index");
+ 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_INDEX | ATT_PARTITIONED_INDEX | ATT_FOREIGN_TABLE:
+ msg = _("\"%s\" is not a table, materialized view, index, partitioned index, or foreign table");
+ break;
case ATT_TABLE | ATT_MATVIEW | ATT_FOREIGN_TABLE:
msg = _("\"%s\" is not a table, materialized view, or foreign table");
break;
@@ -5780,9 +5780,15 @@ 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;
+ case ATT_INDEX:
+ msg = _("\"%s\" is not an index");
+ break;
case ATT_FOREIGN_TABLE:
msg = _("\"%s\" is not a foreign table");
break;
On Tue, Feb 16, 2021 at 06:14:15PM +0900, Kyotaro Horiguchi wrote:
The attached is just fixing that. I tried to make it generic but
didn't find a clean and translatable way.Also I found that only three cases in the function are excecised by
make check.ATT_TABLE : foreign_data, indexing checks
ATT_TABLE | ATT_FOREIGN_TABLE : alter_table
ATT_TABLE | ATT_COMPOSITE_TYPE | ATT_FOREIGN_TABLE : alter_tableI'm not sure it's worth the trouble so the attached doesn't do
anything for that.
Each sentence needs to be completely separate, as the language
translated to may tweak the punctuation of the set of objects listed,
at least. But you know that already :)
If you have seen cases where permission checks show up messages with
an incorrect relkind mentioned, could you add some regression tests
able to trigger the problematic cases you saw and to improve this
coverage?
--
Michael
At Thu, 18 Feb 2021 16:27:23 +0900, Michael Paquier <michael@paquier.xyz> wrote in
On Tue, Feb 16, 2021 at 06:14:15PM +0900, Kyotaro Horiguchi wrote:
The attached is just fixing that. I tried to make it generic but
didn't find a clean and translatable way.Also I found that only three cases in the function are excecised by
make check.ATT_TABLE : foreign_data, indexing checks
ATT_TABLE | ATT_FOREIGN_TABLE : alter_table
ATT_TABLE | ATT_COMPOSITE_TYPE | ATT_FOREIGN_TABLE : alter_tableI'm not sure it's worth the trouble so the attached doesn't do
anything for that.Each sentence needs to be completely separate, as the language
translated to may tweak the punctuation of the set of objects listed,
at least. But you know that already :)
Yeah, I strongly feel that:p As you pointed, the puctuations and the
article (for index and others) was that.
If you have seen cases where permission checks show up messages with
an incorrect relkind mentioned, could you add some regression tests
able to trigger the problematic cases you saw and to improve this
coverage?
I can add some regression tests to cover all the live cases. That
could reveal no-longer-used combinations.
I'll do that. Thaks for the suggestion.
regards.
--
Kyotaro Horiguchi
NTT Open Source Software Center
At Thu, 18 Feb 2021 17:17:37 +0900 (JST), Kyotaro Horiguchi <horikyota.ntt@gmail.com> wrote in
I can add some regression tests to cover all the live cases. That
could reveal no-longer-used combinations.
The attached is that.
ATT_VIEW is used for "CREATE OR REPLACE view" and checked against
earlier in DefineVirtualRelation. But we can add a test to make sure
that is checked anywhere.
All other values can be exercised.
ATT_TABLE | ATT_MATVIEW
ATT_TABLE | ATT_MATVIEW | ATT_INDEX | ATT_PARTITIONED_INDEX
ATT_TABLE | ATT_MATVIEW | ATT_INDEX | ATT_PARTITIONED_INDEX |
ATT_FOREIGN_TABLE
ATT_TABLE | ATT_MATVIEW | ATT_FOREIGN_TABLE
ATT_TABLE | ATT_MATVIEW | ATT_INDEX | ATT_FOREIGN_TABLE
ATT_TABLE | ATT_PARTITIONED_INDEX
ATT_TABLE | ATT_VIEW | ATT_MATVIEW | ATT_INDEX
ATT_TABLE | ATT_VIEW | ATT_FOREIGN_TABLE:
ATT_FOREIGN_TABLE
These are provoked by the following commands respectively:
ALTER TABLE <view> CLUSTER ON
ALTER TABLE <view> SET TABLESPACE
ALTER TABLE <view> ALTER COLUMN <col> SET STATISTICS
ALTER TABLE <view> ALTER COLUMN <col> SET STORGE
ALTER TABLE <view> ALTER COLUMN <col> SET()
ALTER TABLE <view> ATTACH PARTITION
ALTER TABLE/INDEX <partidx> SET/RESET
ALTER TABLE <matview> ALTER <col> SET DEFAULT
ALTER TABLE/INDEX <pidx> ALTER COLLATION ..REFRESH VERSION
ALTER TABLE <view> OPTIONS ()
The following three errors are already excised.
ATT_TABLE
ATT_TABLE | ATT_FOREIGN_TABLE
ATT_TABLE | ATT_COMPOSITE_TYPE | ATT_FOREIGN_TABLE:
By the way, I find this as somewhat mystifying. I'm not sure it worth
fixing though..
ALTER MATERIALIZED VIEW mv1 ALTER COLUMN a SET DEFAULT 1;
ERROR: "mv1" is not a table, view, or foreign table
regards.
--
Kyotaro Horiguchi
NTT Open Source Software Center
Attachments:
regression_tests_for_ATWrongRelkindError.patchtext/x-patch; charset=us-asciiDownload
diff --git a/src/test/regress/expected/alter_table.out b/src/test/regress/expected/alter_table.out
index 0ce6ee4622..4a367c9609 100644
--- a/src/test/regress/expected/alter_table.out
+++ b/src/test/regress/expected/alter_table.out
@@ -6,6 +6,7 @@ SET client_min_messages TO 'warning';
DROP ROLE IF EXISTS regress_alter_table_user1;
RESET client_min_messages;
CREATE USER regress_alter_table_user1;
+CREATE VIEW at_v1 AS SELECT 1 as a;
--
-- add attribute
--
@@ -120,6 +121,9 @@ ALTER INDEX attmp_idx ALTER COLUMN 4 SET STATISTICS 1000;
ERROR: column number 4 of relation "attmp_idx" does not exist
ALTER INDEX attmp_idx ALTER COLUMN 2 SET STATISTICS -1;
DROP TABLE attmp;
+-- test that the command correctly complains for the object of a wrong type
+ALTER TABLE at_v1 ALTER COLUMN a SET STATISTICS 0; -- ERROR
+ERROR: "at_v1" is not a table, materialized view, index, partitioned index, or foreign table
--
-- rename - check on both non-temp and temp tables
--
@@ -1186,6 +1190,11 @@ select * from def_test;
alter table def_test alter column c1 set default 'wrong_datatype';
ERROR: invalid input syntax for type integer: "wrong_datatype"
alter table def_test alter column c2 set default 20;
+-- set defaults to an incorrect object: this should fail
+create materialized view def_tmp_mv as select 1 as a;
+alter table def_tmp_mv alter a set default 0;
+ERROR: "def_tmp_mv" is not a table, view, or foreign table
+drop materialized view def_tmp_mv;
-- set defaults on a non-existent column: this should fail
alter table def_test alter column c3 set default 30;
ERROR: column "c3" of relation "def_test" does not exist
@@ -2076,6 +2085,9 @@ Indexes:
"at_part_2_a_idx" btree (a)
"at_part_2_b_idx" btree (b)
+-- check if the command correctly complains for the object of a wrong type
+alter table at_partitioned_a_idx set (dummy = 1); -- ERROR
+ERROR: "at_partitioned_a_idx" is not a table, view, materialized view, or index
drop table at_partitioned;
-- Alter column type when no table rewrite is required
-- Also check that comments are preserved
@@ -2212,6 +2224,9 @@ Indexes:
a | text | yes | a | external |
btree, for table "public.test_storage"
+-- test that SET STORAGE correctly complains for the object of a wrong type
+alter table at_v1 alter column a set storage plain; -- ERROR
+ERROR: "at_v1" is not a table, materialized view, or foreign table
-- ALTER COLUMN TYPE with a check constraint and a child table (bug #13779)
CREATE TABLE test_inh_check (a float check (a > 10.2), b float);
CREATE TABLE test_inh_check_child() INHERITS(test_inh_check);
@@ -2684,6 +2699,9 @@ select * from my_locks order by 1;
(2 rows)
commit;
+-- test that the command corectly complains for the object of a wrong type
+alter table at_v1 alter column a set (dummy = 1);
+ERROR: "at_v1" is not a table, materialized view, index, or foreign table
begin; alter table alterlock alter column f2 set storage extended;
select * from my_locks order by 1;
relname | max_lockmode
@@ -4110,6 +4128,9 @@ 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;
+-- check that attach partition correctly complains for the object of a wrong type
+ALTER TABLE at_v1 ATTACH PARTITION dummy default; -- ERROR
+ERROR: "at_v1" is not a table or partitioned index
--
-- DETACH PARTITION
--
@@ -4350,6 +4371,11 @@ alter table at_test_sql_partop attach partition at_test_sql_partop_1 for values
drop table at_test_sql_partop;
drop operator class at_test_sql_partop using btree;
drop function at_test_sql_partop;
+-- check that the command correctly complains for the object of a wrong type
+create table attmp();
+alter table attmp options (dummy '1');
+ERROR: "attmp" is not a foreign table
+drop table attmp;
/* Test case for bug #16242 */
-- We create a parent and child where the child has missing
-- non-null attribute values, and arrange to pass them through
diff --git a/src/test/regress/expected/cluster.out b/src/test/regress/expected/cluster.out
index bdae8fe00c..b4d4163836 100644
--- a/src/test/regress/expected/cluster.out
+++ b/src/test/regress/expected/cluster.out
@@ -572,7 +572,12 @@ SELECT * FROM clstr_expression WHERE -a = -3 ORDER BY -a, b;
(4 rows)
COMMIT;
+-- check that the command correctly complains for the object of a wrong type
+CREATE VIEW clstr_tst_view AS SELECT 1;
+ALTER TABLE clstr_tst_view CLUSTER ON x; -- ERROR
+ERROR: "clstr_tst_view" is not a table or materialized view
-- clean up
+DROP VIEW clstr_tst_view;
DROP TABLE clustertest;
DROP TABLE clstr_1;
DROP TABLE clstr_2;
diff --git a/src/test/regress/expected/collate.icu.utf8.out b/src/test/regress/expected/collate.icu.utf8.out
index bc3752e923..981e626f53 100644
--- a/src/test/regress/expected/collate.icu.utf8.out
+++ b/src/test/regress/expected/collate.icu.utf8.out
@@ -2148,6 +2148,13 @@ AND objid::regclass::text = 'icuidx17_part';
icuidx17_part | f
(1 row)
+-- Test that ALTER COLLATION REFRESH VERSION correctly complains for
+-- wrong object. We use ALTER TABLE, not ALTER INDEX since we are
+-- exercising ATWrongRelkindError here.
+CREATE VIEW failview AS SELECT 1 AS a;
+ALTER TABLE failview ALTER COLLATION a REFRESH VERSION; -- ERROR
+ERROR: "failview" is not an index
+DROP VIEW failview;
-- cleanup
RESET search_path;
SET client_min_messages TO warning;
diff --git a/src/test/regress/expected/create_view.out b/src/test/regress/expected/create_view.out
index bd5fe60450..a507ad37be 100644
--- a/src/test/regress/expected/create_view.out
+++ b/src/test/regress/expected/create_view.out
@@ -72,6 +72,9 @@ ERROR: cannot change data type of view column "b" from integer to numeric
-- should work
CREATE OR REPLACE VIEW viewtest AS
SELECT a, b, 0 AS c FROM viewtest_tbl;
+-- check that the command correctly complains for the object of a wrong type
+CREATE OR REPLACE VIEW view_base_table AS SELECT 1 AS a;
+ERROR: "view_base_table" is not a view
DROP VIEW viewtest;
DROP TABLE viewtest_tbl;
-- tests for temporary views
diff --git a/src/test/regress/expected/foreign_data.out b/src/test/regress/expected/foreign_data.out
index b9e25820bc..ffa9287967 100644
--- a/src/test/regress/expected/foreign_data.out
+++ b/src/test/regress/expected/foreign_data.out
@@ -877,8 +877,10 @@ ERROR: column "no_column" of relation "ft1" does not exist
ALTER FOREIGN TABLE ft1 DROP COLUMN IF EXISTS no_column;
NOTICE: column "no_column" of relation "ft1" does not exist, skipping
ALTER FOREIGN TABLE ft1 DROP COLUMN c9;
+ALTER FOREIGN TABLE ft1 SET TABLESPACE ts; -- ERROR (wrong object type)
+ERROR: "ft1" is not a table, materialized view, index, or partitioned index
ALTER FOREIGN TABLE ft1 SET SCHEMA foreign_schema;
-ALTER FOREIGN TABLE ft1 SET TABLESPACE ts; -- ERROR
+ALTER FOREIGN TABLE ft1 SET TABLESPACE ts; -- ERROR (not found)
ERROR: relation "ft1" does not exist
ALTER FOREIGN TABLE foreign_schema.ft1 RENAME c1 TO foreign_column_1;
ALTER FOREIGN TABLE foreign_schema.ft1 RENAME TO foreign_table_1;
diff --git a/src/test/regress/sql/alter_table.sql b/src/test/regress/sql/alter_table.sql
index 4cc55d8525..1b70458790 100644
--- a/src/test/regress/sql/alter_table.sql
+++ b/src/test/regress/sql/alter_table.sql
@@ -9,6 +9,8 @@ RESET client_min_messages;
CREATE USER regress_alter_table_user1;
+CREATE VIEW at_v1 AS SELECT 1 as a;
+
--
-- add attribute
--
@@ -158,6 +160,8 @@ ALTER INDEX attmp_idx ALTER COLUMN 2 SET STATISTICS -1;
DROP TABLE attmp;
+-- test that the command correctly complains for the object of a wrong type
+ALTER TABLE at_v1 ALTER COLUMN a SET STATISTICS 0; -- ERROR
--
-- rename - check on both non-temp and temp tables
@@ -916,6 +920,11 @@ select * from def_test;
alter table def_test alter column c1 set default 'wrong_datatype';
alter table def_test alter column c2 set default 20;
+-- set defaults to an incorrect object: this should fail
+create materialized view def_tmp_mv as select 1 as a;
+alter table def_tmp_mv alter a set default 0;
+drop materialized view def_tmp_mv;
+
-- set defaults on a non-existent column: this should fail
alter table def_test alter column c3 set default 30;
@@ -1409,6 +1418,10 @@ alter table at_partitioned attach partition at_part_2 for values from (1000) to
alter table at_partitioned alter column b type numeric using b::numeric;
\d at_part_1
\d at_part_2
+
+-- check if the command correctly complains for the object of a wrong type
+alter table at_partitioned_a_idx set (dummy = 1); -- ERROR
+
drop table at_partitioned;
-- Alter column type when no table rewrite is required
@@ -1500,6 +1513,9 @@ alter table test_storage alter column a set storage external;
\d+ test_storage
\d+ test_storage_idx
+-- test that SET STORAGE correctly complains for the object of a wrong type
+alter table at_v1 alter column a set storage plain; -- ERROR
+
-- ALTER COLUMN TYPE with a check constraint and a child table (bug #13779)
CREATE TABLE test_inh_check (a float check (a > 10.2), b float);
CREATE TABLE test_inh_check_child() INHERITS(test_inh_check);
@@ -1721,6 +1737,9 @@ begin; alter table alterlock set (autovacuum_enabled = off, fillfactor = 80);
select * from my_locks order by 1;
commit;
+-- test that the command corectly complains for the object of a wrong type
+alter table at_v1 alter column a set (dummy = 1);
+
begin; alter table alterlock alter column f2 set storage extended;
select * from my_locks order by 1;
rollback;
@@ -2640,6 +2659,9 @@ 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;
+-- check that attach partition correctly complains for the object of a wrong type
+ALTER TABLE at_v1 ATTACH PARTITION dummy default; -- ERROR
+
--
-- DETACH PARTITION
--
@@ -2852,6 +2874,11 @@ drop operator class at_test_sql_partop using btree;
drop function at_test_sql_partop;
+-- check that the command correctly complains for the object of a wrong type
+create table attmp();
+alter table attmp options (dummy '1');
+drop table attmp;
+
/* Test case for bug #16242 */
-- We create a parent and child where the child has missing
diff --git a/src/test/regress/sql/cluster.sql b/src/test/regress/sql/cluster.sql
index 188183647c..827a15b305 100644
--- a/src/test/regress/sql/cluster.sql
+++ b/src/test/regress/sql/cluster.sql
@@ -257,7 +257,12 @@ EXPLAIN (COSTS OFF) SELECT * FROM clstr_expression WHERE -a = -3 ORDER BY -a, b;
SELECT * FROM clstr_expression WHERE -a = -3 ORDER BY -a, b;
COMMIT;
+-- check that the command correctly complains for the object of a wrong type
+CREATE VIEW clstr_tst_view AS SELECT 1;
+ALTER TABLE clstr_tst_view CLUSTER ON x; -- ERROR
+
-- clean up
+DROP VIEW clstr_tst_view;
DROP TABLE clustertest;
DROP TABLE clstr_1;
DROP TABLE clstr_2;
diff --git a/src/test/regress/sql/collate.icu.utf8.sql b/src/test/regress/sql/collate.icu.utf8.sql
index 0de2ed8d85..583c671c34 100644
--- a/src/test/regress/sql/collate.icu.utf8.sql
+++ b/src/test/regress/sql/collate.icu.utf8.sql
@@ -875,6 +875,13 @@ SELECT objid::regclass, refobjversion = 'not a version' AS ver FROM pg_depend
WHERE refclassid = 'pg_collation'::regclass
AND objid::regclass::text = 'icuidx17_part';
+-- Test that ALTER COLLATION REFRESH VERSION correctly complains for
+-- wrong object. We use ALTER TABLE, not ALTER INDEX since we are
+-- exercising ATWrongRelkindError here.
+CREATE VIEW failview AS SELECT 1 AS a;
+ALTER TABLE failview ALTER COLLATION a REFRESH VERSION; -- ERROR
+DROP VIEW failview;
+
-- cleanup
RESET search_path;
SET client_min_messages TO warning;
diff --git a/src/test/regress/sql/create_view.sql b/src/test/regress/sql/create_view.sql
index fbd1313b9c..8fbbe05c56 100644
--- a/src/test/regress/sql/create_view.sql
+++ b/src/test/regress/sql/create_view.sql
@@ -77,6 +77,9 @@ CREATE OR REPLACE VIEW viewtest AS
CREATE OR REPLACE VIEW viewtest AS
SELECT a, b, 0 AS c FROM viewtest_tbl;
+-- check that the command correctly complains for the object of a wrong type
+CREATE OR REPLACE VIEW view_base_table AS SELECT 1 AS a;
+
DROP VIEW viewtest;
DROP TABLE viewtest_tbl;
diff --git a/src/test/regress/sql/foreign_data.sql b/src/test/regress/sql/foreign_data.sql
index 73f9f621d8..e96aef5396 100644
--- a/src/test/regress/sql/foreign_data.sql
+++ b/src/test/regress/sql/foreign_data.sql
@@ -406,8 +406,9 @@ ALTER FOREIGN TABLE ft1 OPTIONS (DROP delimiter, SET quote '~', ADD escape '@');
ALTER FOREIGN TABLE ft1 DROP COLUMN no_column; -- ERROR
ALTER FOREIGN TABLE ft1 DROP COLUMN IF EXISTS no_column;
ALTER FOREIGN TABLE ft1 DROP COLUMN c9;
+ALTER FOREIGN TABLE ft1 SET TABLESPACE ts; -- ERROR (wrong object type)
ALTER FOREIGN TABLE ft1 SET SCHEMA foreign_schema;
-ALTER FOREIGN TABLE ft1 SET TABLESPACE ts; -- ERROR
+ALTER FOREIGN TABLE ft1 SET TABLESPACE ts; -- ERROR (not found)
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
Hi Horiguchi-san,
On Fri, Feb 19, 2021 at 05:30:39PM +0900, Kyotaro Horiguchi wrote:
The attached is that.
ATT_VIEW is used for "CREATE OR REPLACE view" and checked against
earlier in DefineVirtualRelation. But we can add a test to make sure
that is checked anywhere.
My apologies for not coming back to this thread earlier. I have this
thread in my backlog for some time now but I was not able to come back
to it. That's too late for v14 but it could be possible to do
something for v15. Could you add this patch to the next commit fest?
That's fine to add my name as reviewer.
Thanks,
--
Michael
At Thu, 22 Apr 2021 13:48:45 +0900, Michael Paquier <michael@paquier.xyz> wrote in
Hi Horiguchi-san,
On Fri, Feb 19, 2021 at 05:30:39PM +0900, Kyotaro Horiguchi wrote:
The attached is that.
ATT_VIEW is used for "CREATE OR REPLACE view" and checked against
earlier in DefineVirtualRelation. But we can add a test to make sure
that is checked anywhere.My apologies for not coming back to this thread earlier. I have this
thread in my backlog for some time now but I was not able to come back
to it. That's too late for v14 but it could be possible to do
something for v15. Could you add this patch to the next commit fest?
That's fine to add my name as reviewer.
Thank you for kindly telling me that, but please don't worry.
I'll add it to the next CF, with specifying you as a reviewer as you
told.
regards.
--
Kyotaro Horiguchi
NTT Open Source Software Center
The following review has been posted through the commitfest application:
make installcheck-world: tested, passed
Implements feature: tested, passed
Spec compliant: tested, passed
Documentation: not tested
I have tested it with various object types and getting a meaningful error.
At Tue, 29 Jun 2021 20:13:14 +0000, ahsan hadi <ahsan.hadi@gmail.com> wrote in
The following review has been posted through the commitfest application:
make installcheck-world: tested, passed
Implements feature: tested, passed
Spec compliant: tested, passed
Documentation: not testedI have tested it with various object types and getting a meaningful error.
Thanks for looking this, Ahsan.
However, Peter-E is proposing a change at a fundamental level, which
looks more promising (disregarding backpatch burden).
/messages/by-id/01d4fd55-d4fe-5afc-446c-a7f99e043f3d@enterprisedb.com
regards.
--
Kyotaro Horiguchi
NTT Open Source Software Center
On Wed, Jun 30, 2021 at 5:56 AM Kyotaro Horiguchi <horikyota.ntt@gmail.com>
wrote:
At Tue, 29 Jun 2021 20:13:14 +0000, ahsan hadi <ahsan.hadi@gmail.com>
wrote inThe following review has been posted through the commitfest application:
make installcheck-world: tested, passed
Implements feature: tested, passed
Spec compliant: tested, passed
Documentation: not testedI have tested it with various object types and getting a meaningful
error.
Thanks for looking this, Ahsan.
However, Peter-E is proposing a change at a fundamental level, which
looks more promising (disregarding backpatch burden)./messages/by-id/01d4fd55-d4fe-5afc-446c-a7f99e043f3d@enterprisedb.com
Sure I will also take a look at this patch.
+1 for avoiding the backpatching burden.
regards.
--
Kyotaro Horiguchi
NTT Open Source Software Center
--
Highgo Software (Canada/China/Pakistan)
URL : http://www.highgo.ca
ADDR: 10318 WHALLEY BLVD, Surrey, BC
EMAIL: mailto: ahsan.hadi@highgo.ca
On Wed, Jun 30, 2021 at 01:43:52PM +0500, Ahsan Hadi wrote:
Sure I will also take a look at this patch.
+1 for avoiding the backpatching burden.
From what I recall of this thread, nobody has really complained about
this stuff either, so a backpatch would be off the table. I agree
that what Peter E is proposing on the other thread is much more
suitable in the long term, as there is no need to worry about multiple
combinations of relkinds in error message, so such error strings
become a no-brainer when more relkinds are added.
--
Michael
On 02.07.21 06:20, Michael Paquier wrote:
On Wed, Jun 30, 2021 at 01:43:52PM +0500, Ahsan Hadi wrote:
Sure I will also take a look at this patch.
+1 for avoiding the backpatching burden.
From what I recall of this thread, nobody has really complained about
this stuff either, so a backpatch would be off the table. I agree
that what Peter E is proposing on the other thread is much more
suitable in the long term, as there is no need to worry about multiple
combinations of relkinds in error message, so such error strings
become a no-brainer when more relkinds are added.
My patch is now committed. The issue that started this thread now
behaves like this:
ALTER TABLE ft1 ATTACH PARTITION ...;
ERROR: ALTER action ATTACH PARTITION cannot be performed on relation "ft1"
DETAIL: This operation is not supported for foreign tables.
So, for PG15, this is taken care of.
Backpatches under the old style for missing combinations would still be
in scope, but there my comment on the proposed patches is that I would
rather not remove apparently unused combinations from back branches.
At Thu, 8 Jul 2021 10:02:53 +0200, Peter Eisentraut <peter.eisentraut@enterprisedb.com> wrote in
My patch is now committed. The issue that started this thread now behaves
like this:ALTER TABLE ft1 ATTACH PARTITION ...;
ERROR: ALTER action ATTACH PARTITION cannot be performed on relation "ft1"
DETAIL: This operation is not supported for foreign tables.So, for PG15, this is taken care of.
Cool.
Backpatches under the old style for missing combinations would still be in
scope, but there my comment on the proposed patches is that I would rather not
remove apparently unused combinations from back branches.
Sounds reasonable. So the attached are that for PG11-PG14. 11 and 12
shares the same patch.
regards.
--
Kyotaro Horiguchi
NTT Open Source Software Center
Attachments:
v2-0001-Add-missing-targets-in-ATWrongRelkindError_PG14.patchtext/x-patch; charset=us-asciiDownload
From f04c1968c0305142ab81e80a193352e1037ec4ef Mon Sep 17 00:00:00 2001
From: Kyotaro Horiguchi <horikyota.ntt@gmail.com>
Date: Thu, 8 Jul 2021 17:55:25 +0900
Subject: [PATCH v2] Add missing targets in ATWrongRelkindError
ATWrongRelkindError yields an ambiguous message ""tbl" is of the wrong
type" due the lack of some combinations of allowed_targets. Add the
missing items. We don't remove apparently unused entries in case
someone is using them.
---
src/backend/commands/tablecmds.c | 12 ++++++++++++
1 file changed, 12 insertions(+)
diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c
index 97a9725df7..3432f9bdd3 100644
--- a/src/backend/commands/tablecmds.c
+++ b/src/backend/commands/tablecmds.c
@@ -6029,6 +6029,12 @@ 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_INDEX | ATT_PARTITIONED_INDEX | ATT_FOREIGN_TABLE:
+ msg = _("\"%s\" is not a table, materialized view, index, partitioned index, or foreign table");
+ break;
case ATT_TABLE | ATT_MATVIEW | ATT_FOREIGN_TABLE:
msg = _("\"%s\" is not a table, materialized view, or foreign table");
break;
@@ -6041,9 +6047,15 @@ 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;
+ case ATT_INDEX:
+ msg = _("\"%s\" is not an index");
+ break;
case ATT_FOREIGN_TABLE:
msg = _("\"%s\" is not a foreign table");
break;
--
2.27.0
v2-0001-Add-missing-targets-in-ATWrongRelkindError_PG13.patchtext/x-patch; charset=us-asciiDownload
From b1fc39633ba1053a4933f89e70369a0cef966840 Mon Sep 17 00:00:00 2001
From: Kyotaro Horiguchi <horikyota.ntt@gmail.com>
Date: Thu, 8 Jul 2021 18:01:19 +0900
Subject: [PATCH v2] Add missing targets in ATWrongRelkindError
ATWrongRelkindError yields an ambiguous message ""tbl" is of the wrong
type" due the lack of some combinations of allowed_targets. Add the
missing items. We don't remove apparently unused entries in case
someone is using them.
---
src/backend/commands/tablecmds.c | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c
index 135fa46981..1bf4ca6884 100644
--- a/src/backend/commands/tablecmds.c
+++ b/src/backend/commands/tablecmds.c
@@ -5649,6 +5649,12 @@ 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_INDEX | ATT_PARTITIONED_INDEX | ATT_FOREIGN_TABLE:
+ msg = _("\"%s\" is not a table, materialized view, index, partitioned index, or foreign table");
+ break;
case ATT_TABLE | ATT_MATVIEW | ATT_FOREIGN_TABLE:
msg = _("\"%s\" is not a table, materialized view, or foreign table");
break;
@@ -5661,6 +5667,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;
--
2.27.0
v2-0001-Add-missing-targets-in-ATWrongRelkindError_PG12-11.patchtext/x-patch; charset=us-asciiDownload
From 71f6da9183e6d41d2f787f6a591772956a2b53df Mon Sep 17 00:00:00 2001
From: Kyotaro Horiguchi <horikyota.ntt@gmail.com>
Date: Thu, 8 Jul 2021 18:03:17 +0900
Subject: [PATCH v2] Add missing targets in ATWrongRelkindError
ATWrongRelkindError yields an ambiguous message ""tbl" is of the wrong
type" due the lack of some combinations of allowed_targets. Add the
missing items. We don't remove apparently unused entries in case
someone is using them.
---
src/backend/commands/tablecmds.c | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c
index 816ce8521f..8dc43195a5 100644
--- a/src/backend/commands/tablecmds.c
+++ b/src/backend/commands/tablecmds.c
@@ -5372,6 +5372,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;
@@ -5384,6 +5387,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;
--
2.27.0
On Fri, Jul 09, 2021 at 10:44:13AM +0900, Kyotaro Horiguchi wrote:
Sounds reasonable. So the attached are that for PG11-PG14. 11 and 12
shares the same patch.
How much do the regression tests published upthread in
/messages/by-id/20210219.173039.609314751334535042.horikyota.ntt@gmail.com
apply here? Shouldn't we also have some regression tests for the new
error cases you are adding? I agree that we'd better avoid removing
those entries, one argument in favor of not removing any entries being
that this could have an impact on forks.
--
Michael
At Fri, 9 Jul 2021 11:03:56 +0900, Michael Paquier <michael@paquier.xyz> wrote in
On Fri, Jul 09, 2021 at 10:44:13AM +0900, Kyotaro Horiguchi wrote:
Sounds reasonable. So the attached are that for PG11-PG14. 11 and 12
shares the same patch.How much do the regression tests published upthread in
/messages/by-id/20210219.173039.609314751334535042.horikyota.ntt@gmail.com
apply here? Shouldn't we also have some regression tests for the new
error cases you are adding? I agree that we'd better avoid removing
Mmm. Ok, I distributed the mother regression test into each version.
PG11, 12:
- ATT_TABLE | ATT_MATVIEW | ATT_INDEX | ATT_PARTITIONED_INDEX
Added.
- ATT_TABLE | ATT_PARTITIONED_INDEX
This test doesn't detect the "is of the wrong type" issue.
The item is practically a dead one since the combination is caught
by transformPartitionCmd before visiting ATPrepCmd, which emits a
bit different error message for the test.
"\"%s\" is not a partitioned table or index"
ATPrepCmd emits an error that:
"\"%s\" is not a table or partitioned index"
Hmm.. somewhat funny. Actually ATT_TABLE is a bit off here but
there's no symbol ATT_PARTITIONED_TABLE. Theoretically the symbol
is needed but practically not. I don't think we need to do more
than that at least for these versions. (Or we don't even need to
add this item.)
PG13:
- ATT_TABLE | ATT_MATVIEW | ATT_INDEX | ATT_PARTITIONED_INDEX
Same to PG12.
- ATT_TABLE | ATT_PARTITIONED_INDEX:
This version raches this item in ATPrepCmd because the commit
1281a5c907 moved the parse-transform phase to the ATExec stage,
which is visited after ATPrepCmd.
On the other hand, when the target relation is a regular table, the
error is missed by ATPrepCmd then the control reaches to the
Exec-stage. The error is finally aught by transformPartitionCmd.
Of course this works fine but doesn't seem clean, but it is
apparently a matter of the master branch.
- ATT_TABLE | ATT_MATVIEW | ATT_INDEX | ATT_PARTITIONED_INDEX | ATT_FOREIGN_TABLE
Added and works as expected.
PG14:
- ATT_INDEX
I noticed that this combination has been reverted by the commit
ec48314708.
- ATT_TABLE | ATT_MATVIEW | ATT_INDEX | ATT_PARTITIONED_INDEX
- ATT_TABLE | ATT_PARTITIONED_INDEX:
- ATT_TABLE | ATT_MATVIEW | ATT_INDEX | ATT_PARTITIONED_INDEX | ATT_FOREIGN_TABLE
Same as PG13.
So, PG14 and 13 share the same fix and test.
error cases you are adding? I agree that we'd better avoid removing
those entries, one argument in favor of not removing any entries being
that this could have an impact on forks.
Ok. The attached are the two patchsets for PG14-13 and PG12-11
containing the fix and the regression test.
regards.
--
Kyotaro Horiguchi
NTT Open Source Software Center
Attachments:
v3-0001-Add-missing-targets-in-ATWrongRelkindError_PG14-13.patchtext/x-patch; charset=us-asciiDownload
From 80fa3ae43f5697a562b2ba460a50cdedf8d53e55 Mon Sep 17 00:00:00 2001
From: Kyotaro Horiguchi <horikyota.ntt@gmail.com>
Date: Thu, 8 Jul 2021 17:55:25 +0900
Subject: [PATCH v3 1/2] Add missing targets in ATWrongRelkindError
ATWrongRelkindError yields an ambiguous message ""tbl" is of the wrong
type" due the lack of some combinations of allowed_targets. Add the
missing items. We don't remove apparently unused entries in case
someone is using them.
---
src/backend/commands/tablecmds.c | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c
index 97a9725df7..d02e01cb20 100644
--- a/src/backend/commands/tablecmds.c
+++ b/src/backend/commands/tablecmds.c
@@ -6029,6 +6029,12 @@ 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_INDEX | ATT_PARTITIONED_INDEX | ATT_FOREIGN_TABLE:
+ msg = _("\"%s\" is not a table, materialized view, index, partitioned index, or foreign table");
+ break;
case ATT_TABLE | ATT_MATVIEW | ATT_FOREIGN_TABLE:
msg = _("\"%s\" is not a table, materialized view, or foreign table");
break;
@@ -6041,6 +6047,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;
--
2.27.0
v3-0002-regress-Add-missing-targets-in-ATWrongRelkindErro_PG14-13.patchtext/x-patch; charset=us-asciiDownload
From 3fc4f789006cb6f6239dda7e6f7c817f9da41812 Mon Sep 17 00:00:00 2001
From: Kyotaro Horiguchi <horikyota.ntt@gmail.com>
Date: Fri, 9 Jul 2021 20:19:23 +0900
Subject: [PATCH v3 2/2] regress - Add missing targets in ATWrongRelkindError
---
src/test/regress/expected/alter_table.out | 7 +++++++
src/test/regress/expected/foreign_data.out | 4 +++-
src/test/regress/sql/alter_table.sql | 6 ++++++
src/test/regress/sql/foreign_data.sql | 3 ++-
4 files changed, 18 insertions(+), 2 deletions(-)
diff --git a/src/test/regress/expected/alter_table.out b/src/test/regress/expected/alter_table.out
index f81bdf513b..b63b4d34b0 100644
--- a/src/test/regress/expected/alter_table.out
+++ b/src/test/regress/expected/alter_table.out
@@ -6,6 +6,7 @@ SET client_min_messages TO 'warning';
DROP ROLE IF EXISTS regress_alter_table_user1;
RESET client_min_messages;
CREATE USER regress_alter_table_user1;
+CREATE VIEW at_v1 AS SELECT 1 as a;
--
-- add attribute
--
@@ -120,6 +121,9 @@ ALTER INDEX attmp_idx ALTER COLUMN 4 SET STATISTICS 1000;
ERROR: column number 4 of relation "attmp_idx" does not exist
ALTER INDEX attmp_idx ALTER COLUMN 2 SET STATISTICS -1;
DROP TABLE attmp;
+-- test that the command correctly complains for the object of a wrong type
+ALTER TABLE at_v1 ALTER COLUMN a SET STATISTICS 0; -- ERROR
+ERROR: "at_v1" is not a table, materialized view, index, partitioned index, or foreign table
--
-- rename - check on both non-temp and temp tables
--
@@ -4111,6 +4115,9 @@ ALTER TABLE hash_parted ATTACH PARTITION fail_part FOR VALUES WITH (MODULUS 3, R
ERROR: every hash partition modulus must be a factor of the next larger modulus
DETAIL: The new modulus 3 is not a factor of 4, the modulus of existing partition "hpart_1".
DROP TABLE fail_part;
+-- check that attach partition correctly complains for the object of a wrong type
+ALTER TABLE at_v1 ATTACH PARTITION dummy default; -- ERROR
+ERROR: "at_v1" is not a table or partitioned index
--
-- DETACH PARTITION
--
diff --git a/src/test/regress/expected/foreign_data.out b/src/test/regress/expected/foreign_data.out
index 5385f98a0f..0f56cae353 100644
--- a/src/test/regress/expected/foreign_data.out
+++ b/src/test/regress/expected/foreign_data.out
@@ -877,8 +877,10 @@ ERROR: column "no_column" of relation "ft1" does not exist
ALTER FOREIGN TABLE ft1 DROP COLUMN IF EXISTS no_column;
NOTICE: column "no_column" of relation "ft1" does not exist, skipping
ALTER FOREIGN TABLE ft1 DROP COLUMN c9;
+ALTER FOREIGN TABLE ft1 SET TABLESPACE ts; -- ERROR (wrong object type)
+ERROR: "ft1" is not a table, materialized view, index, or partitioned index
ALTER FOREIGN TABLE ft1 SET SCHEMA foreign_schema;
-ALTER FOREIGN TABLE ft1 SET TABLESPACE ts; -- ERROR
+ALTER FOREIGN TABLE ft1 SET TABLESPACE ts; -- ERROR (not found)
ERROR: relation "ft1" does not exist
ALTER FOREIGN TABLE foreign_schema.ft1 RENAME c1 TO foreign_column_1;
ALTER FOREIGN TABLE foreign_schema.ft1 RENAME TO foreign_table_1;
diff --git a/src/test/regress/sql/alter_table.sql b/src/test/regress/sql/alter_table.sql
index dc0200adcb..0c13478e3e 100644
--- a/src/test/regress/sql/alter_table.sql
+++ b/src/test/regress/sql/alter_table.sql
@@ -8,6 +8,7 @@ DROP ROLE IF EXISTS regress_alter_table_user1;
RESET client_min_messages;
CREATE USER regress_alter_table_user1;
+CREATE VIEW at_v1 AS SELECT 1 as a;
--
-- add attribute
@@ -158,6 +159,8 @@ ALTER INDEX attmp_idx ALTER COLUMN 2 SET STATISTICS -1;
DROP TABLE attmp;
+-- test that the command correctly complains for the object of a wrong type
+ALTER TABLE at_v1 ALTER COLUMN a SET STATISTICS 0; -- ERROR
--
-- rename - check on both non-temp and temp tables
@@ -2640,6 +2643,9 @@ 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;
+-- check that attach partition correctly complains for the object of a wrong type
+ALTER TABLE at_v1 ATTACH PARTITION dummy default; -- ERROR
+
--
-- DETACH PARTITION
--
diff --git a/src/test/regress/sql/foreign_data.sql b/src/test/regress/sql/foreign_data.sql
index 73f9f621d8..e96aef5396 100644
--- a/src/test/regress/sql/foreign_data.sql
+++ b/src/test/regress/sql/foreign_data.sql
@@ -406,8 +406,9 @@ ALTER FOREIGN TABLE ft1 OPTIONS (DROP delimiter, SET quote '~', ADD escape '@');
ALTER FOREIGN TABLE ft1 DROP COLUMN no_column; -- ERROR
ALTER FOREIGN TABLE ft1 DROP COLUMN IF EXISTS no_column;
ALTER FOREIGN TABLE ft1 DROP COLUMN c9;
+ALTER FOREIGN TABLE ft1 SET TABLESPACE ts; -- ERROR (wrong object type)
ALTER FOREIGN TABLE ft1 SET SCHEMA foreign_schema;
-ALTER FOREIGN TABLE ft1 SET TABLESPACE ts; -- ERROR
+ALTER FOREIGN TABLE ft1 SET TABLESPACE ts; -- ERROR (not found)
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.27.0
v3-0001-Add-missing-targets-in-ATWrongRelkindError_PG12-11.patchtext/x-patch; charset=us-asciiDownload
From 71f6da9183e6d41d2f787f6a591772956a2b53df Mon Sep 17 00:00:00 2001
From: Kyotaro Horiguchi <horikyota.ntt@gmail.com>
Date: Thu, 8 Jul 2021 18:03:17 +0900
Subject: [PATCH v3 1/2] Add missing targets in ATWrongRelkindError
ATWrongRelkindError yields an ambiguous message ""tbl" is of the wrong
type" due the lack of some combinations of allowed_targets. Add the
missing items. We don't remove apparently unused entries in case
someone is using them.
---
src/backend/commands/tablecmds.c | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c
index 816ce8521f..8dc43195a5 100644
--- a/src/backend/commands/tablecmds.c
+++ b/src/backend/commands/tablecmds.c
@@ -5372,6 +5372,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;
@@ -5384,6 +5387,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;
--
2.27.0
v3-0002-regress-Add-missing-targets-in-ATWrongRelkindErro_PG12-11.patchtext/x-patch; charset=us-asciiDownload
From 18c3101d4f2dc95c917a19c82757bd6f4b81fa2a Mon Sep 17 00:00:00 2001
From: Kyotaro Horiguchi <horikyota.ntt@gmail.com>
Date: Fri, 9 Jul 2021 20:40:52 +0900
Subject: [PATCH v3 2/2] regress - Add missing targets in ATWrongRelkindError
---
src/test/regress/expected/alter_table.out | 4 ++++
src/test/regress/expected/foreign_data.out | 4 +++-
src/test/regress/sql/alter_table.sql | 4 ++++
src/test/regress/sql/foreign_data.sql | 3 ++-
4 files changed, 13 insertions(+), 2 deletions(-)
diff --git a/src/test/regress/expected/alter_table.out b/src/test/regress/expected/alter_table.out
index 8d91e2d6c8..5f6d4ed7c3 100644
--- a/src/test/regress/expected/alter_table.out
+++ b/src/test/regress/expected/alter_table.out
@@ -6,6 +6,7 @@ SET client_min_messages TO 'warning';
DROP ROLE IF EXISTS regress_alter_table_user1;
RESET client_min_messages;
CREATE USER regress_alter_table_user1;
+CREATE VIEW at_v1 AS SELECT 1 as a;
--
-- add attribute
--
@@ -3948,6 +3949,9 @@ 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;
+-- check that attach partition correctly complains for the object of a wrong type
+ALTER TABLE at_v1 ATTACH PARTITION dummy default; -- ERROR
+ERROR: "at_v1" is not a partitioned table or index
--
-- DETACH PARTITION
--
diff --git a/src/test/regress/expected/foreign_data.out b/src/test/regress/expected/foreign_data.out
index b9e25820bc..ffa9287967 100644
--- a/src/test/regress/expected/foreign_data.out
+++ b/src/test/regress/expected/foreign_data.out
@@ -877,8 +877,10 @@ ERROR: column "no_column" of relation "ft1" does not exist
ALTER FOREIGN TABLE ft1 DROP COLUMN IF EXISTS no_column;
NOTICE: column "no_column" of relation "ft1" does not exist, skipping
ALTER FOREIGN TABLE ft1 DROP COLUMN c9;
+ALTER FOREIGN TABLE ft1 SET TABLESPACE ts; -- ERROR (wrong object type)
+ERROR: "ft1" is not a table, materialized view, index, or partitioned index
ALTER FOREIGN TABLE ft1 SET SCHEMA foreign_schema;
-ALTER FOREIGN TABLE ft1 SET TABLESPACE ts; -- ERROR
+ALTER FOREIGN TABLE ft1 SET TABLESPACE ts; -- ERROR (not found)
ERROR: relation "ft1" does not exist
ALTER FOREIGN TABLE foreign_schema.ft1 RENAME c1 TO foreign_column_1;
ALTER FOREIGN TABLE foreign_schema.ft1 RENAME TO foreign_table_1;
diff --git a/src/test/regress/sql/alter_table.sql b/src/test/regress/sql/alter_table.sql
index cd925ea8ce..a92cea7f87 100644
--- a/src/test/regress/sql/alter_table.sql
+++ b/src/test/regress/sql/alter_table.sql
@@ -8,6 +8,7 @@ DROP ROLE IF EXISTS regress_alter_table_user1;
RESET client_min_messages;
CREATE USER regress_alter_table_user1;
+CREATE VIEW at_v1 AS SELECT 1 as a;
--
-- add attribute
@@ -2593,6 +2594,9 @@ 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;
+-- check that attach partition correctly complains for the object of a wrong type
+ALTER TABLE at_v1 ATTACH PARTITION dummy default; -- ERROR
+
--
-- DETACH PARTITION
--
diff --git a/src/test/regress/sql/foreign_data.sql b/src/test/regress/sql/foreign_data.sql
index 73f9f621d8..e96aef5396 100644
--- a/src/test/regress/sql/foreign_data.sql
+++ b/src/test/regress/sql/foreign_data.sql
@@ -406,8 +406,9 @@ ALTER FOREIGN TABLE ft1 OPTIONS (DROP delimiter, SET quote '~', ADD escape '@');
ALTER FOREIGN TABLE ft1 DROP COLUMN no_column; -- ERROR
ALTER FOREIGN TABLE ft1 DROP COLUMN IF EXISTS no_column;
ALTER FOREIGN TABLE ft1 DROP COLUMN c9;
+ALTER FOREIGN TABLE ft1 SET TABLESPACE ts; -- ERROR (wrong object type)
ALTER FOREIGN TABLE ft1 SET SCHEMA foreign_schema;
-ALTER FOREIGN TABLE ft1 SET TABLESPACE ts; -- ERROR
+ALTER FOREIGN TABLE ft1 SET TABLESPACE ts; -- ERROR (not found)
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.27.0
On Fri, Jul 09, 2021 at 09:00:31PM +0900, Kyotaro Horiguchi wrote:
Mmm. Ok, I distributed the mother regression test into each version.
Thanks, my apologies for the late reply. It took me some time to
analyze the whole.
PG11, 12:
- ATT_TABLE | ATT_PARTITIONED_INDEX
This test doesn't detect the "is of the wrong type" issue.
The item is practically a dead one since the combination is caught
by transformPartitionCmd before visiting ATPrepCmd, which emits a
bit different error message for the test.
Yes, I was surprised to see this test choke in the utility parsing.
There is a good argument in keeping (ATT_TABLE |
ATT_PARTITIONED_INDEX) though. I analyzed the code and I agree that
it cannot be directly reached, but a future code change on those
branches may expose that. And it does not really cost in keeping it
either.
PG13:
Of course this works fine but doesn't seem clean, but it is
apparently a matter of the master branch.- ATT_TABLE | ATT_MATVIEW | ATT_INDEX | ATT_PARTITIONED_INDEX | ATT_FOREIGN_TABLE
Added and works as expected.
HEAD had its own improvements, and what you have here closes some
holes of their own, so applied. Thanks!
--
Michael
At Wed, 14 Jul 2021 19:55:18 +0900, Michael Paquier <michael@paquier.xyz> wrote in
On Fri, Jul 09, 2021 at 09:00:31PM +0900, Kyotaro Horiguchi wrote:
Mmm. Ok, I distributed the mother regression test into each version.
Thanks, my apologies for the late reply. It took me some time to
analyze the whole.
..
PG13:
Of course this works fine but doesn't seem clean, but it is
apparently a matter of the master branch.- ATT_TABLE | ATT_MATVIEW | ATT_INDEX | ATT_PARTITIONED_INDEX | ATT_FOREIGN_TABLE
Added and works as expected.HEAD had its own improvements, and what you have here closes some
holes of their own, so applied. Thanks!
Thank you for commiting this!
regards.
--
Kyotaro Horiguchi
NTT Open Source Software Center