Skip to content

Commit

Permalink
Fix DDL deparse of CREATE OPERATOR CLASS
Browse files Browse the repository at this point in the history
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
  • Loading branch information
alvherre committed May 20, 2022
1 parent ac78cec commit 4492e73
Show file tree
Hide file tree
Showing 5 changed files with 30 additions and 5 deletions.
19 changes: 14 additions & 5 deletions src/backend/commands/opclasscmds.c
Expand Up @@ -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;
Expand All @@ -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.
Expand Down Expand Up @@ -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);

Expand Down Expand Up @@ -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;
}
}
Expand Down Expand Up @@ -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);
}


Expand Down
6 changes: 6 additions & 0 deletions src/backend/tcop/utility.c
Expand Up @@ -1597,6 +1597,12 @@ ProcessUtilitySlow(ParseState *pstate,

case T_CreateOpFamilyStmt:
address = DefineOpFamily((CreateOpFamilyStmt *) parsetree);

/*
* DefineOpFamily calls EventTriggerCollectSimpleCommand
* directly.
*/
commandCollected = true;
break;

case T_CreateTransformStmt:
Expand Down
1 change: 1 addition & 0 deletions src/test/modules/test_ddl_deparse/expected/opfamily.out
Expand Up @@ -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
5 changes: 5 additions & 0 deletions src/test/regress/expected/event_trigger.out
Expand Up @@ -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
Expand Down
4 changes: 4 additions & 0 deletions src/test/regress/sql/event_trigger.sql
Expand Up @@ -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;

Expand Down

0 comments on commit 4492e73

Please sign in to comment.