Properly handle IF NOT EXISTS for ADD COLUMN

pull/7032/head
Onur Tirtir 2023-07-04 18:36:23 +03:00
parent d4789a2c3a
commit ae142e1764
4 changed files with 19 additions and 7 deletions

View File

@ -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));

View File

@ -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;
/*

View File

@ -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

View File

@ -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