From cf374febf5a06dfbf02f5d6d74f5d156cb9af62a Mon Sep 17 00:00:00 2001 From: Bruce Momjian Date: Thu, 16 Dec 1999 20:07:41 +0000 Subject: [PATCH] >Turning nextval and currval into keywords is not an acceptable way to >go about this. That will risk breaking existing applications that use >those names as column names. > >It should actually almost work to write sq.nextval as things stand, >because Postgres has for a long time considered table.function and >function(table) to be interchangeable notations for certain kinds of >functions. nextval doesn't seem to be one of that kind of function, >at the moment. I'd suggest leaving the grammar as it was, and taking a >look at ParseFuncOrColumn in parse_func.c to see if you can't persuade >it to accept the sequence functions in that style. OK, good point. I tried to implement it somewhere else and ended up extending transformAttr. Attached you'll find the patch. Jeroen van Vianen --- src/backend/parser/parse_expr.c | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/src/backend/parser/parse_expr.c b/src/backend/parser/parse_expr.c index ee43be4195..5b50de1494 100644 --- a/src/backend/parser/parse_expr.c +++ b/src/backend/parser/parse_expr.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/parser/parse_expr.c,v 1.60 1999/12/10 07:37:35 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/parser/parse_expr.c,v 1.61 1999/12/16 20:07:41 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -531,6 +531,30 @@ static Node * transformAttr(ParseState *pstate, Attr *att, int precedence) { Node *basenode; + char * attribute; + + /* Get the name of the first attribute */ + if ((att != NULL) && (lfirst(att->attrs) != NULL)) + { + /* + * Special case for name.nextval and name.currval, assume it's a + * sequence and transform to function call to nextval('name') and + * currval('name') + */ + attribute = pstrdup(((Value *) lfirst(att->attrs))->val.str); + if ((strcasecmp(attribute, "nextval") == 0) || + (strcasecmp(attribute, "currval") == 0)) + { + Value *s = makeNode(Value); + + s->type = T_String; + s->val.str = att->relname; + + return ParseFuncOrColumn(pstate, attribute, + lcons(make_const(s), NIL), false, false, + &pstate->p_last_resno, precedence); + } + } basenode = ParseNestedFuncOrColumn(pstate, att, &pstate->p_last_resno, precedence); -- 2.11.0