aboutsummaryrefslogtreecommitdiff
path: root/src/backend/rewrite/rewriteDefine.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/rewrite/rewriteDefine.c')
-rw-r--r--src/backend/rewrite/rewriteDefine.c51
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);
+}