Exclude partitions when doing undistribute_table

support-partitioning-for-citus-local-tables
Ahmet Gedemenli 2021-08-23 17:57:05 +03:00
parent 844b3ea4df
commit b3b75fecbc
1 changed files with 36 additions and 0 deletions

View File

@ -32,6 +32,7 @@
#include "utils/syscache.h"
static List * RemovePartitionRelationIds(List *relationIdList);
static void EnsureSequentialModeForCitusTableCascadeFunction(List *relationIdList);
static void LockRelationsWithLockMode(List *relationIdList, LOCKMODE lockMode);
static List * GetFKeyCreationCommandsForRelationIdList(List *relationIdList);
@ -73,6 +74,17 @@ CascadeOperationForConnectedRelations(Oid relationId, LOCKMODE lockMode,
LockRelationsWithLockMode(fKeyConnectedRelationIdList, lockMode);
/*
* We shouldn't cascade through foreign keys on partition tables, unless the
* operation is creating Citus Local Tables, as citus
* table functions already have their own logics to handle partition relations.
*/
if (cascadeOperationType != CASCADE_FKEY_ADD_LOCAL_TABLE_TO_METADATA)
{
fKeyConnectedRelationIdList =
RemovePartitionRelationIds(fKeyConnectedRelationIdList);
}
/*
* Our foreign key subgraph can have distributed tables which might already
* be modified in current transaction. So switch to sequential execution
@ -150,6 +162,30 @@ ErrorIfAnyPartitionRelationInvolvedInNonInheritedFKey(List *relationIdList)
}
/*
* RemovePartitionRelationIds returns a list of relation id's by removing
* partition relation id's from given relationIdList.
*/
static List *
RemovePartitionRelationIds(List *relationIdList)
{
List *nonPartitionRelationIdList = NIL;
Oid relationId = InvalidOid;
foreach_oid(relationId, relationIdList)
{
if (PartitionTable(relationId))
{
continue;
}
nonPartitionRelationIdList = lappend_oid(nonPartitionRelationIdList, relationId);
}
return nonPartitionRelationIdList;
}
/*
* EnsureSequentialModeForCitusTableCascadeFunction switches to sequential
* execution mode if needed. If it's not possible, then errors out.