I made a patch for this. I have expanded the narrative discussion on
what commands are supported for event triggers, also made a few
corrections/additions there, based on inspecting the source code. And
then removed the big matrix, which doesn't provide any additional
information, I think.
I think this is sufficient and covers everything. The only hand-wavy
thing I can see is exactly which ALTER commands trigger the sql_drop
event. But this was already quite imprecise before, and I think also
not quite correct. This might need a separate investigation.
In any case, we can use this as a starting point to iterate on the right
wording etc.
From 8de37230f50b6a47c89fc5f5d0ea1010b635be62 Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <pe...@eisentraut.org>
Date: Tue, 29 Oct 2024 11:58:32 +0100
Subject: [PATCH] doc: Remove event trigger firing matrix
This is difficult to maintain accurately, and it was probably already
somewhat incorrect, especially in the sql_drop and table_rewrite
categories.
The prior section already documented which DDL commands are *not*
supported (which was also slightly outdated), so let's just rely on
that instead of listing out each command in full detail.
Discussion:
https://www.postgresql.org/message-id/flat/CACJufxE_UAuxcM08BW5oVsg34v0cFWoEt8yBa5xSAoKLmL6LTQ%40mail.gmail.com
---
doc/src/sgml/event-trigger.sgml | 1022 ++------------------------
src/backend/commands/event_trigger.c | 4 +-
src/backend/tcop/utility.c | 3 +
3 files changed, 79 insertions(+), 950 deletions(-)
diff --git a/doc/src/sgml/event-trigger.sgml b/doc/src/sgml/event-trigger.sgml
index cfa7b3d1b2d..2cfe8d4f278 100644
--- a/doc/src/sgml/event-trigger.sgml
+++ b/doc/src/sgml/event-trigger.sgml
@@ -26,7 +26,7 @@ <title>Overview of Event Trigger Behavior</title>
<para>
An event trigger fires whenever the event with which it is associated
- occurs in the database in which it is defined. Currently, the only
+ occurs in the database in which it is defined. Currently, the
supported events are
<literal>login</literal>,
<literal>ddl_command_start</literal>,
@@ -36,6 +36,9 @@ <title>Overview of Event Trigger Behavior</title>
Support for additional events may be added in future releases.
</para>
+ <sect2 id="event-trigger-login">
+ <title>login</title>
+
<para>
The <literal>login</literal> event occurs when an authenticated user logs
into the system. Any bug in a trigger procedure for this event may
@@ -58,26 +61,57 @@ <title>Overview of Event Trigger Behavior</title>
For an example on how to use the <literal>login</literal> event trigger,
see <xref linkend="event-trigger-database-login-example"/>.
</para>
+ </sect2>
+
+ <sect2 id="event-trigger-ddl_command_start">
+ <title>ddl_command_start</title>
<para>
The <literal>ddl_command_start</literal> event occurs just before the
- execution of a <literal>CREATE</literal>, <literal>ALTER</literal>,
<literal>DROP</literal>,
- <literal>SECURITY LABEL</literal>,
- <literal>COMMENT</literal>, <literal>GRANT</literal> or
<literal>REVOKE</literal>
- command. No check whether the affected object exists or doesn't exist is
- performed before the event trigger fires.
- As an exception, however, this event does not occur for
- DDL commands targeting shared objects — databases, roles, and
tablespaces
- — or for commands targeting event triggers themselves. The event
trigger
- mechanism does not support these object types.
- <literal>ddl_command_start</literal> also occurs just before the
execution of a
- <literal>SELECT INTO</literal> command, since this is equivalent to
- <literal>CREATE TABLE AS</literal>.
+ execution of a DDL command. DDL commands in this context are:
+ <itemizedlist>
+ <listitem><para><literal>CREATE</literal></para></listitem>
+ <listitem><para><literal>ALTER</literal></para></listitem>
+ <listitem><para><literal>DROP</literal></para></listitem>
+ <listitem><para><literal>COMMENT</literal></para></listitem>
+ <listitem><para><literal>GRANT</literal></para></listitem>
+ <listitem><para><literal>IMPORT FOREIGN
SCHEMA</literal></para></listitem>
+ <listitem><para><literal>REINDEX</literal></para></listitem>
+ <listitem><para><literal>REFRESH MATERIALIZED
VIEW</literal></para></listitem>
+ <listitem><para><literal>REVOKE</literal></para></listitem>
+ <listitem><para><literal>SECURITY LABEL</literal></para></listitem>
+ </itemizedlist>
+ <literal>ddl_command_start</literal> also occurs just before the
+ execution of a <literal>SELECT INTO</literal> command, since this is
+ equivalent to <literal>CREATE TABLE AS</literal>.
</para>
+ <para>
+ As an exception, this event does not occur for DDL commands targeting
+ shared objects:
+ <itemizedlist>
+ <listitem><para>databases</para></listitem>
+ <listitem><para>roles</para></listitem>
+ <listitem><para>tablespaces</para></listitem>
+ <listitem><para>parameter privileges</para></listitem>
+ <listitem><para><command>ALTER SYSTEM</command></para></listitem>
+ </itemizedlist>
+ This event also does not occur for commands targeting event triggers
+ themselves.
+ </para>
+
+ <para>
+ No check whether the affected object exists or doesn't exist is performed
+ before the event trigger fires.
+ </para>
+ </sect2>
+
+ <sect2 id="event-trigger-ddl_command_end">
+ <title>ddl_command_end</title>
+
<para>
The <literal>ddl_command_end</literal> event occurs just after the
execution of
- this same set of commands. To obtain more details on the
<acronym>DDL</acronym>
+ the same set of commands as <literal>ddl_command_start</literal>. To
obtain more details on the <acronym>DDL</acronym>
operations that took place, use the set-returning function
<literal>pg_event_trigger_ddl_commands()</literal> from the
<literal>ddl_command_end</literal> event trigger code (see
@@ -86,10 +120,21 @@ <title>Overview of Event Trigger Behavior</title>
and thus the system catalogs can be read as already changed.
</para>
+ </sect2>
+
+ <sect2 id="event-trigger-sql_drop">
+ <title>sql_drop</title>
+
<para>
The <literal>sql_drop</literal> event occurs just before the
<literal>ddl_command_end</literal> event trigger for any operation that
drops
- database objects. To list the objects that have been dropped, use the
+ database objects. Note that besides the obvious <literal>DROP</literal>
+ commands, some <literal>ALTER</literal> commands can also trigger an
+ <literal>sql_drop</literal> event.
+ </para>
+
+ <para>
+ To list the objects that have been dropped, use the
set-returning function
<literal>pg_event_trigger_dropped_objects()</literal> from the
<literal>sql_drop</literal> event trigger code (see
<xref linkend="functions-event-triggers"/>). Note that
@@ -97,6 +142,11 @@ <title>Overview of Event Trigger Behavior</title>
system catalogs, so it's not possible to look them up anymore.
</para>
+ </sect2>
+
+ <sect2 id="event-trigger-table_rewrite">
+ <title>table_rewrite</title>
+
<para>
The <literal>table_rewrite</literal> event occurs just before a table is
rewritten by some actions of the commands <literal>ALTER TABLE</literal>
and
@@ -111,6 +161,11 @@ <title>Overview of Event Trigger Behavior</title>
<literal>pg_event_trigger_table_rewrite_reason()</literal>.
</para>
+ </sect2>
+
+ <sect2 id="event-trigger-aborted-transactions">
+ <title>Event Triggers in Aborted Transactions</title>
+
<para>
Event triggers (like other functions) cannot be executed in an aborted
transaction. Thus, if a DDL command fails with an error, any associated
@@ -122,11 +177,10 @@ <title>Overview of Event Trigger Behavior</title>
back, just as they would be in any other case where the containing
transaction aborts.
</para>
+ </sect2>
- <para>
- For a complete list of commands supported by the event trigger mechanism,
- see <xref linkend="event-trigger-matrix"/>.
- </para>
+ <sect2 id="event-trigger-creating">
+ <title>Creating Event Triggers</title>
<para>
Event triggers are created using the command <xref
linkend="sql-createeventtrigger"/>.
@@ -148,935 +202,7 @@ <title>Overview of Event Trigger Behavior</title>
to intercept. A common use of such triggers is to restrict the range of
DDL operations which users may perform.
</para>
- </sect1>
-
- <sect1 id="event-trigger-matrix">
- <title>Event Trigger Firing Matrix</title>
-
- <para>
- <xref linkend="event-trigger-by-command-tag"/> lists all commands
- for which event triggers are supported.
- </para>
-
- <table id="event-trigger-by-command-tag">
- <title>Event Trigger Support by Command Tag</title>
- <tgroup cols="6">
- <colspec colname="col1" colwidth="2*"/>
- <colspec colname="col2" colwidth="1*"/>
- <colspec colname="col3" colwidth="1*"/>
- <colspec colname="col4" colwidth="1*"/>
- <colspec colname="col5" colwidth="1*"/>
- <colspec colname="col6" colwidth="1*"/>
- <thead>
- <row>
- <entry>Command Tag</entry>
- <entry><literal>ddl_&zwsp;command_&zwsp;start</literal></entry>
- <entry><literal>ddl_&zwsp;command_&zwsp;end</literal></entry>
- <entry><literal>sql_&zwsp;drop</literal></entry>
- <entry><literal>table_&zwsp;rewrite</literal></entry>
- <entry>Notes</entry>
- </row>
- </thead>
- <tbody>
- <row>
- <entry align="left"><literal>ALTER AGGREGATE</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="left"></entry>
- </row>
- <row>
- <entry align="left"><literal>ALTER COLLATION</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="left"></entry>
- </row>
- <row>
- <entry align="left"><literal>ALTER CONVERSION</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="left"></entry>
- </row>
- <row>
- <entry align="left"><literal>ALTER DOMAIN</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="left"></entry>
- </row>
- <row>
- <entry align="left"><literal>ALTER DEFAULT PRIVILEGES</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="left"></entry>
- </row>
- <row>
- <entry align="left"><literal>ALTER EXTENSION</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="left"></entry>
- </row>
- <row>
- <entry align="left"><literal>ALTER FOREIGN DATA
WRAPPER</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="left"></entry>
- </row>
- <row>
- <entry align="left"><literal>ALTER FOREIGN TABLE</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="left"></entry>
- </row>
- <row>
- <entry align="left"><literal>ALTER FUNCTION</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="left"></entry>
- </row>
- <row>
- <entry align="left"><literal>ALTER LANGUAGE</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="left"></entry>
- </row>
- <row>
- <entry align="left"><literal>ALTER LARGE OBJECT</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="left"></entry>
- </row>
- <row>
- <entry align="left"><literal>ALTER MATERIALIZED VIEW</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="left"></entry>
- </row>
- <row>
- <entry align="left"><literal>ALTER OPERATOR</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="left"></entry>
- </row>
- <row>
- <entry align="left"><literal>ALTER OPERATOR CLASS</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="left"></entry>
- </row>
- <row>
- <entry align="left"><literal>ALTER OPERATOR FAMILY</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="left"></entry>
- </row>
- <row>
- <entry align="left"><literal>ALTER POLICY</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="left"></entry>
- </row>
- <row>
- <entry align="left"><literal>ALTER PROCEDURE</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="left"></entry>
- </row>
- <row>
- <entry align="left"><literal>ALTER PUBLICATION</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="left"></entry>
- </row>
- <row>
- <entry align="left"><literal>ALTER ROUTINE</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="left"></entry>
- </row>
- <row>
- <entry align="left"><literal>ALTER SCHEMA</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="left"></entry>
- </row>
- <row>
- <entry align="left"><literal>ALTER SEQUENCE</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="left"></entry>
- </row>
- <row>
- <entry align="left"><literal>ALTER SERVER</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="left"></entry>
- </row>
- <row>
- <entry align="left"><literal>ALTER STATISTICS</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="left"></entry>
- </row>
- <row>
- <entry align="left"><literal>ALTER SUBSCRIPTION</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="left"></entry>
- </row>
- <row>
- <entry align="left"><literal>ALTER TABLE</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="left"></entry>
- </row>
- <row>
- <entry align="left"><literal>ALTER TEXT SEARCH
CONFIGURATION</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="left"></entry>
- </row>
- <row>
- <entry align="left"><literal>ALTER TEXT SEARCH
DICTIONARY</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="left"></entry>
- </row>
- <row>
- <entry align="left"><literal>ALTER TEXT SEARCH PARSER</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="left"></entry>
- </row>
- <row>
- <entry align="left"><literal>ALTER TEXT SEARCH
TEMPLATE</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="left"></entry>
- </row>
- <row>
- <entry align="left"><literal>ALTER TRIGGER</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="left"></entry>
- </row>
- <row>
- <entry align="left"><literal>ALTER TYPE</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="left"></entry>
- </row>
- <row>
- <entry align="left"><literal>ALTER USER MAPPING</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="left"></entry>
- </row>
- <row>
- <entry align="left"><literal>ALTER VIEW</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="left"></entry>
- </row>
- <row>
- <entry align="left"><literal>COMMENT</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="left">Only for local objects</entry>
- </row>
- <row>
- <entry align="left"><literal>CREATE ACCESS METHOD</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="left"></entry>
- </row>
- <row>
- <entry align="left"><literal>CREATE AGGREGATE</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="left"></entry>
- </row>
- <row>
- <entry align="left"><literal>CREATE CAST</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="left"></entry>
- </row>
- <row>
- <entry align="left"><literal>CREATE COLLATION</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="left"></entry>
- </row>
- <row>
- <entry align="left"><literal>CREATE CONVERSION</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="left"></entry>
- </row>
- <row>
- <entry align="left"><literal>CREATE DOMAIN</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="left"></entry>
- </row>
- <row>
- <entry align="left"><literal>CREATE EXTENSION</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="left"></entry>
- </row>
- <row>
- <entry align="left"><literal>CREATE FOREIGN DATA
WRAPPER</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="left"></entry>
- </row>
- <row>
- <entry align="left"><literal>CREATE FOREIGN TABLE</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="left"></entry>
- </row>
- <row>
- <entry align="left"><literal>CREATE FUNCTION</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="left"></entry>
- </row>
- <row>
- <entry align="left"><literal>CREATE INDEX</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="left"></entry>
- </row>
- <row>
- <entry align="left"><literal>CREATE LANGUAGE</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="left"></entry>
- </row>
- <row>
- <entry align="left"><literal>CREATE MATERIALIZED VIEW</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="left"></entry>
- </row>
- <row>
- <entry align="left"><literal>CREATE OPERATOR</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="left"></entry>
- </row>
- <row>
- <entry align="left"><literal>CREATE OPERATOR CLASS</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="left"></entry>
- </row>
- <row>
- <entry align="left"><literal>CREATE OPERATOR FAMILY</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="left"></entry>
- </row>
- <row>
- <entry align="left"><literal>CREATE POLICY</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="left"></entry>
- </row>
- <row>
- <entry align="left"><literal>CREATE PROCEDURE</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="left"></entry>
- </row>
- <row>
- <entry align="left"><literal>CREATE PUBLICATION</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="left"></entry>
- </row>
- <row>
- <entry align="left"><literal>CREATE RULE</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="left"></entry>
- </row>
- <row>
- <entry align="left"><literal>CREATE SCHEMA</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="left"></entry>
- </row>
- <row>
- <entry align="left"><literal>CREATE SEQUENCE</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="left"></entry>
- </row>
- <row>
- <entry align="left"><literal>CREATE SERVER</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="left"></entry>
- </row>
- <row>
- <entry align="left"><literal>CREATE STATISTICS</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="left"></entry>
- </row>
- <row>
- <entry align="left"><literal>CREATE SUBSCRIPTION</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="left"></entry>
- </row>
- <row>
- <entry align="left"><literal>CREATE TABLE</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="left"></entry>
- </row>
- <row>
- <entry align="left"><literal>CREATE TABLE AS</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="left"></entry>
- </row>
- <row>
- <entry align="left"><literal>CREATE TEXT SEARCH
CONFIGURATION</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="left"></entry>
- </row>
- <row>
- <entry align="left"><literal>CREATE TEXT SEARCH
DICTIONARY</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="left"></entry>
- </row>
- <row>
- <entry align="left"><literal>CREATE TEXT SEARCH
PARSER</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="left"></entry>
- </row>
- <row>
- <entry align="left"><literal>CREATE TEXT SEARCH
TEMPLATE</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="left"></entry>
- </row>
- <row>
- <entry align="left"><literal>CREATE TRIGGER</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="left"></entry>
- </row>
- <row>
- <entry align="left"><literal>CREATE TYPE</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="left"></entry>
- </row>
- <row>
- <entry align="left"><literal>CREATE USER MAPPING</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="left"></entry>
- </row>
- <row>
- <entry align="left"><literal>CREATE VIEW</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="left"></entry>
- </row>
- <row>
- <entry align="left"><literal>DROP ACCESS METHOD</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="left"></entry>
- </row>
- <row>
- <entry align="left"><literal>DROP AGGREGATE</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="left"></entry>
- </row>
- <row>
- <entry align="left"><literal>DROP CAST</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="left"></entry>
- </row>
- <row>
- <entry align="left"><literal>DROP COLLATION</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="left"></entry>
- </row>
- <row>
- <entry align="left"><literal>DROP CONVERSION</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="left"></entry>
- </row>
- <row>
- <entry align="left"><literal>DROP DOMAIN</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="left"></entry>
- </row>
- <row>
- <entry align="left"><literal>DROP EXTENSION</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="left"></entry>
- </row>
- <row>
- <entry align="left"><literal>DROP FOREIGN DATA
WRAPPER</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="left"></entry>
- </row>
- <row>
- <entry align="left"><literal>DROP FOREIGN TABLE</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="left"></entry>
- </row>
- <row>
- <entry align="left"><literal>DROP FUNCTION</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="left"></entry>
- </row>
- <row>
- <entry align="left"><literal>DROP INDEX</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="left"></entry>
- </row>
- <row>
- <entry align="left"><literal>DROP LANGUAGE</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="left"></entry>
- </row>
- <row>
- <entry align="left"><literal>DROP MATERIALIZED VIEW</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="left"></entry>
- </row>
- <row>
- <entry align="left"><literal>DROP OPERATOR</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="left"></entry>
- </row>
- <row>
- <entry align="left"><literal>DROP OPERATOR CLASS</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="left"></entry>
- </row>
- <row>
- <entry align="left"><literal>DROP OPERATOR FAMILY</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="left"></entry>
- </row>
- <row>
- <entry align="left"><literal>DROP OWNED</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="left"></entry>
- </row>
- <row>
- <entry align="left"><literal>DROP POLICY</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="left"></entry>
- </row>
- <row>
- <entry align="left"><literal>DROP PROCEDURE</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="left"></entry>
- </row>
- <row>
- <entry align="left"><literal>DROP PUBLICATION</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="left"></entry>
- </row>
- <row>
- <entry align="left"><literal>DROP ROUTINE</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="left"></entry>
- </row>
- <row>
- <entry align="left"><literal>DROP RULE</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="left"></entry>
- </row>
- <row>
- <entry align="left"><literal>DROP SCHEMA</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="left"></entry>
- </row>
- <row>
- <entry align="left"><literal>DROP SEQUENCE</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="left"></entry>
- </row>
- <row>
- <entry align="left"><literal>DROP SERVER</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="left"></entry>
- </row>
- <row>
- <entry align="left"><literal>DROP STATISTICS</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="left"></entry>
- </row>
- <row>
- <entry align="left"><literal>DROP SUBSCRIPTION</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="left"></entry>
- </row>
- <row>
- <entry align="left"><literal>DROP TABLE</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="left"></entry>
- </row>
- <row>
- <entry align="left"><literal>DROP TEXT SEARCH
CONFIGURATION</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="left"></entry>
- </row>
- <row>
- <entry align="left"><literal>DROP TEXT SEARCH
DICTIONARY</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="left"></entry>
- </row>
- <row>
- <entry align="left"><literal>DROP TEXT SEARCH PARSER</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="left"></entry>
- </row>
- <row>
- <entry align="left"><literal>DROP TEXT SEARCH
TEMPLATE</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="left"></entry>
- </row>
- <row>
- <entry align="left"><literal>DROP TRIGGER</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="left"></entry>
- </row>
- <row>
- <entry align="left"><literal>DROP TYPE</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="left"></entry>
- </row>
- <row>
- <entry align="left"><literal>DROP USER MAPPING</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="left"></entry>
- </row>
- <row>
- <entry align="left"><literal>DROP VIEW</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="left"></entry>
- </row>
- <row>
- <entry align="left"><literal>GRANT</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="left">Only for local objects</entry>
- </row>
- <row>
- <entry align="left"><literal>IMPORT FOREIGN SCHEMA</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="left"></entry>
- </row>
- <row>
- <entry align="left"><literal>REFRESH MATERIALIZED
VIEW</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="left"></entry>
- </row>
- <row>
- <entry align="left"><literal>REINDEX</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="left"></entry>
- </row>
- <row>
- <entry align="left"><literal>REVOKE</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="left">Only for local objects</entry>
- </row>
- <row>
- <entry align="left"><literal>SECURITY LABEL</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="left">Only for local objects</entry>
- </row>
- <row>
- <entry align="left"><literal>SELECT INTO</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>X</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="center"><literal>-</literal></entry>
- <entry align="left"></entry>
- </row>
- </tbody>
- </tgroup>
- </table>
+ </sect2>
</sect1>
<sect1 id="event-trigger-interface">
diff --git a/src/backend/commands/event_trigger.c
b/src/backend/commands/event_trigger.c
index a586d246ece..dcfc1dbaffd 100644
--- a/src/backend/commands/event_trigger.c
+++ b/src/backend/commands/event_trigger.c
@@ -1123,7 +1123,7 @@ EventTriggerInvoke(List *fn_oid_list, EventTriggerData
*trigdata)
/*
* Do event triggers support this object type?
*
- * See also event trigger support matrix in event-trigger.sgml.
+ * See also event trigger documentation in event-trigger.sgml.
*/
bool
EventTriggerSupportsObjectType(ObjectType obtype)
@@ -1147,7 +1147,7 @@ EventTriggerSupportsObjectType(ObjectType obtype)
/*
* Do event triggers support this object class?
*
- * See also event trigger support matrix in event-trigger.sgml.
+ * See also event trigger documentation in event-trigger.sgml.
*/
bool
EventTriggerSupportsObject(const ObjectAddress *object)
diff --git a/src/backend/tcop/utility.c b/src/backend/tcop/utility.c
index b2ea8125c92..f28bf371059 100644
--- a/src/backend/tcop/utility.c
+++ b/src/backend/tcop/utility.c
@@ -535,6 +535,9 @@ ProcessUtility(PlannedStmt *pstmt,
* event trigger code not be invoked when doing START TRANSACTION for
* example, because we might need to refresh the event trigger cache,
* which requires being in a valid transaction.
+ *
+ * When adding or moving utility commands, check that the documentation in
+ * event-trigger.sgml is kept up to date.
*/
void
standard_ProcessUtility(PlannedStmt *pstmt,
base-commit: 4b7bba49e71266ec378e672a1aaa9f16823449c2
--
2.47.0