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 Oid get_attrdef_oid(Oid relationId, AttrNumber attnum);
|
||||||
|
|
||||||
static char * GetAddColumnWithNextvalDefaultCmd(Oid sequenceOid, Oid relationId,
|
static char * GetAddColumnWithNextvalDefaultCmd(Oid sequenceOid, Oid relationId,
|
||||||
char *colname, TypeName *typeName);
|
char *colname, TypeName *typeName,
|
||||||
|
bool ifNotExists);
|
||||||
static void ErrorIfAlterTableDropTableNameFromPostgresFdw(List *optionList, Oid
|
static void ErrorIfAlterTableDropTableNameFromPostgresFdw(List *optionList, Oid
|
||||||
relationId);
|
relationId);
|
||||||
|
|
||||||
|
@ -2650,7 +2651,9 @@ PostprocessAlterTableStmt(AlterTableStmt *alterTableStatement)
|
||||||
columnDefinition
|
columnDefinition
|
||||||
->colname,
|
->colname,
|
||||||
columnDefinition
|
columnDefinition
|
||||||
->typeName);
|
->typeName,
|
||||||
|
command->
|
||||||
|
missing_ok);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2915,7 +2918,7 @@ GetAlterColumnWithNextvalDefaultCmd(Oid sequenceOid, Oid relationId, char *colna
|
||||||
*/
|
*/
|
||||||
static char *
|
static char *
|
||||||
GetAddColumnWithNextvalDefaultCmd(Oid sequenceOid, Oid relationId, char *colname,
|
GetAddColumnWithNextvalDefaultCmd(Oid sequenceOid, Oid relationId, char *colname,
|
||||||
TypeName *typeName)
|
TypeName *typeName, bool ifNotExists)
|
||||||
{
|
{
|
||||||
char *qualifiedSequenceName = generate_qualified_relation_name(sequenceOid);
|
char *qualifiedSequenceName = generate_qualified_relation_name(sequenceOid);
|
||||||
char *qualifiedRelationName = generate_qualified_relation_name(relationId);
|
char *qualifiedRelationName = generate_qualified_relation_name(relationId);
|
||||||
|
@ -2940,8 +2943,9 @@ GetAddColumnWithNextvalDefaultCmd(Oid sequenceOid, Oid relationId, char *colname
|
||||||
StringInfoData str = { 0 };
|
StringInfoData str = { 0 };
|
||||||
initStringInfo(&str);
|
initStringInfo(&str);
|
||||||
appendStringInfo(&str,
|
appendStringInfo(&str,
|
||||||
"ALTER TABLE %s ADD COLUMN %s %s "
|
"ALTER TABLE %s ADD COLUMN %s %s %s "
|
||||||
"DEFAULT %s(%s::regclass)", qualifiedRelationName, colname,
|
"DEFAULT %s(%s::regclass)", qualifiedRelationName,
|
||||||
|
ifNotExists ? "IF NOT EXISTS" : "", colname,
|
||||||
format_type_extended(typeOid, typmod, formatFlags),
|
format_type_extended(typeOid, typmod, formatFlags),
|
||||||
quote_qualified_identifier("pg_catalog", nextvalFunctionName),
|
quote_qualified_identifier("pg_catalog", nextvalFunctionName),
|
||||||
quote_literal_cstr(qualifiedSequenceName));
|
quote_literal_cstr(qualifiedSequenceName));
|
||||||
|
|
|
@ -475,6 +475,11 @@ AppendAlterTableCmdAddColumn(StringInfo buf, AlterTableCmd *alterTableCmd)
|
||||||
|
|
||||||
appendStringInfoString(buf, " ADD COLUMN ");
|
appendStringInfoString(buf, " ADD COLUMN ");
|
||||||
|
|
||||||
|
if (alterTableCmd->missing_ok)
|
||||||
|
{
|
||||||
|
appendStringInfoString(buf, "IF NOT EXISTS ");
|
||||||
|
}
|
||||||
|
|
||||||
ColumnDef *columnDefinition = (ColumnDef *) alterTableCmd->def;
|
ColumnDef *columnDefinition = (ColumnDef *) alterTableCmd->def;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -143,6 +143,8 @@ SELECT create_distributed_table('seq_test_4','x');
|
||||||
|
|
||||||
CREATE SEQUENCE seq_4;
|
CREATE SEQUENCE seq_4;
|
||||||
ALTER TABLE seq_test_4 ADD COLUMN a bigint DEFAULT nextval('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;
|
DROP SEQUENCE seq_4 CASCADE;
|
||||||
NOTICE: drop cascades to default value for column a of table seq_test_4
|
NOTICE: drop cascades to default value for column a of table seq_test_4
|
||||||
TRUNCATE 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
|
-- Show that existing sequence has been renamed and a new sequence with the same name
|
||||||
-- created for another type
|
-- created for another type
|
||||||
\c - - - :worker_1_port
|
\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
|
seqrelid | seqtypid | seqmax | seqmin
|
||||||
---------------------------------------------------------------------
|
---------------------------------------------------------------------
|
||||||
"sequence_rollback(citus_backup_0)" | integer | 2147483647 | 1
|
"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');
|
SELECT create_distributed_table('seq_test_4','x');
|
||||||
CREATE SEQUENCE seq_4;
|
CREATE SEQUENCE seq_4;
|
||||||
ALTER TABLE seq_test_4 ADD COLUMN a bigint DEFAULT nextval('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;
|
DROP SEQUENCE seq_4 CASCADE;
|
||||||
TRUNCATE seq_test_4;
|
TRUNCATE seq_test_4;
|
||||||
CREATE SEQUENCE seq_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
|
-- Show that existing sequence has been renamed and a new sequence with the same name
|
||||||
-- created for another type
|
-- created for another type
|
||||||
\c - - - :worker_1_port
|
\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
|
\c - - - :master_port
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue