summaryrefslogtreecommitdiff
path: root/src/backend
diff options
context:
space:
mode:
authorAlvaro Herrera2015-02-23 17:22:42 +0000
committerAlvaro Herrera2015-02-23 17:22:42 +0000
commit296f3a6053844089bc533630fffafaba8f016384 (patch)
tree8ebe070e54f3809f51dd8ff0452934cdf8960127 /src/backend
parent88e982302684246e8af785e78a467ac37c76dee9 (diff)
Support more commands in event triggers
COMMENT, SECURITY LABEL, and GRANT/REVOKE now also fire ddl_command_start and ddl_command_end event triggers, when they operate on database-local objects. Reviewed-By: Michael Paquier, Andres Freund, Stephen Frost
Diffstat (limited to 'src/backend')
-rw-r--r--src/backend/commands/event_trigger.c34
-rw-r--r--src/backend/tcop/utility.c64
2 files changed, 84 insertions, 14 deletions
diff --git a/src/backend/commands/event_trigger.c b/src/backend/commands/event_trigger.c
index a33a5ada1a9..dcf5b987477 100644
--- a/src/backend/commands/event_trigger.c
+++ b/src/backend/commands/event_trigger.c
@@ -267,8 +267,12 @@ check_ddl_tag(const char *tag)
pg_strcasecmp(tag, "REFRESH MATERIALIZED VIEW") == 0 ||
pg_strcasecmp(tag, "ALTER DEFAULT PRIVILEGES") == 0 ||
pg_strcasecmp(tag, "ALTER LARGE OBJECT") == 0 ||
+ pg_strcasecmp(tag, "COMMENT") == 0 ||
+ pg_strcasecmp(tag, "GRANT") == 0 ||
+ pg_strcasecmp(tag, "REVOKE") == 0 ||
pg_strcasecmp(tag, "DROP OWNED") == 0 ||
- pg_strcasecmp(tag, "IMPORT FOREIGN SCHEMA") == 0)
+ pg_strcasecmp(tag, "IMPORT FOREIGN SCHEMA") == 0 ||
+ pg_strcasecmp(tag, "SECURITY LABEL") == 0)
return EVENT_TRIGGER_COMMAND_TAG_OK;
/*
@@ -1149,6 +1153,34 @@ EventTriggerSupportsObjectClass(ObjectClass objclass)
return true;
}
+bool
+EventTriggerSupportsGrantObjectType(GrantObjectType objtype)
+{
+ switch (objtype)
+ {
+ case ACL_OBJECT_DATABASE:
+ case ACL_OBJECT_TABLESPACE:
+ /* no support for global objects */
+ return false;
+
+ case ACL_OBJECT_COLUMN:
+ case ACL_OBJECT_RELATION:
+ case ACL_OBJECT_SEQUENCE:
+ case ACL_OBJECT_DOMAIN:
+ case ACL_OBJECT_FDW:
+ case ACL_OBJECT_FOREIGN_SERVER:
+ case ACL_OBJECT_FUNCTION:
+ case ACL_OBJECT_LANGUAGE:
+ case ACL_OBJECT_LARGEOBJECT:
+ case ACL_OBJECT_NAMESPACE:
+ case ACL_OBJECT_TYPE:
+ return true;
+ default:
+ Assert(false);
+ return true;
+ }
+}
+
/*
* Prepare event trigger state for a new complete query to run, if necessary;
* returns whether this was done. If it was, EventTriggerEndCompleteQuery must
diff --git a/src/backend/tcop/utility.c b/src/backend/tcop/utility.c
index 3533cfa22d4..fcc2ecdbfb4 100644
--- a/src/backend/tcop/utility.c
+++ b/src/backend/tcop/utility.c
@@ -513,14 +513,6 @@ standard_ProcessUtility(Node *parsetree,
ExecuteTruncate((TruncateStmt *) parsetree);
break;
- case T_CommentStmt:
- CommentObject((CommentStmt *) parsetree);
- break;
-
- case T_SecLabelStmt:
- ExecSecLabelStmt((SecLabelStmt *) parsetree);
- break;
-
case T_CopyStmt:
{
uint64 processed;
@@ -548,11 +540,6 @@ standard_ProcessUtility(Node *parsetree,
DeallocateQuery((DeallocateStmt *) parsetree);
break;
- case T_GrantStmt:
- /* no event triggers for global objects */
- ExecuteGrantStmt((GrantStmt *) parsetree);
- break;
-
case T_GrantRoleStmt:
/* no event triggers for global objects */
GrantRole((GrantRoleStmt *) parsetree);
@@ -783,6 +770,19 @@ standard_ProcessUtility(Node *parsetree,
* in some cases, so we "fast path" them in the other cases.
*/
+ case T_GrantStmt:
+ {
+ GrantStmt *stmt = (GrantStmt *) parsetree;
+
+ if (EventTriggerSupportsGrantObjectType(stmt->objtype))
+ ProcessUtilitySlow(parsetree, queryString,
+ context, params,
+ dest, completionTag);
+ else
+ ExecuteGrantStmt((GrantStmt *) parsetree);
+ }
+ break;
+
case T_DropStmt:
{
DropStmt *stmt = (DropStmt *) parsetree;
@@ -835,6 +835,32 @@ standard_ProcessUtility(Node *parsetree,
}
break;
+ case T_CommentStmt:
+ {
+ CommentStmt *stmt = (CommentStmt *) parsetree;
+
+ if (EventTriggerSupportsObjectType(stmt->objtype))
+ ProcessUtilitySlow(parsetree, queryString,
+ context, params,
+ dest, completionTag);
+ else
+ CommentObject((CommentStmt *) parsetree);
+ break;
+ }
+
+ case T_SecLabelStmt:
+ {
+ SecLabelStmt *stmt = (SecLabelStmt *) parsetree;
+
+ if (EventTriggerSupportsObjectType(stmt->objtype))
+ ProcessUtilitySlow(parsetree, queryString,
+ context, params,
+ dest, completionTag);
+ else
+ ExecSecLabelStmt(stmt);
+ break;
+ }
+
default:
/* All other statement types have event trigger support */
ProcessUtilitySlow(parsetree, queryString,
@@ -1315,6 +1341,14 @@ ProcessUtilitySlow(Node *parsetree,
ExecAlterOwnerStmt((AlterOwnerStmt *) parsetree);
break;
+ case T_CommentStmt:
+ CommentObject((CommentStmt *) parsetree, NULL);
+ break;
+
+ case T_GrantStmt:
+ ExecuteGrantStmt((GrantStmt *) parsetree);
+ break;
+
case T_DropOwnedStmt:
DropOwnedObjects((DropOwnedStmt *) parsetree);
break;
@@ -1331,6 +1365,10 @@ ProcessUtilitySlow(Node *parsetree,
AlterPolicy((AlterPolicyStmt *) parsetree);
break;
+ case T_SecLabelStmt:
+ ExecSecLabelStmt((SecLabelStmt *) parsetree;
+ break;
+
default:
elog(ERROR, "unrecognized node type: %d",
(int) nodeTag(parsetree));