From 61ae33dc7f43e0417129ebe89ba499d63ca6fd3a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?mehmet=20furkan=20=C5=9Fahin?= Date: Wed, 25 Oct 2017 14:19:02 +0300 Subject: [PATCH] ALTER TABLE .. REPLICA IDENTITY support is implemented --- .../distributed/executor/multi_utility.c | 4 +- .../distributed/relay/relay_event_utility.c | 12 +++ .../input/multi_alter_table_statements.source | 29 ++++++- .../multi_alter_table_statements.source | 76 ++++++++++++++++++- 4 files changed, 118 insertions(+), 3 deletions(-) diff --git a/src/backend/distributed/executor/multi_utility.c b/src/backend/distributed/executor/multi_utility.c index 8c2467afd..048d6f535 100644 --- a/src/backend/distributed/executor/multi_utility.c +++ b/src/backend/distributed/executor/multi_utility.c @@ -1897,6 +1897,7 @@ ErrorIfUnsupportedDropIndexStmt(DropStmt *dropIndexStatement) * ALTER TABLE SET|DROP NOT NULL * ALTER TABLE SET|DROP DEFAULT * ALTER TABLE ADD|DROP CONSTRAINT + * ALTER TABLE REPLICA IDENTITY */ static void ErrorIfUnsupportedAlterTableStmt(AlterTableStmt *alterTableStatement) @@ -2036,11 +2037,12 @@ ErrorIfUnsupportedAlterTableStmt(AlterTableStmt *alterTableStatement) case AT_DropConstraint: case AT_EnableTrigAll: case AT_DisableTrigAll: + case AT_ReplicaIdentity: { /* * We will not perform any special check for ALTER TABLE DROP CONSTRAINT * , ALTER TABLE .. ALTER COLUMN .. SET NOT NULL and ALTER TABLE ENABLE/ - * DISABLE TRIGGER ALL + * DISABLE TRIGGER ALL, ALTER TABLE .. REPLICA IDENTITY .. */ break; } diff --git a/src/backend/distributed/relay/relay_event_utility.c b/src/backend/distributed/relay/relay_event_utility.c index b09e20df7..7dd118c64 100644 --- a/src/backend/distributed/relay/relay_event_utility.c +++ b/src/backend/distributed/relay/relay_event_utility.c @@ -27,6 +27,7 @@ #include "access/stratnum.h" #include "catalog/indexing.h" #include "catalog/namespace.h" +#include "catalog/pg_class.h" #include "catalog/pg_constraint.h" #include "distributed/metadata_cache.h" #include "distributed/relay_utility.h" @@ -109,6 +110,17 @@ RelayEventExtendNames(Node *parseTree, char *schemaName, uint64 shardId) char **indexName = &(command->name); AppendShardIdToName(indexName, shardId); } + else if (command->subtype == AT_ReplicaIdentity) + { + ReplicaIdentityStmt *replicaIdentity = + (ReplicaIdentityStmt *) command->def; + + if (replicaIdentity->identity_type == REPLICA_IDENTITY_INDEX) + { + char **indexName = &(replicaIdentity->name); + AppendShardIdToName(indexName, shardId); + } + } } break; diff --git a/src/test/regress/input/multi_alter_table_statements.source b/src/test/regress/input/multi_alter_table_statements.source index c7b4fe06b..8aa4f502b 100644 --- a/src/test/regress/input/multi_alter_table_statements.source +++ b/src/test/regress/input/multi_alter_table_statements.source @@ -240,10 +240,37 @@ COMMIT; SELECT indexname, tablename FROM pg_indexes WHERE tablename = 'lineitem_alter'; -- Create single-shard table (to avoid deadlocks in the upcoming test hackery) -CREATE TABLE single_shard_items (id integer, name text); +CREATE TABLE single_shard_items (id integer NOT NULL, name text); SELECT master_create_distributed_table('single_shard_items', 'id', 'hash'); SELECT master_create_worker_shards('single_shard_items', 1, 2); +-- Verify that ALTER TABLE .. REPLICATION IDENTITY [USING INDEX]* .. works +CREATE UNIQUE INDEX replica_idx on single_shard_items(id); + +SELECT relreplident FROM pg_class WHERE relname = 'single_shard_items'; +SELECT run_command_on_workers('SELECT relreplident FROM pg_class WHERE relname LIKE ''single_shard_items_%'' LIMIT 1;'); + +ALTER TABLE single_shard_items REPLICA IDENTITY nothing; +SELECT relreplident FROM pg_class WHERE relname = 'single_shard_items'; +SELECT run_command_on_workers('SELECT relreplident FROM pg_class WHERE relname LIKE ''single_shard_items_%'' LIMIT 1;'); + +ALTER TABLE single_shard_items REPLICA IDENTITY full; +SELECT relreplident FROM pg_class WHERE relname = 'single_shard_items'; +SELECT run_command_on_workers('SELECT relreplident FROM pg_class WHERE relname LIKE ''single_shard_items_%'' LIMIT 1;'); + +ALTER TABLE single_shard_items REPLICA IDENTITY USING INDEX replica_idx; +SELECT relreplident FROM pg_class WHERE relname = 'single_shard_items'; +SELECT run_command_on_workers('SELECT relreplident FROM pg_class WHERE relname LIKE ''single_shard_items_%'' LIMIT 1;'); + +ALTER TABLE single_shard_items REPLICA IDENTITY default, REPLICA IDENTITY USING INDEX replica_idx, REPLICA IDENTITY nothing; +SELECT relreplident FROM pg_class WHERE relname = 'single_shard_items'; +SELECT run_command_on_workers('SELECT relreplident FROM pg_class WHERE relname LIKE ''single_shard_items_%'' LIMIT 1;'); + +ALTER TABLE single_shard_items ADD COLUMN test_col int, REPLICA IDENTITY full; + +DROP INDEX replica_idx; +ALTER TABLE single_shard_items REPLICA IDENTITY default; + -- Drop the column from the worker... \c - - - :worker_2_port ALTER TABLE lineitem_alter_220000 DROP COLUMN first; diff --git a/src/test/regress/output/multi_alter_table_statements.source b/src/test/regress/output/multi_alter_table_statements.source index 573e4ff95..460f9dcf2 100644 --- a/src/test/regress/output/multi_alter_table_statements.source +++ b/src/test/regress/output/multi_alter_table_statements.source @@ -539,7 +539,7 @@ SELECT indexname, tablename FROM pg_indexes WHERE tablename = 'lineitem_alter'; (0 rows) -- Create single-shard table (to avoid deadlocks in the upcoming test hackery) -CREATE TABLE single_shard_items (id integer, name text); +CREATE TABLE single_shard_items (id integer NOT NULL, name text); SELECT master_create_distributed_table('single_shard_items', 'id', 'hash'); master_create_distributed_table --------------------------------- @@ -552,6 +552,80 @@ SELECT master_create_worker_shards('single_shard_items', 1, 2); (1 row) +-- Verify that ALTER TABLE .. REPLICATION IDENTITY [USING INDEX]* .. works +CREATE UNIQUE INDEX replica_idx on single_shard_items(id); +SELECT relreplident FROM pg_class WHERE relname = 'single_shard_items'; + relreplident +-------------- + d +(1 row) + +SELECT run_command_on_workers('SELECT relreplident FROM pg_class WHERE relname LIKE ''single_shard_items_%'' LIMIT 1;'); + run_command_on_workers +------------------------ + (localhost,57637,t,d) + (localhost,57638,t,d) +(2 rows) + +ALTER TABLE single_shard_items REPLICA IDENTITY nothing; +SELECT relreplident FROM pg_class WHERE relname = 'single_shard_items'; + relreplident +-------------- + n +(1 row) + +SELECT run_command_on_workers('SELECT relreplident FROM pg_class WHERE relname LIKE ''single_shard_items_%'' LIMIT 1;'); + run_command_on_workers +------------------------ + (localhost,57637,t,n) + (localhost,57638,t,n) +(2 rows) + +ALTER TABLE single_shard_items REPLICA IDENTITY full; +SELECT relreplident FROM pg_class WHERE relname = 'single_shard_items'; + relreplident +-------------- + f +(1 row) + +SELECT run_command_on_workers('SELECT relreplident FROM pg_class WHERE relname LIKE ''single_shard_items_%'' LIMIT 1;'); + run_command_on_workers +------------------------ + (localhost,57637,t,f) + (localhost,57638,t,f) +(2 rows) + +ALTER TABLE single_shard_items REPLICA IDENTITY USING INDEX replica_idx; +SELECT relreplident FROM pg_class WHERE relname = 'single_shard_items'; + relreplident +-------------- + i +(1 row) + +SELECT run_command_on_workers('SELECT relreplident FROM pg_class WHERE relname LIKE ''single_shard_items_%'' LIMIT 1;'); + run_command_on_workers +------------------------ + (localhost,57637,t,i) + (localhost,57638,t,i) +(2 rows) + +ALTER TABLE single_shard_items REPLICA IDENTITY default, REPLICA IDENTITY USING INDEX replica_idx, REPLICA IDENTITY nothing; +SELECT relreplident FROM pg_class WHERE relname = 'single_shard_items'; + relreplident +-------------- + n +(1 row) + +SELECT run_command_on_workers('SELECT relreplident FROM pg_class WHERE relname LIKE ''single_shard_items_%'' LIMIT 1;'); + run_command_on_workers +------------------------ + (localhost,57637,t,n) + (localhost,57638,t,n) +(2 rows) + +ALTER TABLE single_shard_items ADD COLUMN test_col int, REPLICA IDENTITY full; +DROP INDEX replica_idx; +ALTER TABLE single_shard_items REPLICA IDENTITY default; -- Drop the column from the worker... \c - - - :worker_2_port ALTER TABLE lineitem_alter_220000 DROP COLUMN first;