OSDN Git Service

>Turning nextval and currval into keywords is not an acceptable way to
authorBruce Momjian <bruce@momjian.us>
Thu, 16 Dec 1999 20:07:41 +0000 (20:07 +0000)
committerBruce Momjian <bruce@momjian.us>
Thu, 16 Dec 1999 20:07:41 +0000 (20:07 +0000)
>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

index ee43be4..5b50de1 100644 (file)
@@ -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);