summaryrefslogtreecommitdiff
path: root/src/backend/catalog/pg_aggregate.c
diff options
context:
space:
mode:
authorMichael Paquier <michael@paquier.xyz>2020-09-05 21:33:53 +0900
committerMichael Paquier <michael@paquier.xyz>2020-09-05 21:33:53 +0900
commit8febfd1855450f50f17419def41c2ea9bcf994d5 (patch)
tree50b6bf4ceca0742ae4be713d842e27d83df5f98e /src/backend/catalog/pg_aggregate.c
parent11b80d900fe4297e8e4bc231f6a41b53d604ed9e (diff)
downloadpostgresql-8febfd1855450f50f17419def41c2ea9bcf994d5.tar.gz
Switch to multi-inserts when registering dependencies for many code paths
This commit improves the dependency registrations by taking advantage of the preliminary work done in 63110c62, to group together the insertion of dependencies of the same type to pg_depend. With the current layer of routines available, and as only dependencies of the same type can be grouped, there are code paths still doing more than one multi-insert when it is necessary to register dependencies of multiple types (constraint and index creation are two cases doing that). While on it, this refactors some of the code to use ObjectAddressSet() when manipulating object addresses. Author: Daniel Gustafsson, Michael Paquier Reviewed-by: Andres Freund, Álvaro Herrera Discussion: https://postgr.es/m/20200807061619.GA23955@paquier.xyz
Diffstat (limited to 'src/backend/catalog/pg_aggregate.c')
-rw-r--r--src/backend/catalog/pg_aggregate.c23
1 files changed, 14 insertions, 9 deletions
diff --git a/src/backend/catalog/pg_aggregate.c b/src/backend/catalog/pg_aggregate.c
index 89007ad1ed..a0554f0d79 100644
--- a/src/backend/catalog/pg_aggregate.c
+++ b/src/backend/catalog/pg_aggregate.c
@@ -105,6 +105,7 @@ AggregateCreate(const char *aggName,
int i;
ObjectAddress myself,
referenced;
+ ObjectAddresses *addrs;
AclResult aclresult;
/* sanity checks (caller should have caught these) */
@@ -741,66 +742,70 @@ AggregateCreate(const char *aggName,
* way.
*/
+ addrs = new_object_addresses();
+
/* Depends on transition function */
ObjectAddressSet(referenced, ProcedureRelationId, transfn);
- recordDependencyOn(&myself, &referenced, DEPENDENCY_NORMAL);
+ add_exact_object_address(&referenced, addrs);
/* Depends on final function, if any */
if (OidIsValid(finalfn))
{
ObjectAddressSet(referenced, ProcedureRelationId, finalfn);
- recordDependencyOn(&myself, &referenced, DEPENDENCY_NORMAL);
+ add_exact_object_address(&referenced, addrs);
}
/* Depends on combine function, if any */
if (OidIsValid(combinefn))
{
ObjectAddressSet(referenced, ProcedureRelationId, combinefn);
- recordDependencyOn(&myself, &referenced, DEPENDENCY_NORMAL);
+ add_exact_object_address(&referenced, addrs);
}
/* Depends on serialization function, if any */
if (OidIsValid(serialfn))
{
ObjectAddressSet(referenced, ProcedureRelationId, serialfn);
- recordDependencyOn(&myself, &referenced, DEPENDENCY_NORMAL);
+ add_exact_object_address(&referenced, addrs);
}
/* Depends on deserialization function, if any */
if (OidIsValid(deserialfn))
{
ObjectAddressSet(referenced, ProcedureRelationId, deserialfn);
- recordDependencyOn(&myself, &referenced, DEPENDENCY_NORMAL);
+ add_exact_object_address(&referenced, addrs);
}
/* Depends on forward transition function, if any */
if (OidIsValid(mtransfn))
{
ObjectAddressSet(referenced, ProcedureRelationId, mtransfn);
- recordDependencyOn(&myself, &referenced, DEPENDENCY_NORMAL);
+ add_exact_object_address(&referenced, addrs);
}
/* Depends on inverse transition function, if any */
if (OidIsValid(minvtransfn))
{
ObjectAddressSet(referenced, ProcedureRelationId, minvtransfn);
- recordDependencyOn(&myself, &referenced, DEPENDENCY_NORMAL);
+ add_exact_object_address(&referenced, addrs);
}
/* Depends on final function, if any */
if (OidIsValid(mfinalfn))
{
ObjectAddressSet(referenced, ProcedureRelationId, mfinalfn);
- recordDependencyOn(&myself, &referenced, DEPENDENCY_NORMAL);
+ add_exact_object_address(&referenced, addrs);
}
/* Depends on sort operator, if any */
if (OidIsValid(sortop))
{
ObjectAddressSet(referenced, OperatorRelationId, sortop);
- recordDependencyOn(&myself, &referenced, DEPENDENCY_NORMAL);
+ add_exact_object_address(&referenced, addrs);
}
+ record_object_address_dependencies(&myself, addrs, DEPENDENCY_NORMAL);
+ free_object_addresses(addrs);
return myself;
}