Fix DDL deparse of CREATE OPERATOR CLASS
authorAlvaro Herrera
Fri, 20 May 2022 16:52:55 +0000 (18:52 +0200)
committerAlvaro Herrera
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 
Reported-by: Leslie LEMAIRE
Reviewed-by: Amit Kapila
Reviewed-by: Michael Paquiër
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 66987966b4ec11e56f39e2403f4f0f5706a1dff7..7a931ab758dcfb524951e6bff7643345c1936a24 100644 (file)
@@ -240,7 +240,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;
@@ -264,7 +265,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.
@@ -312,6 +313,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);
 
@@ -447,13 +452,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;
        }
    }
@@ -792,7 +801,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 0e7b7b31384f7f5351618ceb0f4fd296ca25e17b..6a5bcded558d71e51baa62f5ad1c9512342f5a64 100644 (file)
@@ -1721,6 +1721,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 44d545de257b48b31b9762ae3de970b7720cce30..c95c30b3140ac6c4b9a00ee2428c9570a0c8eb60 100644 (file)
@@ -476,6 +476,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 1446cf8cc89faff1392858f68ea2ac6f96baf387..5e45e3f190ee60f398af86815e8097da162cde2a 100644 (file)
@@ -337,6 +337,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;