From 6c693adf0d3de3efd22b1f229a7af585a4af3e33 Mon Sep 17 00:00:00 2001 From: Ahmet Gedemenli Date: Wed, 6 Jul 2022 16:22:17 +0300 Subject: [PATCH] Make DeferErrorIfCircularDependencyExists work for each object --- .../distributed/commands/dependencies.c | 30 +++++++++++++++++-- src/include/distributed/metadata_utility.h | 3 ++ 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/src/backend/distributed/commands/dependencies.c b/src/backend/distributed/commands/dependencies.c index 6329cf6f4..ac50557d5 100644 --- a/src/backend/distributed/commands/dependencies.c +++ b/src/backend/distributed/commands/dependencies.c @@ -201,14 +201,40 @@ ErrorIfCircularDependencyExists(const ObjectAddress *objectAddress) /* - * DeferErrorIfCircularDependencyExists checks whether given object has - * circular dependency with itself via existing objects of pg_dist_object. + * DeferErrorIfCircularDependencyExists is a wrapper function around + * DeferErrorIfCircularDependencyExistsOnObject, which calls that function for + * each dependency of the given object. */ DeferredErrorMessage * DeferErrorIfCircularDependencyExists(const ObjectAddress *objectAddress) { List *dependencies = GetAllSupportedDependenciesForObject(objectAddress); + ObjectAddress *dependency = NULL; + foreach_ptr(dependency, dependencies) + { + DeferredErrorMessage *deferredError = + DeferErrorIfCircularDependencyExistsOnObject(dependency); + + if (deferredError != NULL) + { + return deferredError; + } + } + + return NULL; +} + + +/* + * DeferErrorIfCircularDependencyExistsOnObject checks whether given object has + * circular dependency with itself via existing objects of pg_dist_object. + */ +DeferredErrorMessage * +DeferErrorIfCircularDependencyExistsOnObject(const ObjectAddress *objectAddress) +{ + List *dependencies = GetAllSupportedDependenciesForObject(objectAddress); + ObjectAddress *dependency = NULL; foreach_ptr(dependency, dependencies) { diff --git a/src/include/distributed/metadata_utility.h b/src/include/distributed/metadata_utility.h index bad361ae6..45ea81bdb 100644 --- a/src/include/distributed/metadata_utility.h +++ b/src/include/distributed/metadata_utility.h @@ -262,6 +262,9 @@ extern void EnsureAllObjectDependenciesExistOnAllNodes(const List *targets); extern DeferredErrorMessage * DeferErrorIfCircularDependencyExists(const ObjectAddress * objectAddress); +extern DeferredErrorMessage * DeferErrorIfCircularDependencyExistsOnObject(const + ObjectAddress * + objectAddress); extern List * GetDistributableDependenciesForObject(const ObjectAddress *target); extern List * GetAllDependencyCreateDDLCommands(const List *dependencies); extern bool ShouldPropagate(void);