diff options
Diffstat (limited to 'src/backend/rewrite/rewriteDefine.c')
-rw-r--r-- | src/backend/rewrite/rewriteDefine.c | 51 |
1 files changed, 50 insertions, 1 deletions
diff --git a/src/backend/rewrite/rewriteDefine.c b/src/backend/rewrite/rewriteDefine.c index 4cebece58cd..b0315157e4f 100644 --- a/src/backend/rewrite/rewriteDefine.c +++ b/src/backend/rewrite/rewriteDefine.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/rewrite/rewriteDefine.c,v 1.62 2001/05/03 21:16:48 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/rewrite/rewriteDefine.c,v 1.63 2001/08/12 21:35:18 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -28,6 +28,7 @@ #include "rewrite/rewriteSupport.h" #include "storage/smgr.h" #include "utils/builtins.h" +#include "utils/syscache.h" static void setRuleCheckAsUser(Query *qry, Oid userid); @@ -478,3 +479,51 @@ setRuleCheckAsUser_walker(Node *node, Oid *context) return expression_tree_walker(node, setRuleCheckAsUser_walker, (void *) context); } + + +/* + * Rename an existing rewrite rule. + * + * There is not currently a user command to invoke this directly + * (perhaps there should be). But we need it anyway to rename the + * ON SELECT rule associated with a view, when the view is renamed. + */ +void +RenameRewriteRule(char *oldname, char *newname) +{ + Relation pg_rewrite_desc; + HeapTuple ruletup; + + pg_rewrite_desc = heap_openr(RewriteRelationName, RowExclusiveLock); + + ruletup = SearchSysCacheCopy(RULENAME, + PointerGetDatum(oldname), + 0, 0, 0); + if (!HeapTupleIsValid(ruletup)) + elog(ERROR, "RenameRewriteRule: rule \"%s\" does not exist", oldname); + + /* should not already exist */ + if (IsDefinedRewriteRule(newname)) + elog(ERROR, "Attempt to rename rule \"%s\" failed: \"%s\" already exists", + oldname, newname); + + StrNCpy(NameStr(((Form_pg_rewrite) GETSTRUCT(ruletup))->rulename), + newname, NAMEDATALEN); + + simple_heap_update(pg_rewrite_desc, &ruletup->t_self, ruletup); + + /* keep system catalog indices current */ + if (RelationGetForm(pg_rewrite_desc)->relhasindex) + { + Relation idescs[Num_pg_rewrite_indices]; + + CatalogOpenIndices(Num_pg_rewrite_indices, Name_pg_rewrite_indices, + idescs); + CatalogIndexInsert(idescs, Num_pg_rewrite_indices, pg_rewrite_desc, + ruletup); + CatalogCloseIndices(Num_pg_rewrite_indices, idescs); + } + + heap_freetuple(ruletup); + heap_close(pg_rewrite_desc, RowExclusiveLock); +} |