summaryrefslogtreecommitdiff
path: root/src/backend/rewrite
diff options
context:
space:
mode:
authorTom Lane2002-07-16 05:53:34 +0000
committerTom Lane2002-07-16 05:53:34 +0000
commit30ec31604d56388b7b05ecf48cd8fa56c18f181b (patch)
treebc8ff344e3814846bc71b0693144c2d9e73e0060 /src/backend/rewrite
parent1e07ab78cc99520c4c300a3230689521b78f4c16 (diff)
Add code to extract dependencies from an expression tree, and use it
to build dependencies for rules, constraint expressions, and default expressions. Repair some problems in the original design of recursiveDeletion() exposed by more complex dependency sets. Fix regression tests that were deleting things in illegal sequences.
Diffstat (limited to 'src/backend/rewrite')
-rw-r--r--src/backend/rewrite/rewriteDefine.c32
1 files changed, 22 insertions, 10 deletions
diff --git a/src/backend/rewrite/rewriteDefine.c b/src/backend/rewrite/rewriteDefine.c
index 5922cb4ab5b..59d0744dcee 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.74 2002/07/12 18:43:17 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/rewrite/rewriteDefine.c,v 1.75 2002/07/16 05:53:34 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -47,9 +47,11 @@ InsertRule(char *rulname,
Oid eventrel_oid,
AttrNumber evslot_index,
bool evinstead,
- char *evqual,
- char *actiontree)
+ Node *event_qual,
+ List *action)
{
+ char *evqual = nodeToString(event_qual);
+ char *actiontree = nodeToString((Node *) action);
int i;
Datum values[Natts_pg_rewrite];
char nulls[Natts_pg_rewrite];
@@ -123,6 +125,21 @@ InsertRule(char *rulname,
recordDependencyOn(&myself, &referenced,
(evtype == CMD_SELECT) ? DEPENDENCY_INTERNAL : DEPENDENCY_AUTO);
+ /*
+ * Also install dependencies on objects referenced in action and qual.
+ */
+ recordDependencyOnExpr(&myself, (Node *) action, NIL,
+ DEPENDENCY_NORMAL);
+ if (event_qual != NULL)
+ {
+ /* Find query containing OLD/NEW rtable entries */
+ Query *qry = (Query *) lfirst(action);
+
+ qry = getInsertSelectQuery(qry, NULL);
+ recordDependencyOnExpr(&myself, event_qual, qry->rtable,
+ DEPENDENCY_NORMAL);
+ }
+
heap_close(pg_rewrite_desc, RowExclusiveLock);
return rewriteObjectId;
@@ -141,8 +158,6 @@ DefineQueryRewrite(RuleStmt *stmt)
Oid ruleId;
int event_attno;
Oid event_attype;
- char *actionP,
- *event_qualP;
List *l;
Query *query;
AclResult aclresult;
@@ -342,16 +357,13 @@ DefineQueryRewrite(RuleStmt *stmt)
/* discard rule if it's null action and not INSTEAD; it's a no-op */
if (action != NIL || is_instead)
{
- event_qualP = nodeToString(event_qual);
- actionP = nodeToString(action);
-
ruleId = InsertRule(stmt->rulename,
event_type,
ev_relid,
event_attno,
is_instead,
- event_qualP,
- actionP);
+ event_qual,
+ action);
/*
* Set pg_class 'relhasrules' field TRUE for event relation. If