mirror of https://github.com/citusdata/citus.git
Properly handle IF NOT EXISTS for ADD COLUMN
parent
d4789a2c3a
commit
ae142e1764
|
@ -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));
|
||||
|
|
|
@ -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;
|
||||
|
||||
/*
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
Loading…
Reference in New Issue