From: Bruce Momjian <bruce@momjian.us>
Date: Thu, 16 Dec 1999 20:07:41 +0000 (+0000)
Subject: >Turning nextval and currval into keywords is not an acceptable way to
X-Git-Tag: REL7_0~1020
X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=cf374febf5a06dfbf02f5d6d74f5d156cb9af62a;p=postgresql

>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
---

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);