aboutsummaryrefslogtreecommitdiff
path: root/src/backend/commands
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/commands
parent11b80d900fe4297e8e4bc231f6a41b53d604ed9e (diff)
downloadpostgresql-8febfd1855450f50f17419def41c2ea9bcf994d5.tar.gz
postgresql-8febfd1855450f50f17419def41c2ea9bcf994d5.zip
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/commands')
-rw-r--r--src/backend/commands/functioncmds.c34
-rw-r--r--src/backend/commands/proclang.c24
-rw-r--r--src/backend/commands/tsearchcmds.c90
3 files changed, 71 insertions, 77 deletions
diff --git a/src/backend/commands/functioncmds.c b/src/backend/commands/functioncmds.c
index 1b5bdcec8b8..e236581a8e0 100644
--- a/src/backend/commands/functioncmds.c
+++ b/src/backend/commands/functioncmds.c
@@ -1696,6 +1696,7 @@ CreateTransform(CreateTransformStmt *stmt)
Relation relation;
ObjectAddress myself,
referenced;
+ ObjectAddresses *addrs;
bool is_replace;
/*
@@ -1836,39 +1837,34 @@ CreateTransform(CreateTransformStmt *stmt)
if (is_replace)
deleteDependencyRecordsFor(TransformRelationId, transformid, true);
+ addrs = new_object_addresses();
+
/* make dependency entries */
- myself.classId = TransformRelationId;
- myself.objectId = transformid;
- myself.objectSubId = 0;
+ ObjectAddressSet(myself, TransformRelationId, transformid);
/* dependency on language */
- referenced.classId = LanguageRelationId;
- referenced.objectId = langid;
- referenced.objectSubId = 0;
- recordDependencyOn(&myself, &referenced, DEPENDENCY_NORMAL);
+ ObjectAddressSet(referenced, LanguageRelationId, langid);
+ add_exact_object_address(&referenced, addrs);
/* dependency on type */
- referenced.classId = TypeRelationId;
- referenced.objectId = typeid;
- referenced.objectSubId = 0;
- recordDependencyOn(&myself, &referenced, DEPENDENCY_NORMAL);
+ ObjectAddressSet(referenced, TypeRelationId, typeid);
+ add_exact_object_address(&referenced, addrs);
/* dependencies on functions */
if (OidIsValid(fromsqlfuncid))
{
- referenced.classId = ProcedureRelationId;
- referenced.objectId = fromsqlfuncid;
- referenced.objectSubId = 0;
- recordDependencyOn(&myself, &referenced, DEPENDENCY_NORMAL);
+ ObjectAddressSet(referenced, ProcedureRelationId, fromsqlfuncid);
+ add_exact_object_address(&referenced, addrs);
}
if (OidIsValid(tosqlfuncid))
{
- referenced.classId = ProcedureRelationId;
- referenced.objectId = tosqlfuncid;
- referenced.objectSubId = 0;
- recordDependencyOn(&myself, &referenced, DEPENDENCY_NORMAL);
+ ObjectAddressSet(referenced, ProcedureRelationId, tosqlfuncid);
+ add_exact_object_address(&referenced, addrs);
}
+ record_object_address_dependencies(&myself, addrs, DEPENDENCY_NORMAL);
+ free_object_addresses(addrs);
+
/* dependency on extension */
recordDependencyOnCurrentExtension(&myself, is_replace);
diff --git a/src/backend/commands/proclang.c b/src/backend/commands/proclang.c
index 14153426bdd..8ef60374f59 100644
--- a/src/backend/commands/proclang.c
+++ b/src/backend/commands/proclang.c
@@ -57,6 +57,7 @@ CreateProceduralLanguage(CreatePLangStmt *stmt)
bool is_update;
ObjectAddress myself,
referenced;
+ ObjectAddresses *addrs;
/*
* Check permission
@@ -186,30 +187,29 @@ CreateProceduralLanguage(CreatePLangStmt *stmt)
/* dependency on extension */
recordDependencyOnCurrentExtension(&myself, is_update);
+ addrs = new_object_addresses();
+
/* dependency on the PL handler function */
- referenced.classId = ProcedureRelationId;
- referenced.objectId = handlerOid;
- referenced.objectSubId = 0;
- recordDependencyOn(&myself, &referenced, DEPENDENCY_NORMAL);
+ ObjectAddressSet(referenced, ProcedureRelationId, handlerOid);
+ add_exact_object_address(&referenced, addrs);
/* dependency on the inline handler function, if any */
if (OidIsValid(inlineOid))
{
- referenced.classId = ProcedureRelationId;
- referenced.objectId = inlineOid;
- referenced.objectSubId = 0;
- recordDependencyOn(&myself, &referenced, DEPENDENCY_NORMAL);
+ ObjectAddressSet(referenced, ProcedureRelationId, inlineOid);
+ add_exact_object_address(&referenced, addrs);
}
/* dependency on the validator function, if any */
if (OidIsValid(valOid))
{
- referenced.classId = ProcedureRelationId;
- referenced.objectId = valOid;
- referenced.objectSubId = 0;
- recordDependencyOn(&myself, &referenced, DEPENDENCY_NORMAL);
+ ObjectAddressSet(referenced, ProcedureRelationId, valOid);
+ add_exact_object_address(&referenced, addrs);
}
+ record_object_address_dependencies(&myself, addrs, DEPENDENCY_NORMAL);
+ free_object_addresses(addrs);
+
/* Post creation hook for new procedural language */
InvokeObjectPostCreateHook(LanguageRelationId, myself.objectId, 0);
diff --git a/src/backend/commands/tsearchcmds.c b/src/backend/commands/tsearchcmds.c
index 319a62012ed..f5d1d137b81 100644
--- a/src/backend/commands/tsearchcmds.c
+++ b/src/backend/commands/tsearchcmds.c
@@ -133,42 +133,41 @@ makeParserDependencies(HeapTuple tuple)
Form_pg_ts_parser prs = (Form_pg_ts_parser) GETSTRUCT(tuple);
ObjectAddress myself,
referenced;
+ ObjectAddresses *addrs;
- myself.classId = TSParserRelationId;
- myself.objectId = prs->oid;
- myself.objectSubId = 0;
-
- /* dependency on namespace */
- referenced.classId = NamespaceRelationId;
- referenced.objectId = prs->prsnamespace;
- referenced.objectSubId = 0;
- recordDependencyOn(&myself, &referenced, DEPENDENCY_NORMAL);
+ ObjectAddressSet(myself, TSParserRelationId, prs->oid);
/* dependency on extension */
recordDependencyOnCurrentExtension(&myself, false);
- /* dependencies on functions */
- referenced.classId = ProcedureRelationId;
- referenced.objectSubId = 0;
+ addrs = new_object_addresses();
- referenced.objectId = prs->prsstart;
- recordDependencyOn(&myself, &referenced, DEPENDENCY_NORMAL);
+ /* dependency on namespace */
+ ObjectAddressSet(referenced, NamespaceRelationId, prs->prsnamespace);
+ add_exact_object_address(&referenced, addrs);
+
+ /* dependencies on functions */
+ ObjectAddressSet(referenced, ProcedureRelationId, prs->prsstart);
+ add_exact_object_address(&referenced, addrs);
referenced.objectId = prs->prstoken;
- recordDependencyOn(&myself, &referenced, DEPENDENCY_NORMAL);
+ add_exact_object_address(&referenced, addrs);
referenced.objectId = prs->prsend;
- recordDependencyOn(&myself, &referenced, DEPENDENCY_NORMAL);
+ add_exact_object_address(&referenced, addrs);
referenced.objectId = prs->prslextype;
- recordDependencyOn(&myself, &referenced, DEPENDENCY_NORMAL);
+ add_exact_object_address(&referenced, addrs);
if (OidIsValid(prs->prsheadline))
{
referenced.objectId = prs->prsheadline;
- 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;
}
@@ -304,16 +303,9 @@ makeDictionaryDependencies(HeapTuple tuple)
Form_pg_ts_dict dict = (Form_pg_ts_dict) GETSTRUCT(tuple);
ObjectAddress myself,
referenced;
+ ObjectAddresses *addrs;
- myself.classId = TSDictionaryRelationId;
- myself.objectId = dict->oid;
- myself.objectSubId = 0;
-
- /* dependency on namespace */
- referenced.classId = NamespaceRelationId;
- referenced.objectId = dict->dictnamespace;
- referenced.objectSubId = 0;
- recordDependencyOn(&myself, &referenced, DEPENDENCY_NORMAL);
+ ObjectAddressSet(myself, TSDictionaryRelationId, dict->oid);
/* dependency on owner */
recordDependencyOnOwner(myself.classId, myself.objectId, dict->dictowner);
@@ -321,11 +313,18 @@ makeDictionaryDependencies(HeapTuple tuple)
/* dependency on extension */
recordDependencyOnCurrentExtension(&myself, false);
+ addrs = new_object_addresses();
+
+ /* dependency on namespace */
+ ObjectAddressSet(referenced, NamespaceRelationId, dict->dictnamespace);
+ add_exact_object_address(&referenced, addrs);
+
/* dependency on template */
- referenced.classId = TSTemplateRelationId;
- referenced.objectId = dict->dicttemplate;
- referenced.objectSubId = 0;
- recordDependencyOn(&myself, &referenced, DEPENDENCY_NORMAL);
+ ObjectAddressSet(referenced, TSTemplateRelationId, dict->dicttemplate);
+ add_exact_object_address(&referenced, addrs);
+
+ record_object_address_dependencies(&myself, addrs, DEPENDENCY_NORMAL);
+ free_object_addresses(addrs);
return myself;
}
@@ -649,33 +648,32 @@ makeTSTemplateDependencies(HeapTuple tuple)
Form_pg_ts_template tmpl = (Form_pg_ts_template) GETSTRUCT(tuple);
ObjectAddress myself,
referenced;
+ ObjectAddresses *addrs;
- myself.classId = TSTemplateRelationId;
- myself.objectId = tmpl->oid;
- myself.objectSubId = 0;
-
- /* dependency on namespace */
- referenced.classId = NamespaceRelationId;
- referenced.objectId = tmpl->tmplnamespace;
- referenced.objectSubId = 0;
- recordDependencyOn(&myself, &referenced, DEPENDENCY_NORMAL);
+ ObjectAddressSet(myself, TSTemplateRelationId, tmpl->oid);
/* dependency on extension */
recordDependencyOnCurrentExtension(&myself, false);
- /* dependencies on functions */
- referenced.classId = ProcedureRelationId;
- referenced.objectSubId = 0;
+ addrs = new_object_addresses();
- referenced.objectId = tmpl->tmpllexize;
- recordDependencyOn(&myself, &referenced, DEPENDENCY_NORMAL);
+ /* dependency on namespace */
+ ObjectAddressSet(referenced, NamespaceRelationId, tmpl->tmplnamespace);
+ add_exact_object_address(&referenced, addrs);
+
+ /* dependencies on functions */
+ ObjectAddressSet(referenced, ProcedureRelationId, tmpl->tmpllexize);
+ add_exact_object_address(&referenced, addrs);
if (OidIsValid(tmpl->tmplinit))
{
referenced.objectId = tmpl->tmplinit;
- 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;
}