diff --git a/src/backend/distributed/commands/citus_add_local_table_to_metadata.c b/src/backend/distributed/commands/citus_add_local_table_to_metadata.c index 5788f2eea..785501dc3 100644 --- a/src/backend/distributed/commands/citus_add_local_table_to_metadata.c +++ b/src/backend/distributed/commands/citus_add_local_table_to_metadata.c @@ -55,7 +55,6 @@ static void ErrorIfUnsupportedCitusLocalColumnDefinition(Relation relation); static void NoticeIfAutoConvertingLocalTables(bool autoConverted); static void NoticeRelationIsAlreadyAddedToMetadata(Oid relationId); static CascadeOperationType GetCascadeTypeForCitusLocalTables(bool autoConverted); -static void UpdateAutoConvertedForConnectedRelations(Oid relationId, bool autoConverted); static List * GetShellTableDDLEventsForCitusLocalTable(Oid relationId); static uint64 ConvertLocalTableToShard(Oid relationId); static void RenameRelationToShardRelation(Oid shellRelationId, uint64 shardId); @@ -211,7 +210,8 @@ CreateCitusLocalTable(Oid relationId, bool cascadeViaForeignKeys, bool autoConve * already added to metadata, we should mark this one and connected relations * as auto-converted = false. */ - UpdateAutoConvertedForConnectedRelations(relationId, autoConverted); + UpdateAutoConvertedForConnectedRelations(list_make1_oid(relationId), + autoConverted); NoticeRelationIsAlreadyAddedToMetadata(relationId); @@ -621,19 +621,26 @@ GetCascadeTypeForCitusLocalTables(bool autoConverted) /* * UpdateAutoConvertedForConnectedRelations updates the autoConverted field on - * pg_dist_partition for the foreign key connected relations of the given relation. + * pg_dist_partition for the foreign key connected relations of the given relations. * Sets it to given autoConverted value for all of the connected relations. * We don't need to update partition relations separately, since the foreign key * graph already includes them, as they have the same (inherited) fkeys as their parents. */ -static void -UpdateAutoConvertedForConnectedRelations(Oid relationId, bool autoConverted) +void +UpdateAutoConvertedForConnectedRelations(List *relationIds, bool autoConverted) { InvalidateForeignKeyGraph(); - List *relationIdList = GetForeignKeyConnectedRelationIdList(relationId); + + List *relationIdList = NIL; + Oid relid = InvalidOid; + foreach_oid(relid, relationIds) + { + List *connectedRelations = GetForeignKeyConnectedRelationIdList(relid); + relationIdList = list_concat_unique_oid(relationIdList, connectedRelations); + } + relationIdList = SortList(relationIdList, CompareOids); - Oid relid = InvalidOid; foreach_oid(relid, relationIdList) { UpdatePgDistPartitionAutoConverted(relid, false); diff --git a/src/backend/distributed/commands/table.c b/src/backend/distributed/commands/table.c index 235cfe07f..17a816e08 100644 --- a/src/backend/distributed/commands/table.c +++ b/src/backend/distributed/commands/table.c @@ -72,8 +72,6 @@ static bool AlterTableDefinesFKeyBetweenPostgresAndNonDistTable( AlterTableStmt *alterTableStatement); static bool ShouldMarkConnectedRelationsNotAutoConverted(Oid leftRelationId, Oid rightRelationId); -static void MarkConnectedRelationsNotAutoConverted(Oid leftRelationId, - Oid rightRelationId); static bool RelationIdListContainsCitusTableType(List *relationIdList, CitusTableType citusTableType); static bool RelationIdListContainsPostgresTable(List *relationIdList); @@ -871,8 +869,8 @@ PreprocessAlterTableStmt(Node *node, const char *alterTableCommand, if (ShouldMarkConnectedRelationsNotAutoConverted(leftRelationId, rightRelationId)) { - MarkConnectedRelationsNotAutoConverted(leftRelationId, - rightRelationId); + List *relationList = list_make2_oid(leftRelationId, rightRelationId); + UpdateAutoConvertedForConnectedRelations(relationList, false); } /* @@ -1212,28 +1210,6 @@ ShouldMarkConnectedRelationsNotAutoConverted(Oid leftRelationId, Oid rightRelati } -/* - * MarkConnectedRelationsNotAutoConverted takes two relations. - * Marks both of them as not-auto-converted, as well as other connected relations. - */ -static void -MarkConnectedRelationsNotAutoConverted(Oid leftRelationId, Oid rightRelationId) -{ - InvalidateForeignKeyGraph(); - List *leftConnectedRelIds = GetForeignKeyConnectedRelationIdList(leftRelationId); - List *rightConnectedRelIds = GetForeignKeyConnectedRelationIdList(rightRelationId); - List *allConnectedRelations = list_concat_unique_oid(leftConnectedRelIds, - rightConnectedRelIds); - allConnectedRelations = SortList(allConnectedRelations, CompareOids); - - Oid relationId = InvalidOid; - foreach_oid(relationId, allConnectedRelations) - { - UpdatePgDistPartitionAutoConverted(relationId, false); - } -} - - /* * RelationIdListContainsCitusTableType returns true if given relationIdList * contains a citus table with given type. diff --git a/src/include/distributed/commands.h b/src/include/distributed/commands.h index 71b0f55f5..9c0c86c5b 100644 --- a/src/include/distributed/commands.h +++ b/src/include/distributed/commands.h @@ -545,5 +545,7 @@ extern void PostprocessVariableSetStmt(VariableSetStmt *setStmt, const char *set extern void CreateCitusLocalTablePartitionOf(CreateStmt *createStatement, Oid relationId, Oid parentRelationId); +extern void UpdateAutoConvertedForConnectedRelations(List *relationId, bool + autoConverted); #endif /*CITUS_COMMANDS_H */