Handle DROP FKEY commands in preprocess

pull/4453/head
Onur Tirtir 2020-12-25 10:29:09 +03:00
parent 6af1ece547
commit 0502ca5f39
1 changed files with 42 additions and 7 deletions

View File

@ -56,7 +56,9 @@ static List * GetAlterTableCommandFKeyConstraintList(AlterTableCmd *command);
static bool AlterTableCommandTypeIsTrigger(AlterTableType alterTableType); static bool AlterTableCommandTypeIsTrigger(AlterTableType alterTableType);
static bool AlterTableHasCommandByFunc(AlterTableStmt *alterTableStatement, static bool AlterTableHasCommandByFunc(AlterTableStmt *alterTableStatement,
AlterTableCommandFunc alterTableCommandFunc); AlterTableCommandFunc alterTableCommandFunc);
static bool AlterTableCmdAddsOrDropsFkey(AlterTableCmd *command, Oid relationId);
static bool AlterTableCmdAddsFKey(AlterTableCmd *command, Oid relationId); static bool AlterTableCmdAddsFKey(AlterTableCmd *command, Oid relationId);
static bool AlterTableCmdDropsFkey(AlterTableCmd *command, Oid relationId);
static void ErrorIfUnsupportedAlterTableStmt(AlterTableStmt *alterTableStatement); static void ErrorIfUnsupportedAlterTableStmt(AlterTableStmt *alterTableStatement);
static void ErrorIfCitusLocalTablePartitionCommand(AlterTableCmd *alterTableCmd, static void ErrorIfCitusLocalTablePartitionCommand(AlterTableCmd *alterTableCmd,
Oid parentRelationId); Oid parentRelationId);
@ -404,7 +406,7 @@ PreprocessAlterTableStmt(Node *node, const char *alterTableCommand)
*/ */
ErrorIfAlterTableDefinesFKeyFromPostgresToCitusLocalTable(alterTableStatement); ErrorIfAlterTableDefinesFKeyFromPostgresToCitusLocalTable(alterTableStatement);
if (AlterTableHasCommandByFunc(alterTableStatement, AlterTableCmdAddsFKey)) if (AlterTableHasCommandByFunc(alterTableStatement, AlterTableCmdAddsOrDropsFkey))
{ {
MarkInvalidateForeignKeyGraph(); MarkInvalidateForeignKeyGraph();
} }
@ -1018,7 +1020,20 @@ AlterTableHasCommandByFunc(AlterTableStmt *alterTableStatement,
/* /*
* AlterTableCmdAddsFKey * AlterTableCmdAddsOrDropsFkey returns true if given alter table subcommand
* might add or drop a foreign key constraint.
*/
static bool
AlterTableCmdAddsOrDropsFkey(AlterTableCmd *command, Oid relationId)
{
return AlterTableCmdAddsFKey(command, relationId) ||
AlterTableCmdDropsFkey(command, relationId);
}
/*
* AlterTableCmdAddsFKey returns true if given alter table subcommand might
* define a foreign key.
*/ */
static bool static bool
AlterTableCmdAddsFKey(AlterTableCmd *command, Oid relationId) AlterTableCmdAddsFKey(AlterTableCmd *command, Oid relationId)
@ -1051,6 +1066,31 @@ AlterTableCmdAddsFKey(AlterTableCmd *command, Oid relationId)
} }
/*
* AlterTableCmdDropsFkey returns true if given alter table subcommand might drop:
* - a foreign key or,
* - a uniqueness constraint that a foreign key depends on or,
* - a referencing column of a foreign key or,
* - a referenced column of a foreign key.
*/
static bool
AlterTableCmdDropsFkey(AlterTableCmd *command, Oid relationId)
{
AlterTableType alterTableType = command->subtype;
if (alterTableType == AT_DropConstraint)
{
char *constraintName = command->name;
if (ConstraintIsAForeignKey(constraintName, relationId))
{
return true;
}
}
return false;
}
void void
ErrorUnsupportedAlterTableAddColumn(Oid relationId, AlterTableCmd *command, ErrorUnsupportedAlterTableAddColumn(Oid relationId, AlterTableCmd *command,
Constraint *constraint) Constraint *constraint)
@ -1420,11 +1460,6 @@ ErrorIfUnsupportedAlterTableStmt(AlterTableStmt *alterTableStatement)
return; return;
} }
if (ConstraintIsAForeignKey(command->name, relationId))
{
MarkInvalidateForeignKeyGraph();
}
break; break;
} }