doc issues in event-trigger-matrix.html
hi.
I think the "X" and "-" mean in this matrix [0]https://www.postgresql.org/docs/current/event-trigger-matrix.html is not very intuitive.
mainly because "X" tends to mean negative things in most cases.
we can write a sentence saying "X" means this, "-" means that.
or maybe Check mark [1]https://en.wikipedia.org/wiki/Check_mark and Cross mark [2]https://en.wikipedia.org/wiki/X_mark are more universal.
and we can use these marks.
"Only for local objects"
is there any reference explaining "local objects"?
I think local object means objects that only affect one single database?
[0]: https://www.postgresql.org/docs/current/event-trigger-matrix.html
[1]: https://en.wikipedia.org/wiki/Check_mark
[2]: https://en.wikipedia.org/wiki/X_mark
On Tue, Mar 19, 2024 at 08:00:00AM +0800, jian he wrote:
I think the "X" and "-" mean in this matrix [0] is not very intuitive.
mainly because "X" tends to mean negative things in most cases.
we can write a sentence saying "X" means this, "-" means that.or maybe Check mark [1] and Cross mark [2] are more universal.
and we can use these marks."Only for local objects"
is there any reference explaining "local objects"?
I think local object means objects that only affect one single database?
It is true that in Japan the cross mark refers to a negation, and
that's the opposite in France: I would put a cross on a table in the
case where something is supported. I've never seen anybody complain
about the format of these tables, FWIW, but if these were to be
changed, the update should happen across the board for all the tables
and not only one.
Using ASCII characters also has the advantage to make the maintenance
clightly easier, in my opinion, because there is no translation effort
between these special characters and their XML equivalent, like "<"
<-> "<".
--
Michael
On 19 Mar 2024, at 02:14, Michael Paquier <michael@paquier.xyz> wrote:
On Tue, Mar 19, 2024 at 08:00:00AM +0800, jian he wrote:
I think the "X" and "-" mean in this matrix [0] is not very intuitive.
mainly because "X" tends to mean negative things in most cases.
we can write a sentence saying "X" means this, "-" means that.or maybe Check mark [1] and Cross mark [2] are more universal.
and we can use these marks."Only for local objects"
is there any reference explaining "local objects"?
I think local object means objects that only affect one single database?
That's a bigger problem than the table representation, we never define what
"local object" mean anywhere in the EVT docs. EV's are global for a database,
but not a cluster, so I assume what this means is that EVs for non-DDL commands
like COMMENT can only fire for a specific relation they are attached to and not
database wide?
It is true that in Japan the cross mark refers to a negation, and
that's the opposite in France: I would put a cross on a table in the
case where something is supported. I've never seen anybody complain
about the format of these tables, FWIW, but if these were to be
changed, the update should happen across the board for all the tables
and not only one.
AFAICT we only have one other table with "X" denoting support, the "Conflicting
Lock Modes" table under Concurrency Control chapter, and there we simply leave
the "not supported" column empty instead of using a dash. Maybe the simple fix
here is to make these tables consistent by removing the dash from the event
trigger firing matrix?
As a sidenote, the table should gain a sentence explaining why the login column
is missing to avoid confusion.
--
Daniel Gustafsson
On 19.03.24 10:34, Daniel Gustafsson wrote:
"Only for local objects"
is there any reference explaining "local objects"?
I think local object means objects that only affect one single database?That's a bigger problem than the table representation, we never define what
"local object" mean anywhere in the EVT docs. EV's are global for a database,
but not a cluster, so I assume what this means is that EVs for non-DDL commands
like COMMENT can only fire for a specific relation they are attached to and not
database wide?
I think we could replace this whole table by a few definitions:
- "Local objects" are everything except "global objects".
- "Global objects", for the purpose of event triggers, are databases,
tablespaces, roles, role memberships, and parameter ACLs.
- DDL commands are all commands except SELECT, INSERT, UPDATE, DELETE,
MERGE.
- Events triggers are supported for all DDL commands on all local objects.
Is this table saying anything else?
Is there any way to check if it's even correct? For example, it shows
that the event "sql_drop" can fire for a few ALTER commands, but how is
this determined? If tomorrow someone changes ALTER DOMAIN to possibly
do a table rewrite, will they remember to update this table?
On 21 Mar 2024, at 22:47, Peter Eisentraut <peter@eisentraut.org> wrote:
On 19.03.24 10:34, Daniel Gustafsson wrote:
"Only for local objects"
is there any reference explaining "local objects"?
I think local object means objects that only affect one single database?That's a bigger problem than the table representation, we never define what
"local object" mean anywhere in the EVT docs. EV's are global for a database,
but not a cluster, so I assume what this means is that EVs for non-DDL commands
like COMMENT can only fire for a specific relation they are attached to and not
database wide?I think we could replace this whole table by a few definitions:
Simply extending the "Overview of Event Trigger Behavior" section slightly
might even be enough?
If tomorrow someone changes ... will they remember to update this table?
Highly unlikely.
--
Daniel Gustafsson
On Fri, Mar 22, 2024 at 5:47 AM Peter Eisentraut <peter@eisentraut.org> wrote:
On 19.03.24 10:34, Daniel Gustafsson wrote:
"Only for local objects"
is there any reference explaining "local objects"?
I think local object means objects that only affect one single database?That's a bigger problem than the table representation, we never define what
"local object" mean anywhere in the EVT docs. EV's are global for a database,
but not a cluster, so I assume what this means is that EVs for non-DDL commands
like COMMENT can only fire for a specific relation they are attached to and not
database wide?I think we could replace this whole table by a few definitions:
- "Local objects" are everything except "global objects".
- "Global objects", for the purpose of event triggers, are databases,
tablespaces, roles, role memberships, and parameter ACLs.- DDL commands are all commands except SELECT, INSERT, UPDATE, DELETE,
MERGE.- Events triggers are supported for all DDL commands on all local objects.
Is this table saying anything else?
Is there any way to check if it's even correct? For example, it shows
comparing these two html files:
https://www.postgresql.org/docs/devel/sql-commands.html
https://www.postgresql.org/docs/devel/event-trigger-matrix.html
summary:
all commands begin with "CREATE"
except the following two are not supported by event trigger.
CREATE TRANSFORM
CREATE EVENT TRIGGER
generally, one "CREATE" corresponds to one "DROP" and one "ALTER".
but I found there is more to "CREATE" than "ALTER". (i didn't bother why)
there is one more "DROP" than "CREATE",
because of "DROP ROUTINE" and "DROP OWNED"
also
"CREATE TABLE"
"CREATE TABLE AS"
corresponds to one "DROP TABLE"
other command not begin with "CREATE" supported by event trigger (per
event-trigger-matrix) are:
COMMENT
GRANT Only for local objects
IMPORT FOREIGN SCHEMA
REFRESH MATERIALIZED VIEW
REINDEX
REVOKE
SECURITY LABEL
SELECT INTO
all commands
that is not begin with "CREATE" | "DROP", "ALTER" (per sql-commands.html) are:
ABORT
ANALYZE
BEGIN
CALL
CHECKPOINT
CLOSE
CLUSTER
COMMENT
COMMIT
COMMIT PREPARED
COPY
DEALLOCATE
DECLARE
DELETE
DISCARD
DO
END
EXECUTE
EXPLAIN
FETCH
GRANT
IMPORT FOREIGN SCHEMA
INSERT
LISTEN
LOAD
LOCK
MERGE
MOVE
NOTIFY
PREPARE
PREPARE TRANSACTION
REASSIGN OWNED
REFRESH MATERIALIZED VIEW
REINDEX
RELEASE SAVEPOINT
RESET
REVOKE
ROLLBACK
ROLLBACK PREPARED
ROLLBACK TO SAVEPOINT
SAVEPOINT
SECURITY LABEL
SELECT
SELECT INTO
SET
SET CONSTRAINTS
SET ROLE
SET SESSION AUTHORIZATION
SET TRANSACTION
SHOW
START TRANSACTION
TRUNCATE
UNLISTEN
UPDATE
VACUUM
VALUES
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.
Attachments:
0001-doc-Remove-event-trigger-firing-matrix.patchtext/plain; charset=UTF-8; name=0001-doc-Remove-event-trigger-firing-matrix.patchDownload
From 8de37230f50b6a47c89fc5f5d0ea1010b635be62 Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <peter@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
On 29 Oct 2024, at 12:54, Peter Eisentraut <peter@eisentraut.org> wrote:
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.
+1, I think this is a net improvement.
The only thing I would change on top of this is move the reference to section
9.30 under table_rewrite to be at the end after both supporting functions since
the link is relevant to both of them. Something like:
- <literal>pg_event_trigger_table_rewrite_oid()</literal> (see
- <xref linkend="functions-event-triggers"/>). To discover the reason(s)
- for the rewrite, use the function
- <literal>pg_event_trigger_table_rewrite_reason()</literal>.
+ <literal>pg_event_trigger_table_rewrite_oid()</literal> To discover the reason(s)
+ for the rewrite, use the function <literal>pg_event_trigger_table_rewrite_reason()</literal>
+ (see <xref linkend="functions-event-triggers"/>).
--
Daniel Gustafsson
On Tue, Oct 29, 2024 at 03:53:43PM +0100, Daniel Gustafsson wrote:
+1, I think this is a net improvement.
Agreed. I have spent some time looking in the past few years looking
at patches that tweaked this table, and it was always hard to figure
out if it was completely right.
The only thing I would change on top of this is move the reference to section
9.30 under table_rewrite to be at the end after both supporting functions since
the link is relevant to both of them. Something like:- <literal>pg_event_trigger_table_rewrite_oid()</literal> (see - <xref linkend="functions-event-triggers"/>). To discover the reason(s) - for the rewrite, use the function - <literal>pg_event_trigger_table_rewrite_reason()</literal>. + <literal>pg_event_trigger_table_rewrite_oid()</literal> To discover the reason(s) + for the rewrite, use the function <literal>pg_event_trigger_table_rewrite_reason()</literal> + (see <xref linkend="functions-event-triggers"/>).
Fine by me to tweak this paragraph like that with the link at the end.
--
Michael
On Tue, Oct 29, 2024 at 7:54 PM Peter Eisentraut <peter@eisentraut.org> wrote:
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.
hi. I have some minor issue.
<para>
An event trigger fires whenever the event with which it is associated
occurs in the database in which it is defined.
</para>
is possible to rewrite this sentence, two "which" is kind of not easy
to understand?
create role alice;
create role bob;
grant alice to bob;
<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>
not 100% sure this description
" <listitem><para>roles</para></listitem>"
cover case like "grant alice to bob;"
Here "targeting shared objects" is "role related meta information".
maybe a new item like
<listitem><para>roles privileges</para></listitem>.
so we can more easily distinguish
"grant select on t1 to alice;"
and
"grant alice to bob;"
On 29.10.24 23:33, Michael Paquier wrote:
On Tue, Oct 29, 2024 at 03:53:43PM +0100, Daniel Gustafsson wrote:
+1, I think this is a net improvement.
Agreed. I have spent some time looking in the past few years looking
at patches that tweaked this table, and it was always hard to figure
out if it was completely right.The only thing I would change on top of this is move the reference to section
9.30 under table_rewrite to be at the end after both supporting functions since
the link is relevant to both of them. Something like:- <literal>pg_event_trigger_table_rewrite_oid()</literal> (see - <xref linkend="functions-event-triggers"/>). To discover the reason(s) - for the rewrite, use the function - <literal>pg_event_trigger_table_rewrite_reason()</literal>. + <literal>pg_event_trigger_table_rewrite_oid()</literal> To discover the reason(s) + for the rewrite, use the function <literal>pg_event_trigger_table_rewrite_reason()</literal> + (see <xref linkend="functions-event-triggers"/>).Fine by me to tweak this paragraph like that with the link at the end.
Committed with the suggested changes.
On 30.10.24 13:31, jian he wrote:
On Tue, Oct 29, 2024 at 7:54 PM Peter Eisentraut <peter@eisentraut.org> wrote:
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.hi. I have some minor issue.
<para>
An event trigger fires whenever the event with which it is associated
occurs in the database in which it is defined.
</para>
is possible to rewrite this sentence, two "which" is kind of not easy
to understand?
I couldn't think of anything simpler that wouldn't be weirdly nested in
some other way. This wasn't really related to this patch, so I didn't
touch it. But suggestions are welcome.
create role alice;
create role bob;
grant alice to bob;
<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>not 100% sure this description
" <listitem><para>roles</para></listitem>"
cover case like "grant alice to bob;"
Here "targeting shared objects" is "role related meta information".
maybe a new item like
<listitem><para>roles privileges</para></listitem>.
Yeah, I added a clarification in the committed version.