diff --git a/src/backend/distributed/commands/table.c b/src/backend/distributed/commands/table.c index 85d09d942..f6502c477 100644 --- a/src/backend/distributed/commands/table.c +++ b/src/backend/distributed/commands/table.c @@ -120,7 +120,8 @@ static void SetInterShardDDLTaskRelationShardList(Task *task, static Oid get_attrdef_oid(Oid relationId, AttrNumber attnum); static char * GetAddColumnWithNextvalDefaultCmd(Oid sequenceOid, Oid relationId, - char *colname, TypeName *typeName); + char *colname, TypeName *typeName, + bool ifNotExists); static void ErrorIfAlterTableDropTableNameFromPostgresFdw(List *optionList, Oid relationId); @@ -2650,7 +2651,9 @@ PostprocessAlterTableStmt(AlterTableStmt *alterTableStatement) columnDefinition ->colname, columnDefinition - ->typeName); + ->typeName, + command-> + missing_ok); } } } @@ -2915,7 +2918,7 @@ GetAlterColumnWithNextvalDefaultCmd(Oid sequenceOid, Oid relationId, char *colna */ static char * GetAddColumnWithNextvalDefaultCmd(Oid sequenceOid, Oid relationId, char *colname, - TypeName *typeName) + TypeName *typeName, bool ifNotExists) { char *qualifiedSequenceName = generate_qualified_relation_name(sequenceOid); char *qualifiedRelationName = generate_qualified_relation_name(relationId); @@ -2940,8 +2943,9 @@ GetAddColumnWithNextvalDefaultCmd(Oid sequenceOid, Oid relationId, char *colname StringInfoData str = { 0 }; initStringInfo(&str); appendStringInfo(&str, - "ALTER TABLE %s ADD COLUMN %s %s " - "DEFAULT %s(%s::regclass)", qualifiedRelationName, colname, + "ALTER TABLE %s ADD COLUMN %s %s %s " + "DEFAULT %s(%s::regclass)", qualifiedRelationName, + ifNotExists ? "IF NOT EXISTS" : "", colname, format_type_extended(typeOid, typmod, formatFlags), quote_qualified_identifier("pg_catalog", nextvalFunctionName), quote_literal_cstr(qualifiedSequenceName)); diff --git a/src/backend/distributed/deparser/deparse_table_stmts.c b/src/backend/distributed/deparser/deparse_table_stmts.c index 8d3803cfe..c58ad0798 100644 --- a/src/backend/distributed/deparser/deparse_table_stmts.c +++ b/src/backend/distributed/deparser/deparse_table_stmts.c @@ -475,6 +475,11 @@ AppendAlterTableCmdAddColumn(StringInfo buf, AlterTableCmd *alterTableCmd) appendStringInfoString(buf, " ADD COLUMN "); + if (alterTableCmd->missing_ok) + { + appendStringInfoString(buf, "IF NOT EXISTS "); + } + ColumnDef *columnDefinition = (ColumnDef *) alterTableCmd->def; /* diff --git a/src/test/regress/expected/multi_sequence_default.out b/src/test/regress/expected/multi_sequence_default.out index 1cf2e806d..8a984f884 100644 --- a/src/test/regress/expected/multi_sequence_default.out +++ b/src/test/regress/expected/multi_sequence_default.out @@ -143,6 +143,8 @@ SELECT create_distributed_table('seq_test_4','x'); CREATE SEQUENCE seq_4; ALTER TABLE seq_test_4 ADD COLUMN a bigint DEFAULT nextval('seq_4'); +ALTER TABLE seq_test_4 ADD COLUMN IF NOT EXISTS a bigint DEFAULT nextval('seq_4'); +NOTICE: column "a" of relation "seq_test_4" already exists, skipping DROP SEQUENCE seq_4 CASCADE; NOTICE: drop cascades to default value for column a of table seq_test_4 TRUNCATE seq_test_4; @@ -879,7 +881,7 @@ ROLLBACK; -- Show that existing sequence has been renamed and a new sequence with the same name -- created for another type \c - - - :worker_1_port -SELECT seqrelid::regclass, seqtypid::regtype, seqmax, seqmin FROM pg_sequence WHERE seqrelid::regclass::text like '%sequence_rollback%' ORDER BY 1,2; +SELECT seqrelid::regclass, seqtypid::regtype, seqmax, seqmin FROM pg_sequence WHERE seqrelid::regclass::text in ('sequence_rollback', '"sequence_rollback(citus_backup_0)"') ORDER BY 1,2; seqrelid | seqtypid | seqmax | seqmin --------------------------------------------------------------------- "sequence_rollback(citus_backup_0)" | integer | 2147483647 | 1 diff --git a/src/test/regress/sql/multi_sequence_default.sql b/src/test/regress/sql/multi_sequence_default.sql index b41aba577..422a97df4 100644 --- a/src/test/regress/sql/multi_sequence_default.sql +++ b/src/test/regress/sql/multi_sequence_default.sql @@ -65,6 +65,7 @@ CREATE TABLE seq_test_4 (x int, y int); SELECT create_distributed_table('seq_test_4','x'); CREATE SEQUENCE seq_4; ALTER TABLE seq_test_4 ADD COLUMN a bigint DEFAULT nextval('seq_4'); +ALTER TABLE seq_test_4 ADD COLUMN IF NOT EXISTS a bigint DEFAULT nextval('seq_4'); DROP SEQUENCE seq_4 CASCADE; TRUNCATE seq_test_4; CREATE SEQUENCE seq_4; @@ -440,7 +441,7 @@ ROLLBACK; -- Show that existing sequence has been renamed and a new sequence with the same name -- created for another type \c - - - :worker_1_port -SELECT seqrelid::regclass, seqtypid::regtype, seqmax, seqmin FROM pg_sequence WHERE seqrelid::regclass::text like '%sequence_rollback%' ORDER BY 1,2; +SELECT seqrelid::regclass, seqtypid::regtype, seqmax, seqmin FROM pg_sequence WHERE seqrelid::regclass::text in ('sequence_rollback', '"sequence_rollback(citus_backup_0)"') ORDER BY 1,2; \c - - - :master_port