Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit3a96b6c

Browse files
committed
Attached is a patch for ALTER TRIGGER RENAME per the above thread. I
left a stub for a future "ALTER RULE RENAME" but did not write that oneyet. Bruce, if you want to add my name for for that I'll take it and doit later.Joe Conway
1 parentfbc4b71 commit3a96b6c

File tree

7 files changed

+182
-31
lines changed

7 files changed

+182
-31
lines changed

‎src/backend/commands/tablecmds.c

Lines changed: 118 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
*
99
*
1010
* IDENTIFICATION
11-
* $Header: /cvsroot/pgsql/src/backend/commands/tablecmds.c,v 1.8 2002/04/24 02:38:58 momjian Exp $
11+
* $Header: /cvsroot/pgsql/src/backend/commands/tablecmds.c,v 1.9 2002/04/24 02:48:54 momjian Exp $
1212
*
1313
*-------------------------------------------------------------------------
1414
*/
@@ -2846,6 +2846,123 @@ renamerel(Oid relid, const char *newrelname)
28462846
relation_close(targetrelation,NoLock);
28472847
}
28482848

2849+
/*
2850+
*renametrig- changes the name of a trigger on a relation
2851+
*
2852+
*trigger name is changed in trigger catalog.
2853+
*No record of the previous name is kept.
2854+
*
2855+
*get proper relrelation from relation catalog (if not arg)
2856+
*scan trigger catalog
2857+
*for name conflict (within rel)
2858+
*for original trigger (if not arg)
2859+
*modify tgname in trigger tuple
2860+
*insert modified trigger in trigger catalog
2861+
*delete original trigger from trigger catalog
2862+
*/
2863+
externvoidrenametrig(Oidrelid,
2864+
constchar*oldname,
2865+
constchar*newname)
2866+
{
2867+
Relationtargetrel;
2868+
Relationtgrel;
2869+
HeapTupletuple;
2870+
SysScanDesctgscan;
2871+
ScanKeyDatakey;
2872+
boolfound= FALSE;
2873+
Relationidescs[Num_pg_trigger_indices];
2874+
2875+
/*
2876+
* Grab an exclusive lock on the target table, which we will NOT
2877+
* release until end of transaction.
2878+
*/
2879+
targetrel=heap_open(relid,AccessExclusiveLock);
2880+
2881+
/*
2882+
* Scan pg_trigger twice for existing triggers on relation. We do this in
2883+
* order to ensure a trigger does not exist with newname (The unique index
2884+
* on tgrelid/tgname would complain anyway) and to ensure a trigger does
2885+
* exist with oldname.
2886+
*
2887+
* NOTE that this is cool only because we have AccessExclusiveLock on the
2888+
* relation, so the trigger set won't be changing underneath us.
2889+
*/
2890+
tgrel=heap_openr(TriggerRelationName,RowExclusiveLock);
2891+
2892+
/*
2893+
* First pass -- look for name conflict
2894+
*/
2895+
ScanKeyEntryInitialize(&key,0,
2896+
Anum_pg_trigger_tgrelid,
2897+
F_OIDEQ,
2898+
ObjectIdGetDatum(relid));
2899+
tgscan=systable_beginscan(tgrel,TriggerRelidNameIndex, true,
2900+
SnapshotNow,1,&key);
2901+
while (HeapTupleIsValid(tuple=systable_getnext(tgscan)))
2902+
{
2903+
Form_pg_triggerpg_trigger= (Form_pg_trigger)GETSTRUCT(tuple);
2904+
2905+
if (namestrcmp(&(pg_trigger->tgname),newname)==0)
2906+
elog(ERROR,"renametrig: trigger %s already defined on relation %s",
2907+
newname,RelationGetRelationName(targetrel));
2908+
}
2909+
systable_endscan(tgscan);
2910+
2911+
/*
2912+
* Second pass -- look for trigger existing with oldname and update
2913+
*/
2914+
ScanKeyEntryInitialize(&key,0,
2915+
Anum_pg_trigger_tgrelid,
2916+
F_OIDEQ,
2917+
ObjectIdGetDatum(relid));
2918+
tgscan=systable_beginscan(tgrel,TriggerRelidNameIndex, true,
2919+
SnapshotNow,1,&key);
2920+
while (HeapTupleIsValid(tuple=systable_getnext(tgscan)))
2921+
{
2922+
Form_pg_triggerpg_trigger= (Form_pg_trigger)GETSTRUCT(tuple);
2923+
2924+
if (namestrcmp(&(pg_trigger->tgname),oldname)==0)
2925+
{
2926+
/*
2927+
* Update pg_trigger tuple with new tgname.
2928+
* (Scribbling on tuple is OK because it's a copy...)
2929+
*/
2930+
namestrcpy(&(pg_trigger->tgname),newname);
2931+
simple_heap_update(tgrel,&tuple->t_self,tuple);
2932+
2933+
/*
2934+
* keep system catalog indices current
2935+
*/
2936+
CatalogOpenIndices(Num_pg_trigger_indices,Name_pg_trigger_indices,idescs);
2937+
CatalogIndexInsert(idescs,Num_pg_trigger_indices,tgrel,tuple);
2938+
CatalogCloseIndices(Num_pg_trigger_indices,idescs);
2939+
2940+
/*
2941+
* Invalidate relation's relcache entry so that other
2942+
* backends (and this one too!) are sent SI message to make them
2943+
* rebuild relcache entries.
2944+
*/
2945+
CacheInvalidateRelcache(relid);
2946+
2947+
found= TRUE;
2948+
break;
2949+
}
2950+
}
2951+
systable_endscan(tgscan);
2952+
2953+
heap_close(tgrel,RowExclusiveLock);
2954+
2955+
if (!found)
2956+
elog(ERROR,"renametrig: trigger %s not defined on relation %s",
2957+
oldname,RelationGetRelationName(targetrel));
2958+
2959+
/*
2960+
* Close rel, but keep exclusive lock!
2961+
*/
2962+
heap_close(targetrel,NoLock);
2963+
}
2964+
2965+
28492966
/*
28502967
* Given a trigger function OID, determine whether it is an RI trigger,
28512968
* and if so whether it is attached to PK or FK relation.

‎src/backend/nodes/copyfuncs.c

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
* Portions Copyright (c) 1994, Regents of the University of California
1616
*
1717
* IDENTIFICATION
18-
* $Header: /cvsroot/pgsql/src/backend/nodes/copyfuncs.c,v 1.180 2002/04/18 20:01:09 tgl Exp $
18+
* $Header: /cvsroot/pgsql/src/backend/nodes/copyfuncs.c,v 1.181 2002/04/24 02:48:54 momjian Exp $
1919
*
2020
*-------------------------------------------------------------------------
2121
*/
@@ -2137,10 +2137,11 @@ _copyRenameStmt(RenameStmt *from)
21372137
RenameStmt*newnode=makeNode(RenameStmt);
21382138

21392139
Node_Copy(from,newnode,relation);
2140-
if (from->column)
2141-
newnode->column=pstrdup(from->column);
2140+
if (from->oldname)
2141+
newnode->oldname=pstrdup(from->oldname);
21422142
if (from->newname)
21432143
newnode->newname=pstrdup(from->newname);
2144+
newnode->renameType=from->renameType;
21442145

21452146
returnnewnode;
21462147
}

‎src/backend/nodes/equalfuncs.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
* Portions Copyright (c) 1994, Regents of the University of California
2121
*
2222
* IDENTIFICATION
23-
* $Header: /cvsroot/pgsql/src/backend/nodes/equalfuncs.c,v 1.128 2002/04/18 20:01:09 tgl Exp $
23+
* $Header: /cvsroot/pgsql/src/backend/nodes/equalfuncs.c,v 1.129 2002/04/24 02:48:54 momjian Exp $
2424
*
2525
*-------------------------------------------------------------------------
2626
*/
@@ -983,10 +983,12 @@ _equalRenameStmt(RenameStmt *a, RenameStmt *b)
983983
{
984984
if (!equal(a->relation,b->relation))
985985
return false;
986-
if (!equalstr(a->column,b->column))
986+
if (!equalstr(a->oldname,b->oldname))
987987
return false;
988988
if (!equalstr(a->newname,b->newname))
989989
return false;
990+
if (a->renameType!=b->renameType)
991+
return false;
990992

991993
return true;
992994
}

‎src/backend/parser/gram.y

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
*
1212
*
1313
* IDENTIFICATION
14-
* $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 2.309 2002/04/21 21:53:23 thomas Exp $
14+
* $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 2.310 2002/04/24 02:48:54 momjian Exp $
1515
*
1616
* HISTORY
1717
* AUTHORDATEMAJOR EVENT
@@ -2919,8 +2919,21 @@ RenameStmt: ALTER TABLE relation_expr RENAME opt_column opt_name TO name
29192919
{
29202920
RenameStmt *n = makeNode(RenameStmt);
29212921
n->relation =$3;
2922-
n->column =$6;
2922+
n->oldname =$6;
29232923
n->newname =$8;
2924+
if ($6 ==NULL)
2925+
n->renameType = RENAME_TABLE;
2926+
else
2927+
n->renameType = RENAME_COLUMN;
2928+
$$ = (Node *)n;
2929+
}
2930+
|ALTERTRIGGERnameONrelation_exprRENAMETOname
2931+
{
2932+
RenameStmt *n = makeNode(RenameStmt);
2933+
n->relation =$5;
2934+
n->oldname =$3;
2935+
n->newname =$8;
2936+
n->renameType = RENAME_TRIGGER;
29242937
$$ = (Node *)n;
29252938
}
29262939
;

‎src/backend/tcop/utility.c

Lines changed: 23 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
*
1111
*
1212
* IDENTIFICATION
13-
* $Header: /cvsroot/pgsql/src/backend/tcop/utility.c,v 1.150 2002/04/18 20:01:09 tgl Exp $
13+
* $Header: /cvsroot/pgsql/src/backend/tcop/utility.c,v 1.151 2002/04/24 02:48:55 momjian Exp $
1414
*
1515
*-------------------------------------------------------------------------
1616
*/
@@ -377,23 +377,30 @@ ProcessUtility(Node *parsetree,
377377

378378
CheckOwnership(stmt->relation, true);
379379

380-
if (stmt->column==NULL)
380+
switch (stmt->renameType)
381381
{
382-
/*
383-
* rename relation
384-
*/
385-
renamerel(RangeVarGetRelid(stmt->relation, false),
386-
stmt->newname);
387-
}
388-
else
389-
{
390-
/*
391-
* rename attribute
392-
*/
393-
renameatt(RangeVarGetRelid(stmt->relation, false),
394-
stmt->column,/* old att name */
382+
caseRENAME_TABLE:
383+
renamerel(RangeVarGetRelid(stmt->relation, false),
384+
stmt->newname);
385+
break;
386+
caseRENAME_COLUMN:
387+
renameatt(RangeVarGetRelid(stmt->relation, false),
388+
stmt->oldname,/* old att name */
395389
stmt->newname,/* new att name */
396-
interpretInhOption(stmt->relation->inhOpt));/* recursive? */
390+
interpretInhOption(stmt->relation->inhOpt));/* recursive? */
391+
break;
392+
caseRENAME_TRIGGER:
393+
renametrig(RangeVarGetRelid(stmt->relation, false),
394+
stmt->oldname,/* old att name */
395+
stmt->newname);/* new att name */
396+
break;
397+
caseRENAME_RULE:
398+
elog(ERROR,"ProcessUtility: Invalid target for RENAME: %d",
399+
stmt->renameType);
400+
break;
401+
default:
402+
elog(ERROR,"ProcessUtility: Invalid target for RENAME: %d",
403+
stmt->renameType);
397404
}
398405
}
399406
break;

‎src/include/commands/tablecmds.h

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,15 @@
77
* Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group
88
* Portions Copyright (c) 1994, Regents of the University of California
99
*
10-
* $Id: tablecmds.h,v 1.1 2002/04/15 05:22:04 tgl Exp $
10+
* $Id: tablecmds.h,v 1.2 2002/04/24 02:48:55 momjian Exp $
1111
*
1212
*-------------------------------------------------------------------------
1313
*/
1414
#ifndefTABLECMDS_H
1515
#defineTABLECMDS_H
1616

1717
#include"nodes/parsenodes.h"
18+
#include"utils/inval.h"
1819

1920
externvoidAlterTableAddColumn(Oidmyrelid,boolinherits,
2021
ColumnDef*colDef);
@@ -60,4 +61,8 @@ extern void renameatt(Oid relid,
6061
externvoidrenamerel(Oidrelid,
6162
constchar*newrelname);
6263

64+
externvoidrenametrig(Oidrelid,
65+
constchar*oldname,
66+
constchar*newname);
67+
6368
#endif/* TABLECMDS_H */

‎src/include/nodes/parsenodes.h

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
* Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group
88
* Portions Copyright (c) 1994, Regents of the University of California
99
*
10-
* $Id: parsenodes.h,v 1.173 2002/04/21 00:26:43 tgl Exp $
10+
* $Id: parsenodes.h,v 1.174 2002/04/24 02:48:55 momjian Exp $
1111
*
1212
*-------------------------------------------------------------------------
1313
*/
@@ -1233,17 +1233,23 @@ typedef struct RemoveOperStmt
12331233
}RemoveOperStmt;
12341234

12351235
/* ----------------------
1236-
*AlterTable Rename Statement
1236+
*AlterObject Rename Statement
12371237
* ----------------------
1238+
* Currently supports renaming tables, table columns, and triggers.
1239+
* If renaming a table, oldname is ignored.
12381240
*/
1241+
#defineRENAME_TABLE110
1242+
#defineRENAME_COLUMN111
1243+
#defineRENAME_TRIGGER112
1244+
#defineRENAME_RULE113
1245+
12391246
typedefstructRenameStmt
12401247
{
12411248
NodeTagtype;
1242-
RangeVar*relation;/* relation to be altered */
1243-
char*column;/* if NULL, rename the relation name to
1244-
* the new name. Otherwise, rename this
1245-
* column name. */
1249+
RangeVar*relation;/* owning relation */
1250+
char*oldname;/* name of rule, trigger, etc */
12461251
char*newname;/* the new name */
1252+
intrenameType;/* RENAME_TABLE, RENAME_COLUMN, etc */
12471253
}RenameStmt;
12481254

12491255
/* ----------------------

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp