mirror of https://github.com/citusdata/citus.git
Some refactor as a preparation
parent
a4f377282e
commit
00da1eed20
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue