summaryrefslogtreecommitdiff
path: root/src/backend
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend')
-rw-r--r--src/backend/catalog/pg_aggregate.c1
-rw-r--r--src/backend/catalog/pg_proc.c51
-rw-r--r--src/backend/commands/functioncmds.c7
-rw-r--r--src/backend/commands/typecmds.c4
4 files changed, 46 insertions, 17 deletions
diff --git a/src/backend/catalog/pg_aggregate.c b/src/backend/catalog/pg_aggregate.c
index bcf4050f5b1..a05f8a87c1f 100644
--- a/src/backend/catalog/pg_aggregate.c
+++ b/src/backend/catalog/pg_aggregate.c
@@ -637,6 +637,7 @@ AggregateCreate(const char *aggName,
parameterNames, /* parameterNames */
parameterDefaults, /* parameterDefaults */
PointerGetDatum(NULL), /* trftypes */
+ NIL, /* trfoids */
PointerGetDatum(NULL), /* proconfig */
InvalidOid, /* no prosupport */
1, /* procost */
diff --git a/src/backend/catalog/pg_proc.c b/src/backend/catalog/pg_proc.c
index 880b597fb3a..5fdcf24d5f8 100644
--- a/src/backend/catalog/pg_proc.c
+++ b/src/backend/catalog/pg_proc.c
@@ -26,7 +26,6 @@
#include "catalog/pg_proc.h"
#include "catalog/pg_transform.h"
#include "catalog/pg_type.h"
-#include "commands/defrem.h"
#include "executor/functions.h"
#include "funcapi.h"
#include "mb/pg_wchar.h"
@@ -61,6 +60,35 @@ static bool match_prosrc_to_literal(const char *prosrc, const char *literal,
/* ----------------------------------------------------------------
* ProcedureCreate
*
+ * procedureName: string name of routine (proname)
+ * procNamespace: OID of namespace (pronamespace)
+ * replace: true to allow replacement of an existing pg_proc entry
+ * returnsSet: returns set? (proretset)
+ * returnType: OID of result type (prorettype)
+ * proowner: OID of owner role (proowner)
+ * languageObjectId: OID of function language (prolang)
+ * languageValidator: OID of validator function to apply, if any
+ * prosrc: string form of function definition (prosrc)
+ * probin: string form of binary reference, or NULL (probin)
+ * prosqlbody: Node tree of pre-parsed SQL body, or NULL (prosqlbody)
+ * prokind: function/aggregate/procedure/etc code (prokind)
+ * security_definer: security definer? (prosecdef)
+ * isLeakProof: leak proof? (proleakproof)
+ * isStrict: strict? (proisstrict)
+ * volatility: volatility code (provolatile)
+ * parallel: parallel safety code (proparallel)
+ * parameterTypes: input parameter types, as an oidvector (proargtypes)
+ * allParameterTypes: all parameter types, as an OID array (proallargtypes)
+ * parameterModes: parameter modes, as a "char" array (proargmodes)
+ * parameterNames: parameter names, as a text array (proargnames)
+ * parameterDefaults: defaults, as a List of Node trees (proargdefaults)
+ * trftypes: transformable type OIDs, as an OID array (protrftypes)
+ * trfoids: List of transform OIDs that routine should depend on
+ * proconfig: GUC set clauses, as a text array (proconfig)
+ * prosupport: OID of support function, if any (prosupport)
+ * procost: cost factor (procost)
+ * prorows: estimated output rows for a SRF (prorows)
+ *
* Note: allParameterTypes, parameterModes, parameterNames, trftypes, and proconfig
* are either arrays of the proper types or NULL. We declare them Datum,
* not "ArrayType *", to avoid importing array.h into pg_proc.h.
@@ -90,6 +118,7 @@ ProcedureCreate(const char *procedureName,
Datum parameterNames,
List *parameterDefaults,
Datum trftypes,
+ List *trfoids,
Datum proconfig,
Oid prosupport,
float4 procost,
@@ -115,7 +144,6 @@ ProcedureCreate(const char *procedureName,
referenced;
char *detailmsg;
int i;
- Oid trfid;
ObjectAddresses *addrs;
/*
@@ -609,25 +637,18 @@ ProcedureCreate(const char *procedureName,
ObjectAddressSet(referenced, TypeRelationId, returnType);
add_exact_object_address(&referenced, addrs);
- /* dependency on transform used by return type, if any */
- if ((trfid = get_transform_oid(returnType, languageObjectId, true)))
- {
- ObjectAddressSet(referenced, TransformRelationId, trfid);
- add_exact_object_address(&referenced, addrs);
- }
-
/* dependency on parameter types */
for (i = 0; i < allParamCount; i++)
{
ObjectAddressSet(referenced, TypeRelationId, allParams[i]);
add_exact_object_address(&referenced, addrs);
+ }
- /* dependency on transform used by parameter type, if any */
- if ((trfid = get_transform_oid(allParams[i], languageObjectId, true)))
- {
- ObjectAddressSet(referenced, TransformRelationId, trfid);
- add_exact_object_address(&referenced, addrs);
- }
+ /* dependency on transforms, if any */
+ foreach_oid(transformid, trfoids)
+ {
+ ObjectAddressSet(referenced, TransformRelationId, transformid);
+ add_exact_object_address(&referenced, addrs);
}
/* dependency on support function, if any */
diff --git a/src/backend/commands/functioncmds.c b/src/backend/commands/functioncmds.c
index b9fd7683abb..0335e982b31 100644
--- a/src/backend/commands/functioncmds.c
+++ b/src/backend/commands/functioncmds.c
@@ -1046,6 +1046,7 @@ CreateFunction(ParseState *pstate, CreateFunctionStmt *stmt)
List *parameterDefaults;
Oid variadicArgType;
List *trftypes_list = NIL;
+ List *trfoids_list = NIL;
ArrayType *trftypes;
Oid requiredResultType;
bool isWindowFunc,
@@ -1157,11 +1158,12 @@ CreateFunction(ParseState *pstate, CreateFunctionStmt *stmt)
Oid typeid = typenameTypeId(NULL,
lfirst_node(TypeName, lc));
Oid elt = get_base_element_type(typeid);
+ Oid transformid;
typeid = elt ? elt : typeid;
-
- get_transform_oid(typeid, languageOid, false);
+ transformid = get_transform_oid(typeid, languageOid, false);
trftypes_list = lappend_oid(trftypes_list, typeid);
+ trfoids_list = lappend_oid(trfoids_list, transformid);
}
}
@@ -1292,6 +1294,7 @@ CreateFunction(ParseState *pstate, CreateFunctionStmt *stmt)
PointerGetDatum(parameterNames),
parameterDefaults,
PointerGetDatum(trftypes),
+ trfoids_list,
PointerGetDatum(proconfig),
prosupport,
procost,
diff --git a/src/backend/commands/typecmds.c b/src/backend/commands/typecmds.c
index 3cb3ca1cca1..45ae7472ab5 100644
--- a/src/backend/commands/typecmds.c
+++ b/src/backend/commands/typecmds.c
@@ -1810,6 +1810,7 @@ makeRangeConstructors(const char *name, Oid namespace,
PointerGetDatum(NULL), /* parameterNames */
NIL, /* parameterDefaults */
PointerGetDatum(NULL), /* trftypes */
+ NIL, /* trfoids */
PointerGetDatum(NULL), /* proconfig */
InvalidOid, /* prosupport */
1.0, /* procost */
@@ -1875,6 +1876,7 @@ makeMultirangeConstructors(const char *name, Oid namespace,
PointerGetDatum(NULL), /* parameterNames */
NIL, /* parameterDefaults */
PointerGetDatum(NULL), /* trftypes */
+ NIL, /* trfoids */
PointerGetDatum(NULL), /* proconfig */
InvalidOid, /* prosupport */
1.0, /* procost */
@@ -1919,6 +1921,7 @@ makeMultirangeConstructors(const char *name, Oid namespace,
PointerGetDatum(NULL), /* parameterNames */
NIL, /* parameterDefaults */
PointerGetDatum(NULL), /* trftypes */
+ NIL, /* trfoids */
PointerGetDatum(NULL), /* proconfig */
InvalidOid, /* prosupport */
1.0, /* procost */
@@ -1957,6 +1960,7 @@ makeMultirangeConstructors(const char *name, Oid namespace,
PointerGetDatum(NULL), /* parameterNames */
NIL, /* parameterDefaults */
PointerGetDatum(NULL), /* trftypes */
+ NIL, /* trfoids */
PointerGetDatum(NULL), /* proconfig */
InvalidOid, /* prosupport */
1.0, /* procost */