7
7
* Portions Copyright (c) 1994, Regents of the University of California
8
8
*
9
9
* IDENTIFICATION
10
- * $Header: /cvsroot/pgsql/src/backend/commands/trigger.c,v 1.116 2002/04/27 03:45:02 tgl Exp $
10
+ * $Header: /cvsroot/pgsql/src/backend/commands/trigger.c,v 1.117 2002/04/30 01:24:57 tgl Exp $
11
11
*
12
12
*-------------------------------------------------------------------------
13
13
*/
@@ -514,8 +514,7 @@ RelationRemoveTriggers(Relation rel)
514
514
*for name conflict (within rel)
515
515
*for original trigger (if not arg)
516
516
*modify tgname in trigger tuple
517
- *insert modified trigger in trigger catalog
518
- *delete original trigger from trigger catalog
517
+ *update row in catalog
519
518
*/
520
519
void
521
520
renametrig (Oid relid ,
@@ -526,8 +525,7 @@ renametrig(Oid relid,
526
525
Relation tgrel ;
527
526
HeapTuple tuple ;
528
527
SysScanDesc tgscan ;
529
- ScanKeyData key ;
530
- bool found = FALSE;
528
+ ScanKeyData key [2 ];
531
529
Relation idescs [Num_pg_trigger_indices ];
532
530
533
531
/*
@@ -550,70 +548,69 @@ renametrig(Oid relid,
550
548
/*
551
549
* First pass -- look for name conflict
552
550
*/
553
- ScanKeyEntryInitialize (& key ,0 ,
551
+ ScanKeyEntryInitialize (& key [ 0 ] ,0 ,
554
552
Anum_pg_trigger_tgrelid ,
555
553
F_OIDEQ ,
556
554
ObjectIdGetDatum (relid ));
555
+ ScanKeyEntryInitialize (& key [1 ],0 ,
556
+ Anum_pg_trigger_tgname ,
557
+ F_NAMEEQ ,
558
+ PointerGetDatum (newname ));
557
559
tgscan = systable_beginscan (tgrel ,TriggerRelidNameIndex , true,
558
- SnapshotNow ,1 ,& key );
559
- while (HeapTupleIsValid (tuple = systable_getnext (tgscan )))
560
- {
561
- Form_pg_trigger pg_trigger = (Form_pg_trigger )GETSTRUCT (tuple );
562
-
563
- if (namestrcmp (& (pg_trigger -> tgname ),newname )== 0 )
564
- elog (ERROR ,"renametrig: trigger %s already defined on relation %s" ,
565
- newname ,RelationGetRelationName (targetrel ));
566
- }
560
+ SnapshotNow ,2 ,key );
561
+ if (HeapTupleIsValid (tuple = systable_getnext (tgscan )))
562
+ elog (ERROR ,"renametrig: trigger %s already defined on relation %s" ,
563
+ newname ,RelationGetRelationName (targetrel ));
567
564
systable_endscan (tgscan );
568
565
569
566
/*
570
567
* Second pass -- look for trigger existing with oldname and update
571
568
*/
572
- ScanKeyEntryInitialize (& key ,0 ,
569
+ ScanKeyEntryInitialize (& key [ 0 ] ,0 ,
573
570
Anum_pg_trigger_tgrelid ,
574
571
F_OIDEQ ,
575
572
ObjectIdGetDatum (relid ));
573
+ ScanKeyEntryInitialize (& key [1 ],0 ,
574
+ Anum_pg_trigger_tgname ,
575
+ F_NAMEEQ ,
576
+ PointerGetDatum (oldname ));
576
577
tgscan = systable_beginscan (tgrel ,TriggerRelidNameIndex , true,
577
- SnapshotNow ,1 , & key );
578
- while (HeapTupleIsValid (tuple = systable_getnext (tgscan )))
578
+ SnapshotNow ,2 , key );
579
+ if (HeapTupleIsValid (tuple = systable_getnext (tgscan )))
579
580
{
580
- Form_pg_trigger pg_trigger = (Form_pg_trigger )GETSTRUCT (tuple );
581
+ /*
582
+ * Update pg_trigger tuple with new tgname.
583
+ */
584
+ tuple = heap_copytuple (tuple );/* need a modifiable copy */
581
585
582
- if (namestrcmp (& (pg_trigger -> tgname ),oldname )== 0 )
583
- {
584
- /*
585
- * Update pg_trigger tuple with new tgname.
586
- * (Scribbling on tuple is OK because it's a copy...)
587
- */
588
- namestrcpy (& (pg_trigger -> tgname ),newname );
589
- simple_heap_update (tgrel ,& tuple -> t_self ,tuple );
586
+ namestrcpy (& ((Form_pg_trigger )GETSTRUCT (tuple ))-> tgname ,newname );
590
587
591
- /*
592
- * keep system catalog indices current
593
- */
594
- CatalogOpenIndices (Num_pg_trigger_indices ,Name_pg_trigger_indices ,idescs );
595
- CatalogIndexInsert (idescs ,Num_pg_trigger_indices ,tgrel ,tuple );
596
- CatalogCloseIndices (Num_pg_trigger_indices ,idescs );
588
+ simple_heap_update (tgrel ,& tuple -> t_self ,tuple );
597
589
598
- /*
599
- *Invalidate relation's relcache entry so that other
600
- * backends (and this one too!) are sent SI message to make them
601
- * rebuild relcache entries.
602
- */
603
- CacheInvalidateRelcache ( relid );
590
+ /*
591
+ *keep system catalog indices current
592
+ */
593
+ CatalogOpenIndices ( Num_pg_trigger_indices , Name_pg_trigger_indices , idescs );
594
+ CatalogIndexInsert ( idescs , Num_pg_trigger_indices , tgrel , tuple );
595
+ CatalogCloseIndices ( Num_pg_trigger_indices , idescs );
604
596
605
- found = TRUE;
606
- break ;
607
- }
597
+ /*
598
+ * Invalidate relation's relcache entry so that other backends (and
599
+ * this one too!) are sent SI message to make them rebuild relcache
600
+ * entries. (Ideally this should happen automatically...)
601
+ */
602
+ CacheInvalidateRelcache (relid );
608
603
}
604
+ else
605
+ {
606
+ elog (ERROR ,"renametrig: trigger %s not defined on relation %s" ,
607
+ oldname ,RelationGetRelationName (targetrel ));
608
+ }
609
+
609
610
systable_endscan (tgscan );
610
611
611
612
heap_close (tgrel ,RowExclusiveLock );
612
613
613
- if (!found )
614
- elog (ERROR ,"renametrig: trigger %s not defined on relation %s" ,
615
- oldname ,RelationGetRelationName (targetrel ));
616
-
617
614
/*
618
615
* Close rel, but keep exclusive lock!
619
616
*/