1
0
mirror of https://github.com/postgres/postgres.git synced 2025-09-03 15:22:11 +03:00

Don't treat NEW and OLD as reserved words anymore. For the purposes of rules

it works just as well to have them be ordinary identifiers, and this gets rid
of a number of ugly special cases.  Plus we aren't interfering with non-rule
usage of these names.

catversion bump because the names change internally in stored rules.
This commit is contained in:
Tom Lane
2009-11-05 23:24:27 +00:00
parent 45d7e04fce
commit 593f4b854a
18 changed files with 84 additions and 156 deletions

View File

@@ -11,7 +11,7 @@
*
*
* IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/parser/gram.y,v 2.687 2009/11/04 23:15:08 tgl Exp $
* $PostgreSQL: pgsql/src/backend/parser/gram.y,v 2.688 2009/11/05 23:24:23 tgl Exp $
*
* HISTORY
* AUTHOR DATE MAJOR EVENT
@@ -254,7 +254,7 @@ static TypeName *TableFuncTypeName(List *columns);
%type <list> TriggerEvents TriggerOneEvent
%type <value> TriggerFuncArg
%type <str> relation_name copy_file_name
%type <str> copy_file_name
database_name access_method_clause access_method attr_name
index_name name file_name cluster_index_specification
@@ -263,7 +263,7 @@ static TypeName *TableFuncTypeName(List *columns);
%type <range> qualified_name OptConstrFromTable
%type <str> all_Op MathOp SpecialRuleRelation
%type <str> all_Op MathOp
%type <str> iso_level opt_encoding
%type <node> grantee
@@ -502,11 +502,11 @@ static TypeName *TableFuncTypeName(List *columns);
MAPPING MATCH MAXVALUE MINUTE_P MINVALUE MODE MONTH_P MOVE
NAME_P NAMES NATIONAL NATURAL NCHAR NEW NEXT NO NOCREATEDB
NAME_P NAMES NATIONAL NATURAL NCHAR NEXT NO NOCREATEDB
NOCREATEROLE NOCREATEUSER NOINHERIT NOLOGIN_P NONE NOSUPERUSER
NOT NOTHING NOTIFY NOTNULL NOWAIT NULL_P NULLIF NULLS_P NUMERIC
OBJECT_P OF OFF OFFSET OIDS OLD ON ONLY OPERATOR OPTION OPTIONS OR
OBJECT_P OF OFF OFFSET OIDS ON ONLY OPERATOR OPTION OPTIONS OR
ORDER OUT_P OUTER_P OVER OVERLAPS OVERLAY OWNED OWNER
PARSER PARTIAL PARTITION PASSWORD PLACING PLANS POSITION
@@ -5886,20 +5886,18 @@ AlterOwnerStmt: ALTER AGGREGATE func_name aggr_args OWNER TO RoleId
*****************************************************************************/
RuleStmt: CREATE opt_or_replace RULE name AS
{ pg_yyget_extra(yyscanner)->QueryIsRule = TRUE; }
ON event TO qualified_name where_clause
DO opt_instead RuleActionList
{
RuleStmt *n = makeNode(RuleStmt);
n->replace = $2;
n->relation = $10;
n->relation = $9;
n->rulename = $4;
n->whereClause = $11;
n->event = $8;
n->instead = $13;
n->actions = $14;
n->whereClause = $10;
n->event = $7;
n->instead = $12;
n->actions = $13;
$$ = (Node *)n;
pg_yyget_extra(yyscanner)->QueryIsRule = FALSE;
}
;
@@ -10109,16 +10107,11 @@ case_arg: a_expr { $$ = $1; }
| /*EMPTY*/ { $$ = NULL; }
;
/*
* columnref starts with relation_name not ColId, so that OLD and NEW
* references can be accepted. Note that when there are more than two
* dotted names, the first name is not actually a relation name...
*/
columnref: relation_name
columnref: ColId
{
$$ = makeColumnRef($1, NIL, @1, yyscanner);
}
| relation_name indirection
| ColId indirection
{
$$ = makeColumnRef($1, $2, @1, yyscanner);
}
@@ -10258,11 +10251,6 @@ target_el: a_expr AS ColLabel
*
*****************************************************************************/
relation_name:
SpecialRuleRelation { $$ = $1; }
| ColId { $$ = $1; }
;
qualified_name_list:
qualified_name { $$ = list_make1($1); }
| qualified_name_list ',' qualified_name { $$ = lappend($1, $3); }
@@ -10276,7 +10264,7 @@ qualified_name_list:
* which may contain subscripts, and reject that case in the C code.
*/
qualified_name:
relation_name
ColId
{
$$ = makeNode(RangeVar);
$$->catalogname = NULL;
@@ -10284,7 +10272,7 @@ qualified_name:
$$->relname = $1;
$$->location = @1;
}
| relation_name indirection
| ColId indirection
{
check_qualified_name($2, yyscanner);
$$ = makeNode(RangeVar);
@@ -10343,7 +10331,7 @@ file_name: Sconst { $$ = $1; };
*/
func_name: type_function_name
{ $$ = list_make1(makeString($1)); }
| relation_name indirection
| ColId indirection
{
$$ = check_func_name(lcons(makeString($1), $2),
yyscanner);
@@ -10912,12 +10900,10 @@ reserved_keyword:
| LIMIT
| LOCALTIME
| LOCALTIMESTAMP
| NEW
| NOT
| NULL_P
| OFF
| OFFSET
| OLD
| ON
| ONLY
| OR
@@ -10946,30 +10932,6 @@ reserved_keyword:
| WITH
;
SpecialRuleRelation:
OLD
{
if (pg_yyget_extra(yyscanner)->QueryIsRule)
$$ = "*OLD*";
else
ereport(ERROR,
(errcode(ERRCODE_SYNTAX_ERROR),
errmsg("OLD used in query that is not in a rule"),
parser_errposition(@1)));
}
| NEW
{
if (pg_yyget_extra(yyscanner)->QueryIsRule)
$$ = "*NEW*";
else
ereport(ERROR,
(errcode(ERRCODE_SYNTAX_ERROR),
errmsg("NEW used in query that is not in a rule"),
parser_errposition(@1)));
}
;
%%
/*
@@ -11461,7 +11423,6 @@ void
parser_init(base_yy_extra_type *yyext)
{
yyext->parsetree = NIL; /* in case grammar forgets to set it */
yyext->QueryIsRule = FALSE;
}
/*

View File

@@ -19,7 +19,7 @@
* Portions Copyright (c) 1996-2009, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* $PostgreSQL: pgsql/src/backend/parser/parse_utilcmd.c,v 2.28 2009/10/13 00:53:08 tgl Exp $
* $PostgreSQL: pgsql/src/backend/parser/parse_utilcmd.c,v 2.29 2009/11/05 23:24:24 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -1549,10 +1549,10 @@ transformRuleStmt(RuleStmt *stmt, const char *queryString,
* qualification.
*/
oldrte = addRangeTableEntryForRelation(pstate, rel,
makeAlias("*OLD*", NIL),
makeAlias("old", NIL),
false, false);
newrte = addRangeTableEntryForRelation(pstate, rel,
makeAlias("*NEW*", NIL),
makeAlias("new", NIL),
false, false);
/* Must override addRangeTableEntry's default access-check flags */
oldrte->requiredPerms = 0;
@@ -1653,10 +1653,10 @@ transformRuleStmt(RuleStmt *stmt, const char *queryString,
* them in the joinlist.
*/
oldrte = addRangeTableEntryForRelation(sub_pstate, rel,
makeAlias("*OLD*", NIL),
makeAlias("old", NIL),
false, false);
newrte = addRangeTableEntryForRelation(sub_pstate, rel,
makeAlias("*NEW*", NIL),
makeAlias("new", NIL),
false, false);
oldrte->requiredPerms = 0;
newrte->requiredPerms = 0;