53#include "utils/fmgroids.h"
54#include "utils/fmgrprotos.h"
142 errmsg(
"permission denied to create event trigger \"%s\"",
144 errhint(
"Must be superuser to create an event trigger.")));
147 if (
strcmp(
stmt->eventname,
"ddl_command_start") != 0 &&
148 strcmp(
stmt->eventname,
"ddl_command_end") != 0 &&
151 strcmp(
stmt->eventname,
"table_rewrite") != 0)
154 errmsg(
"unrecognized event name \"%s\"",
158 foreach(
lc,
stmt->whenclause)
171 errmsg(
"unrecognized filter variable \"%s\"", def->
defname)));
175 if ((
strcmp(
stmt->eventname,
"ddl_command_start") == 0 ||
176 strcmp(
stmt->eventname,
"ddl_command_end") == 0 ||
180 else if (
strcmp(
stmt->eventname,
"table_rewrite") == 0
186 errmsg(
"tag filtering is not supported for login event triggers")));
196 errmsg(
"event trigger \"%s\" already exists",
205 errmsg(
"function %s must return type %s",
229 errmsg(
"filter value \"%s\" not recognized for filter variable \"%s\"",
235 errmsg(
"event triggers are not supported for %s",
257 errmsg(
"event triggers are not supported for %s",
270 errmsg(
"filter variable \"%s\" specified more than once",
298 memset(nulls,
false,
sizeof(nulls));
322 if (
strcmp(eventname,
"login") == 0)
377 for (p = result; *p; p++)
413 if (!db->dathasloginevt)
415 db->dathasloginevt =
true;
434 char tgenabled =
stmt->tgenabled;
443 errmsg(
"event trigger \"%s\" does not exist",
454 evtForm->evtenabled = tgenabled;
495 errmsg(
"event trigger \"%s\" does not exist",
name)));
527 errmsg(
"event trigger with OID %u does not exist", trigOid)));
557 errmsg(
"permission denied to change owner of event trigger \"%s\"",
559 errhint(
"The owner of an event trigger must be a superuser.")));
589 errmsg(
"event trigger \"%s\" does not exist", trigname)));
662#ifdef USE_ASSERT_CHECKING
974 if (db->dathasloginevt)
976 db->dathasloginevt =
false;
1084 "event trigger context",
1096 elog(
DEBUG1,
"EventTriggerInvoke %u", fnoid);
1198 "event trigger state",
1203 state->in_sql_drop =
false;
1537 errmsg(
"%s can only be called in a sql_drop event trigger function",
1538 "pg_event_trigger_dropped_objects()")));
1548 bool nulls[12] = {0};
1630 errmsg(
"%s can only be called in a table_rewrite event trigger function",
1631 "pg_event_trigger_table_rewrite_oid()")));
1651 errmsg(
"%s can only be called in a table_rewrite event trigger function",
1652 "pg_event_trigger_table_rewrite_reason()")));
1718 const Node *parsetree)
1823 newsub->address = address;
1991 Oid *dictIds,
int ndicts)
2067 errmsg(
"%s can only be called in an event trigger function",
2068 "pg_event_trigger_ddl_commands()")));
2077 bool nulls[9] = {0};
2105 char *schema =
NULL;
2128 if (identity ==
NULL)
2157 elog(
ERROR,
"cache lookup failed for object %u/%u",
2164 "invalid null namespace in object %u/%u/%d",
2226 "GRANT" :
"REVOKE");
2267 return "FOREIGN DATA WRAPPER";
2269 return "FOREIGN SERVER";
2275 return "LARGE OBJECT";
2285 return "TABLESPACE";
2326 elog(
ERROR,
"unsupported object type: %d", (
int) objtype);
2353 return "FOREIGN DATA WRAPPERS";
2355 return "FOREIGN SERVERS";
2361 return "LARGE OBJECTS";
2365 return "PROCEDURES";
2369 return "TABLESPACES";
2411 elog(
ERROR,
"unsupported object type: %d", (
int) objtype);
void aclcheck_error(AclResult aclerr, ObjectType objtype, const char *objectname)
bool object_ownercheck(Oid classid, Oid objectid, Oid roleid)
ArrayType * construct_empty_array(Oid elmtype)
ArrayType * construct_array_builtin(Datum *elems, int nelems, Oid elmtype)
#define InvalidAttrNumber
bool bms_is_member(int x, const Bitmapset *a)
static Datum values[MAXATTR]
#define CStringGetTextDatum(s)
#define Assert(condition)
#define OidIsValid(objectId)
Oid GetNewOidWithIndex(Relation relation, Oid indexId, AttrNumber oidcolumn)
const char * GetCommandTagName(CommandTag commandTag)
CommandTag GetCommandTagEnum(const char *commandname)
bool command_tag_event_trigger_ok(CommandTag commandTag)
bool command_tag_table_rewrite_ok(CommandTag commandTag)
@ SCT_AlterDefaultPrivileges
int errcode(int sqlerrcode)
int errhint(const char *fmt,...) pg_attribute_printf(1
#define ereport(elevel,...)
void EventTriggerUndoInhibitCommandCollection(void)
void EventTriggerSQLDropAddObject(const ObjectAddress *object, bool original, bool normal)
static void AlterEventTriggerOwner_internal(Relation rel, HeapTuple tup, Oid newOwnerId)
void EventTriggerOnLogin(void)
bool trackDroppedObjectsNeeded(void)
void EventTriggerCollectAlterTSConfig(const AlterTSConfigurationStmt *stmt, Oid cfgId, Oid *dictIds, int ndicts)
Datum pg_event_trigger_ddl_commands(PG_FUNCTION_ARGS)
void EventTriggerDDLCommandStart(Node *parsetree)
void EventTriggerInhibitCommandCollection(void)
bool EventTriggerBeginCompleteQuery(void)
static bool filter_event_trigger(CommandTag tag, EventTriggerCacheItem *item)
void EventTriggerTableRewrite(Node *parsetree, Oid tableOid, int reason)
static bool obtain_object_name_namespace(const ObjectAddress *object, SQLDropObject *obj)
bool EventTriggerSupportsObject(const ObjectAddress *object)
bool EventTriggerSupportsObjectType(ObjectType obtype)
Oid CreateEventTrigger(CreateEventTrigStmt *stmt)
void EventTriggerCollectAlterTableSubcmd(const Node *subcmd, ObjectAddress address)
static void validate_table_rewrite_tags(const char *filtervar, List *taglist)
Oid AlterEventTrigger(AlterEventTrigStmt *stmt)
static const char * stringify_adefprivs_objtype(ObjectType objtype)
void EventTriggerCollectCreateOpClass(const CreateOpClassStmt *stmt, Oid opcoid, List *operators, List *procedures)
void EventTriggerCollectGrant(InternalGrant *istmt)
Datum pg_event_trigger_table_rewrite_reason(PG_FUNCTION_ARGS)
void EventTriggerSQLDrop(Node *parsetree)
Datum pg_event_trigger_dropped_objects(PG_FUNCTION_ARGS)
static CommandTag EventTriggerGetTag(Node *parsetree, EventTriggerEvent event)
void EventTriggerEndCompleteQuery(void)
Datum pg_event_trigger_table_rewrite_oid(PG_FUNCTION_ARGS)
static void validate_ddl_tags(const char *filtervar, List *taglist)
void AlterEventTriggerOwner_oid(Oid trigOid, Oid newOwnerId)
void EventTriggerAlterTableRelid(Oid objectId)
void EventTriggerAlterTableStart(const Node *parsetree)
static EventTriggerQueryState * currentEventTriggerState
void EventTriggerAlterTableEnd(void)
static void SetDatabaseHasLoginEventTriggers(void)
static void error_duplicate_filter_variable(const char *defname)
void EventTriggerCollectAlterDefPrivs(const AlterDefaultPrivilegesStmt *stmt)
static const char * stringify_grant_objtype(ObjectType objtype)
void EventTriggerDDLCommandEnd(Node *parsetree)
static Oid insert_event_trigger_tuple(const char *trigname, const char *eventname, Oid evtOwner, Oid funcoid, List *taglist)
static List * EventTriggerCommonSetup(Node *parsetree, EventTriggerEvent event, const char *eventstr, EventTriggerData *trigdata, bool unfiltered)
void EventTriggerCollectSimpleCommand(ObjectAddress address, ObjectAddress secondaryObject, const Node *parsetree)
Oid get_event_trigger_oid(const char *trigname, bool missing_ok)
void EventTriggerCollectAlterOpFam(const AlterOpFamilyStmt *stmt, Oid opfamoid, List *operators, List *procedures)
ObjectAddress AlterEventTriggerOwner(const char *name, Oid newOwnerId)
static void EventTriggerInvoke(List *fn_oid_list, EventTriggerData *trigdata)
static Datum filter_list_to_array(List *filterlist)
List * EventCacheLookup(EventTriggerEvent event)
#define palloc_object(type)
#define palloc_array(type, count)
#define palloc0_object(type)
void fmgr_info(Oid functionId, FmgrInfo *finfo)
#define InitFunctionCallInfoData(Fcinfo, Flinfo, Nargs, Collation, Context, Resultinfo)
#define LOCAL_FCINFO(name, nargs)
#define FunctionCallInvoke(fcinfo)
#define PG_RETURN_INT32(x)
void InitMaterializedSRF(FunctionCallInfo fcinfo, bits32 flags)
void systable_endscan(SysScanDesc sysscan)
void systable_inplace_update_cancel(void *state)
void systable_inplace_update_begin(Relation relation, Oid indexId, bool indexOK, Snapshot snapshot, int nkeys, const ScanKeyData *key, HeapTuple *oldtupcopy, void **state)
void systable_inplace_update_finish(void *state, HeapTuple tuple)
HeapTuple systable_getnext(SysScanDesc sysscan)
SysScanDesc systable_beginscan(Relation heapRelation, Oid indexId, bool indexOK, Snapshot snapshot, int nkeys, ScanKey key)
bool MyDatabaseHasLoginEventTriggers
HeapTuple heap_form_tuple(TupleDesc tupleDescriptor, const Datum *values, const bool *isnull)
void heap_freetuple(HeapTuple htup)
#define HeapTupleIsValid(tuple)
static Datum heap_getattr(HeapTuple tup, int attnum, TupleDesc tupleDesc, bool *isnull)
static void * GETSTRUCT(const HeapTupleData *tuple)
static void slist_init(slist_head *head)
static bool slist_is_empty(const slist_head *head)
static void slist_push_head(slist_head *head, slist_node *node)
#define slist_container(type, membername, ptr)
#define slist_foreach(iter, lhead)
void CatalogTupleUpdate(Relation heapRel, const ItemPointerData *otid, HeapTuple tup)
void CatalogTupleInsert(Relation heapRel, HeapTuple tup)
List * lappend(List *list, void *datum)
List * list_copy(const List *oldlist)
List * lappend_oid(List *list, Oid datum)
void list_free(List *list)
void UnlockTuple(Relation relation, const ItemPointerData *tid, LOCKMODE lockmode)
void LockSharedObject(Oid classid, Oid objid, uint16 objsubid, LOCKMODE lockmode)
bool ConditionalLockSharedObject(Oid classid, Oid objid, uint16 objsubid, LOCKMODE lockmode)
#define AccessExclusiveLock
#define InplaceUpdateTupleLock
char * get_namespace_name_or_temp(Oid nspid)
char * get_namespace_name(Oid nspid)
Oid get_func_rettype(Oid funcid)
void * MemoryContextAlloc(MemoryContext context, Size size)
void MemoryContextReset(MemoryContext context)
char * pstrdup(const char *in)
void pfree(void *pointer)
MemoryContext TopMemoryContext
MemoryContext CurrentMemoryContext
void MemoryContextDelete(MemoryContext context)
#define AllocSetContextCreate
#define ALLOCSET_DEFAULT_SIZES
int namestrcmp(Name name, const char *str)
void namestrcpy(Name name, const char *str)
char * NameListToString(const List *names)
bool isTempNamespace(Oid namespaceId)
bool isAnyTempNamespace(Oid namespaceId)
#define IsA(nodeptr, _type_)
#define InvokeObjectPostCreateHook(classId, objectId, subId)
#define InvokeObjectPostAlterHook(classId, objectId, subId)
char * getObjectTypeDescription(const ObjectAddress *object, bool missing_ok)
ArrayType * strlist_to_textarray(List *list)
bool get_object_namensp_unique(Oid class_id)
HeapTuple get_catalog_object_by_oid(Relation catalog, AttrNumber oidcol, Oid objectId)
AttrNumber get_object_attnum_oid(Oid class_id)
AttrNumber get_object_attnum_namespace(Oid class_id)
char * getObjectIdentityParts(const ObjectAddress *object, List **objname, List **objargs, bool missing_ok)
AttrNumber get_object_attnum_name(Oid class_id)
char * getObjectIdentity(const ObjectAddress *object, bool missing_ok)
bool is_objectclass_supported(Oid class_id)
#define ObjectAddressSet(addr, class_id, object_id)
static MemoryContext MemoryContextSwitchTo(MemoryContext context)
Oid LookupFuncName(List *funcname, int nargs, const Oid *argtypes, bool missing_ok)
@ OBJECT_PUBLICATION_NAMESPACE
ObjectAddress GetAttrDefaultColumnAddress(Oid attrdefoid)
END_CATALOG_STRUCT typedef FormData_pg_database * Form_pg_database
void recordDependencyOn(const ObjectAddress *depender, const ObjectAddress *referenced, DependencyType behavior)
void recordDependencyOnCurrentExtension(const ObjectAddress *object, bool isReplace)
END_CATALOG_STRUCT typedef FormData_pg_event_trigger * Form_pg_event_trigger
static int list_length(const List *l)
END_CATALOG_STRUCT typedef FormData_pg_policy * Form_pg_policy
void changeDependencyOnOwner(Oid classId, Oid objectId, Oid newOwnerId)
void recordDependencyOnOwner(Oid classId, Oid objectId, Oid owner)
END_CATALOG_STRUCT typedef FormData_pg_trigger * Form_pg_trigger
void pgstat_init_function_usage(FunctionCallInfo fcinfo, PgStat_FunctionCallUsage *fcu)
void pgstat_end_function_usage(PgStat_FunctionCallUsage *fcu, bool finalize)
static unsigned char pg_ascii_toupper(unsigned char ch)
static Datum PointerGetDatum(const void *X)
static Name DatumGetName(Datum X)
static Oid DatumGetObjectId(Datum X)
static Datum BoolGetDatum(bool X)
static Datum ObjectIdGetDatum(Oid X)
static Datum NameGetDatum(const NameData *X)
static Datum CStringGetDatum(const char *X)
static Datum Int32GetDatum(int32 X)
static Datum CharGetDatum(char X)
static color newsub(struct colormap *cm, color co)
#define RelationGetDescr(relation)
void ScanKeyInit(ScanKey entry, AttrNumber attributeNumber, StrategyNumber strategy, RegProcedure procedure, Datum argument)
Snapshot GetTransactionSnapshot(void)
void PushActiveSnapshot(Snapshot snapshot)
void PopActiveSnapshot(void)
void check_stack_depth(void)
#define BTEqualStrategyNumber
#define ERRCODE_DUPLICATE_OBJECT
CollectedCommandType type
struct CollectedCommand::@134::@138 opfam
struct CollectedCommand::@134::@135 simple
struct CollectedCommand::@134::@141 defprivs
struct CollectedCommand * parent
struct CollectedCommand::@134::@136 alterTable
union CollectedCommand::@134 d
struct CollectedCommand::@134::@137 grant
struct CollectedCommand::@134::@140 atscfg
struct CollectedCommand::@134::@139 createopc
ObjectAddress secondaryObject
struct EventTriggerQueryState * previous
CollectedCommand * currentCommand
bool commandCollectionInhibited
bool superuser_arg(Oid roleid)
HeapTuple SearchSysCacheLockedCopy1(SysCacheIdentifier cacheId, Datum key1)
HeapTuple SearchSysCache1(SysCacheIdentifier cacheId, Datum key1)
#define SearchSysCacheCopy1(cacheId, key1)
#define GetSysCacheOid1(cacheId, oidcol, key1)
void table_close(Relation relation, LOCKMODE lockmode)
Relation table_open(Oid relationId, LOCKMODE lockmode)
int SessionReplicationRole
#define SESSION_REPLICATION_ROLE_REPLICA
#define TRIGGER_FIRES_ON_ORIGIN
#define TRIGGER_FIRES_ON_REPLICA
void tuplestore_putvalues(Tuplestorestate *state, TupleDesc tdesc, const Datum *values, const bool *isnull)
CommandTag CreateCommandTag(Node *parsetree)
static const char * CreateCommandName(Node *parsetree)
text * cstring_to_text(const char *s)
void CommandCounterIncrement(void)
void StartTransactionCommand(void)
void CommitTransactionCommand(void)