diff --git a/src/backend/distributed/metadata/dependency.c b/src/backend/distributed/metadata/dependency.c index ec8197bf7..a1b3b4f52 100644 --- a/src/backend/distributed/metadata/dependency.c +++ b/src/backend/distributed/metadata/dependency.c @@ -122,9 +122,10 @@ typedef struct ViewDependencyNode static List * GetRelationSequenceDependencyList(Oid relationId); -static List * GetRelationTriggerFunctionDepencyList(Oid relationId); +static List * GetRelationTriggerFunctionDependencyList(Oid relationId); static List * GetRelationStatsSchemaDependencyList(Oid relationId); static DependencyDefinition * CreateObjectAddressDependencyDef(Oid classId, Oid objectId); +static List * CreateObjectAddressDependencyDefList(Oid classId, List *objectIdList); static ObjectAddress DependencyDefinitionObjectAddress(DependencyDefinition *definition); /* forward declarations for functions to interact with the ObjectAddressCollector */ @@ -982,7 +983,7 @@ ExpandCitusSupportedTypes(ObjectAddressCollector *collector, ObjectAddress targe */ Oid relationId = target.objectId; List *triggerFunctionDepencyList = - GetRelationTriggerFunctionDepencyList(relationId); + GetRelationTriggerFunctionDependencyList(relationId); result = list_concat(result, triggerFunctionDepencyList); /* @@ -1049,27 +1050,18 @@ GetRelationSequenceDependencyList(Oid relationId) static List * GetRelationStatsSchemaDependencyList(Oid relationId) { - List *dependencyList = NIL; - List *schemaIds = GetExplicitStatisticsSchemaIdList(relationId); - Oid schemaId = InvalidOid; - foreach_oid(schemaId, schemaIds) - { - DependencyDefinition *dependency = - CreateObjectAddressDependencyDef(NamespaceRelationId, schemaId); - dependencyList = lappend(dependencyList, dependency); - } - return dependencyList; + return CreateObjectAddressDependencyDefList(NamespaceRelationId, schemaIds); } /* - * GetRelationTriggerFunctionDepencyList returns a list of DependencyDefinition + * GetRelationTriggerFunctionDependencyList returns a list of DependencyDefinition * objects for the functions that triggers of the relation with relationId depends. */ static List * -GetRelationTriggerFunctionDepencyList(Oid relationId) +GetRelationTriggerFunctionDependencyList(Oid relationId) { List *dependencyList = NIL; @@ -1102,6 +1094,27 @@ CreateObjectAddressDependencyDef(Oid classId, Oid objectId) } +/* + * CreateObjectAddressDependencyDefList is a wrapper function for + * CreateObjectAddressDependencyDef to operate on a list of relation oids, + * instead of a single oid. + */ +static List * +CreateObjectAddressDependencyDefList(Oid classId, List *objectIdList) +{ + List *dependencyList = NIL; + Oid objectId = InvalidOid; + foreach_oid(objectId, objectIdList) + { + DependencyDefinition *dependency = + CreateObjectAddressDependencyDef(classId, objectId); + dependencyList = lappend(dependencyList, dependency); + } + + return dependencyList; +} + + /* * DependencyDefinitionObjectAddress returns the object address of the dependency defined * by the dependency definition, irregardless what the source of the definition is diff --git a/src/test/regress/expected/columnar_create.out b/src/test/regress/expected/columnar_create.out index 704c0d932..9cb025336 100644 --- a/src/test/regress/expected/columnar_create.out +++ b/src/test/regress/expected/columnar_create.out @@ -76,7 +76,16 @@ CREATE TEMPORARY TABLE columnar_temp(i int) USING columnar; INSERT INTO columnar_temp SELECT i FROM generate_series(1,5) i; SELECT columnar_test_helpers.columnar_relation_storageid(oid) AS columnar_temp_storage_id FROM pg_class WHERE relname='columnar_temp' \gset +SELECT pg_backend_pid() AS val INTO old_backend_pid; \c - - - :master_port +-- wait until old backend to expire to make sure that temp table cleanup is complete +SELECT columnar_test_helpers.pg_waitpid(val) FROM old_backend_pid; + pg_waitpid +--------------------------------------------------------------------- + +(1 row) + +DROP TABLE old_backend_pid; -- show that temporary table itself and it's metadata is removed SELECT COUNT(*)=0 FROM pg_class WHERE relname='columnar_temp'; ?column? diff --git a/src/test/regress/expected/columnar_test_helpers.out b/src/test/regress/expected/columnar_test_helpers.out index 8736919ea..f5142a431 100644 --- a/src/test/regress/expected/columnar_test_helpers.out +++ b/src/test/regress/expected/columnar_test_helpers.out @@ -118,3 +118,11 @@ BEGIN END LOOP; RETURN false; END; $$ language plpgsql; +CREATE OR REPLACE FUNCTION pg_waitpid(p_pid integer) +RETURNS VOID AS $$ +BEGIN + WHILE EXISTS (SELECT * FROM pg_stat_activity WHERE pid=p_pid) + LOOP + PERFORM pg_sleep(0.001); + END LOOP; +END; $$ language plpgsql; diff --git a/src/test/regress/sql/columnar_create.sql b/src/test/regress/sql/columnar_create.sql index f83b1c2a8..a5861bb45 100644 --- a/src/test/regress/sql/columnar_create.sql +++ b/src/test/regress/sql/columnar_create.sql @@ -63,8 +63,15 @@ INSERT INTO columnar_temp SELECT i FROM generate_series(1,5) i; SELECT columnar_test_helpers.columnar_relation_storageid(oid) AS columnar_temp_storage_id FROM pg_class WHERE relname='columnar_temp' \gset +SELECT pg_backend_pid() AS val INTO old_backend_pid; + \c - - - :master_port +-- wait until old backend to expire to make sure that temp table cleanup is complete +SELECT columnar_test_helpers.pg_waitpid(val) FROM old_backend_pid; + +DROP TABLE old_backend_pid; + -- show that temporary table itself and it's metadata is removed SELECT COUNT(*)=0 FROM pg_class WHERE relname='columnar_temp'; SELECT columnar_test_helpers.columnar_metadata_has_storage_id(:columnar_temp_storage_id); diff --git a/src/test/regress/sql/columnar_test_helpers.sql b/src/test/regress/sql/columnar_test_helpers.sql index 0340c06f9..f96dcdbf6 100644 --- a/src/test/regress/sql/columnar_test_helpers.sql +++ b/src/test/regress/sql/columnar_test_helpers.sql @@ -128,3 +128,12 @@ BEGIN END LOOP; RETURN false; END; $$ language plpgsql; + +CREATE OR REPLACE FUNCTION pg_waitpid(p_pid integer) +RETURNS VOID AS $$ +BEGIN + WHILE EXISTS (SELECT * FROM pg_stat_activity WHERE pid=p_pid) + LOOP + PERFORM pg_sleep(0.001); + END LOOP; +END; $$ language plpgsql;