Adds in NO MAXVALUE and NO MINVALUE options for create sequence per 200X
authorBruce Momjian <bruce@momjian.us>
Thu, 13 Feb 2003 05:25:24 +0000 (05:25 +0000)
committerBruce Momjian <bruce@momjian.us>
Thu, 13 Feb 2003 05:25:24 +0000 (05:25 +0000)
spec, which will also make alter sequence a touch easier.

sequence.c  init_params() will check for settings which have been
defined twice, and complain.

Rod Taylor

src/backend/commands/sequence.c
src/backend/parser/gram.y

index f5d41b3df2c9d2b4d53aca8de358fc4a8af2499a..c3ea6a14c0064ab8052b43e96718e2c8fd4ffdba 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/backend/commands/sequence.c,v 1.90 2002/11/11 22:19:21 tgl Exp $
+ *   $Header: /cvsroot/pgsql/src/backend/commands/sequence.c,v 1.91 2003/02/13 05:25:24 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -781,6 +781,7 @@ init_params(CreateSeqStmt *seq, Form_pg_sequence new)
    DefElem    *max_value = NULL;
    DefElem    *min_value = NULL;
    DefElem    *cache_value = NULL;
+   bool        is_cycled_set = false;
    List       *option;
 
    new->is_cycled = false;
@@ -789,17 +790,42 @@ init_params(CreateSeqStmt *seq, Form_pg_sequence new)
        DefElem    *defel = (DefElem *) lfirst(option);
 
        if (strcmp(defel->defname, "increment") == 0)
+       {
+           if (increment_by)
+               elog(ERROR, "DefineSequence: INCREMENT BY defined twice");
            increment_by = defel;
+       }
        else if (strcmp(defel->defname, "start") == 0)
+       {
+           if (last_value)
+               elog(ERROR, "DefineSequence: LAST VALUE defined twice");
            last_value = defel;
+       }
        else if (strcmp(defel->defname, "maxvalue") == 0)
+       {
+           if (max_value)
+               elog(ERROR, "DefineSequence: MAX VALUE defined twice");
            max_value = defel;
+       }
        else if (strcmp(defel->defname, "minvalue") == 0)
+       {
+           if (min_value)
+               elog(ERROR, "DefineSequence: MIN VALUE defined twice");
            min_value = defel;
+       }
        else if (strcmp(defel->defname, "cache") == 0)
+       {
+           if (cache_value)
+               elog(ERROR, "DefineSequence: CACHE defined twice");
            cache_value = defel;
+       }
        else if (strcmp(defel->defname, "cycle") == 0)
+       {
+           if (is_cycled_set)
+               elog(ERROR, "DefineSequence: CYCLE defined twice");
+           is_cycled_set = true;
            new->is_cycled = (defel->arg != NULL);
+       }
        else
            elog(ERROR, "DefineSequence: option \"%s\" not recognized",
                 defel->defname);
@@ -810,7 +836,7 @@ init_params(CreateSeqStmt *seq, Form_pg_sequence new)
    else if ((new->increment_by = defGetInt64(increment_by)) == 0)
        elog(ERROR, "DefineSequence: can't INCREMENT by 0");
 
-   if (max_value == (DefElem *) NULL)  /* MAXVALUE */
+   if (max_value == (DefElem *) NULL || !max_value->arg)   /* MAXVALUE */
    {
        if (new->increment_by > 0)
            new->max_value = SEQ_MAXVALUE;      /* ascending seq */
@@ -820,7 +846,7 @@ init_params(CreateSeqStmt *seq, Form_pg_sequence new)
    else
        new->max_value = defGetInt64(max_value);
 
-   if (min_value == (DefElem *) NULL)  /* MINVALUE */
+   if (min_value == (DefElem *) NULL || !min_value->arg)   /* MINVALUE */
    {
        if (new->increment_by > 0)
            new->min_value = 1; /* ascending seq */
index f6ce850f37ba8400268905a741e1d4c5f11da4df..5a7dff919d89c254b4e2479548c4872f53c7c224 100644 (file)
@@ -11,7 +11,7 @@
  *
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 2.402 2003/02/13 05:19:59 momjian Exp $
+ *   $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 2.403 2003/02/13 05:25:24 momjian Exp $
  *
  * HISTORY
  *   AUTHOR            DATE            MAJOR EVENT
@@ -1909,6 +1909,14 @@ OptSeqElem: CACHE NumericOnly
                {
                    $$ = makeDefElem("minvalue", (Node *)$2);
                }
+           | NO MAXVALUE
+               {
+                   $$ = makeDefElem("maxvalue", (Node *)NULL);
+               }
+           | NO MINVALUE
+               {
+                   $$ = makeDefElem("minvalue", (Node *)NULL);
+               }
            | START opt_with NumericOnly
                {
                    $$ = makeDefElem("start", (Node *)$3);