psql-v9.2-prep-create-hook.v0.patch
application/octet-stream
Filename: psql-v9.2-prep-create-hook.v0.patch
Type: application/octet-stream
Part: 0
Patch
Same data as JSON:
GET /api/v1/attachments/:id/patch
the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes.
API reference →
Format: unified
Series: patch v9
| File | + | − |
|---|---|---|
| src/backend/bootstrap/bootparse.y | 2 | 1 |
| src/backend/catalog/heap.c | 14 | 7 |
| src/backend/catalog/namespace.c | 14 | 4 |
| src/backend/catalog/pg_aggregate.c | 4 | 2 |
| src/backend/catalog/pg_collation.c | 1 | 1 |
| src/backend/catalog/pg_constraint.c | 2 | 1 |
| src/backend/catalog/pg_conversion.c | 1 | 1 |
| src/backend/catalog/pg_namespace.c | 3 | 2 |
| src/backend/catalog/pg_operator.c | 2 | 2 |
| src/backend/catalog/pg_proc.c | 4 | 2 |
| src/backend/catalog/pg_type.c | 8 | 4 |
| src/backend/catalog/toasting.c | 2 | 1 |
| src/backend/commands/aggregatecmds.c | 10 | 1 |
| src/backend/commands/cluster.c | 2 | 1 |
| src/backend/commands/dbcommands.c | 7 | 1 |
| src/backend/commands/extension.c | 1 | 1 |
| src/backend/commands/foreigncmds.c | 5 | 3 |
| src/backend/commands/functioncmds.c | 14 | 3 |
| src/backend/commands/opclasscmds.c | 2 | 2 |
| src/backend/commands/proclang.c | 21 | 8 |
| src/backend/commands/schemacmds.c | 7 | 1 |
| src/backend/commands/tablecmds.c | 8 | 2 |
| src/backend/commands/tablespace.c | 1 | 1 |
| src/backend/commands/trigger.c | 1 | 1 |
| src/backend/commands/tsearchcmds.c | 7 | 4 |
| src/backend/commands/typecmds.c | 47 | 13 |
| src/backend/commands/user.c | 2 | 1 |
| src/backend/executor/execMain.c | 10 | 1 |
| src/backend/rewrite/rewriteDefine.c | 1 | 1 |
| src/backend/storage/large_object/inv_api.c | 1 | 1 |
| src/include/catalog/heap.h | 2 | 1 |
| src/include/catalog/objectaccess.h | 145 | 5 |
| src/include/catalog/pg_aggregate.h | 2 | 1 |
| src/include/catalog/pg_namespace.h | 2 | 1 |
| src/include/catalog/pg_proc_fn.h | 2 | 1 |
| src/include/catalog/pg_type_fn.h | 4 | 2 |
diff --git a/src/backend/bootstrap/bootparse.y b/src/backend/bootstrap/bootparse.y
index d0a0e92..fc4970d 100644
--- a/src/backend/bootstrap/bootparse.y
+++ b/src/backend/bootstrap/bootparse.y
@@ -248,7 +248,8 @@ Boot_CreateStmt:
ONCOMMIT_NOOP,
(Datum) 0,
false,
- true);
+ true,
+ 0);
elog(DEBUG4, "relation created with OID %u", id);
}
do_end();
diff --git a/src/backend/catalog/heap.c b/src/backend/catalog/heap.c
index e11d896..1a6a0bc 100644
--- a/src/backend/catalog/heap.c
+++ b/src/backend/catalog/heap.c
@@ -89,7 +89,8 @@ static Oid AddNewRelationType(const char *typeName,
char new_rel_kind,
Oid ownerid,
Oid new_row_type,
- Oid new_array_type);
+ Oid new_array_type,
+ Datum hook_private);
static void RelationRemoveInheritance(Oid relid);
static void StoreRelCheck(Relation rel, char *ccname, Node *expr,
bool is_validated, bool is_local, int inhcount);
@@ -910,7 +911,8 @@ AddNewRelationType(const char *typeName,
char new_rel_kind,
Oid ownerid,
Oid new_row_type,
- Oid new_array_type)
+ Oid new_array_type,
+ Datum hook_private)
{
return
TypeCreate(new_row_type, /* optional predetermined OID */
@@ -943,7 +945,8 @@ AddNewRelationType(const char *typeName,
-1, /* typmod */
0, /* array dimensions for typBaseType */
false, /* Type NOT NULL */
- InvalidOid); /* rowtypes never have a collation */
+ InvalidOid, /* rowtypes never have a collation */
+ hook_private); /* opaque of object_access_hook */
}
/* --------------------------------
@@ -993,7 +996,8 @@ heap_create_with_catalog(const char *relname,
OnCommitAction oncommit,
Datum reloptions,
bool use_user_acl,
- bool allow_system_table_mods)
+ bool allow_system_table_mods,
+ Datum hook_private)
{
Relation pg_class_desc;
Relation new_rel_desc;
@@ -1154,7 +1158,8 @@ heap_create_with_catalog(const char *relname,
relkind,
ownerid,
reltypeid,
- new_array_oid);
+ new_array_oid,
+ hook_private);
/*
* Now make the array type if wanted.
@@ -1195,7 +1200,8 @@ heap_create_with_catalog(const char *relname,
-1, /* typmod */
0, /* array dimensions for typBaseType */
false, /* Type NOT NULL */
- InvalidOid); /* rowtypes never have a collation */
+ InvalidOid, /* rowtypes never have a collation */
+ hook_private); /* opaque of the object_access_hook */
pfree(relarrayname);
}
@@ -1279,7 +1285,8 @@ heap_create_with_catalog(const char *relname,
}
/* Post creation hook for new relation */
- InvokeObjectAccessHook(OAT_POST_CREATE, RelationRelationId, relid, 0);
+ InvokeObjectAccessHook(OAT_POST_CREATE,
+ RelationRelationId, relid, 0, hook_private);
/*
* Store any supplied constraints and defaults.
diff --git a/src/backend/catalog/namespace.c b/src/backend/catalog/namespace.c
index fcc90fe..acbce90 100644
--- a/src/backend/catalog/namespace.c
+++ b/src/backend/catalog/namespace.c
@@ -21,6 +21,7 @@
#include "access/xact.h"
#include "catalog/dependency.h"
+#include "catalog/objectaccess.h"
#include "catalog/pg_authid.h"
#include "catalog/pg_collation.h"
#include "catalog/pg_conversion.h"
@@ -3384,9 +3385,12 @@ InitTempTableNamespace(void)
char namespaceName[NAMEDATALEN];
Oid namespaceId;
Oid toastspaceId;
+ Datum hook_private = 0;
Assert(!OidIsValid(myTempNamespace));
+ snprintf(namespaceName, sizeof(namespaceName), "pg_temp_%d", MyBackendId);
+
/*
* First, do permission check to see if we are authorized to make temp
* tables. We use a nonstandard error message here since "databasename:
@@ -3404,6 +3408,10 @@ InitTempTableNamespace(void)
errmsg("permission denied to create temporary tables in database \"%s\"",
get_database_name(MyDatabaseId))));
+ /* Prep-creation hook for new temp-schema */
+ InvokeObjectPrepCreateHook(NamespaceRelationId,
+ &hook_private, namespaceName);
+
/*
* Do not allow a Hot Standby slave session to make temp tables. Aside
* from problems with modifying the system catalogs, there is a naming
@@ -3419,8 +3427,6 @@ InitTempTableNamespace(void)
(errcode(ERRCODE_READ_ONLY_SQL_TRANSACTION),
errmsg("cannot create temporary tables during recovery")));
- snprintf(namespaceName, sizeof(namespaceName), "pg_temp_%d", MyBackendId);
-
namespaceId = get_namespace_oid(namespaceName, true);
if (!OidIsValid(namespaceId))
{
@@ -3432,7 +3438,9 @@ InitTempTableNamespace(void)
* temp tables. This works because the places that access the temp
* namespace for my own backend skip permissions checks on it.
*/
- namespaceId = NamespaceCreate(namespaceName, BOOTSTRAP_SUPERUSERID);
+ namespaceId = NamespaceCreate(namespaceName,
+ BOOTSTRAP_SUPERUSERID,
+ hook_private);
/* Advance command counter to make namespace visible */
CommandCounterIncrement();
}
@@ -3456,7 +3464,9 @@ InitTempTableNamespace(void)
toastspaceId = get_namespace_oid(namespaceName, true);
if (!OidIsValid(toastspaceId))
{
- toastspaceId = NamespaceCreate(namespaceName, BOOTSTRAP_SUPERUSERID);
+ toastspaceId = NamespaceCreate(namespaceName,
+ BOOTSTRAP_SUPERUSERID,
+ hook_private);
/* Advance command counter to make namespace visible */
CommandCounterIncrement();
}
diff --git a/src/backend/catalog/pg_aggregate.c b/src/backend/catalog/pg_aggregate.c
index 86e8c6b..38b661d 100644
--- a/src/backend/catalog/pg_aggregate.c
+++ b/src/backend/catalog/pg_aggregate.c
@@ -50,7 +50,8 @@ AggregateCreate(const char *aggName,
List *aggfinalfnName,
List *aggsortopName,
Oid aggTransType,
- const char *agginitval)
+ const char *agginitval,
+ Datum hook_private)
{
Relation aggdesc;
HeapTuple tup;
@@ -229,7 +230,8 @@ AggregateCreate(const char *aggName,
NIL, /* parameterDefaults */
PointerGetDatum(NULL), /* proconfig */
1, /* procost */
- 0); /* prorows */
+ 0, /* prorows */
+ hook_private); /* opaque of hook */
/*
* Okay to create the pg_aggregate entry.
diff --git a/src/backend/catalog/pg_collation.c b/src/backend/catalog/pg_collation.c
index ce9bfae..1cdc006 100644
--- a/src/backend/catalog/pg_collation.c
+++ b/src/backend/catalog/pg_collation.c
@@ -136,7 +136,7 @@ CollationCreate(const char *collname, Oid collnamespace,
/* Post creation hook for new collation */
InvokeObjectAccessHook(OAT_POST_CREATE,
- CollationRelationId, oid, 0);
+ CollationRelationId, oid, 0, 0);
heap_freetuple(tup);
heap_close(rel, RowExclusiveLock);
diff --git a/src/backend/catalog/pg_constraint.c b/src/backend/catalog/pg_constraint.c
index 6997994..8be45b6 100644
--- a/src/backend/catalog/pg_constraint.c
+++ b/src/backend/catalog/pg_constraint.c
@@ -364,7 +364,8 @@ CreateConstraintEntry(const char *constraintName,
}
/* Post creation hook for new constraint */
- InvokeObjectAccessHook(OAT_POST_CREATE, ConstraintRelationId, conOid, 0);
+ InvokeObjectAccessHook(OAT_POST_CREATE,
+ ConstraintRelationId, conOid, 0, 0);
return conOid;
}
diff --git a/src/backend/catalog/pg_conversion.c b/src/backend/catalog/pg_conversion.c
index e480aeb..ce87f06 100644
--- a/src/backend/catalog/pg_conversion.c
+++ b/src/backend/catalog/pg_conversion.c
@@ -135,7 +135,7 @@ ConversionCreate(const char *conname, Oid connamespace,
/* Post creation hook for new conversion */
InvokeObjectAccessHook(OAT_POST_CREATE,
- ConversionRelationId, HeapTupleGetOid(tup), 0);
+ ConversionRelationId, HeapTupleGetOid(tup), 0, 0);
heap_freetuple(tup);
heap_close(rel, RowExclusiveLock);
diff --git a/src/backend/catalog/pg_namespace.c b/src/backend/catalog/pg_namespace.c
index ceebac2..5d76ecf 100644
--- a/src/backend/catalog/pg_namespace.c
+++ b/src/backend/catalog/pg_namespace.c
@@ -29,7 +29,7 @@
* ---------------
*/
Oid
-NamespaceCreate(const char *nspName, Oid ownerId)
+NamespaceCreate(const char *nspName, Oid ownerId, Datum hook_private)
{
Relation nspdesc;
HeapTuple tup;
@@ -86,7 +86,8 @@ NamespaceCreate(const char *nspName, Oid ownerId)
recordDependencyOnCurrentExtension(&myself, false);
/* Post creation hook for new schema */
- InvokeObjectAccessHook(OAT_POST_CREATE, NamespaceRelationId, nspoid, 0);
+ InvokeObjectAccessHook(OAT_POST_CREATE,
+ NamespaceRelationId, nspoid, 0, hook_private);
return nspoid;
}
diff --git a/src/backend/catalog/pg_operator.c b/src/backend/catalog/pg_operator.c
index 1440464..98e3921 100644
--- a/src/backend/catalog/pg_operator.c
+++ b/src/backend/catalog/pg_operator.c
@@ -275,7 +275,7 @@ OperatorShellMake(const char *operatorName,
/* Post creation hook for new shell operator */
InvokeObjectAccessHook(OAT_POST_CREATE,
- OperatorRelationId, operatorObjectId, 0);
+ OperatorRelationId, operatorObjectId, 0, 0);
/*
* Make sure the tuple is visible for subsequent lookups/updates.
@@ -544,7 +544,7 @@ OperatorCreate(const char *operatorName,
/* Post creation hook for new operator */
InvokeObjectAccessHook(OAT_POST_CREATE,
- OperatorRelationId, operatorObjectId, 0);
+ OperatorRelationId, operatorObjectId, 0, 0);
heap_close(pg_operator_desc, RowExclusiveLock);
diff --git a/src/backend/catalog/pg_proc.c b/src/backend/catalog/pg_proc.c
index 8378c36..f7866fc 100644
--- a/src/backend/catalog/pg_proc.c
+++ b/src/backend/catalog/pg_proc.c
@@ -85,7 +85,8 @@ ProcedureCreate(const char *procedureName,
List *parameterDefaults,
Datum proconfig,
float4 procost,
- float4 prorows)
+ float4 prorows,
+ Datum hook_private)
{
Oid retval;
int parameterCount;
@@ -646,7 +647,8 @@ ProcedureCreate(const char *procedureName,
heap_freetuple(tup);
/* Post creation hook for new function */
- InvokeObjectAccessHook(OAT_POST_CREATE, ProcedureRelationId, retval, 0);
+ InvokeObjectAccessHook(OAT_POST_CREATE,
+ ProcedureRelationId, retval, 0, hook_private);
heap_close(rel, RowExclusiveLock);
diff --git a/src/backend/catalog/pg_type.c b/src/backend/catalog/pg_type.c
index 21d1ef3..cd7afa3 100644
--- a/src/backend/catalog/pg_type.c
+++ b/src/backend/catalog/pg_type.c
@@ -51,7 +51,8 @@ Oid binary_upgrade_next_pg_type_oid = InvalidOid;
* ----------------------------------------------------------------
*/
Oid
-TypeShellMake(const char *typeName, Oid typeNamespace, Oid ownerId)
+TypeShellMake(const char *typeName, Oid typeNamespace, Oid ownerId,
+ Datum hook_private)
{
Relation pg_type_desc;
TupleDesc tupDesc;
@@ -161,7 +162,8 @@ TypeShellMake(const char *typeName, Oid typeNamespace, Oid ownerId)
false);
/* Post creation hook for new shell type */
- InvokeObjectAccessHook(OAT_POST_CREATE, TypeRelationId, typoid, 0);
+ InvokeObjectAccessHook(OAT_POST_CREATE,
+ TypeRelationId, typoid, 0, hook_private);
/*
* clean up and return the type-oid
@@ -213,7 +215,8 @@ TypeCreate(Oid newTypeOid,
int32 typeMod,
int32 typNDims, /* Array dimensions for baseType */
bool typeNotNull,
- Oid typeCollation)
+ Oid typeCollation,
+ Datum hook_private)
{
Relation pg_type_desc;
Oid typeObjectId;
@@ -465,7 +468,8 @@ TypeCreate(Oid newTypeOid,
rebuildDeps);
/* Post creation hook for new type */
- InvokeObjectAccessHook(OAT_POST_CREATE, TypeRelationId, typeObjectId, 0);
+ InvokeObjectAccessHook(OAT_POST_CREATE,
+ TypeRelationId, typeObjectId, 0, hook_private);
/*
* finish up
diff --git a/src/backend/catalog/toasting.c b/src/backend/catalog/toasting.c
index 3a40e8b..148b100 100644
--- a/src/backend/catalog/toasting.c
+++ b/src/backend/catalog/toasting.c
@@ -228,7 +228,8 @@ create_toast_table(Relation rel, Oid toastOid, Oid toastIndexOid, Datum reloptio
ONCOMMIT_NOOP,
reloptions,
false,
- true);
+ true,
+ 0);
Assert(toast_relid != InvalidOid);
/* make the toast relation visible, else heap_open will fail */
diff --git a/src/backend/commands/aggregatecmds.c b/src/backend/commands/aggregatecmds.c
index a2122c1..35a622f 100644
--- a/src/backend/commands/aggregatecmds.c
+++ b/src/backend/commands/aggregatecmds.c
@@ -25,7 +25,9 @@
#include "access/heapam.h"
#include "catalog/dependency.h"
#include "catalog/indexing.h"
+#include "catalog/objectaccess.h"
#include "catalog/pg_aggregate.h"
+#include "catalog/pg_language.h"
#include "catalog/pg_proc.h"
#include "catalog/pg_type.h"
#include "commands/defrem.h"
@@ -51,6 +53,7 @@ DefineAggregate(List *name, List *args, bool oldstyle, List *parameters)
char *aggName;
Oid aggNamespace;
AclResult aclresult;
+ Datum hook_private = 0;
List *transfuncName = NIL;
List *finalfuncName = NIL;
List *sortoperatorName = NIL;
@@ -192,6 +195,11 @@ DefineAggregate(List *name, List *args, bool oldstyle, List *parameters)
format_type_be(transTypeId))));
}
+ /* Prep-creation hook for new aggregate function */
+ InvokeProcedurePrepCreateHook(&hook_private, aggName,
+ buildoidvector(aggArgTypes, numArgs),
+ aggNamespace, INTERNALlanguageId, false);
+
/*
* Most of the argument-checking is done inside of AggregateCreate
*/
@@ -203,7 +211,8 @@ DefineAggregate(List *name, List *args, bool oldstyle, List *parameters)
finalfuncName, /* final function name */
sortoperatorName, /* sort operator name */
transTypeId, /* transition data type */
- initval); /* initial condition */
+ initval, /* initial condition */
+ hook_private); /* opaque of object_access_hook */
}
diff --git a/src/backend/commands/cluster.c b/src/backend/commands/cluster.c
index edec44d..93e7177 100644
--- a/src/backend/commands/cluster.c
+++ b/src/backend/commands/cluster.c
@@ -645,7 +645,8 @@ make_new_heap(Oid OIDOldHeap, Oid NewTableSpace)
ONCOMMIT_NOOP,
reloptions,
false,
- true);
+ true,
+ 0);
Assert(OIDNewHeap != InvalidOid);
ReleaseSysCache(tuple);
diff --git a/src/backend/commands/dbcommands.c b/src/backend/commands/dbcommands.c
index 4551db7..58a1fd6 100644
--- a/src/backend/commands/dbcommands.c
+++ b/src/backend/commands/dbcommands.c
@@ -127,6 +127,7 @@ createdb(const CreatedbStmt *stmt)
int dbconnlimit = -1;
int notherbackends;
int npreparedxacts;
+ Datum hook_private = 0;
createdb_failure_params fparms;
/* Extract options from the statement node tree */
@@ -424,6 +425,10 @@ createdb(const CreatedbStmt *stmt)
/* Note there is no additional permission check in this path */
}
+ /* Prep-creation hook for new database */
+ InvokeDatabasePrepCreateHook(&hook_private, dbname,
+ src_dboid, dst_deftablespace);
+
/*
* Check for db name conflict. This is just to give a more friendly error
* message than "unique index violation". There's a race condition but
@@ -515,7 +520,8 @@ createdb(const CreatedbStmt *stmt)
copyTemplateDependencies(src_dboid, dboid);
/* Post creation hook for new database */
- InvokeObjectAccessHook(OAT_POST_CREATE, DatabaseRelationId, dboid, 0);
+ InvokeObjectAccessHook(OAT_POST_CREATE,
+ DatabaseRelationId, dboid, 0, hook_private);
/*
* Force a checkpoint before starting the copy. This will force dirty
diff --git a/src/backend/commands/extension.c b/src/backend/commands/extension.c
index c334ca9..253141b 100644
--- a/src/backend/commands/extension.c
+++ b/src/backend/commands/extension.c
@@ -1558,7 +1558,7 @@ InsertExtensionTuple(const char *extName, Oid extOwner,
}
/* Post creation hook for new extension */
InvokeObjectAccessHook(OAT_POST_CREATE,
- ExtensionRelationId, extensionOid, 0);
+ ExtensionRelationId, extensionOid, 0, 0);
return extensionOid;
}
diff --git a/src/backend/commands/foreigncmds.c b/src/backend/commands/foreigncmds.c
index d9c27d1..60aba65 100644
--- a/src/backend/commands/foreigncmds.c
+++ b/src/backend/commands/foreigncmds.c
@@ -518,7 +518,7 @@ CreateForeignDataWrapper(CreateFdwStmt *stmt)
/* Post creation hook for new foreign data wrapper */
InvokeObjectAccessHook(OAT_POST_CREATE,
- ForeignDataWrapperRelationId, fdwId, 0);
+ ForeignDataWrapperRelationId, fdwId, 0, 0);
heap_close(rel, RowExclusiveLock);
}
@@ -858,7 +858,8 @@ CreateForeignServer(CreateForeignServerStmt *stmt)
recordDependencyOnCurrentExtension(&myself, false);
/* Post creation hook for new foreign server */
- InvokeObjectAccessHook(OAT_POST_CREATE, ForeignServerRelationId, srvId, 0);
+ InvokeObjectAccessHook(OAT_POST_CREATE,
+ ForeignServerRelationId, srvId, 0, 0);
heap_close(rel, RowExclusiveLock);
}
@@ -1137,7 +1138,8 @@ CreateUserMapping(CreateUserMappingStmt *stmt)
recordDependencyOnCurrentExtension(&myself, false);
/* Post creation hook for new user mapping */
- InvokeObjectAccessHook(OAT_POST_CREATE, UserMappingRelationId, umId, 0);
+ InvokeObjectAccessHook(OAT_POST_CREATE,
+ UserMappingRelationId, umId, 0, 0);
heap_close(rel, RowExclusiveLock);
}
diff --git a/src/backend/commands/functioncmds.c b/src/backend/commands/functioncmds.c
index 92abd44..8c65025 100644
--- a/src/backend/commands/functioncmds.c
+++ b/src/backend/commands/functioncmds.c
@@ -113,6 +113,7 @@ compute_return_type(TypeName *returnType, Oid languageOid,
char *typnam = TypeNameToString(returnType);
Oid namespaceId;
AclResult aclresult;
+ Datum hook_private = 0;
char *typname;
/*
@@ -146,7 +147,11 @@ compute_return_type(TypeName *returnType, Oid languageOid,
if (aclresult != ACLCHECK_OK)
aclcheck_error(aclresult, ACL_KIND_NAMESPACE,
get_namespace_name(namespaceId));
- rettype = TypeShellMake(typname, namespaceId, GetUserId());
+ /* Prep-creation hook for new range type */
+ InvokeSchemaObjectPrepCreateHook(TypeRelationId, &hook_private,
+ typname, namespaceId);
+ rettype = TypeShellMake(typname, namespaceId,
+ GetUserId(), hook_private);
Assert(OidIsValid(rettype));
}
@@ -798,6 +803,7 @@ CreateFunction(CreateFunctionStmt *stmt, const char *queryString)
ArrayType *proconfig;
float4 procost;
float4 prorows;
+ Datum hook_private = 0;
HeapTuple languageTuple;
Form_pg_language languageStruct;
List *as_clause;
@@ -877,6 +883,10 @@ CreateFunction(CreateFunctionStmt *stmt, const char *queryString)
¶meterDefaults,
&requiredResultType);
+ /* Prep-creation hook for new function */
+ InvokeProcedurePrepCreateHook(&hook_private, funcname, parameterTypes,
+ namespaceId, languageOid, false);
+
if (stmt->returnType)
{
/* explicit RETURNS clause */
@@ -960,7 +970,8 @@ CreateFunction(CreateFunctionStmt *stmt, const char *queryString)
parameterDefaults,
PointerGetDatum(proconfig),
procost,
- prorows);
+ prorows,
+ hook_private);
}
@@ -1769,7 +1780,7 @@ CreateCast(CreateCastStmt *stmt)
recordDependencyOnCurrentExtension(&myself, false);
/* Post creation hook for new cast */
- InvokeObjectAccessHook(OAT_POST_CREATE, CastRelationId, castid, 0);
+ InvokeObjectAccessHook(OAT_POST_CREATE, CastRelationId, castid, 0, 0);
heap_freetuple(tuple);
diff --git a/src/backend/commands/opclasscmds.c b/src/backend/commands/opclasscmds.c
index af0de05..08ab307 100644
--- a/src/backend/commands/opclasscmds.c
+++ b/src/backend/commands/opclasscmds.c
@@ -313,7 +313,7 @@ CreateOpFamily(char *amname, char *opfname, Oid namespaceoid, Oid amoid)
/* Post creation hook for new operator family */
InvokeObjectAccessHook(OAT_POST_CREATE,
- OperatorFamilyRelationId, opfamilyoid, 0);
+ OperatorFamilyRelationId, opfamilyoid, 0, 0);
heap_close(rel, RowExclusiveLock);
@@ -716,7 +716,7 @@ DefineOpClass(CreateOpClassStmt *stmt)
/* Post creation hook for new operator class */
InvokeObjectAccessHook(OAT_POST_CREATE,
- OperatorClassRelationId, opclassoid, 0);
+ OperatorClassRelationId, opclassoid, 0, 0);
heap_close(rel, RowExclusiveLock);
}
diff --git a/src/backend/commands/proclang.c b/src/backend/commands/proclang.c
index 98770c5..10758aa 100644
--- a/src/backend/commands/proclang.c
+++ b/src/backend/commands/proclang.c
@@ -51,7 +51,7 @@ typedef struct
static void create_proc_lang(const char *languageName, bool replace,
Oid languageOwner, Oid handlerOid, Oid inlineOid,
- Oid valOid, bool trusted);
+ Oid valOid, bool trusted, Datum hook_private);
static PLTemplate *find_language_template(const char *languageName);
static void AlterLanguageOwner_internal(HeapTuple tup, Relation rel,
Oid newOwnerId);
@@ -71,6 +71,7 @@ CreateProceduralLanguage(CreatePLangStmt *stmt)
valOid;
Oid funcrettype;
Oid funcargtypes[1];
+ Datum hook_private = 0;
/*
* Translate the language name to lower case
@@ -107,6 +108,10 @@ CreateProceduralLanguage(CreatePLangStmt *stmt)
get_database_name(MyDatabaseId));
}
+ /* Prep-creation hook for new language */
+ InvokeObjectPrepCreateHook(LanguageRelationId,
+ &hook_private, languageName);
+
/*
* Find or create the handler function, which we force to be in the
* pg_catalog schema. If already present, it must have the correct
@@ -146,7 +151,8 @@ CreateProceduralLanguage(CreatePLangStmt *stmt)
NIL,
PointerGetDatum(NULL),
1,
- 0);
+ 0,
+ hook_private);
}
/*
@@ -181,7 +187,8 @@ CreateProceduralLanguage(CreatePLangStmt *stmt)
NIL,
PointerGetDatum(NULL),
1,
- 0);
+ 0,
+ hook_private);
}
}
else
@@ -219,7 +226,8 @@ CreateProceduralLanguage(CreatePLangStmt *stmt)
NIL,
PointerGetDatum(NULL),
1,
- 0);
+ 0,
+ hook_private);
}
}
else
@@ -228,7 +236,7 @@ CreateProceduralLanguage(CreatePLangStmt *stmt)
/* ok, create it */
create_proc_lang(languageName, stmt->replace, GetUserId(),
handlerOid, inlineOid,
- valOid, pltemplate->tmpltrusted);
+ valOid, pltemplate->tmpltrusted, hook_private);
}
else
{
@@ -252,6 +260,10 @@ CreateProceduralLanguage(CreatePLangStmt *stmt)
(errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
errmsg("must be superuser to create custom procedural language")));
+ /* Prep-creation hook for new language */
+ InvokeObjectPrepCreateHook(LanguageRelationId,
+ &hook_private, languageName);
+
/*
* Lookup the PL handler function and check that it is of the expected
* return type
@@ -303,7 +315,7 @@ CreateProceduralLanguage(CreatePLangStmt *stmt)
/* ok, create it */
create_proc_lang(languageName, stmt->replace, GetUserId(),
handlerOid, inlineOid,
- valOid, stmt->pltrusted);
+ valOid, stmt->pltrusted, hook_private);
}
}
@@ -313,7 +325,7 @@ CreateProceduralLanguage(CreatePLangStmt *stmt)
static void
create_proc_lang(const char *languageName, bool replace,
Oid languageOwner, Oid handlerOid, Oid inlineOid,
- Oid valOid, bool trusted)
+ Oid valOid, bool trusted, Datum hook_private)
{
Relation rel;
TupleDesc tupDesc;
@@ -431,7 +443,8 @@ create_proc_lang(const char *languageName, bool replace,
/* Post creation hook for new procedural language */
InvokeObjectAccessHook(OAT_POST_CREATE,
- LanguageRelationId, myself.objectId, 0);
+ LanguageRelationId, myself.objectId, 0,
+ hook_private);
heap_close(rel, RowExclusiveLock);
}
diff --git a/src/backend/commands/schemacmds.c b/src/backend/commands/schemacmds.c
index 8daa9d0..a59aa68 100644
--- a/src/backend/commands/schemacmds.c
+++ b/src/backend/commands/schemacmds.c
@@ -19,6 +19,7 @@
#include "catalog/dependency.h"
#include "catalog/indexing.h"
#include "catalog/namespace.h"
+#include "catalog/objectaccess.h"
#include "catalog/pg_namespace.h"
#include "commands/dbcommands.h"
#include "commands/schemacmds.h"
@@ -48,6 +49,7 @@ CreateSchemaCommand(CreateSchemaStmt *stmt, const char *queryString)
Oid owner_uid;
Oid saved_uid;
int save_sec_context;
+ Datum hook_private = 0;
AclResult aclresult;
GetUserIdAndSecContext(&saved_uid, &save_sec_context);
@@ -74,6 +76,10 @@ CreateSchemaCommand(CreateSchemaStmt *stmt, const char *queryString)
check_is_member_of_role(saved_uid, owner_uid);
+ /* Prep-creation hook for new schema */
+ InvokeObjectPrepCreateHook(NamespaceRelationId,
+ &hook_private, schemaName);
+
/* Additional check to protect reserved schema names */
if (!allowSystemTableMods && IsReservedName(schemaName))
ereport(ERROR,
@@ -94,7 +100,7 @@ CreateSchemaCommand(CreateSchemaStmt *stmt, const char *queryString)
save_sec_context | SECURITY_LOCAL_USERID_CHANGE);
/* Create the schema's namespace */
- namespaceId = NamespaceCreate(schemaName, owner_uid);
+ namespaceId = NamespaceCreate(schemaName, owner_uid, hook_private);
/* Advance cmd counter to make the namespace visible */
CommandCounterIncrement();
diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c
index c4622c0..a3053d6 100644
--- a/src/backend/commands/tablecmds.c
+++ b/src/backend/commands/tablecmds.c
@@ -413,6 +413,7 @@ DefineRelation(CreateStmt *stmt, char relkind, Oid ownerId)
ListCell *listptr;
AttrNumber attnum;
static char *validnsps[] = HEAP_RELOPT_NAMESPACES;
+ Datum hook_private = 0;
Oid ofTypeId;
/*
@@ -575,6 +576,10 @@ DefineRelation(CreateStmt *stmt, char relkind, Oid ownerId)
}
}
+ /* Prep-creation hook for new relation */
+ InvokeRelationPrepCreateHook(&hook_private, relname, relkind,
+ namespaceId, tablespaceId, descriptor);
+
/*
* Create the relation. Inherited defaults and constraints are passed in
* for immediate handling --- since they don't need parsing, they can be
@@ -599,7 +604,8 @@ DefineRelation(CreateStmt *stmt, char relkind, Oid ownerId)
stmt->oncommit,
reloptions,
true,
- allowSystemTableMods);
+ allowSystemTableMods,
+ hook_private);
/* Store inheritance information for new rel. */
StoreCatalogInheritance(relationId, inheritOids);
@@ -4381,7 +4387,7 @@ ATExecAddColumn(List **wqueue, AlteredTableInfo *tab, Relation rel,
/* Post creation hook for new attribute */
InvokeObjectAccessHook(OAT_POST_CREATE,
- RelationRelationId, myrelid, newattnum);
+ RelationRelationId, myrelid, newattnum, 0);
heap_close(pgclass, RowExclusiveLock);
diff --git a/src/backend/commands/tablespace.c b/src/backend/commands/tablespace.c
index d223f8c..b0672e1 100644
--- a/src/backend/commands/tablespace.c
+++ b/src/backend/commands/tablespace.c
@@ -332,7 +332,7 @@ CreateTableSpace(CreateTableSpaceStmt *stmt)
/* Post creation hook for new tablespace */
InvokeObjectAccessHook(OAT_POST_CREATE,
- TableSpaceRelationId, tablespaceoid, 0);
+ TableSpaceRelationId, tablespaceoid, 0, 0);
create_tablespace_directories(location, tablespaceoid);
diff --git a/src/backend/commands/trigger.c b/src/backend/commands/trigger.c
index a6e7268..daeb0a1 100644
--- a/src/backend/commands/trigger.c
+++ b/src/backend/commands/trigger.c
@@ -747,7 +747,7 @@ CreateTrigger(CreateTrigStmt *stmt, const char *queryString,
/* Post creation hook for new trigger */
InvokeObjectAccessHook(OAT_POST_CREATE,
- TriggerRelationId, trigoid, 0);
+ TriggerRelationId, trigoid, 0, 0);
/* Keep lock on target rel until end of xact */
heap_close(rel, NoLock);
diff --git a/src/backend/commands/tsearchcmds.c b/src/backend/commands/tsearchcmds.c
index 5f206d8..2fb7304 100644
--- a/src/backend/commands/tsearchcmds.c
+++ b/src/backend/commands/tsearchcmds.c
@@ -271,7 +271,8 @@ DefineTSParser(List *names, List *parameters)
makeParserDependencies(tup);
/* Post creation hook for new text search parser */
- InvokeObjectAccessHook(OAT_POST_CREATE, TSParserRelationId, prsOid, 0);
+ InvokeObjectAccessHook(OAT_POST_CREATE,
+ TSParserRelationId, prsOid, 0, 0);
heap_freetuple(tup);
@@ -565,7 +566,7 @@ DefineTSDictionary(List *names, List *parameters)
/* Post creation hook for new text search dictionary */
InvokeObjectAccessHook(OAT_POST_CREATE,
- TSDictionaryRelationId, dictOid, 0);
+ TSDictionaryRelationId, dictOid, 0, 0);
heap_freetuple(tup);
@@ -1036,7 +1037,8 @@ DefineTSTemplate(List *names, List *parameters)
makeTSTemplateDependencies(tup);
/* Post creation hook for new text search template */
- InvokeObjectAccessHook(OAT_POST_CREATE, TSTemplateRelationId, dictOid, 0);
+ InvokeObjectAccessHook(OAT_POST_CREATE,
+ TSTemplateRelationId, dictOid, 0, 0);
heap_freetuple(tup);
@@ -1419,7 +1421,8 @@ DefineTSConfiguration(List *names, List *parameters)
makeConfigurationDependencies(tup, false, mapRel);
/* Post creation hook for new text search configuration */
- InvokeObjectAccessHook(OAT_POST_CREATE, TSConfigRelationId, cfgOid, 0);
+ InvokeObjectAccessHook(OAT_POST_CREATE,
+ TSConfigRelationId, cfgOid, 0, 0);
heap_freetuple(tup);
diff --git a/src/backend/commands/typecmds.c b/src/backend/commands/typecmds.c
index 91488bb..f91cc02 100644
--- a/src/backend/commands/typecmds.c
+++ b/src/backend/commands/typecmds.c
@@ -38,6 +38,7 @@
#include "catalog/dependency.h"
#include "catalog/heap.h"
#include "catalog/indexing.h"
+#include "catalog/objectaccess.h"
#include "catalog/pg_collation.h"
#include "catalog/pg_constraint.h"
#include "catalog/pg_depend.h"
@@ -104,7 +105,7 @@ static char *domainAddConstraint(Oid domainOid, Oid domainNamespace,
int typMod, Constraint *constr,
char *domainName);
static void makeRangeConstructor(char *name, Oid namespace, Oid rettype,
- Oid subtype);
+ Oid subtype, Datum hook_private);
/*
@@ -162,6 +163,7 @@ DefineType(List *names, List *parameters)
Oid array_oid;
Oid typoid;
Oid resulttype;
+ Datum hook_private = 0;
ListCell *pl;
/*
@@ -192,6 +194,11 @@ DefineType(List *names, List *parameters)
get_namespace_name(typeNamespace));
#endif
+ /* Prep-creation hook for new type */
+ InvokeSchemaObjectPrepCreateHook(TypeRelationId,
+ &hook_private,
+ typeName, typeNamespace);
+
/*
* Look to see if type already exists (presumably as a shell; if not,
* TypeCreate will complain).
@@ -216,7 +223,8 @@ DefineType(List *names, List *parameters)
*/
if (!OidIsValid(typoid))
{
- typoid = TypeShellMake(typeName, typeNamespace, GetUserId());
+ typoid = TypeShellMake(typeName, typeNamespace,
+ GetUserId(), hook_private);
/* Make new shell type visible for modification below */
CommandCounterIncrement();
@@ -583,7 +591,8 @@ DefineType(List *names, List *parameters)
-1, /* typMod (Domains only) */
0, /* Array Dimensions of typbasetype */
false, /* Type NOT NULL */
- collation); /* type's collation */
+ collation, /* type's collation */
+ hook_private); /* opaque to post-creation hook */
/*
* Create the array type that goes with it.
@@ -623,7 +632,8 @@ DefineType(List *names, List *parameters)
-1, /* typMod (Domains only) */
0, /* Array dimensions of typbasetype */
false, /* Type NOT NULL */
- collation); /* type's collation */
+ collation, /* type's collation */
+ hook_private); /* opaque to post-creation hook */
pfree(array_type);
}
@@ -677,6 +687,7 @@ DefineDomain(CreateDomainStmt *stmt)
char *domainName;
Oid domainNamespace;
AclResult aclresult;
+ Datum hook_private = 0;
int16 internalLength;
Oid inputProcedure;
Oid outputProcedure;
@@ -719,6 +730,10 @@ DefineDomain(CreateDomainStmt *stmt)
aclcheck_error(aclresult, ACL_KIND_NAMESPACE,
get_namespace_name(domainNamespace));
+ /* Prep-creation hook for new domain */
+ InvokeSchemaObjectPrepCreateHook(TypeRelationId, &hook_private,
+ domainName, domainNamespace);
+
/*
* Check for collision with an existing type name. If there is one and
* it's an autogenerated array, we can rename it out of the way.
@@ -998,7 +1013,8 @@ DefineDomain(CreateDomainStmt *stmt)
basetypeMod, /* typeMod value */
typNDims, /* Array dimensions for base type */
typNotNull, /* Type NOT NULL */
- domaincoll); /* type's collation */
+ domaincoll, /* type's collation */
+ hook_private); /* opaque to post-creation hook */
/*
* Process constraints which refer to the domain ID returned by TypeCreate
@@ -1046,6 +1062,7 @@ DefineEnum(CreateEnumStmt *stmt)
Oid enumNamespace;
Oid enumTypeOid;
AclResult aclresult;
+ Datum hook_private = 0;
Oid old_type_oid;
Oid enumArrayOid;
@@ -1059,6 +1076,10 @@ DefineEnum(CreateEnumStmt *stmt)
aclcheck_error(aclresult, ACL_KIND_NAMESPACE,
get_namespace_name(enumNamespace));
+ /* Prep-creation hook for new enum type */
+ InvokeSchemaObjectPrepCreateHook(TypeRelationId, &hook_private,
+ enumName, enumNamespace);
+
/*
* Check for collision with an existing type name. If there is one and
* it's an autogenerated array, we can rename it out of the way.
@@ -1108,7 +1129,8 @@ DefineEnum(CreateEnumStmt *stmt)
-1, /* typMod (Domains only) */
0, /* Array dimensions of typbasetype */
false, /* Type NOT NULL */
- InvalidOid); /* type's collation */
+ InvalidOid, /* type's collation */
+ hook_private); /* opaque to post-creation hook */
/* Enter the enum's values into pg_enum */
EnumValuesCreate(enumTypeOid, stmt->vals);
@@ -1148,7 +1170,8 @@ DefineEnum(CreateEnumStmt *stmt)
-1, /* typMod (Domains only) */
0, /* Array dimensions of typbasetype */
false, /* Type NOT NULL */
- InvalidOid); /* type's collation */
+ InvalidOid, /* type's collation */
+ hook_private); /* opaque to post-creation hook */
pfree(enumArrayName);
}
@@ -1179,6 +1202,7 @@ DefineRange(CreateRangeStmt *stmt)
regproc rangeSubtypeDiff = InvalidOid;
AclResult aclresult;
+ Datum hook_private = 0;
/* Convert list of names to a name and namespace */
typeNamespace = QualifiedNameGetCreationNamespace(stmt->typeName,
@@ -1190,6 +1214,10 @@ DefineRange(CreateRangeStmt *stmt)
aclcheck_error(aclresult, ACL_KIND_NAMESPACE,
get_namespace_name(typeNamespace));
+ /* Prep-creation hook for new range type */
+ InvokeSchemaObjectPrepCreateHook(TypeRelationId, &hook_private,
+ typeName, typeNamespace);
+
/*
* Look to see if type already exists (presumably as a shell; if not,
* TypeCreate will complain).
@@ -1214,7 +1242,8 @@ DefineRange(CreateRangeStmt *stmt)
*/
if (!OidIsValid(typoid))
{
- typoid = TypeShellMake(typeName, typeNamespace, GetUserId());
+ typoid = TypeShellMake(typeName, typeNamespace,
+ GetUserId(), hook_private);
/* Make new shell type visible for modification below */
CommandCounterIncrement();
@@ -1355,7 +1384,8 @@ DefineRange(CreateRangeStmt *stmt)
-1, /* typMod (Domains only) */
0, /* Array dimensions of typbasetype */
false, /* Type NOT NULL */
- InvalidOid); /* typcollation */
+ InvalidOid, /* typcollation */
+ hook_private); /* opaque to post-creation hook */
/* create the entry in pg_range */
RangeCreate(typoid, rangeSubtype, rangeCollation, rangeSubOpclass,
@@ -1396,11 +1426,13 @@ DefineRange(CreateRangeStmt *stmt)
-1, /* typMod (Domains only) */
0, /* Array dimensions of typbasetype */
false, /* Type NOT NULL */
- InvalidOid); /* typcollation */
+ InvalidOid, /* typcollation */
+ hook_private); /* opaque to post-creation hook */
pfree(rangeArrayName);
- makeRangeConstructor(typeName, typeNamespace, typoid, rangeSubtype);
+ makeRangeConstructor(typeName, typeNamespace, typoid,
+ rangeSubtype, hook_private);
}
/*
@@ -1413,7 +1445,8 @@ DefineRange(CreateRangeStmt *stmt)
* offer more convenience for the user.
*/
static void
-makeRangeConstructor(char *name, Oid namespace, Oid rangeOid, Oid subtype)
+makeRangeConstructor(char *name, Oid namespace, Oid rangeOid,
+ Oid subtype, Datum hook_private)
{
ObjectAddress referenced;
Oid constructorArgTypes[3];
@@ -1461,7 +1494,8 @@ makeRangeConstructor(char *name, Oid namespace, Oid rangeOid, Oid subtype)
NIL, /* parameterDefaults */
PointerGetDatum(NULL), /* proconfig */
1.0, /* procost */
- 0.0); /* prorows */
+ 0.0, /* prorows */
+ hook_private);
/*
* Make the constructor internally-dependent on the range type so that
diff --git a/src/backend/commands/user.c b/src/backend/commands/user.c
index fa312cb..cc29acb 100644
--- a/src/backend/commands/user.c
+++ b/src/backend/commands/user.c
@@ -434,7 +434,8 @@ CreateRole(CreateRoleStmt *stmt)
GetUserId(), false);
/* Post creation hook for new role */
- InvokeObjectAccessHook(OAT_POST_CREATE, AuthIdRelationId, roleid, 0);
+ InvokeObjectAccessHook(OAT_POST_CREATE,
+ AuthIdRelationId, roleid, 0, 0);
/*
* Close pg_authid, but keep lock till commit.
diff --git a/src/backend/executor/execMain.c b/src/backend/executor/execMain.c
index fd7a9ed..b31eea4 100644
--- a/src/backend/executor/execMain.c
+++ b/src/backend/executor/execMain.c
@@ -43,6 +43,7 @@
#include "access/xact.h"
#include "catalog/heap.h"
#include "catalog/namespace.h"
+#include "catalog/objectaccess.h"
#include "catalog/toasting.h"
#include "commands/tablespace.h"
#include "commands/trigger.h"
@@ -2393,6 +2394,7 @@ OpenIntoRel(QueryDesc *queryDesc)
Oid namespaceId;
Oid tablespaceId;
Datum reloptions;
+ Datum hook_private = 0;
Oid intoRelationId;
DR_intorel *myState;
static char *validnsps[] = HEAP_RELOPT_NAMESPACES;
@@ -2467,6 +2469,12 @@ OpenIntoRel(QueryDesc *queryDesc)
false);
(void) heap_reloptions(RELKIND_RELATION, reloptions, true);
+ /* Prep-creation hook for new table */
+ InvokeRelationPrepCreateHook(&hook_private, intoName,
+ RELKIND_RELATION,
+ namespaceId, tablespaceId,
+ queryDesc->tupDesc);
+
/* Now we can actually create the new relation */
intoRelationId = heap_create_with_catalog(intoName,
namespaceId,
@@ -2486,7 +2494,8 @@ OpenIntoRel(QueryDesc *queryDesc)
into->onCommit,
reloptions,
true,
- allowSystemTableMods);
+ allowSystemTableMods,
+ hook_private);
Assert(intoRelationId != InvalidOid);
/*
diff --git a/src/backend/rewrite/rewriteDefine.c b/src/backend/rewrite/rewriteDefine.c
index 17db70e..f0c0e31 100644
--- a/src/backend/rewrite/rewriteDefine.c
+++ b/src/backend/rewrite/rewriteDefine.c
@@ -178,7 +178,7 @@ InsertRule(char *rulname,
/* Post creation hook for new rule */
InvokeObjectAccessHook(OAT_POST_CREATE,
- RewriteRelationId, rewriteObjectId, 0);
+ RewriteRelationId, rewriteObjectId, 0, 0);
heap_close(pg_rewrite_desc, RowExclusiveLock);
diff --git a/src/backend/storage/large_object/inv_api.c b/src/backend/storage/large_object/inv_api.c
index fed6d2e..1cdfa5c 100644
--- a/src/backend/storage/large_object/inv_api.c
+++ b/src/backend/storage/large_object/inv_api.c
@@ -217,7 +217,7 @@ inv_create(Oid lobjId)
/* Post creation hook for new large object */
InvokeObjectAccessHook(OAT_POST_CREATE,
- LargeObjectRelationId, lobjId_new, 0);
+ LargeObjectRelationId, lobjId_new, 0, 0);
/*
* Advance command counter to make new tuple visible to later operations.
diff --git a/src/include/catalog/heap.h b/src/include/catalog/heap.h
index aee2d88..ca4d6a1 100644
--- a/src/include/catalog/heap.h
+++ b/src/include/catalog/heap.h
@@ -65,7 +65,8 @@ extern Oid heap_create_with_catalog(const char *relname,
OnCommitAction oncommit,
Datum reloptions,
bool use_user_acl,
- bool allow_system_table_mods);
+ bool allow_system_table_mods,
+ Datum hook_private);
extern void heap_drop_with_catalog(Oid relid);
diff --git a/src/include/catalog/objectaccess.h b/src/include/catalog/objectaccess.h
index 2925475..30bdc75 100644
--- a/src/include/catalog/objectaccess.h
+++ b/src/include/catalog/objectaccess.h
@@ -10,11 +10,17 @@
#ifndef OBJECTACCESS_H
#define OBJECTACCESS_H
+#include "access/tupdesc.h"
+
/*
* Object access hooks are intended to be called just before or just after
* performing certain actions on a SQL object. This is intended as
* infrastructure for security or logging pluggins.
*
+ * OAT_PREP_CREATE should be invoked around the permission check of object
+ * creation; with arguments that informs properties of the object being
+ * constructed.
+ *
* OAT_POST_CREATE should be invoked just after the the object is created.
* Typically, this is done after inserting the primary catalog records and
* associated dependencies.
@@ -23,24 +29,158 @@
*/
typedef enum ObjectAccessType
{
+ OAT_PREP_CREATE,
OAT_POST_CREATE,
} ObjectAccessType;
/*
+ * ObjectAccessPrepCreateInfo
+ *
+ * A set of contextual information on prep object events; reuired data
+ * is depending on object classes. So, module should check classId prior
+ * to reference this structure.
+ */
+typedef union
+{
+ struct {
+ Datum *private;
+ const char *objname;
+ Oid namespaceId; /* only objects under schema */
+ } common;
+
+ struct {
+ Datum *private;
+ const char *datname;
+ Oid datsourceId;
+ Oid tablespaceId;
+ } pg_database;
+
+ struct {
+ Datum *private;
+ const char *relname;
+ char relkind;
+ Oid namespaceId;
+ Oid tablespaceId;
+ TupleDesc tupdesc;
+ } pg_class;
+
+ struct {
+ Datum *private;
+ const char *proname;
+ oidvector *proargs;
+ Oid namespaceId;
+ Oid languageId;
+ bool leakproof;
+ } pg_proc;
+} ObjectAccessPrepCreateInfo;
+
+/*
* Hook, and a macro to invoke it.
*/
typedef void (*object_access_hook_type) (ObjectAccessType access,
- Oid classId,
- Oid objectId,
- int subId);
+ Oid classId,
+ Oid objectId,
+ int subId,
+ Datum argument);
extern PGDLLIMPORT object_access_hook_type object_access_hook;
-#define InvokeObjectAccessHook(access,classId,objectId,subId) \
+#define InvokeObjectPrepCreateHook(classId,_private,_objname) \
+ do { \
+ if (object_access_hook) \
+ { \
+ ObjectAccessPrepCreateInfo __info; \
+ \
+ __info.common.private = (_private); \
+ __info.common.objname = (_objname); \
+ __info.common.namespaceId = InvalidOid; \
+ \
+ (*object_access_hook)(OAT_PREP_CREATE, \
+ (classId),InvalidOid,0, \
+ PointerGetDatum(&__info)); \
+ } \
+ } while(0)
+
+#define InvokeSchemaObjectPrepCreateHook(classId,_private, \
+ _objname,_namespace) \
+ do { \
+ if (object_access_hook) \
+ { \
+ ObjectAccessPrepCreateInfo __info; \
+ \
+ __info.common.private = (_private); \
+ __info.common.objname = (_objname); \
+ __info.common.namespaceId = (_namespace); \
+ \
+ (*object_access_hook)(OAT_PREP_CREATE, \
+ (classId),InvalidOid,0, \
+ PointerGetDatum(&__info)); \
+ } \
+ } while(0)
+
+#define InvokeDatabasePrepCreateHook(_private,_datname,_source,_tablespace) \
+ do { \
+ if (object_access_hook) \
+ { \
+ ObjectAccessPrepCreateInfo __info; \
+ \
+ __info.pg_database.private = (_private); \
+ __info.pg_database.datname = (_datname); \
+ __info.pg_database.datsourceId = (_source); \
+ __info.pg_database.tablespaceId = (_tablespace); \
+ \
+ (*object_access_hook)(OAT_PREP_CREATE, \
+ DatabaseRelationId,InvalidOid,0, \
+ PointerGetDatum(&__info)); \
+ } \
+ } while (0)
+
+#define InvokeRelationPrepCreateHook(_private,_relname,_relkind, \
+ _namespace,_tablespace,_tupdesc) \
do { \
if (object_access_hook) \
- (*object_access_hook)((access),(classId),(objectId),(subId)); \
+ { \
+ ObjectAccessPrepCreateInfo __info; \
+ \
+ __info.pg_class.private = (_private); \
+ __info.pg_class.relname = (_relname); \
+ __info.pg_class.relkind = (_relkind); \
+ __info.pg_class.namespaceId = (_namespace); \
+ __info.pg_class.tablespaceId = (_tablespace); \
+ __info.pg_class.tupdesc = (_tupdesc); \
+ \
+ (*object_access_hook)(OAT_PREP_CREATE, \
+ RelationRelationId,InvalidOid,0, \
+ PointerGetDatum(&__info)); \
+ } \
+ } while(0)
+
+#define InvokeProcedurePrepCreateHook(_private,_proname,_proargs, \
+ _namespace,_language,_leakproof) \
+ do { \
+ if (object_access_hook) \
+ { \
+ ObjectAccessPrepCreateInfo __info; \
+ \
+ __info.pg_proc.private = (_private); \
+ __info.pg_proc.proname = (_proname); \
+ __info.pg_proc.proargs = (_proargs); \
+ __info.pg_proc.namespaceId = (_namespace); \
+ __info.pg_proc.languageId = (_language); \
+ __info.pg_proc.leakproof = (_leakproof); \
+ \
+ (*object_access_hook)(OAT_PREP_CREATE, \
+ ProcedureRelationId, InvalidOid, 0, \
+ PointerGetDatum(&__info)); \
+ } \
+ } while(0)
+
+#define InvokeObjectAccessHook(access,classId,objectId,subId,argment) \
+ do { \
+ if (object_access_hook) \
+ (*object_access_hook)((access),(classId), \
+ (objectId),(subId),(argment)); \
} while(0)
#endif /* OBJECTACCESS_H */
diff --git a/src/include/catalog/pg_aggregate.h b/src/include/catalog/pg_aggregate.h
index 26966d2..7b2d172 100644
--- a/src/include/catalog/pg_aggregate.h
+++ b/src/include/catalog/pg_aggregate.h
@@ -237,6 +237,7 @@ extern void AggregateCreate(const char *aggName,
List *aggfinalfnName,
List *aggsortopName,
Oid aggTransType,
- const char *agginitval);
+ const char *agginitval,
+ Datum hook_private);
#endif /* PG_AGGREGATE_H */
diff --git a/src/include/catalog/pg_namespace.h b/src/include/catalog/pg_namespace.h
index 680802d7..eedcf1b 100644
--- a/src/include/catalog/pg_namespace.h
+++ b/src/include/catalog/pg_namespace.h
@@ -77,6 +77,7 @@ DESCR("standard public schema");
/*
* prototypes for functions in pg_namespace.c
*/
-extern Oid NamespaceCreate(const char *nspName, Oid ownerId);
+extern Oid NamespaceCreate(const char *nspName, Oid ownerId,
+ Datum hook_private);
#endif /* PG_NAMESPACE_H */
diff --git a/src/include/catalog/pg_proc_fn.h b/src/include/catalog/pg_proc_fn.h
index 09d779f..a28786f 100644
--- a/src/include/catalog/pg_proc_fn.h
+++ b/src/include/catalog/pg_proc_fn.h
@@ -37,7 +37,8 @@ extern Oid ProcedureCreate(const char *procedureName,
List *parameterDefaults,
Datum proconfig,
float4 procost,
- float4 prorows);
+ float4 prorows,
+ Datum hook_private);
extern bool function_parse_error_transpose(const char *prosrc);
diff --git a/src/include/catalog/pg_type_fn.h b/src/include/catalog/pg_type_fn.h
index 81e7d7f..f47c7b6 100644
--- a/src/include/catalog/pg_type_fn.h
+++ b/src/include/catalog/pg_type_fn.h
@@ -19,7 +19,8 @@
extern Oid TypeShellMake(const char *typeName,
Oid typeNamespace,
- Oid ownerId);
+ Oid ownerId,
+ Datum hook_private);
extern Oid TypeCreate(Oid newTypeOid,
const char *typeName,
@@ -51,7 +52,8 @@ extern Oid TypeCreate(Oid newTypeOid,
int32 typeMod,
int32 typNDims,
bool typeNotNull,
- Oid typeCollation);
+ Oid typeCollation,
+ Datum hook_private);
extern void GenerateTypeDependencies(Oid typeNamespace,
Oid typeObjectId,