diff options
Diffstat (limited to 'src/backend/parser')
-rw-r--r-- | src/backend/parser/analyze.c | 28 | ||||
-rw-r--r-- | src/backend/parser/gram.y | 3 | ||||
-rw-r--r-- | src/backend/parser/parse_relation.c | 9 |
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); |