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
|
||||
* 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
|
||||
* 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;
|
||||
struct DropRelationCallbackState *state;
|
||||
char relkind;
|
||||
char expected_relkind;
|
||||
Form_pg_class classform;
|
||||
LOCKMODE heap_lockmode;
|
||||
|
||||
|
@ -3619,7 +3620,21 @@ RangeVarCallbackForDropIndex(const RangeVar *rel, Oid relOid, Oid oldRelOid, voi
|
|||
return; /* concurrently dropped, so nothing to do */
|
||||
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),
|
||||
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
|
||||
(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
|
||||
-- add COLUMN to partitioned table
|
||||
ALTER TABLE partitioning_test ADD new_column int;
|
||||
|
@ -1701,3 +1731,9 @@ ORDER BY
|
|||
|
||||
DROP SCHEMA partitioning_schema CASCADE;
|
||||
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
|
||||
(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
|
||||
-- add COLUMN to partitioned table
|
||||
ALTER TABLE partitioning_test ADD new_column int;
|
||||
|
@ -1652,3 +1683,11 @@ ORDER BY
|
|||
|
||||
DROP SCHEMA partitioning_schema CASCADE;
|
||||
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)
|
||||
|
||||
-- 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
|
||||
-- add COLUMN to partitioned table
|
||||
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;
|
||||
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
|
||||
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
|
||||
-- add COLUMN to partitioned table
|
||||
ALTER TABLE partitioning_test ADD new_column int;
|
||||
|
@ -1050,3 +1075,10 @@ ORDER BY
|
|||
1,2;
|
||||
|
||||
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