From 70f70d7d3f584dbc964348f82a3737ee66f4de01 Mon Sep 17 00:00:00 2001 From: Alvaro Herrera Date: Fri, 20 May 2022 18:52:55 +0200 Subject: [PATCH] Fix DDL deparse of CREATE OPERATOR CLASS MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit 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 | 19 ++++++++++++++----- src/backend/tcop/utility.c | 6 ++++++ .../test_ddl_deparse/expected/opfamily.out | 1 + src/test/regress/expected/event_trigger.out | 3 +++ src/test/regress/sql/event_trigger.sql | 4 ++++ 5 files changed, 28 insertions(+), 5 deletions(-) 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; -- 2.39.5