Commit b70b7865 authored by Tom Lane's avatar Tom Lane

Tweak CreateTrigger() so that the OID used in the name of an

RI_ConstraintTrigger is the same OID assigned to the pg_trigger row.
This reduces consumption of OIDs and may ease debugging.
parent 17b28503
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* Portions Copyright (c) 1994, Regents of the University of California * Portions Copyright (c) 1994, Regents of the University of California
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/commands/trigger.c,v 1.122 2002/07/20 05:16:57 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/commands/trigger.c,v 1.123 2002/07/20 19:55:38 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -50,6 +50,14 @@ static void DeferredTriggerExecute(DeferredTriggerEvent event, int itemno, ...@@ -50,6 +50,14 @@ static void DeferredTriggerExecute(DeferredTriggerEvent event, int itemno,
MemoryContext per_tuple_context); MemoryContext per_tuple_context);
/*
* Create a trigger. Returns the OID of the created trigger.
*
* forConstraint, if true, says that this trigger is being created to
* implement a constraint. The caller will then be expected to make
* a pg_depend entry linking the trigger to that constraint (and thereby
* to the owning relation(s)).
*/
Oid Oid
CreateTrigger(CreateTrigStmt *stmt, bool forConstraint) CreateTrigger(CreateTrigStmt *stmt, bool forConstraint)
{ {
...@@ -94,6 +102,12 @@ CreateTrigger(CreateTrigStmt *stmt, bool forConstraint) ...@@ -94,6 +102,12 @@ CreateTrigger(CreateTrigStmt *stmt, bool forConstraint)
if (aclresult != ACLCHECK_OK) if (aclresult != ACLCHECK_OK)
aclcheck_error(aclresult, RelationGetRelationName(rel)); aclcheck_error(aclresult, RelationGetRelationName(rel));
/*
* Generate the trigger's OID now, so that we can use it in the name
* if needed.
*/
trigoid = newoid();
/* /*
* If trigger is an RI constraint, use specified trigger name as * If trigger is an RI constraint, use specified trigger name as
* constraint name and build a unique trigger name instead. * constraint name and build a unique trigger name instead.
...@@ -103,7 +117,7 @@ CreateTrigger(CreateTrigStmt *stmt, bool forConstraint) ...@@ -103,7 +117,7 @@ CreateTrigger(CreateTrigStmt *stmt, bool forConstraint)
if (stmt->isconstraint) if (stmt->isconstraint)
{ {
snprintf(constrtrigname, sizeof(constrtrigname), snprintf(constrtrigname, sizeof(constrtrigname),
"RI_ConstraintTrigger_%u", newoid()); "RI_ConstraintTrigger_%u", trigoid);
trigname = constrtrigname; trigname = constrtrigname;
constrname = stmt->trigname; constrname = stmt->trigname;
} }
...@@ -279,10 +293,14 @@ CreateTrigger(CreateTrigStmt *stmt, bool forConstraint) ...@@ -279,10 +293,14 @@ CreateTrigger(CreateTrigStmt *stmt, bool forConstraint)
tuple = heap_formtuple(tgrel->rd_att, values, nulls); tuple = heap_formtuple(tgrel->rd_att, values, nulls);
/* force tuple to have the desired OID */
AssertTupleDescHasOid(tgrel->rd_att);
HeapTupleSetOid(tuple, trigoid);
/* /*
* Insert tuple into pg_trigger. * Insert tuple into pg_trigger.
*/ */
trigoid = simple_heap_insert(tgrel, tuple); simple_heap_insert(tgrel, tuple);
CatalogOpenIndices(Num_pg_trigger_indices, Name_pg_trigger_indices, idescs); CatalogOpenIndices(Num_pg_trigger_indices, Name_pg_trigger_indices, idescs);
CatalogIndexInsert(idescs, Num_pg_trigger_indices, tgrel, tuple); CatalogIndexInsert(idescs, Num_pg_trigger_indices, tgrel, tuple);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment