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);