diff --git a/src/backend/distributed/commands/table.c b/src/backend/distributed/commands/table.c index 0c30b0273..ba75bb101 100644 --- a/src/backend/distributed/commands/table.c +++ b/src/backend/distributed/commands/table.c @@ -956,11 +956,15 @@ PreprocessAlterTableAddConstraint(AlterTableStmt *alterTableStatement, Oid relationId, Constraint *constraint) { - /* We should only preprocess an ADD CONSTRAINT command if we are changing the it. + /* + * We should only preprocess an ADD CONSTRAINT command if we have empty conname * This only happens when we have to create a constraint name in citus since the client does * not specify a name. + * indexname should also be NULL to make sure this is not an + * ADD {PRIMARY KEY, UNIQUE} USING INDEX command + * which doesn't need a conname since the indexname will be used */ - Assert(constraint->conname == NULL); + Assert(constraint->conname == NULL && constraint->indexname == NULL); Relation rel = RelationIdGetRelation(relationId); @@ -1269,7 +1273,13 @@ PreprocessAlterTableStmt(Node *node, const char *alterTableCommand, constraint); } } - else if (constraint->conname == NULL) + /* + * When constraint->indexname is not NULL we are handling an + * ADD {PRIMARY KEY, UNIQUE} USING INDEX command. In this case + * we do not have to create a name and change the command. + * The existing index name will be used by the postgres. + */ + else if (constraint->conname == NULL && constraint->indexname == NULL) { if (ConstrTypeCitusCanDefaultName(constraint->contype)) { @@ -3326,8 +3336,6 @@ ErrorIfUnsupportedAlterTableStmt(AlterTableStmt *alterTableStatement) case AT_AddConstraint: { - Constraint *constraint = (Constraint *) command->def; - /* we only allow constraints if they are only subcommand */ if (commandList->length > 1) { @@ -3337,26 +3345,6 @@ ErrorIfUnsupportedAlterTableStmt(AlterTableStmt *alterTableStatement) errhint("You can issue each subcommand separately"))); } - /* - * We will use constraint name in each placement by extending it at - * workers. Therefore we require it to be exist. - */ - if (constraint->conname == NULL) - { - /* - * We support ALTER TABLE ... ADD PRIMARY ... commands by creating a constraint name - * and changing the command into the following form. - * ALTER TABLE ... ADD CONSTRAINT PRIMARY KEY ... - */ - if (ConstrTypeCitusCanDefaultName(constraint->contype) == false) - { - ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg( - "cannot create constraint without a name on a " - "distributed table"))); - } - } - break; } diff --git a/src/backend/distributed/relay/relay_event_utility.c b/src/backend/distributed/relay/relay_event_utility.c index 0949f3fbd..b7629a38b 100644 --- a/src/backend/distributed/relay/relay_event_utility.c +++ b/src/backend/distributed/relay/relay_event_utility.c @@ -178,7 +178,15 @@ RelayEventExtendNames(Node *parseTree, char *schemaName, uint64 shardId) if (!PartitionedTable(relationId) || constraint->contype != CONSTR_CHECK) { - AppendShardIdToName(constraintName, shardId); + /* + * constraint->conname could be empty in the case of + * ADD {PRIMARY KEY, UNIQUE} USING INDEX. + * In this case, already extended index name will be used by postgres. + */ + if (constraint->conname != NULL) + { + AppendShardIdToName(constraintName, shardId); + } } } else if (command->subtype == AT_DropConstraint || diff --git a/src/test/regress/expected/multi_alter_table_add_constraints_without_name.out b/src/test/regress/expected/multi_alter_table_add_constraints_without_name.out index e1da7b3dc..54224c924 100644 --- a/src/test/regress/expected/multi_alter_table_add_constraints_without_name.out +++ b/src/test/regress/expected/multi_alter_table_add_constraints_without_name.out @@ -44,6 +44,73 @@ SELECT con.conname \c - - :master_host :master_port ALTER TABLE AT_AddConstNoName.products DROP CONSTRAINT products_pkey; +-- Check "ADD PRIMARY KEY USING INDEX ..." +CREATE TABLE AT_AddConstNoName.tbl(col1 int, col2 int); +SELECT create_distributed_table('AT_AddConstNoName.tbl', 'col1'); + create_distributed_table +--------------------------------------------------------------------- + +(1 row) + +CREATE UNIQUE INDEX my_index ON AT_AddConstNoName.tbl(col1); +ALTER TABLE AT_AddConstNoName.tbl ADD PRIMARY KEY USING INDEX my_index; +SELECT con.conname + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace + WHERE rel.relname = 'tbl'; + conname +--------------------------------------------------------------------- + my_index +(1 row) + +\c - - :public_worker_1_host :worker_1_port +SELECT con.conname + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace + WHERE rel.relname LIKE 'tbl%' ORDER BY con.conname ASC; + conname +--------------------------------------------------------------------- + my_index + my_index_5410004 + my_index_5410005 + my_index_5410006 + my_index_5410007 +(5 rows) + +\c - - :master_host :master_port +ALTER TABLE AT_AddConstNoName.tbl DROP CONSTRAINT my_index; +-- Check "ADD UNIQUE USING INDEX ..." +CREATE UNIQUE INDEX my_index ON AT_AddConstNoName.tbl(col1); +ALTER TABLE AT_AddConstNoName.tbl ADD UNIQUE USING INDEX my_index; +SELECT con.conname + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace + WHERE rel.relname = 'tbl'; + conname +--------------------------------------------------------------------- + my_index +(1 row) + +\c - - :public_worker_1_host :worker_1_port +SELECT con.conname + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace + WHERE rel.relname LIKE 'tbl%'ORDER BY con.conname ASC; + conname +--------------------------------------------------------------------- + my_index + my_index_5410004 + my_index_5410005 + my_index_5410006 + my_index_5410007 +(5 rows) + +\c - - :master_host :master_port +ALTER TABLE AT_AddConstNoName.tbl DROP CONSTRAINT my_index; -- Check "ADD PRIMARY KEY DEFERRABLE" ALTER TABLE AT_AddConstNoName.products ADD PRIMARY KEY(product_no) DEFERRABLE; \c - - :public_worker_1_host :worker_1_port @@ -429,10 +496,10 @@ SELECT con.conname WHERE rel.relname LIKE 'very%' ORDER BY con.conname ASC; conname --------------------------------------------------------------------- - verylonglonglonglonglonglonglonglonglonglonglo_559ab79d_5410006 - verylonglonglonglonglonglonglonglonglonglonglo_559ab79d_5410007 - verylonglonglonglonglonglonglonglonglonglonglo_559ab79d_5410008 - verylonglonglonglonglonglonglonglonglonglonglo_559ab79d_5410009 + verylonglonglonglonglonglonglonglonglonglonglo_559ab79d_5410010 + verylonglonglonglonglonglonglonglonglonglonglo_559ab79d_5410011 + verylonglonglonglonglonglonglonglonglonglonglo_559ab79d_5410012 + verylonglonglonglonglonglonglonglonglonglonglo_559ab79d_5410013 verylonglonglonglonglonglonglonglonglonglonglonglonglonglo_pkey (5 rows) @@ -472,10 +539,10 @@ SELECT con.conname WHERE rel.relname LIKE 'very%' ORDER BY con.conname ASC; conname --------------------------------------------------------------------- - verylonglonglonglonglonglonglonglonglonglonglo_cd61b0cf_5410006 - verylonglonglonglonglonglonglonglonglonglonglo_cd61b0cf_5410007 - verylonglonglonglonglonglonglonglonglonglonglo_cd61b0cf_5410008 - verylonglonglonglonglonglonglonglonglonglonglo_cd61b0cf_5410009 + verylonglonglonglonglonglonglonglonglonglonglo_cd61b0cf_5410010 + verylonglonglonglonglonglonglonglonglonglonglo_cd61b0cf_5410011 + verylonglonglonglonglonglonglonglonglonglonglo_cd61b0cf_5410012 + verylonglonglonglonglonglonglonglonglonglonglo_cd61b0cf_5410013 verylonglonglonglonglonglonglonglonglonglonglong_product_no_key (5 rows) @@ -515,10 +582,10 @@ SELECT con.conname WHERE rel.relname LIKE 'very%' ORDER BY con.conname ASC; conname --------------------------------------------------------------------- - verylonglonglonglonglonglonglonglonglonglonglo_057ed027_5410006 - verylonglonglonglonglonglonglonglonglonglonglo_057ed027_5410007 - verylonglonglonglonglonglonglonglonglonglonglo_057ed027_5410008 - verylonglonglonglonglonglonglonglonglonglonglo_057ed027_5410009 + verylonglonglonglonglonglonglonglonglonglonglo_057ed027_5410010 + verylonglonglonglonglonglonglonglonglonglonglo_057ed027_5410011 + verylonglonglonglonglonglonglonglonglonglonglo_057ed027_5410012 + verylonglonglonglonglonglonglonglonglonglonglo_057ed027_5410013 verylonglonglonglonglonglonglonglonglonglonglon_product_no_excl (5 rows) @@ -558,10 +625,10 @@ SELECT con.conname WHERE rel.relname LIKE 'very%' ORDER BY con.conname ASC; conname --------------------------------------------------------------------- - verylonglonglonglonglonglonglonglonglonglonglo_d943e063_5410006 - verylonglonglonglonglonglonglonglonglonglonglo_d943e063_5410007 - verylonglonglonglonglonglonglonglonglonglonglo_d943e063_5410008 - verylonglonglonglonglonglonglonglonglonglonglo_d943e063_5410009 + verylonglonglonglonglonglonglonglonglonglonglo_d943e063_5410010 + verylonglonglonglonglonglonglonglonglonglonglo_d943e063_5410011 + verylonglonglonglonglonglonglonglonglonglonglo_d943e063_5410012 + verylonglonglonglonglonglonglonglonglonglonglo_d943e063_5410013 verylonglonglonglonglonglonglonglonglonglonglonglonglongl_check (5 rows) @@ -618,10 +685,10 @@ SELECT con.conname WHERE rel.relname LIKE 'longlonglonglonglonglonglonglonglong%' ORDER BY con.conname ASC; conname --------------------------------------------------------------------- - longlonglonglonglonglonglonglonglonglonglonglo_9e4e3069_5410014 - longlonglonglonglonglonglonglonglonglonglonglo_9e4e3069_5410015 - longlonglonglonglonglonglonglonglonglonglonglo_9e4e3069_5410016 - longlonglonglonglonglonglonglonglonglonglonglo_9e4e3069_5410017 + longlonglonglonglonglonglonglonglonglonglonglo_9e4e3069_5410018 + longlonglonglonglonglonglonglonglonglonglonglo_9e4e3069_5410019 + longlonglonglonglonglonglonglonglonglonglonglo_9e4e3069_5410020 + longlonglonglonglonglonglonglonglonglonglonglo_9e4e3069_5410021 longlonglonglonglonglonglonglonglonglonglonglonglonglonglo_pkey (5 rows) @@ -664,10 +731,10 @@ SELECT con.conname WHERE rel.relname LIKE 'longlonglonglonglonglonglonglonglong%' ORDER BY con.conname ASC; conname --------------------------------------------------------------------- - longlonglonglonglonglonglonglonglonglonglongl__d794d9f1_5410014 - longlonglonglonglonglonglonglonglonglonglongl__d794d9f1_5410015 - longlonglonglonglonglonglonglonglonglonglongl__d794d9f1_5410016 - longlonglonglonglonglonglonglonglonglonglongl__d794d9f1_5410017 + longlonglonglonglonglonglonglonglonglonglongl__d794d9f1_5410018 + longlonglonglonglonglonglonglonglonglonglongl__d794d9f1_5410019 + longlonglonglonglonglonglonglonglonglonglongl__d794d9f1_5410020 + longlonglonglonglonglonglonglonglonglonglongl__d794d9f1_5410021 longlonglonglonglonglonglonglonglonglonglongl_partition_col_key (5 rows) @@ -820,7 +887,7 @@ SELECT con.conname conname --------------------------------------------------------------------- citus_local_table_pkey - citus_local_table_pkey_5410022 + citus_local_table_pkey_5410026 (2 rows) SELECT create_distributed_table('AT_AddConstNoName.citus_local_table','id'); @@ -848,10 +915,10 @@ SELECT con.conname conname --------------------------------------------------------------------- citus_local_table_pkey - citus_local_table_pkey_5410023 - citus_local_table_pkey_5410024 - citus_local_table_pkey_5410025 - citus_local_table_pkey_5410026 + citus_local_table_pkey_5410027 + citus_local_table_pkey_5410028 + citus_local_table_pkey_5410029 + citus_local_table_pkey_5410030 (5 rows) \c - - :master_host :master_port @@ -879,10 +946,10 @@ SELECT con.conname conname --------------------------------------------------------------------- citus_local_table_id_key - citus_local_table_id_key_5410023 - citus_local_table_id_key_5410024 - citus_local_table_id_key_5410025 - citus_local_table_id_key_5410026 + citus_local_table_id_key_5410027 + citus_local_table_id_key_5410028 + citus_local_table_id_key_5410029 + citus_local_table_id_key_5410030 (5 rows) \c - - :master_host :master_port @@ -920,10 +987,10 @@ SELECT con.conname conname --------------------------------------------------------------------- citus_local_table_id_excl - citus_local_table_id_excl_5410023 - citus_local_table_id_excl_5410024 - citus_local_table_id_excl_5410025 - citus_local_table_id_excl_5410026 + citus_local_table_id_excl_5410027 + citus_local_table_id_excl_5410028 + citus_local_table_id_excl_5410029 + citus_local_table_id_excl_5410030 (5 rows) \c - - :master_host :master_port @@ -961,10 +1028,10 @@ SELECT con.conname conname --------------------------------------------------------------------- citus_local_table_check - citus_local_table_check_5410023 - citus_local_table_check_5410024 - citus_local_table_check_5410025 - citus_local_table_check_5410026 + citus_local_table_check_5410027 + citus_local_table_check_5410028 + citus_local_table_check_5410029 + citus_local_table_check_5410030 (5 rows) \c - - :master_host :master_port @@ -1014,10 +1081,10 @@ SELECT con.conname WHERE rel.relname LIKE 'longlonglonglonglonglonglonglonglong%' ORDER BY con.conname ASC; conname --------------------------------------------------------------------- - longlonglonglonglonglonglonglonglonglonglonglo_9e4e3069_5410034 - longlonglonglonglonglonglonglonglonglonglonglo_9e4e3069_5410035 - longlonglonglonglonglonglonglonglonglonglonglo_9e4e3069_5410036 - longlonglonglonglonglonglonglonglonglonglonglo_9e4e3069_5410037 + longlonglonglonglonglonglonglonglonglonglonglo_9e4e3069_5410038 + longlonglonglonglonglonglonglonglonglonglonglo_9e4e3069_5410039 + longlonglonglonglonglonglonglonglonglonglonglo_9e4e3069_5410040 + longlonglonglonglonglonglonglonglonglonglonglo_9e4e3069_5410041 longlonglonglonglonglonglonglonglonglonglonglonglonglonglo_pkey (5 rows) @@ -1051,10 +1118,10 @@ SELECT con.conname WHERE rel.relname LIKE 'longlonglonglonglonglonglonglonglong%' ORDER BY con.conname ASC; conname --------------------------------------------------------------------- - longlonglonglonglonglonglonglonglonglonglongl__d794d9f1_5410034 - longlonglonglonglonglonglonglonglonglonglongl__d794d9f1_5410035 - longlonglonglonglonglonglonglonglonglonglongl__d794d9f1_5410036 - longlonglonglonglonglonglonglonglonglonglongl__d794d9f1_5410037 + longlonglonglonglonglonglonglonglonglonglongl__d794d9f1_5410038 + longlonglonglonglonglonglonglonglonglonglongl__d794d9f1_5410039 + longlonglonglonglonglonglonglonglonglonglongl__d794d9f1_5410040 + longlonglonglonglonglonglonglonglonglonglongl__d794d9f1_5410041 longlonglonglonglonglonglonglonglonglonglongl_partition_col_key (5 rows) @@ -1144,10 +1211,10 @@ SELECT con.conname conname --------------------------------------------------------------------- 2nd table_pkey - 2nd table_pkey_5410042 - 2nd table_pkey_5410043 - 2nd table_pkey_5410044 - 2nd table_pkey_5410045 + 2nd table_pkey_5410046 + 2nd table_pkey_5410047 + 2nd table_pkey_5410048 + 2nd table_pkey_5410049 (5 rows) \c - - :master_host :master_port @@ -1174,10 +1241,10 @@ SELECT con.conname conname --------------------------------------------------------------------- 2nd table_2nd id_3rd id_key - 2nd table_2nd id_3rd id_key_5410042 - 2nd table_2nd id_3rd id_key_5410043 - 2nd table_2nd id_3rd id_key_5410044 - 2nd table_2nd id_3rd id_key_5410045 + 2nd table_2nd id_3rd id_key_5410046 + 2nd table_2nd id_3rd id_key_5410047 + 2nd table_2nd id_3rd id_key_5410048 + 2nd table_2nd id_3rd id_key_5410049 (5 rows) \c - - :master_host :master_port @@ -1204,10 +1271,10 @@ SELECT con.conname conname --------------------------------------------------------------------- 2nd table_2nd id_excl - 2nd table_2nd id_excl_5410042 - 2nd table_2nd id_excl_5410043 - 2nd table_2nd id_excl_5410044 - 2nd table_2nd id_excl_5410045 + 2nd table_2nd id_excl_5410046 + 2nd table_2nd id_excl_5410047 + 2nd table_2nd id_excl_5410048 + 2nd table_2nd id_excl_5410049 (5 rows) \c - - :master_host :master_port @@ -1234,20 +1301,21 @@ SELECT con.conname conname --------------------------------------------------------------------- 2nd table_check - 2nd table_check_5410042 - 2nd table_check_5410043 - 2nd table_check_5410044 - 2nd table_check_5410045 + 2nd table_check_5410046 + 2nd table_check_5410047 + 2nd table_check_5410048 + 2nd table_check_5410049 (5 rows) \c - - :master_host :master_port ALTER TABLE AT_AddConstNoName."2nd table" DROP CONSTRAINT "2nd table_check"; DROP EXTENSION btree_gist; DROP SCHEMA AT_AddConstNoName CASCADE; -NOTICE: drop cascades to 6 other objects -DETAIL: drop cascades to table at_addconstnoname.products_ref_2 +NOTICE: drop cascades to 7 other objects +DETAIL: drop cascades to table at_addconstnoname.tbl +drop cascades to table at_addconstnoname.products_ref_2 drop cascades to table at_addconstnoname.products_ref_3 drop cascades to table at_addconstnoname.verylonglonglonglonglonglonglonglonglonglonglonglonglonglonglon -drop cascades to table at_addconstnoname.products_ref_3_5410005 +drop cascades to table at_addconstnoname.products_ref_3_5410009 drop cascades to table at_addconstnoname.citus_local_partitioned_table drop cascades to table at_addconstnoname."2nd table" diff --git a/src/test/regress/sql/multi_alter_table_add_constraints_without_name.sql b/src/test/regress/sql/multi_alter_table_add_constraints_without_name.sql index db620be02..fe8bb4b20 100644 --- a/src/test/regress/sql/multi_alter_table_add_constraints_without_name.sql +++ b/src/test/regress/sql/multi_alter_table_add_constraints_without_name.sql @@ -36,6 +36,48 @@ SELECT con.conname \c - - :master_host :master_port ALTER TABLE AT_AddConstNoName.products DROP CONSTRAINT products_pkey; +-- Check "ADD PRIMARY KEY USING INDEX ..." + +CREATE TABLE AT_AddConstNoName.tbl(col1 int, col2 int); +SELECT create_distributed_table('AT_AddConstNoName.tbl', 'col1'); +CREATE UNIQUE INDEX my_index ON AT_AddConstNoName.tbl(col1); +ALTER TABLE AT_AddConstNoName.tbl ADD PRIMARY KEY USING INDEX my_index; + +SELECT con.conname + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace + WHERE rel.relname = 'tbl'; + +\c - - :public_worker_1_host :worker_1_port +SELECT con.conname + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace + WHERE rel.relname LIKE 'tbl%' ORDER BY con.conname ASC; + +\c - - :master_host :master_port +ALTER TABLE AT_AddConstNoName.tbl DROP CONSTRAINT my_index; + +-- Check "ADD UNIQUE USING INDEX ..." +CREATE UNIQUE INDEX my_index ON AT_AddConstNoName.tbl(col1); +ALTER TABLE AT_AddConstNoName.tbl ADD UNIQUE USING INDEX my_index; + +SELECT con.conname + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace + WHERE rel.relname = 'tbl'; + +\c - - :public_worker_1_host :worker_1_port +SELECT con.conname + FROM pg_catalog.pg_constraint con + INNER JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid + INNER JOIN pg_catalog.pg_namespace nsp ON nsp.oid = connamespace + WHERE rel.relname LIKE 'tbl%'ORDER BY con.conname ASC; + +\c - - :master_host :master_port +ALTER TABLE AT_AddConstNoName.tbl DROP CONSTRAINT my_index; -- Check "ADD PRIMARY KEY DEFERRABLE" ALTER TABLE AT_AddConstNoName.products ADD PRIMARY KEY(product_no) DEFERRABLE;