Some refactor as a preparation

pull/4489/head
Onur Tirtir 2021-01-11 04:32:52 +03:00
parent a4f377282e
commit 00da1eed20
3 changed files with 32 additions and 18 deletions

View File

@ -12,6 +12,11 @@
#include "postgres.h" #include "postgres.h"
#include "distributed/pg_version_constants.h"
#if (PG_VERSION_NUM < PG_VERSION_12)
#include "access/htup_details.h"
#endif
#include "access/xact.h" #include "access/xact.h"
#include "catalog/pg_constraint.h" #include "catalog/pg_constraint.h"
#include "distributed/commands/utility_hook.h" #include "distributed/commands/utility_hook.h"
@ -25,6 +30,7 @@
#include "distributed/worker_protocol.h" #include "distributed/worker_protocol.h"
#include "utils/builtins.h" #include "utils/builtins.h"
#include "utils/lsyscache.h" #include "utils/lsyscache.h"
#include "utils/syscache.h"
static void EnsureSequentialModeForCitusTableCascadeFunction(List *relationIdList); static void EnsureSequentialModeForCitusTableCascadeFunction(List *relationIdList);
@ -32,10 +38,9 @@ static bool RelationIdListHasReferenceTable(List *relationIdList);
static void LockRelationsWithLockMode(List *relationIdList, LOCKMODE lockMode); static void LockRelationsWithLockMode(List *relationIdList, LOCKMODE lockMode);
static List * RemovePartitionRelationIds(List *relationIdList); static List * RemovePartitionRelationIds(List *relationIdList);
static List * GetFKeyCreationCommandsForRelationIdList(List *relationIdList); static List * GetFKeyCreationCommandsForRelationIdList(List *relationIdList);
static void DropRelationIdListForeignKeys(List *relationIdList); static void DropRelationIdListForeignKeys(List *relationIdList, int fKeyFlags);
static void DropRelationForeignKeys(Oid relationId); static List * GetRelationDropFkeyCommands(Oid relationId, int fKeyFlags);
static List * GetRelationDropFkeyCommands(Oid relationId); static char * GetDropFkeyCascadeCommand(Oid foreignKeyId);
static char * GetDropFkeyCascadeCommand(Oid relationId, Oid foreignKeyId);
static void ExecuteCascadeOperationForRelationIdList(List *relationIdList, static void ExecuteCascadeOperationForRelationIdList(List *relationIdList,
CascadeOperationType CascadeOperationType
cascadeOperationType); cascadeOperationType);
@ -95,7 +100,8 @@ CascadeOperationForConnectedRelations(Oid relationId, LOCKMODE lockMode,
* This is because referenced foreign keys are already captured as other * This is because referenced foreign keys are already captured as other
* relations' referencing foreign keys. * relations' referencing foreign keys.
*/ */
DropRelationIdListForeignKeys(nonPartitionRelationIdList); int fKeyFlags = INCLUDE_REFERENCING_CONSTRAINTS | INCLUDE_ALL_TABLE_TYPES;
DropRelationIdListForeignKeys(nonPartitionRelationIdList, fKeyFlags);
ExecuteCascadeOperationForRelationIdList(nonPartitionRelationIdList, ExecuteCascadeOperationForRelationIdList(nonPartitionRelationIdList,
cascadeOperationType); cascadeOperationType);
@ -257,12 +263,12 @@ GetFKeyCreationCommandsForRelationIdList(List *relationIdList)
* relation id list. * relation id list.
*/ */
static void static void
DropRelationIdListForeignKeys(List *relationIdList) DropRelationIdListForeignKeys(List *relationIdList, int fKeyFlags)
{ {
Oid relationId = InvalidOid; Oid relationId = InvalidOid;
foreach_oid(relationId, relationIdList) foreach_oid(relationId, relationIdList)
{ {
DropRelationForeignKeys(relationId); DropRelationForeignKeys(relationId, fKeyFlags);
} }
} }
@ -271,10 +277,10 @@ DropRelationIdListForeignKeys(List *relationIdList)
* DropRelationForeignKeys drops foreign keys where the relation with * DropRelationForeignKeys drops foreign keys where the relation with
* relationId is the referencing relation. * relationId is the referencing relation.
*/ */
static void void
DropRelationForeignKeys(Oid relationId) DropRelationForeignKeys(Oid relationId, int fKeyFlags)
{ {
List *dropFkeyCascadeCommandList = GetRelationDropFkeyCommands(relationId); List *dropFkeyCascadeCommandList = GetRelationDropFkeyCommands(relationId, fKeyFlags);
ExecuteAndLogDDLCommandList(dropFkeyCascadeCommandList); ExecuteAndLogDDLCommandList(dropFkeyCascadeCommandList);
} }
@ -284,18 +290,16 @@ DropRelationForeignKeys(Oid relationId)
* keys where the relation with relationId is the referencing relation. * keys where the relation with relationId is the referencing relation.
*/ */
static List * static List *
GetRelationDropFkeyCommands(Oid relationId) GetRelationDropFkeyCommands(Oid relationId, int fKeyFlags)
{ {
List *dropFkeyCascadeCommandList = NIL; List *dropFkeyCascadeCommandList = NIL;
int flag = INCLUDE_REFERENCING_CONSTRAINTS | INCLUDE_ALL_TABLE_TYPES; List *relationFKeyIdList = GetForeignKeyOids(relationId, fKeyFlags);
List *relationFKeyIdList = GetForeignKeyOids(relationId, flag);
Oid foreignKeyId; Oid foreignKeyId;
foreach_oid(foreignKeyId, relationFKeyIdList) foreach_oid(foreignKeyId, relationFKeyIdList)
{ {
char *dropFkeyCascadeCommand = GetDropFkeyCascadeCommand(relationId, char *dropFkeyCascadeCommand = GetDropFkeyCascadeCommand(foreignKeyId);
foreignKeyId);
dropFkeyCascadeCommandList = lappend(dropFkeyCascadeCommandList, dropFkeyCascadeCommandList = lappend(dropFkeyCascadeCommandList,
dropFkeyCascadeCommand); dropFkeyCascadeCommand);
} }
@ -309,10 +313,19 @@ GetRelationDropFkeyCommands(Oid relationId)
* foreignKeyId. * foreignKeyId.
*/ */
static char * static char *
GetDropFkeyCascadeCommand(Oid relationId, Oid foreignKeyId) GetDropFkeyCascadeCommand(Oid foreignKeyId)
{ {
/*
* As we need to execute ALTER TABLE DROP CONSTRAINT command on
* referencing relation, resolve it here.
*/
HeapTuple heapTuple = SearchSysCache1(CONSTROID, ObjectIdGetDatum(foreignKeyId));
Form_pg_constraint constraintForm = (Form_pg_constraint) GETSTRUCT(heapTuple);
Oid relationId = constraintForm->conrelid;
char *qualifiedRelationName = generate_qualified_relation_name(relationId); char *qualifiedRelationName = generate_qualified_relation_name(relationId);
ReleaseSysCache(heapTuple);
char *constraintName = get_constraint_name(foreignKeyId); char *constraintName = get_constraint_name(foreignKeyId);
const char *quotedConstraintName = quote_identifier(constraintName); const char *quotedConstraintName = quote_identifier(constraintName);

View File

@ -77,7 +77,6 @@ static void ForeignConstraintFindDistKeys(HeapTuple pgConstraintTuple,
int *referencedAttrIndex); int *referencedAttrIndex);
static List * GetForeignKeyIdsForColumn(char *columnName, Oid relationId, static List * GetForeignKeyIdsForColumn(char *columnName, Oid relationId,
int searchForeignKeyColumnFlags); int searchForeignKeyColumnFlags);
static List * GetForeignConstraintCommandsInternal(Oid relationId, int flags);
static Oid get_relation_constraint_oid_compat(HeapTuple heapTuple); static Oid get_relation_constraint_oid_compat(HeapTuple heapTuple);
static bool IsTableTypeIncluded(Oid relationId, int flags); static bool IsTableTypeIncluded(Oid relationId, int flags);
static void UpdateConstraintIsValid(Oid constraintId, bool isValid); static void UpdateConstraintIsValid(Oid constraintId, bool isValid);
@ -663,7 +662,7 @@ GetForeignConstraintFromDistributedTablesCommands(Oid relationId)
* DDL commands to recreate the foreign key constraints returned by * DDL commands to recreate the foreign key constraints returned by
* GetForeignKeyOids. See more details at the underlying function. * GetForeignKeyOids. See more details at the underlying function.
*/ */
static List * List *
GetForeignConstraintCommandsInternal(Oid relationId, int flags) GetForeignConstraintCommandsInternal(Oid relationId, int flags)
{ {
List *foreignKeyOids = GetForeignKeyOids(relationId, flags); List *foreignKeyOids = GetForeignKeyOids(relationId, flags);

View File

@ -166,6 +166,7 @@ extern List * GetReferencingForeignConstaintCommands(Oid relationOid);
extern List * GetForeignConstraintToReferenceTablesCommands(Oid relationId); extern List * GetForeignConstraintToReferenceTablesCommands(Oid relationId);
extern List * GetForeignConstraintToDistributedTablesCommands(Oid relationId); extern List * GetForeignConstraintToDistributedTablesCommands(Oid relationId);
extern List * GetForeignConstraintFromDistributedTablesCommands(Oid relationId); extern List * GetForeignConstraintFromDistributedTablesCommands(Oid relationId);
extern List * GetForeignConstraintCommandsInternal(Oid relationId, int flags);
extern bool HasForeignKeyToCitusLocalTable(Oid relationId); extern bool HasForeignKeyToCitusLocalTable(Oid relationId);
extern bool HasForeignKeyToReferenceTable(Oid relationOid); extern bool HasForeignKeyToReferenceTable(Oid relationOid);
extern bool TableReferenced(Oid relationOid); extern bool TableReferenced(Oid relationOid);
@ -412,6 +413,7 @@ extern void CascadeOperationForConnectedRelations(Oid relationId, LOCKMODE relLo
CascadeOperationType CascadeOperationType
cascadeOperationType); cascadeOperationType);
extern void ErrorIfAnyPartitionRelationInvolvedInNonInheritedFKey(List *relationIdList); extern void ErrorIfAnyPartitionRelationInvolvedInNonInheritedFKey(List *relationIdList);
extern void DropRelationForeignKeys(Oid relationId, int flags);
extern void ExecuteAndLogDDLCommandList(List *ddlCommandList); extern void ExecuteAndLogDDLCommandList(List *ddlCommandList);
extern void ExecuteAndLogDDLCommand(const char *commandString); extern void ExecuteAndLogDDLCommand(const char *commandString);