From: Alvaro Herrera Date: Fri, 20 May 2022 16:52:55 +0000 (+0200) Subject: Fix DDL deparse of CREATE OPERATOR CLASS X-Git-Tag: REL_10_22~66 X-Git-Url: http://git.postgresql.org/gitweb/?a=commitdiff_plain;h=70f70d7d3f584dbc964348f82a3737ee66f4de01;p=postgresql.git Fix DDL deparse of CREATE OPERATOR CLASS 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 --- diff --git a/src/backend/commands/opclasscmds.c b/src/backend/commands/opclasscmds.c index a31b1acb9c6..93a59d4c379 100644 --- a/src/backend/commands/opclasscmds.c +++ b/src/backend/commands/opclasscmds.c @@ -238,7 +238,8 @@ get_opclass_oid(Oid amID, List *opclassname, bool missing_ok) * Caller must have done permissions checks etc. already. */ static ObjectAddress -CreateOpFamily(char *amname, char *opfname, Oid namespaceoid, Oid amoid) +CreateOpFamily(CreateOpFamilyStmt *stmt, const char *opfname, + Oid namespaceoid, Oid amoid) { Oid opfamilyoid; Relation rel; @@ -262,7 +263,7 @@ CreateOpFamily(char *amname, char *opfname, Oid namespaceoid, Oid amoid) 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. @@ -307,6 +308,10 @@ CreateOpFamily(char *amname, char *opfname, Oid namespaceoid, Oid amoid) /* 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); @@ -438,13 +443,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; } } @@ -747,7 +756,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); } diff --git a/src/backend/tcop/utility.c b/src/backend/tcop/utility.c index 185869d9fa8..3d3c1c9bfac 100644 --- a/src/backend/tcop/utility.c +++ b/src/backend/tcop/utility.c @@ -1558,6 +1558,12 @@ ProcessUtilitySlow(ParseState *pstate, case T_CreateOpFamilyStmt: address = DefineOpFamily((CreateOpFamilyStmt *) parsetree); + + /* + * DefineOpFamily calls EventTriggerCollectSimpleCommand + * directly. + */ + commandCollected = true; break; case T_CreateTransformStmt: diff --git a/src/test/modules/test_ddl_deparse/expected/opfamily.out b/src/test/modules/test_ddl_deparse/expected/opfamily.out index 14bd6037cdf..c7e3a23ef70 100644 --- a/src/test/modules/test_ddl_deparse/expected/opfamily.out +++ b/src/test/modules/test_ddl_deparse/expected/opfamily.out @@ -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 diff --git a/src/test/regress/expected/event_trigger.out b/src/test/regress/expected/event_trigger.out index 36e81964d47..ed738f5490c 100644 --- a/src/test/regress/expected/event_trigger.out +++ b/src/test/regress/expected/event_trigger.out @@ -424,6 +424,9 @@ 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; 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 diff --git a/src/test/regress/sql/event_trigger.sql b/src/test/regress/sql/event_trigger.sql index 9f1ab32a7c7..aa013de0121 100644 --- a/src/test/regress/sql/event_trigger.sql +++ b/src/test/regress/sql/event_trigger.sql @@ -309,6 +309,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;