summaryrefslogtreecommitdiff
path: root/src/backend/rewrite
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2002-04-18 20:01:11 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2002-04-18 20:01:11 +0000
commitb3120804ad1692322a6d905b352df7fa0d7cdd80 (patch)
tree93aaf632df82db20e63c952be8a6fd1e4ec15629 /src/backend/rewrite
parent4e08a625b006ba3992be881b516773adba5863e4 (diff)
downloadpostgresql-b3120804ad1692322a6d905b352df7fa0d7cdd80.tar.gz
Rule names are now unique per-relation, rather than unique globally.
DROP RULE and COMMENT ON RULE syntax adds an 'ON tablename' clause, similar to TRIGGER syntaxes. To allow loading of existing pg_dump files containing COMMENT ON RULE, the COMMENT code will still accept the old syntax --- but only if the target rulename is unique across the whole database.
Diffstat (limited to 'src/backend/rewrite')
-rw-r--r--src/backend/rewrite/rewriteDefine.c39
-rw-r--r--src/backend/rewrite/rewriteRemove.c45
-rw-r--r--src/backend/rewrite/rewriteSupport.c9
3 files changed, 47 insertions, 46 deletions
diff --git a/src/backend/rewrite/rewriteDefine.c b/src/backend/rewrite/rewriteDefine.c
index f20c9a0d98..8b40aeb4f7 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.66 2002/03/26 19:16:02 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/rewrite/rewriteDefine.c,v 1.67 2002/04/18 20:01:09 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -37,7 +37,7 @@ static bool setRuleCheckAsUser_walker(Node *node, Oid *context);
/*
* InsertRule -
- * takes the arguments and inserts them as attributes into the system
+ * takes the arguments and inserts them as a row into the system
* relation "pg_rewrite"
*/
static Oid
@@ -58,7 +58,7 @@ InsertRule(char *rulname,
HeapTuple tup;
Oid rewriteObjectId;
- if (IsDefinedRewriteRule(rulname))
+ if (IsDefinedRewriteRule(eventrel_oid, rulname))
elog(ERROR, "Attempt to insert rule \"%s\" failed: already exists",
rulname);
@@ -69,13 +69,13 @@ InsertRule(char *rulname,
i = 0;
namestrcpy(&rname, rulname);
- values[i++] = NameGetDatum(&rname);
- values[i++] = CharGetDatum(evtype + '0');
- values[i++] = ObjectIdGetDatum(eventrel_oid);
- values[i++] = Int16GetDatum(evslot_index);
- values[i++] = BoolGetDatum(evinstead);
- values[i++] = DirectFunctionCall1(textin, CStringGetDatum(evqual));
- values[i++] = DirectFunctionCall1(textin, CStringGetDatum(actiontree));
+ values[i++] = NameGetDatum(&rname); /* rulename */
+ values[i++] = ObjectIdGetDatum(eventrel_oid); /* ev_class */
+ values[i++] = Int16GetDatum(evslot_index); /* ev_attr */
+ values[i++] = CharGetDatum(evtype + '0'); /* ev_type */
+ values[i++] = BoolGetDatum(evinstead); /* is_instead */
+ values[i++] = DirectFunctionCall1(textin, CStringGetDatum(evqual)); /* ev_qual */
+ values[i++] = DirectFunctionCall1(textin, CStringGetDatum(actiontree)); /* ev_action */
/*
* create a new pg_rewrite tuple
@@ -423,26 +423,27 @@ setRuleCheckAsUser_walker(Node *node, Oid *context)
* ON SELECT rule associated with a view, when the view is renamed.
*/
void
-RenameRewriteRule(char *oldname, char *newname)
+RenameRewriteRule(Oid owningRel, const char *oldName,
+ const char *newName)
{
Relation pg_rewrite_desc;
HeapTuple ruletup;
pg_rewrite_desc = heap_openr(RewriteRelationName, RowExclusiveLock);
- ruletup = SearchSysCacheCopy(RULENAME,
- PointerGetDatum(oldname),
- 0, 0, 0);
+ ruletup = SearchSysCacheCopy(RULERELNAME,
+ ObjectIdGetDatum(owningRel),
+ PointerGetDatum(oldName),
+ 0, 0);
if (!HeapTupleIsValid(ruletup))
- elog(ERROR, "RenameRewriteRule: rule \"%s\" does not exist", oldname);
+ elog(ERROR, "RenameRewriteRule: rule \"%s\" does not exist", oldName);
/* should not already exist */
- if (IsDefinedRewriteRule(newname))
+ if (IsDefinedRewriteRule(owningRel, newName))
elog(ERROR, "Attempt to rename rule \"%s\" failed: \"%s\" already exists",
- oldname, newname);
+ oldName, newName);
- StrNCpy(NameStr(((Form_pg_rewrite) GETSTRUCT(ruletup))->rulename),
- newname, NAMEDATALEN);
+ namestrcpy(&(((Form_pg_rewrite) GETSTRUCT(ruletup))->rulename), newName);
simple_heap_update(pg_rewrite_desc, &ruletup->t_self, ruletup);
diff --git a/src/backend/rewrite/rewriteRemove.c b/src/backend/rewrite/rewriteRemove.c
index da8f1b8e54..df85fa504a 100644
--- a/src/backend/rewrite/rewriteRemove.c
+++ b/src/backend/rewrite/rewriteRemove.c
@@ -8,15 +8,16 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/rewrite/rewriteRemove.c,v 1.47 2002/03/29 19:06:13 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/rewrite/rewriteRemove.c,v 1.48 2002/04/18 20:01:09 tgl Exp $
*
*-------------------------------------------------------------------------
*/
#include "postgres.h"
-#include "utils/builtins.h"
+#include "access/genam.h"
#include "access/heapam.h"
#include "catalog/catname.h"
+#include "catalog/indexing.h"
#include "catalog/pg_rewrite.h"
#include "commands/comment.h"
#include "miscadmin.h"
@@ -30,12 +31,11 @@
/*
* RemoveRewriteRule
*
- * Delete a rule given its (possibly qualified) rulename.
+ * Delete a rule given its name.
*/
void
-RemoveRewriteRule(List *names)
+RemoveRewriteRule(Oid owningRel, const char *ruleName)
{
- char *ruleName;
Relation RewriteRelation;
Relation event_relation;
HeapTuple tuple;
@@ -45,13 +45,6 @@ RemoveRewriteRule(List *names)
int32 aclcheck_result;
/*
- * XXX temporary until rules become schema-tized
- */
- if (length(names) != 1)
- elog(ERROR, "Qualified rule names not supported yet");
- ruleName = strVal(lfirst(names));
-
- /*
* Open the pg_rewrite relation.
*/
RewriteRelation = heap_openr(RewriteRelationName, RowExclusiveLock);
@@ -59,9 +52,10 @@ RemoveRewriteRule(List *names)
/*
* Find the tuple for the target rule.
*/
- tuple = SearchSysCacheCopy(RULENAME,
+ tuple = SearchSysCacheCopy(RULERELNAME,
+ ObjectIdGetDatum(owningRel),
PointerGetDatum(ruleName),
- 0, 0, 0);
+ 0, 0);
/*
* complain if no rule with such name existed
@@ -75,6 +69,7 @@ RemoveRewriteRule(List *names)
*/
ruleId = tuple->t_data->t_oid;
eventRelationOid = ((Form_pg_rewrite) GETSTRUCT(tuple))->ev_class;
+ Assert(eventRelationOid == owningRel);
/*
* We had better grab AccessExclusiveLock so that we know no other
@@ -137,10 +132,10 @@ RemoveRewriteRule(List *names)
void
RelationRemoveRules(Oid relid)
{
- Relation RewriteRelation = NULL;
- HeapScanDesc scanDesc = NULL;
+ Relation RewriteRelation;
+ SysScanDesc scanDesc;
ScanKeyData scanKeyData;
- HeapTuple tuple = NULL;
+ HeapTuple tuple;
/*
* Open the pg_rewrite relation.
@@ -148,18 +143,21 @@ RelationRemoveRules(Oid relid)
RewriteRelation = heap_openr(RewriteRelationName, RowExclusiveLock);
/*
- * Scan the RuleRelation ('pg_rewrite') for all the tuples that has
- * the same ev_class as relid (the relation to be removed).
+ * Scan pg_rewrite for all the tuples that have the same ev_class
+ * as relid (the relation to be removed).
*/
ScanKeyEntryInitialize(&scanKeyData,
0,
Anum_pg_rewrite_ev_class,
F_OIDEQ,
ObjectIdGetDatum(relid));
- scanDesc = heap_beginscan(RewriteRelation,
- 0, SnapshotNow, 1, &scanKeyData);
- while (HeapTupleIsValid(tuple = heap_getnext(scanDesc, 0)))
+ scanDesc = systable_beginscan(RewriteRelation,
+ RewriteRelRulenameIndex,
+ true, SnapshotNow,
+ 1, &scanKeyData);
+
+ while (HeapTupleIsValid(tuple = systable_getnext(scanDesc)))
{
/* Delete any comments associated with this rule */
DeleteComments(tuple->t_data->t_oid, RelationGetRelid(RewriteRelation));
@@ -167,6 +165,7 @@ RelationRemoveRules(Oid relid)
simple_heap_delete(RewriteRelation, &tuple->t_self);
}
- heap_endscan(scanDesc);
+ systable_endscan(scanDesc);
+
heap_close(RewriteRelation, RowExclusiveLock);
}
diff --git a/src/backend/rewrite/rewriteSupport.c b/src/backend/rewrite/rewriteSupport.c
index bc2f04932a..62a951aaf6 100644
--- a/src/backend/rewrite/rewriteSupport.c
+++ b/src/backend/rewrite/rewriteSupport.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/rewrite/rewriteSupport.c,v 1.49 2001/08/12 21:35:19 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/rewrite/rewriteSupport.c,v 1.50 2002/04/18 20:01:09 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -29,11 +29,12 @@
* Is there a rule by the given name?
*/
bool
-IsDefinedRewriteRule(const char *ruleName)
+IsDefinedRewriteRule(Oid owningRel, const char *ruleName)
{
- return SearchSysCacheExists(RULENAME,
+ return SearchSysCacheExists(RULERELNAME,
+ ObjectIdGetDatum(owningRel),
PointerGetDatum(ruleName),
- 0, 0, 0);
+ 0, 0);
}
/*