|
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 | static void setRuleCheckAsUser(Query *qry, Oid userid);
|
@@ -478,3 +479,51 @@ setRuleCheckAsUser_walker(Node *node, Oid *context)
|
478 | 479 | return expression_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 | + Relation pg_rewrite_desc; |
| 495 | + HeapTuple ruletup; |
| 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 | + Relation idescs[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 | +} |
0 commit comments