]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Fix DDL deparse of CREATE OPERATOR CLASS
authorAlvaro Herrera <alvherre@alvh.no-ip.org>
Fri, 20 May 2022 16:52:55 +0000 (18:52 +0200)
committerAlvaro Herrera <alvherre@alvh.no-ip.org>
Fri, 20 May 2022 16:52:55 +0000 (18:52 +0200)
When an implicit operator family is created, it wasn't getting reported.
Make it do so.

This has always been missing.  Backpatch to 10.

Author: Masahiko Sawada <sawada.mshk@gmail.com>
Reported-by: Leslie LEMAIRE <leslie.lemaire@developpement-durable.gouv.fr>
Reviewed-by: Amit Kapila <amit.kapila16@gmail.com>
Reviewed-by: Michael Paquiër <michael@paquier.xyz>
Discussion: https://postgr.es/m/f74d69e151b22171e8829551b1159e77@developpement-durable.gouv.fr

src/backend/commands/opclasscmds.c
src/backend/tcop/utility.c
src/test/modules/test_ddl_deparse/expected/opfamily.out
src/test/regress/expected/event_trigger.out
src/test/regress/sql/event_trigger.sql

index 6a1ccdeb826b63fcb00cfb5040fc5e8ca8136257..2705b34a42de51a31aaaaf2c713a1f3996275a38 100644 (file)
@@ -243,7 +243,8 @@ get_opclass_oid(Oid amID, List *opclassname, bool missing_ok)
  * Caller must have done permissions checks etc. already.
  */
 static ObjectAddress
-CreateOpFamily(const char *amname, const char *opfname, Oid namespaceoid, Oid amoid)
+CreateOpFamily(CreateOpFamilyStmt *stmt, const char *opfname,
+                          Oid namespaceoid, Oid amoid)
 {
        Oid                     opfamilyoid;
        Relation        rel;
@@ -267,7 +268,7 @@ CreateOpFamily(const char *amname, const char *opfname, Oid namespaceoid, Oid am
                ereport(ERROR,
                                (errcode(ERRCODE_DUPLICATE_OBJECT),
                                 errmsg("operator family \"%s\" for access method \"%s\" already exists",
-                                               opfname, amname)));
+                                               opfname, stmt->amname)));
 
        /*
         * Okay, let's create the pg_opfamily entry.
@@ -315,6 +316,10 @@ CreateOpFamily(const char *amname, const char *opfname, Oid namespaceoid, Oid am
        /* dependency on extension */
        recordDependencyOnCurrentExtension(&myself, false);
 
+       /* Report the new operator family to possibly interested event triggers */
+       EventTriggerCollectSimpleCommand(myself, InvalidObjectAddress,
+                                                                        (Node *) stmt);
+
        /* Post creation hook for new operator family */
        InvokeObjectPostCreateHook(OperatorFamilyRelationId, opfamilyoid, 0);
 
@@ -448,13 +453,17 @@ DefineOpClass(CreateOpClassStmt *stmt)
                }
                else
                {
+                       CreateOpFamilyStmt *opfstmt;
                        ObjectAddress tmpAddr;
 
+                       opfstmt = makeNode(CreateOpFamilyStmt);
+                       opfstmt->opfamilyname = stmt->opclassname;
+                       opfstmt->amname = stmt->amname;
+
                        /*
                         * Create it ... again no need for more permissions ...
                         */
-                       tmpAddr = CreateOpFamily(stmt->amname, opcname,
-                                                                        namespaceoid, amoid);
+                       tmpAddr = CreateOpFamily(opfstmt, opcname, namespaceoid, amoid);
                        opfamilyoid = tmpAddr.objectId;
                }
        }
@@ -760,7 +769,7 @@ DefineOpFamily(CreateOpFamilyStmt *stmt)
                                 errmsg("must be superuser to create an operator family")));
 
        /* Insert pg_opfamily catalog entry */
-       return CreateOpFamily(stmt->amname, opfname, namespaceoid, amoid);
+       return CreateOpFamily(stmt, opfname, namespaceoid, amoid);
 }
 
 
index e22ddb4427ccc38d53e25749d544182d7bfec7c6..071365486db396ee85545cbab9492dbc9a7abaf7 100644 (file)
@@ -1597,6 +1597,12 @@ ProcessUtilitySlow(ParseState *pstate,
 
                        case T_CreateOpFamilyStmt:
                                address = DefineOpFamily((CreateOpFamilyStmt *) parsetree);
+
+                               /*
+                                * DefineOpFamily calls EventTriggerCollectSimpleCommand
+                                * directly.
+                                */
+                               commandCollected = true;
                                break;
 
                        case T_CreateTransformStmt:
index 14bd6037cdf61dd2a40272570264ba7b7cd02a94..c7e3a23ef70e03f9597f3eeec166c3b00050c62a 100644 (file)
@@ -64,4 +64,5 @@ NOTICE:  DDL test: type simple, tag CREATE OPERATOR
 create operator class ctype_hash_ops
   default for type ctype using hash as
   operator 1 =(ctype, ctype);
+NOTICE:  DDL test: type simple, tag CREATE OPERATOR FAMILY
 NOTICE:  DDL test: type create operator class, tag CREATE OPERATOR CLASS
index 041de4587764d8693bdb80ed227bef01a9d4af9d..4af4b90eab71f8f27a2a23f519210de5e4f0e489 100644 (file)
@@ -478,6 +478,11 @@ NOTICE:  NORMAL: orig=f normal=t istemp=f type=table identity=evttrig.part_10_15
 NOTICE:  NORMAL: orig=f normal=t istemp=f type=table identity=evttrig.part_15_20 name={evttrig,part_15_20} args={}
 DROP TABLE a_temp_tbl;
 NOTICE:  NORMAL: orig=t normal=f istemp=t type=table identity=pg_temp.a_temp_tbl name={pg_temp,a_temp_tbl} args={}
+-- CREATE OPERATOR CLASS without FAMILY clause should report
+-- both CREATE OPERATOR FAMILY and CREATE OPERATOR CLASS
+CREATE OPERATOR CLASS evttrigopclass FOR TYPE int USING btree AS STORAGE int;
+NOTICE:  END: command_tag=CREATE OPERATOR FAMILY type=operator family identity=public.evttrigopclass USING btree
+NOTICE:  END: command_tag=CREATE OPERATOR CLASS type=operator class identity=public.evttrigopclass USING btree
 DROP EVENT TRIGGER regress_event_trigger_report_dropped;
 DROP EVENT TRIGGER regress_event_trigger_report_end;
 -- only allowed from within an event trigger function, should fail
index 7572a2280e65b4942e1907ed93ff12a6be30565c..e9dd0b477113d6be844aef42245c236fc426df52 100644 (file)
@@ -339,6 +339,10 @@ DROP INDEX evttrig.one_idx;
 DROP SCHEMA evttrig CASCADE;
 DROP TABLE a_temp_tbl;
 
+-- CREATE OPERATOR CLASS without FAMILY clause should report
+-- both CREATE OPERATOR FAMILY and CREATE OPERATOR CLASS
+CREATE OPERATOR CLASS evttrigopclass FOR TYPE int USING btree AS STORAGE int;
+
 DROP EVENT TRIGGER regress_event_trigger_report_dropped;
 DROP EVENT TRIGGER regress_event_trigger_report_end;