aboutsummaryrefslogtreecommitdiff
path: root/src/backend/commands/trigger.c
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2002-04-30 01:24:57 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2002-04-30 01:24:57 +0000
commit4c25a0655b9721af5c65922981c03926d856c6e4 (patch)
tree01a461fa88391005dec75b2c63064d42c61e0677 /src/backend/commands/trigger.c
parent857661ba2eeb7ccde7dfc11659cb4c67748cb980 (diff)
downloadpostgresql-4c25a0655b9721af5c65922981c03926d856c6e4.tar.gz
postgresql-4c25a0655b9721af5c65922981c03926d856c6e4.zip
Code review for ALTER TRIGGER RENAME patch: make better use of index,
don't scribble on tuple returned by table scan.
Diffstat (limited to 'src/backend/commands/trigger.c')
-rw-r--r--src/backend/commands/trigger.c89
1 files changed, 43 insertions, 46 deletions
diff --git a/src/backend/commands/trigger.c b/src/backend/commands/trigger.c
index 52e9761d759..a871c857880 100644
--- a/src/backend/commands/trigger.c
+++ b/src/backend/commands/trigger.c
@@ -7,7 +7,7 @@
* Portions Copyright (c) 1994, Regents of the University of California
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/commands/trigger.c,v 1.116 2002/04/27 03:45:02 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/commands/trigger.c,v 1.117 2002/04/30 01:24:57 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -514,8 +514,7 @@ RelationRemoveTriggers(Relation rel)
* for name conflict (within rel)
* for original trigger (if not arg)
* modify tgname in trigger tuple
- * insert modified trigger in trigger catalog
- * delete original trigger from trigger catalog
+ * update row in catalog
*/
void
renametrig(Oid relid,
@@ -526,8 +525,7 @@ renametrig(Oid relid,
Relation tgrel;
HeapTuple tuple;
SysScanDesc tgscan;
- ScanKeyData key;
- bool found = FALSE;
+ ScanKeyData key[2];
Relation idescs[Num_pg_trigger_indices];
/*
@@ -550,70 +548,69 @@ renametrig(Oid relid,
/*
* First pass -- look for name conflict
*/
- ScanKeyEntryInitialize(&key, 0,
+ ScanKeyEntryInitialize(&key[0], 0,
Anum_pg_trigger_tgrelid,
F_OIDEQ,
ObjectIdGetDatum(relid));
+ ScanKeyEntryInitialize(&key[1], 0,
+ Anum_pg_trigger_tgname,
+ F_NAMEEQ,
+ PointerGetDatum(newname));
tgscan = systable_beginscan(tgrel, TriggerRelidNameIndex, true,
- SnapshotNow, 1, &key);
- while (HeapTupleIsValid(tuple = systable_getnext(tgscan)))
- {
- Form_pg_trigger pg_trigger = (Form_pg_trigger) GETSTRUCT(tuple);
-
- if (namestrcmp(&(pg_trigger->tgname), newname) == 0)
- elog(ERROR, "renametrig: trigger %s already defined on relation %s",
- newname, RelationGetRelationName(targetrel));
- }
+ SnapshotNow, 2, key);
+ if (HeapTupleIsValid(tuple = systable_getnext(tgscan)))
+ elog(ERROR, "renametrig: trigger %s already defined on relation %s",
+ newname, RelationGetRelationName(targetrel));
systable_endscan(tgscan);
/*
* Second pass -- look for trigger existing with oldname and update
*/
- ScanKeyEntryInitialize(&key, 0,
+ ScanKeyEntryInitialize(&key[0], 0,
Anum_pg_trigger_tgrelid,
F_OIDEQ,
ObjectIdGetDatum(relid));
+ ScanKeyEntryInitialize(&key[1], 0,
+ Anum_pg_trigger_tgname,
+ F_NAMEEQ,
+ PointerGetDatum(oldname));
tgscan = systable_beginscan(tgrel, TriggerRelidNameIndex, true,
- SnapshotNow, 1, &key);
- while (HeapTupleIsValid(tuple = systable_getnext(tgscan)))
+ SnapshotNow, 2, key);
+ if (HeapTupleIsValid(tuple = systable_getnext(tgscan)))
{
- Form_pg_trigger pg_trigger = (Form_pg_trigger) GETSTRUCT(tuple);
+ /*
+ * Update pg_trigger tuple with new tgname.
+ */
+ tuple = heap_copytuple(tuple); /* need a modifiable copy */
- if (namestrcmp(&(pg_trigger->tgname), oldname) == 0)
- {
- /*
- * Update pg_trigger tuple with new tgname.
- * (Scribbling on tuple is OK because it's a copy...)
- */
- namestrcpy(&(pg_trigger->tgname), newname);
- simple_heap_update(tgrel, &tuple->t_self, tuple);
+ namestrcpy(&((Form_pg_trigger) GETSTRUCT(tuple))->tgname, newname);
- /*
- * keep system catalog indices current
- */
- CatalogOpenIndices(Num_pg_trigger_indices, Name_pg_trigger_indices, idescs);
- CatalogIndexInsert(idescs, Num_pg_trigger_indices, tgrel, tuple);
- CatalogCloseIndices(Num_pg_trigger_indices, idescs);
+ simple_heap_update(tgrel, &tuple->t_self, tuple);
- /*
- * Invalidate relation's relcache entry so that other
- * backends (and this one too!) are sent SI message to make them
- * rebuild relcache entries.
- */
- CacheInvalidateRelcache(relid);
+ /*
+ * keep system catalog indices current
+ */
+ CatalogOpenIndices(Num_pg_trigger_indices, Name_pg_trigger_indices, idescs);
+ CatalogIndexInsert(idescs, Num_pg_trigger_indices, tgrel, tuple);
+ CatalogCloseIndices(Num_pg_trigger_indices, idescs);
- found = TRUE;
- break;
- }
+ /*
+ * Invalidate relation's relcache entry so that other backends (and
+ * this one too!) are sent SI message to make them rebuild relcache
+ * entries. (Ideally this should happen automatically...)
+ */
+ CacheInvalidateRelcache(relid);
}
+ else
+ {
+ elog(ERROR, "renametrig: trigger %s not defined on relation %s",
+ oldname, RelationGetRelationName(targetrel));
+ }
+
systable_endscan(tgscan);
heap_close(tgrel, RowExclusiveLock);
- if (!found)
- elog(ERROR, "renametrig: trigger %s not defined on relation %s",
- oldname, RelationGetRelationName(targetrel));
-
/*
* Close rel, but keep exclusive lock!
*/