mirror of https://github.com/citusdata/citus.git
Fixes a bug on not being able to drop index on a partitioned table.
Reason for the failure is that PG11 introduced a new relation kind RELKIND_PARTITIONED_INDEX to be used for partitioned indices. We expanded our check to cover that case.pull/2383/head
parent
9215c00ee2
commit
0f6e514bfb
|
@ -3578,7 +3578,7 @@ InterShardDDLTaskList(Oid leftRelationId, Oid rightRelationId,
|
||||||
*
|
*
|
||||||
* This code is heavily borrowed from RangeVarCallbackForDropRelation() in
|
* This code is heavily borrowed from RangeVarCallbackForDropRelation() in
|
||||||
* commands/tablecmds.c in Postgres source. We need this to ensure the right
|
* commands/tablecmds.c in Postgres source. We need this to ensure the right
|
||||||
* order of locking while dealing with DROP INDEX statments. Because we are
|
* order of locking while dealing with DROP INDEX statements. Because we are
|
||||||
* exclusively using this callback for INDEX processing, the PARTITION-related
|
* exclusively using this callback for INDEX processing, the PARTITION-related
|
||||||
* logic from PostgreSQL's similar callback has been omitted as unneeded.
|
* logic from PostgreSQL's similar callback has been omitted as unneeded.
|
||||||
*/
|
*/
|
||||||
|
@ -3589,6 +3589,7 @@ RangeVarCallbackForDropIndex(const RangeVar *rel, Oid relOid, Oid oldRelOid, voi
|
||||||
HeapTuple tuple;
|
HeapTuple tuple;
|
||||||
struct DropRelationCallbackState *state;
|
struct DropRelationCallbackState *state;
|
||||||
char relkind;
|
char relkind;
|
||||||
|
char expected_relkind;
|
||||||
Form_pg_class classform;
|
Form_pg_class classform;
|
||||||
LOCKMODE heap_lockmode;
|
LOCKMODE heap_lockmode;
|
||||||
|
|
||||||
|
@ -3619,7 +3620,21 @@ RangeVarCallbackForDropIndex(const RangeVar *rel, Oid relOid, Oid oldRelOid, voi
|
||||||
return; /* concurrently dropped, so nothing to do */
|
return; /* concurrently dropped, so nothing to do */
|
||||||
classform = (Form_pg_class) GETSTRUCT(tuple);
|
classform = (Form_pg_class) GETSTRUCT(tuple);
|
||||||
|
|
||||||
if (classform->relkind != relkind)
|
/*
|
||||||
|
* PG 11 sends relkind as partitioned index for an index
|
||||||
|
* on partitioned table. It is handled the same
|
||||||
|
* as regular index as far as we are concerned here.
|
||||||
|
*
|
||||||
|
* See tablecmds.c:RangeVarCallbackForDropRelation()
|
||||||
|
*/
|
||||||
|
expected_relkind = classform->relkind;
|
||||||
|
|
||||||
|
#if PG_VERSION_NUM >= 110000
|
||||||
|
if (expected_relkind == RELKIND_PARTITIONED_INDEX)
|
||||||
|
expected_relkind = RELKIND_INDEX;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (expected_relkind != relkind)
|
||||||
ereport(ERROR, (errcode(ERRCODE_WRONG_OBJECT_TYPE),
|
ereport(ERROR, (errcode(ERRCODE_WRONG_OBJECT_TYPE),
|
||||||
errmsg("\"%s\" is not an index", rel->relname)));
|
errmsg("\"%s\" is not an index", rel->relname)));
|
||||||
|
|
||||||
|
|
|
@ -569,6 +569,36 @@ SELECT tablename, indexname FROM pg_indexes WHERE tablename LIKE 'partitioning_t
|
||||||
partitioning_test_default | partitioning_test_default_id_idx
|
partitioning_test_default | partitioning_test_default_id_idx
|
||||||
(9 rows)
|
(9 rows)
|
||||||
|
|
||||||
|
-- test drop
|
||||||
|
-- indexes created on parent table can only be dropped on parent table
|
||||||
|
-- ie using the same index name
|
||||||
|
-- following will fail
|
||||||
|
DROP INDEX partitioning_test_2009_id_idx;
|
||||||
|
ERROR: cannot drop index partitioning_test_2009_id_idx because index partitioning_index requires it
|
||||||
|
HINT: You can drop index partitioning_index instead.
|
||||||
|
-- but dropping index on parent table will succeed
|
||||||
|
DROP INDEX partitioning_index;
|
||||||
|
-- this index was already created on partition table
|
||||||
|
DROP INDEX partitioning_2009_index;
|
||||||
|
-- test drop index on non-distributed, partitioned table
|
||||||
|
CREATE TABLE non_distributed_partitioned_table(a int, b int) PARTITION BY RANGE (a);
|
||||||
|
CREATE TABLE non_distributed_partitioned_table_1 PARTITION OF non_distributed_partitioned_table
|
||||||
|
FOR VALUES FROM (0) TO (10);
|
||||||
|
CREATE INDEX non_distributed_partitioned_table_index ON non_distributed_partitioned_table(a);
|
||||||
|
-- see index is created
|
||||||
|
SELECT tablename, indexname FROM pg_indexes WHERE tablename LIKE 'non_distributed%' ORDER BY indexname;
|
||||||
|
tablename | indexname
|
||||||
|
-------------------------------------+-------------------------------------------
|
||||||
|
non_distributed_partitioned_table_1 | non_distributed_partitioned_table_1_a_idx
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
-- drop the index and see it is dropped
|
||||||
|
DROP INDEX non_distributed_partitioned_table_index;
|
||||||
|
SELECT tablename, indexname FROM pg_indexes WHERE tablename LIKE 'non_distributed%' ORDER BY indexname;
|
||||||
|
tablename | indexname
|
||||||
|
-----------+-----------
|
||||||
|
(0 rows)
|
||||||
|
|
||||||
-- test add COLUMN
|
-- test add COLUMN
|
||||||
-- add COLUMN to partitioned table
|
-- add COLUMN to partitioned table
|
||||||
ALTER TABLE partitioning_test ADD new_column int;
|
ALTER TABLE partitioning_test ADD new_column int;
|
||||||
|
@ -1701,3 +1731,9 @@ ORDER BY
|
||||||
|
|
||||||
DROP SCHEMA partitioning_schema CASCADE;
|
DROP SCHEMA partitioning_schema CASCADE;
|
||||||
NOTICE: drop cascades to table "schema-test"
|
NOTICE: drop cascades to table "schema-test"
|
||||||
|
RESET SEARCH_PATH;
|
||||||
|
DROP TABLE IF EXISTS
|
||||||
|
partitioning_hash_test,
|
||||||
|
partitioning_hash_join_test,
|
||||||
|
partitioning_test_failure,
|
||||||
|
non_distributed_partitioned_table;
|
||||||
|
|
|
@ -565,6 +565,37 @@ SELECT tablename, indexname FROM pg_indexes WHERE tablename LIKE 'partitioning_t
|
||||||
partitioning_test_2009 | partitioning_2009_index
|
partitioning_test_2009 | partitioning_2009_index
|
||||||
(2 rows)
|
(2 rows)
|
||||||
|
|
||||||
|
-- test drop
|
||||||
|
-- indexes created on parent table can only be dropped on parent table
|
||||||
|
-- ie using the same index name
|
||||||
|
-- following will fail
|
||||||
|
DROP INDEX partitioning_test_2009_id_idx;
|
||||||
|
ERROR: index "partitioning_test_2009_id_idx" does not exist
|
||||||
|
-- but dropping index on parent table will succeed
|
||||||
|
DROP INDEX partitioning_index;
|
||||||
|
ERROR: index "partitioning_index" does not exist
|
||||||
|
-- this index was already created on partition table
|
||||||
|
DROP INDEX partitioning_2009_index;
|
||||||
|
-- test drop index on non-distributed, partitioned table
|
||||||
|
CREATE TABLE non_distributed_partitioned_table(a int, b int) PARTITION BY RANGE (a);
|
||||||
|
CREATE TABLE non_distributed_partitioned_table_1 PARTITION OF non_distributed_partitioned_table
|
||||||
|
FOR VALUES FROM (0) TO (10);
|
||||||
|
CREATE INDEX non_distributed_partitioned_table_index ON non_distributed_partitioned_table(a);
|
||||||
|
ERROR: cannot create index on partitioned table "non_distributed_partitioned_table"
|
||||||
|
-- see index is created
|
||||||
|
SELECT tablename, indexname FROM pg_indexes WHERE tablename LIKE 'non_distributed%' ORDER BY indexname;
|
||||||
|
tablename | indexname
|
||||||
|
-----------+-----------
|
||||||
|
(0 rows)
|
||||||
|
|
||||||
|
-- drop the index and see it is dropped
|
||||||
|
DROP INDEX non_distributed_partitioned_table_index;
|
||||||
|
ERROR: index "non_distributed_partitioned_table_index" does not exist
|
||||||
|
SELECT tablename, indexname FROM pg_indexes WHERE tablename LIKE 'non_distributed%' ORDER BY indexname;
|
||||||
|
tablename | indexname
|
||||||
|
-----------+-----------
|
||||||
|
(0 rows)
|
||||||
|
|
||||||
-- test add COLUMN
|
-- test add COLUMN
|
||||||
-- add COLUMN to partitioned table
|
-- add COLUMN to partitioned table
|
||||||
ALTER TABLE partitioning_test ADD new_column int;
|
ALTER TABLE partitioning_test ADD new_column int;
|
||||||
|
@ -1652,3 +1683,11 @@ ORDER BY
|
||||||
|
|
||||||
DROP SCHEMA partitioning_schema CASCADE;
|
DROP SCHEMA partitioning_schema CASCADE;
|
||||||
NOTICE: drop cascades to table "schema-test"
|
NOTICE: drop cascades to table "schema-test"
|
||||||
|
RESET SEARCH_PATH;
|
||||||
|
DROP TABLE IF EXISTS
|
||||||
|
partitioning_hash_test,
|
||||||
|
partitioning_hash_join_test,
|
||||||
|
partitioning_test_failure,
|
||||||
|
non_distributed_partitioned_table;
|
||||||
|
NOTICE: table "partitioning_hash_test" does not exist, skipping
|
||||||
|
NOTICE: table "partitioning_hash_join_test" does not exist, skipping
|
||||||
|
|
|
@ -541,6 +541,44 @@ SELECT tablename, indexname FROM pg_indexes WHERE tablename LIKE 'partitioning_t
|
||||||
-----------+-----------
|
-----------+-----------
|
||||||
(0 rows)
|
(0 rows)
|
||||||
|
|
||||||
|
-- test drop
|
||||||
|
-- indexes created on parent table can only be dropped on parent table
|
||||||
|
-- ie using the same index name
|
||||||
|
-- following will fail
|
||||||
|
DROP INDEX partitioning_test_2009_id_idx;
|
||||||
|
ERROR: index "partitioning_test_2009_id_idx" does not exist
|
||||||
|
-- but dropping index on parent table will succeed
|
||||||
|
DROP INDEX partitioning_index;
|
||||||
|
ERROR: index "partitioning_index" does not exist
|
||||||
|
-- this index was already created on partition table
|
||||||
|
DROP INDEX partitioning_2009_index;
|
||||||
|
ERROR: index "partitioning_2009_index" does not exist
|
||||||
|
-- test drop index on non-distributed, partitioned table
|
||||||
|
CREATE TABLE non_distributed_partitioned_table(a int, b int) PARTITION BY RANGE (a);
|
||||||
|
ERROR: syntax error at or near "PARTITION"
|
||||||
|
LINE 1: ...E non_distributed_partitioned_table(a int, b int) PARTITION ...
|
||||||
|
^
|
||||||
|
CREATE TABLE non_distributed_partitioned_table_1 PARTITION OF non_distributed_partitioned_table
|
||||||
|
FOR VALUES FROM (0) TO (10);
|
||||||
|
ERROR: syntax error at or near "PARTITION"
|
||||||
|
LINE 1: CREATE TABLE non_distributed_partitioned_table_1 PARTITION O...
|
||||||
|
^
|
||||||
|
CREATE INDEX non_distributed_partitioned_table_index ON non_distributed_partitioned_table(a);
|
||||||
|
ERROR: relation "non_distributed_partitioned_table" does not exist
|
||||||
|
-- see index is created
|
||||||
|
SELECT tablename, indexname FROM pg_indexes WHERE tablename LIKE 'non_distributed%' ORDER BY indexname;
|
||||||
|
tablename | indexname
|
||||||
|
-----------+-----------
|
||||||
|
(0 rows)
|
||||||
|
|
||||||
|
-- drop the index and see it is dropped
|
||||||
|
DROP INDEX non_distributed_partitioned_table_index;
|
||||||
|
ERROR: index "non_distributed_partitioned_table_index" does not exist
|
||||||
|
SELECT tablename, indexname FROM pg_indexes WHERE tablename LIKE 'non_distributed%' ORDER BY indexname;
|
||||||
|
tablename | indexname
|
||||||
|
-----------+-----------
|
||||||
|
(0 rows)
|
||||||
|
|
||||||
-- test add COLUMN
|
-- test add COLUMN
|
||||||
-- add COLUMN to partitioned table
|
-- add COLUMN to partitioned table
|
||||||
ALTER TABLE partitioning_test ADD new_column int;
|
ALTER TABLE partitioning_test ADD new_column int;
|
||||||
|
@ -1532,3 +1570,13 @@ LINE 6: logicalrelid IN ('partitioning_schema."schema-test"'::re...
|
||||||
^
|
^
|
||||||
DROP SCHEMA partitioning_schema CASCADE;
|
DROP SCHEMA partitioning_schema CASCADE;
|
||||||
NOTICE: drop cascades to table "schema-test_2009"
|
NOTICE: drop cascades to table "schema-test_2009"
|
||||||
|
RESET SEARCH_PATH;
|
||||||
|
DROP TABLE IF EXISTS
|
||||||
|
partitioning_hash_test,
|
||||||
|
partitioning_hash_join_test,
|
||||||
|
partitioning_test_failure,
|
||||||
|
non_distributed_partitioned_table;
|
||||||
|
NOTICE: table "partitioning_hash_test" does not exist, skipping
|
||||||
|
NOTICE: table "partitioning_hash_join_test" does not exist, skipping
|
||||||
|
NOTICE: table "partitioning_test_failure" does not exist, skipping
|
||||||
|
NOTICE: table "non_distributed_partitioned_table" does not exist, skipping
|
||||||
|
|
|
@ -345,6 +345,31 @@ CREATE INDEX CONCURRENTLY partitioned_2010_index ON partitioning_test_2010(id);
|
||||||
-- see index is created
|
-- see index is created
|
||||||
SELECT tablename, indexname FROM pg_indexes WHERE tablename LIKE 'partitioning_test%' ORDER BY indexname;
|
SELECT tablename, indexname FROM pg_indexes WHERE tablename LIKE 'partitioning_test%' ORDER BY indexname;
|
||||||
|
|
||||||
|
-- test drop
|
||||||
|
-- indexes created on parent table can only be dropped on parent table
|
||||||
|
-- ie using the same index name
|
||||||
|
-- following will fail
|
||||||
|
DROP INDEX partitioning_test_2009_id_idx;
|
||||||
|
|
||||||
|
-- but dropping index on parent table will succeed
|
||||||
|
DROP INDEX partitioning_index;
|
||||||
|
|
||||||
|
-- this index was already created on partition table
|
||||||
|
DROP INDEX partitioning_2009_index;
|
||||||
|
|
||||||
|
-- test drop index on non-distributed, partitioned table
|
||||||
|
CREATE TABLE non_distributed_partitioned_table(a int, b int) PARTITION BY RANGE (a);
|
||||||
|
CREATE TABLE non_distributed_partitioned_table_1 PARTITION OF non_distributed_partitioned_table
|
||||||
|
FOR VALUES FROM (0) TO (10);
|
||||||
|
CREATE INDEX non_distributed_partitioned_table_index ON non_distributed_partitioned_table(a);
|
||||||
|
|
||||||
|
-- see index is created
|
||||||
|
SELECT tablename, indexname FROM pg_indexes WHERE tablename LIKE 'non_distributed%' ORDER BY indexname;
|
||||||
|
|
||||||
|
-- drop the index and see it is dropped
|
||||||
|
DROP INDEX non_distributed_partitioned_table_index;
|
||||||
|
SELECT tablename, indexname FROM pg_indexes WHERE tablename LIKE 'non_distributed%' ORDER BY indexname;
|
||||||
|
|
||||||
-- test add COLUMN
|
-- test add COLUMN
|
||||||
-- add COLUMN to partitioned table
|
-- add COLUMN to partitioned table
|
||||||
ALTER TABLE partitioning_test ADD new_column int;
|
ALTER TABLE partitioning_test ADD new_column int;
|
||||||
|
@ -1050,3 +1075,10 @@ ORDER BY
|
||||||
1,2;
|
1,2;
|
||||||
|
|
||||||
DROP SCHEMA partitioning_schema CASCADE;
|
DROP SCHEMA partitioning_schema CASCADE;
|
||||||
|
RESET SEARCH_PATH;
|
||||||
|
DROP TABLE IF EXISTS
|
||||||
|
partitioning_hash_test,
|
||||||
|
partitioning_hash_join_test,
|
||||||
|
partitioning_test_failure,
|
||||||
|
non_distributed_partitioned_table;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue