mirror of
https://github.com/postgres/postgres.git
synced 2025-09-02 04:21:28 +03:00
Extend object-access hook machinery to support post-alter events.
This also slightly widens the scope of what we support in terms of post-create events. KaiGai Kohei, with a few changes, mostly to the comments, by me
This commit is contained in:
@@ -96,9 +96,11 @@ extern List *AddRelationNewConstraints(Relation rel,
|
||||
List *newColDefaults,
|
||||
List *newConstraints,
|
||||
bool allow_merge,
|
||||
bool is_local);
|
||||
bool is_local,
|
||||
bool is_internal);
|
||||
|
||||
extern void StoreAttrDefault(Relation rel, AttrNumber attnum, Node *expr);
|
||||
extern void StoreAttrDefault(Relation rel, AttrNumber attnum,
|
||||
Node *expr, bool is_internal);
|
||||
|
||||
extern Node *cookDefault(ParseState *pstate,
|
||||
Node *raw_default,
|
||||
|
@@ -72,7 +72,8 @@ extern void index_constraint_create(Relation heapRelation,
|
||||
bool mark_as_primary,
|
||||
bool update_pgindex,
|
||||
bool remove_old_dependencies,
|
||||
bool allow_system_table_mods);
|
||||
bool allow_system_table_mods,
|
||||
bool is_internal);
|
||||
|
||||
extern void index_drop(Oid indexId, bool concurrent);
|
||||
|
||||
|
@@ -22,6 +22,11 @@
|
||||
* OAT_DROP should be invoked just before deletion of objects; typically
|
||||
* deleteOneObject(). Its arguments are packed within ObjectAccessDrop.
|
||||
*
|
||||
* OAT_POST_ALTER should be invoked just after the object is altered,
|
||||
* but before the command counter is incremented. An extension using the
|
||||
* hook can use SnapshotNow and SnapshotSelf to get the old and new
|
||||
* versions of the tuple.
|
||||
*
|
||||
* Other types may be added in the future.
|
||||
*/
|
||||
typedef enum ObjectAccessType
|
||||
@@ -57,20 +62,51 @@ typedef struct
|
||||
} ObjectAccessDrop;
|
||||
|
||||
/*
|
||||
* Hook, and a macro to invoke it.
|
||||
* Arguments of OAT_POST_ALTER event
|
||||
*/
|
||||
typedef struct
|
||||
{
|
||||
/*
|
||||
* This identifier is used when system catalog takes two IDs
|
||||
* to identify a particular tuple of the catalog.
|
||||
* It is only used when the caller want to identify an entry
|
||||
* of pg_inherits, pg_db_role_setting or pg_user_mapping.
|
||||
* Elsewhere, InvalidOid should be set.
|
||||
*/
|
||||
Oid auxiliary_id;
|
||||
|
||||
/*
|
||||
* If this flag is set, the user hasn't requested that the object be
|
||||
* altered, but we're doing it anyway for some internal reason.
|
||||
* Permissions-checking hooks may want to skip checks if, say, we're
|
||||
* alter the constraints of a temporary heap during CLUSTER.
|
||||
*/
|
||||
bool is_internal;
|
||||
} ObjectAccessPostAlter;
|
||||
|
||||
/* Plugin provides a hook function matching this signature. */
|
||||
typedef void (*object_access_hook_type) (ObjectAccessType access,
|
||||
Oid classId,
|
||||
Oid objectId,
|
||||
int subId,
|
||||
void *arg);
|
||||
|
||||
/* Plugin sets this variable to a suitable hook function. */
|
||||
extern PGDLLIMPORT object_access_hook_type object_access_hook;
|
||||
|
||||
/* Core code uses these functions to call the hook (see macros below). */
|
||||
extern void RunObjectPostCreateHook(Oid classId, Oid objectId, int subId,
|
||||
bool is_internal);
|
||||
extern void RunObjectDropHook(Oid classId, Oid objectId, int subId,
|
||||
int dropflags);
|
||||
extern void RunObjectPostAlterHook(Oid classId, Oid objectId, int subId,
|
||||
Oid auxiliaryId, bool is_internal);
|
||||
|
||||
/*
|
||||
* The following macros are wrappers around the functions above; these should
|
||||
* normally be used to invoke the hook in lieu of calling the above functions
|
||||
* directly.
|
||||
*/
|
||||
|
||||
#define InvokeObjectPostCreateHook(classId,objectId,subId) \
|
||||
InvokeObjectPostCreateHookArg((classId),(objectId),(subId),false)
|
||||
@@ -90,4 +126,15 @@ extern void RunObjectDropHook(Oid classId, Oid objectId, int subId,
|
||||
(dropflags)); \
|
||||
} while(0)
|
||||
|
||||
#define InvokeObjectPostAlterHook(classId,objectId,subId) \
|
||||
InvokeObjectPostAlterHookArg((classId),(objectId),(subId), \
|
||||
InvalidOid,false)
|
||||
#define InvokeObjectPostAlterHookArg(classId,objectId,subId, \
|
||||
auxiliaryId,is_internal) \
|
||||
do { \
|
||||
if (object_access_hook) \
|
||||
RunObjectPostAlterHook((classId),(objectId),(subId), \
|
||||
(auxiliaryId),(is_internal)); \
|
||||
} while(0)
|
||||
|
||||
#endif /* OBJECTACCESS_H */
|
||||
|
@@ -232,7 +232,8 @@ extern Oid CreateConstraintEntry(const char *constraintName,
|
||||
const char *conSrc,
|
||||
bool conIsLocal,
|
||||
int conInhCount,
|
||||
bool conNoInherit);
|
||||
bool conNoInherit,
|
||||
bool is_internal);
|
||||
|
||||
extern void RemoveConstraintById(Oid conId);
|
||||
extern void RenameConstraintById(Oid conId, const char *newname);
|
||||
|
@@ -23,13 +23,14 @@ extern void cluster_rel(Oid tableOid, Oid indexOid, bool recheck,
|
||||
bool verbose, int freeze_min_age, int freeze_table_age);
|
||||
extern void check_index_is_clusterable(Relation OldHeap, Oid indexOid,
|
||||
bool recheck, LOCKMODE lockmode);
|
||||
extern void mark_index_clustered(Relation rel, Oid indexOid);
|
||||
extern void mark_index_clustered(Relation rel, Oid indexOid, bool is_internal);
|
||||
|
||||
extern Oid make_new_heap(Oid OIDOldHeap, Oid NewTableSpace);
|
||||
extern void finish_heap_swap(Oid OIDOldHeap, Oid OIDNewHeap,
|
||||
bool is_system_catalog,
|
||||
bool swap_toast_by_content,
|
||||
bool check_constraints,
|
||||
bool is_internal,
|
||||
TransactionId frozenXid,
|
||||
MultiXactId frozenMulti);
|
||||
|
||||
|
@@ -58,7 +58,7 @@ extern Oid RenameConstraint(RenameStmt *stmt);
|
||||
extern Oid RenameRelation(RenameStmt *stmt);
|
||||
|
||||
extern void RenameRelationInternal(Oid myrelid,
|
||||
const char *newrelname);
|
||||
const char *newrelname, bool is_internal);
|
||||
|
||||
extern void find_composite_type_dependencies(Oid typeOid,
|
||||
Relation origRelation,
|
||||
|
Reference in New Issue
Block a user