diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2002-04-30 01:24:57 +0000 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2002-04-30 01:24:57 +0000 |
commit | 4c25a0655b9721af5c65922981c03926d856c6e4 (patch) | |
tree | 01a461fa88391005dec75b2c63064d42c61e0677 /src/backend/commands/trigger.c | |
parent | 857661ba2eeb7ccde7dfc11659cb4c67748cb980 (diff) | |
download | postgresql-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.c | 89 |
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! */ |