Make DeferErrorIfCircularDependencyExists work for each object

pull/6052/head
Ahmet Gedemenli 2022-07-06 16:22:17 +03:00
parent eb3e5ee227
commit 6c693adf0d
2 changed files with 31 additions and 2 deletions

View File

@ -201,14 +201,40 @@ ErrorIfCircularDependencyExists(const ObjectAddress *objectAddress)
/* /*
* DeferErrorIfCircularDependencyExists checks whether given object has * DeferErrorIfCircularDependencyExists is a wrapper function around
* circular dependency with itself via existing objects of pg_dist_object. * DeferErrorIfCircularDependencyExistsOnObject, which calls that function for
* each dependency of the given object.
*/ */
DeferredErrorMessage * DeferredErrorMessage *
DeferErrorIfCircularDependencyExists(const ObjectAddress *objectAddress) DeferErrorIfCircularDependencyExists(const ObjectAddress *objectAddress)
{ {
List *dependencies = GetAllSupportedDependenciesForObject(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; ObjectAddress *dependency = NULL;
foreach_ptr(dependency, dependencies) foreach_ptr(dependency, dependencies)
{ {

View File

@ -262,6 +262,9 @@ extern void EnsureAllObjectDependenciesExistOnAllNodes(const List *targets);
extern DeferredErrorMessage * DeferErrorIfCircularDependencyExists(const extern DeferredErrorMessage * DeferErrorIfCircularDependencyExists(const
ObjectAddress * ObjectAddress *
objectAddress); objectAddress);
extern DeferredErrorMessage * DeferErrorIfCircularDependencyExistsOnObject(const
ObjectAddress *
objectAddress);
extern List * GetDistributableDependenciesForObject(const ObjectAddress *target); extern List * GetDistributableDependenciesForObject(const ObjectAddress *target);
extern List * GetAllDependencyCreateDDLCommands(const List *dependencies); extern List * GetAllDependencyCreateDDLCommands(const List *dependencies);
extern bool ShouldPropagate(void); extern bool ShouldPropagate(void);