|
8 | 8 | *
|
9 | 9 | *
|
10 | 10 | * IDENTIFICATION
|
11 |
| - * $Header: /cvsroot/pgsql/src/backend/rewrite/rewriteDefine.c,v 1.62 2001/05/03 21:16:48 tgl Exp $ |
| 11 | + * $Header: /cvsroot/pgsql/src/backend/rewrite/rewriteDefine.c,v 1.63 2001/08/12 21:35:18 tgl Exp $ |
12 | 12 | *
|
13 | 13 | *-------------------------------------------------------------------------
|
14 | 14 | */
|
|
28 | 28 | #include"rewrite/rewriteSupport.h"
|
29 | 29 | #include"storage/smgr.h"
|
30 | 30 | #include"utils/builtins.h"
|
| 31 | +#include"utils/syscache.h" |
31 | 32 |
|
32 | 33 |
|
33 | 34 | staticvoidsetRuleCheckAsUser(Query*qry,Oiduserid);
|
@@ -478,3 +479,51 @@ setRuleCheckAsUser_walker(Node *node, Oid *context)
|
478 | 479 | returnexpression_tree_walker(node,setRuleCheckAsUser_walker,
|
479 | 480 | (void*)context);
|
480 | 481 | }
|
| 482 | + |
| 483 | + |
| 484 | +/* |
| 485 | + * Rename an existing rewrite rule. |
| 486 | + * |
| 487 | + * There is not currently a user command to invoke this directly |
| 488 | + * (perhaps there should be). But we need it anyway to rename the |
| 489 | + * ON SELECT rule associated with a view, when the view is renamed. |
| 490 | + */ |
| 491 | +void |
| 492 | +RenameRewriteRule(char*oldname,char*newname) |
| 493 | +{ |
| 494 | +Relationpg_rewrite_desc; |
| 495 | +HeapTupleruletup; |
| 496 | + |
| 497 | +pg_rewrite_desc=heap_openr(RewriteRelationName,RowExclusiveLock); |
| 498 | + |
| 499 | +ruletup=SearchSysCacheCopy(RULENAME, |
| 500 | +PointerGetDatum(oldname), |
| 501 | +0,0,0); |
| 502 | +if (!HeapTupleIsValid(ruletup)) |
| 503 | +elog(ERROR,"RenameRewriteRule: rule \"%s\" does not exist",oldname); |
| 504 | + |
| 505 | +/* should not already exist */ |
| 506 | +if (IsDefinedRewriteRule(newname)) |
| 507 | +elog(ERROR,"Attempt to rename rule \"%s\" failed: \"%s\" already exists", |
| 508 | +oldname,newname); |
| 509 | + |
| 510 | +StrNCpy(NameStr(((Form_pg_rewrite)GETSTRUCT(ruletup))->rulename), |
| 511 | +newname,NAMEDATALEN); |
| 512 | + |
| 513 | +simple_heap_update(pg_rewrite_desc,&ruletup->t_self,ruletup); |
| 514 | + |
| 515 | +/* keep system catalog indices current */ |
| 516 | +if (RelationGetForm(pg_rewrite_desc)->relhasindex) |
| 517 | +{ |
| 518 | +Relationidescs[Num_pg_rewrite_indices]; |
| 519 | + |
| 520 | +CatalogOpenIndices(Num_pg_rewrite_indices,Name_pg_rewrite_indices, |
| 521 | +idescs); |
| 522 | +CatalogIndexInsert(idescs,Num_pg_rewrite_indices,pg_rewrite_desc, |
| 523 | +ruletup); |
| 524 | +CatalogCloseIndices(Num_pg_rewrite_indices,idescs); |
| 525 | +} |
| 526 | + |
| 527 | +heap_freetuple(ruletup); |
| 528 | +heap_close(pg_rewrite_desc,RowExclusiveLock); |
| 529 | +} |