Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit 6029861

Browse files
committed
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 <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
1 parent b398388 commit 6029861

File tree

5 files changed

+30
-5
lines changed

5 files changed

+30
-5
lines changed

src/backend/commands/opclasscmds.c

+14-5
Original file line numberDiff line numberDiff line change
@@ -240,7 +240,8 @@ get_opclass_oid(Oid amID, List *opclassname, bool missing_ok)
240240
* Caller must have done permissions checks etc. already.
241241
*/
242242
static ObjectAddress
243-
CreateOpFamily(const char *amname, const char *opfname, Oid namespaceoid, Oid amoid)
243+
CreateOpFamily(CreateOpFamilyStmt *stmt, const char *opfname,
244+
Oid namespaceoid, Oid amoid)
244245
{
245246
Oid opfamilyoid;
246247
Relation rel;
@@ -264,7 +265,7 @@ CreateOpFamily(const char *amname, const char *opfname, Oid namespaceoid, Oid am
264265
ereport(ERROR,
265266
(errcode(ERRCODE_DUPLICATE_OBJECT),
266267
errmsg("operator family \"%s\" for access method \"%s\" already exists",
267-
opfname, amname)));
268+
opfname, stmt->amname)));
268269

269270
/*
270271
* Okay, let's create the pg_opfamily entry.
@@ -312,6 +313,10 @@ CreateOpFamily(const char *amname, const char *opfname, Oid namespaceoid, Oid am
312313
/* dependency on extension */
313314
recordDependencyOnCurrentExtension(&myself, false);
314315

316+
/* Report the new operator family to possibly interested event triggers */
317+
EventTriggerCollectSimpleCommand(myself, InvalidObjectAddress,
318+
(Node *) stmt);
319+
315320
/* Post creation hook for new operator family */
316321
InvokeObjectPostCreateHook(OperatorFamilyRelationId, opfamilyoid, 0);
317322

@@ -447,13 +452,17 @@ DefineOpClass(CreateOpClassStmt *stmt)
447452
}
448453
else
449454
{
455+
CreateOpFamilyStmt *opfstmt;
450456
ObjectAddress tmpAddr;
451457

458+
opfstmt = makeNode(CreateOpFamilyStmt);
459+
opfstmt->opfamilyname = stmt->opclassname;
460+
opfstmt->amname = stmt->amname;
461+
452462
/*
453463
* Create it ... again no need for more permissions ...
454464
*/
455-
tmpAddr = CreateOpFamily(stmt->amname, opcname,
456-
namespaceoid, amoid);
465+
tmpAddr = CreateOpFamily(opfstmt, opcname, namespaceoid, amoid);
457466
opfamilyoid = tmpAddr.objectId;
458467
}
459468
}
@@ -792,7 +801,7 @@ DefineOpFamily(CreateOpFamilyStmt *stmt)
792801
errmsg("must be superuser to create an operator family")));
793802

794803
/* Insert pg_opfamily catalog entry */
795-
return CreateOpFamily(stmt->amname, opfname, namespaceoid, amoid);
804+
return CreateOpFamily(stmt, opfname, namespaceoid, amoid);
796805
}
797806

798807

src/backend/tcop/utility.c

+6
Original file line numberDiff line numberDiff line change
@@ -1721,6 +1721,12 @@ ProcessUtilitySlow(ParseState *pstate,
17211721

17221722
case T_CreateOpFamilyStmt:
17231723
address = DefineOpFamily((CreateOpFamilyStmt *) parsetree);
1724+
1725+
/*
1726+
* DefineOpFamily calls EventTriggerCollectSimpleCommand
1727+
* directly.
1728+
*/
1729+
commandCollected = true;
17241730
break;
17251731

17261732
case T_CreateTransformStmt:

src/test/modules/test_ddl_deparse/expected/opfamily.out

+1
Original file line numberDiff line numberDiff line change
@@ -64,4 +64,5 @@ NOTICE: DDL test: type simple, tag CREATE OPERATOR
6464
create operator class ctype_hash_ops
6565
default for type ctype using hash as
6666
operator 1 =(ctype, ctype);
67+
NOTICE: DDL test: type simple, tag CREATE OPERATOR FAMILY
6768
NOTICE: DDL test: type create operator class, tag CREATE OPERATOR CLASS

src/test/regress/expected/event_trigger.out

+5
Original file line numberDiff line numberDiff line change
@@ -476,6 +476,11 @@ NOTICE: NORMAL: orig=f normal=t istemp=f type=table identity=evttrig.part_10_15
476476
NOTICE: NORMAL: orig=f normal=t istemp=f type=table identity=evttrig.part_15_20 name={evttrig,part_15_20} args={}
477477
DROP TABLE a_temp_tbl;
478478
NOTICE: NORMAL: orig=t normal=f istemp=t type=table identity=pg_temp.a_temp_tbl name={pg_temp,a_temp_tbl} args={}
479+
-- CREATE OPERATOR CLASS without FAMILY clause should report
480+
-- both CREATE OPERATOR FAMILY and CREATE OPERATOR CLASS
481+
CREATE OPERATOR CLASS evttrigopclass FOR TYPE int USING btree AS STORAGE int;
482+
NOTICE: END: command_tag=CREATE OPERATOR FAMILY type=operator family identity=public.evttrigopclass USING btree
483+
NOTICE: END: command_tag=CREATE OPERATOR CLASS type=operator class identity=public.evttrigopclass USING btree
479484
DROP EVENT TRIGGER regress_event_trigger_report_dropped;
480485
DROP EVENT TRIGGER regress_event_trigger_report_end;
481486
-- only allowed from within an event trigger function, should fail

src/test/regress/sql/event_trigger.sql

+4
Original file line numberDiff line numberDiff line change
@@ -337,6 +337,10 @@ DROP INDEX evttrig.one_idx;
337337
DROP SCHEMA evttrig CASCADE;
338338
DROP TABLE a_temp_tbl;
339339

340+
-- CREATE OPERATOR CLASS without FAMILY clause should report
341+
-- both CREATE OPERATOR FAMILY and CREATE OPERATOR CLASS
342+
CREATE OPERATOR CLASS evttrigopclass FOR TYPE int USING btree AS STORAGE int;
343+
340344
DROP EVENT TRIGGER regress_event_trigger_report_dropped;
341345
DROP EVENT TRIGGER regress_event_trigger_report_end;
342346

0 commit comments

Comments
 (0)