mirror of
https://github.com/postgres/postgres.git
synced 2025-07-07 00:36:50 +03:00
Make ALTER TABLE RENAME on a view rename the view's on-select rule too.
Needed to keep pg_dump from getting confused.
This commit is contained in:
@ -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);
|
||||
}
|
||||
|
Reference in New Issue
Block a user