aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2001-06-04 16:17:30 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2001-06-04 16:17:30 +0000
commiteeaa497e7b31b52be919e7fbd4125f66c60ce87e (patch)
tree50f829e39bced0cbba0de09b8da913fddcc9582b /src
parent12c1552066cac81a6b93062e8966cfa0d2d56af5 (diff)
downloadpostgresql-eeaa497e7b31b52be919e7fbd4125f66c60ce87e.tar.gz
postgresql-eeaa497e7b31b52be919e7fbd4125f66c60ce87e.zip
Give error message, rather than coredump, for utility statements in
conditional rules (rules with WHERE clauses). We cannot support these since there's noplace to hang a condition on a utility statement. We caught the other case (attempt to attach a condition at rewrite time) awhile ago, but this one escaped notice until now.
Diffstat (limited to 'src')
-rw-r--r--src/backend/parser/analyze.c23
1 files changed, 18 insertions, 5 deletions
diff --git a/src/backend/parser/analyze.c b/src/backend/parser/analyze.c
index 0b6faf64227..2bef065b11a 100644
--- a/src/backend/parser/analyze.c
+++ b/src/backend/parser/analyze.c
@@ -6,7 +6,7 @@
* Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
- * $Header: /cvsroot/pgsql/src/backend/parser/analyze.c,v 1.187 2001/05/22 16:37:15 petere Exp $
+ * $Header: /cvsroot/pgsql/src/backend/parser/analyze.c,v 1.188 2001/06/04 16:17:30 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -1742,13 +1742,15 @@ transformRuleStmt(ParseState *pstate, RuleStmt *stmt)
}
else
{
- List *actions;
+ List *oldactions;
+ List *newactions = NIL;
/*
* transform each statement, like parse_analyze()
*/
- foreach(actions, stmt->actions)
+ foreach(oldactions, stmt->actions)
{
+ Node *action = (Node *) lfirst(oldactions);
ParseState *sub_pstate = make_parsestate(pstate->parentParseState);
Query *sub_qry,
*top_subqry;
@@ -1775,7 +1777,16 @@ transformRuleStmt(ParseState *pstate, RuleStmt *stmt)
addRTEtoQuery(sub_pstate, newrte, false, true);
/* Transform the rule action statement */
- top_subqry = transformStmt(sub_pstate, lfirst(actions));
+ top_subqry = transformStmt(sub_pstate, action);
+
+ /*
+ * We cannot support utility-statement actions (eg NOTIFY)
+ * with nonempty rule WHERE conditions, because there's no
+ * way to make the utility action execute conditionally.
+ */
+ if (top_subqry->commandType == CMD_UTILITY &&
+ stmt->whereClause != NULL)
+ elog(ERROR, "Rules with WHERE conditions may only have SELECT, INSERT, UPDATE, or DELETE actions");
/*
* If the action is INSERT...SELECT, OLD/NEW have been pushed
@@ -1846,11 +1857,13 @@ transformRuleStmt(ParseState *pstate, RuleStmt *stmt)
sub_qry->jointree->fromlist = sub_pstate->p_joinlist;
}
- lfirst(actions) = top_subqry;
+ newactions = lappend(newactions, top_subqry);
release_pstate_resources(sub_pstate);
pfree(sub_pstate);
}
+
+ stmt->actions = newactions;
}
return qry;