aboutsummaryrefslogtreecommitdiff
path: root/src/backend/parser
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/parser')
-rw-r--r--src/backend/parser/analyze.c28
-rw-r--r--src/backend/parser/gram.y3
-rw-r--r--src/backend/parser/parse_relation.c9
3 files changed, 35 insertions, 5 deletions
diff --git a/src/backend/parser/analyze.c b/src/backend/parser/analyze.c
index 65f40f4cad8..2bdcef170f3 100644
--- a/src/backend/parser/analyze.c
+++ b/src/backend/parser/analyze.c
@@ -7,7 +7,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/parser/analyze.c,v 1.79 1998/07/20 20:48:51 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/parser/analyze.c,v 1.80 1998/08/18 00:48:54 scrappy Exp $
*
*-------------------------------------------------------------------------
*/
@@ -742,11 +742,33 @@ static Query *
transformRuleStmt(ParseState *pstate, RuleStmt *stmt)
{
Query *qry;
+ Query *action;
List *actions;
qry = makeNode(Query);
qry->commandType = CMD_UTILITY;
+ /*
+ * 'instead nothing' rules with a qualification need a
+ * query a rangetable so the rewrite handler can add the
+ * negated rule qualification to the original query. We
+ * create a query with the new command type CMD_NOTHING
+ * here that is treated special by the rewrite system.
+ */
+ if (stmt->actions == NIL) {
+ Query *nothing_qry = makeNode(Query);
+ nothing_qry->commandType = CMD_NOTHING;
+
+ addRangeTableEntry(pstate, stmt->object->relname, "*CURRENT*",
+ FALSE, FALSE);
+ addRangeTableEntry(pstate, stmt->object->relname, "*NEW*",
+ FALSE, FALSE);
+
+ nothing_qry->rtable = pstate->p_rtable;
+
+ stmt->actions = lappend(NIL, nothing_qry);
+ }
+
actions = stmt->actions;
/*
@@ -768,7 +790,9 @@ transformRuleStmt(ParseState *pstate, RuleStmt *stmt)
pstate->p_is_rule = true; /* for expand all */
pstate->p_hasAggs = false;
- lfirst(actions) = transformStmt(pstate, lfirst(actions));
+ action = (Query *)lfirst(actions);
+ if (action->commandType != CMD_NOTHING)
+ lfirst(actions) = transformStmt(pstate, lfirst(actions));
actions = lnext(actions);
}
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
index 0e0015f3e49..23db7a10731 100644
--- a/src/backend/parser/gram.y
+++ b/src/backend/parser/gram.y
@@ -10,7 +10,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 2.22 1998/08/17 16:08:34 thomas Exp $
+ * $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 2.23 1998/08/18 00:48:55 scrappy Exp $
*
* HISTORY
* AUTHOR DATE MAJOR EVENT
@@ -1955,6 +1955,7 @@ RuleStmt: CREATE RULE name AS
OptStmtList: NOTHING { $$ = NIL; }
| OptimizableStmt { $$ = lcons($1, NIL); }
| '[' OptStmtBlock ']' { $$ = $2; }
+ | '(' OptStmtBlock ')' { $$ = $2; }
;
OptStmtBlock: OptStmtMulti
diff --git a/src/backend/parser/parse_relation.c b/src/backend/parser/parse_relation.c
index fef834d2c6d..181152bfa5b 100644
--- a/src/backend/parser/parse_relation.c
+++ b/src/backend/parser/parse_relation.c
@@ -7,7 +7,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/parser/parse_relation.c,v 1.12 1998/07/08 14:04:11 thomas Exp $
+ * $Header: /cvsroot/pgsql/src/backend/parser/parse_relation.c,v 1.13 1998/08/18 00:48:57 scrappy Exp $
*
*-------------------------------------------------------------------------
*/
@@ -191,8 +191,13 @@ addRangeTableEntry(ParseState *pstate,
if (pstate != NULL)
{
if (refnameRangeTablePosn(pstate, refname, &sublevels_up) != 0 &&
- (!inFromCl || sublevels_up == 0))
+ (!inFromCl || sublevels_up == 0)) {
+ if (!strcmp(refname, "*CURRENT*") || !strcmp(refname, "*NEW*")) {
+ int rt_index = refnameRangeTablePosn(pstate, refname, &sublevels_up);
+ return (RangeTblEntry *)nth(rt_index - 1, pstate->p_rtable);
+ }
elog(ERROR, "Table name %s specified more than once", refname);
+ }
}
rte->relname = pstrdup(relname);