From 3eabc4490ecbf6b9845917811cf930af41aff845 Mon Sep 17 00:00:00 2001
From: Bruce Momjian <bruce@momjian.us>
Date: Sun, 10 Nov 2002 00:10:20 +0000
Subject: [PATCH] Tweak CREATE SEQUENCE grammar to be more SQL1999 standards
 compliant.

Neil Conway
---
 doc/src/sgml/ref/create_sequence.sgml | 25 ++++++++++++++++++-------
 src/backend/commands/sequence.c       |  8 ++------
 src/backend/parser/gram.y             | 20 ++++++++++++++------
 3 files changed, 34 insertions(+), 19 deletions(-)

diff --git a/doc/src/sgml/ref/create_sequence.sgml b/doc/src/sgml/ref/create_sequence.sgml
index 3db79850c8a..4e36dfbe771 100644
--- a/doc/src/sgml/ref/create_sequence.sgml
+++ b/doc/src/sgml/ref/create_sequence.sgml
@@ -1,5 +1,5 @@
 <!--
-$Header: /cvsroot/pgsql/doc/src/sgml/ref/create_sequence.sgml,v 1.28 2002/05/18 15:44:47 petere Exp $
+$Header: /cvsroot/pgsql/doc/src/sgml/ref/create_sequence.sgml,v 1.29 2002/11/10 00:10:20 momjian Exp $
 PostgreSQL documentation
 -->
 
@@ -21,9 +21,9 @@ PostgreSQL documentation
    <date>1999-07-20</date>
   </refsynopsisdivinfo>
   <synopsis>
-CREATE [ TEMPORARY | TEMP ] SEQUENCE <replaceable class="parameter">seqname</replaceable> [ INCREMENT <replaceable class="parameter">increment</replaceable> ]
+CREATE [ TEMPORARY | TEMP ] SEQUENCE <replaceable class="parameter">seqname</replaceable> [ INCREMENT [ BY ] <replaceable class="parameter">increment</replaceable> ]
     [ MINVALUE <replaceable class="parameter">minvalue</replaceable> ] [ MAXVALUE <replaceable class="parameter">maxvalue</replaceable> ]
-    [ START <replaceable class="parameter">start</replaceable> ] [ CACHE <replaceable class="parameter">cache</replaceable> ] [ CYCLE ]
+    [ START [ WITH ] <replaceable class="parameter">start</replaceable> ] [ CACHE <replaceable class="parameter">cache</replaceable> ] [ [ NO ] CYCLE ]
   </synopsis>
   
   <refsect2 id="R2-SQL-CREATESEQUENCE-1">
@@ -130,8 +130,8 @@ CREATE [ TEMPORARY | TEMP ] SEQUENCE <replaceable class="parameter">seqname</rep
       <term>CYCLE</term>
       <listitem>
        <para>
-	The optional CYCLE keyword may be used to enable the sequence
-	to wrap around when the
+	The optional <option>CYCLE</option> keyword may be used to enable
+	the sequence to wrap around when the
 	<replaceable class="parameter">maxvalue</replaceable> or
 	<replaceable class="parameter">minvalue</replaceable> has been
 	reached by
@@ -140,11 +140,22 @@ CREATE [ TEMPORARY | TEMP ] SEQUENCE <replaceable class="parameter">seqname</rep
 	<replaceable class="parameter">minvalue</replaceable> or
 	<replaceable class="parameter">maxvalue</replaceable>,
 	respectively.
-	Without CYCLE, after the limit is reached <function>nextval</> calls
-	will return an error.
        </para>
       </listitem>
      </varlistentry>
+
+	 <varlistentry>
+	  <term>NO CYCLE</term>
+	  <listitem>
+	   <para>
+	If the optional <option>NO CYCLE</option> keyword is specified, any
+	calls to <function>nextval</function> after the sequence has reached
+	its maximum value will return an error.  If neither
+	<option>CYCLE</option> or <option>NO CYCLE</option> are specified,
+	<option>NO CYCLE</option> is the default.
+	   </para>
+	  </listitem>
+	</varlistentry>
     </variablelist>
    </para>
   </refsect2>
diff --git a/src/backend/commands/sequence.c b/src/backend/commands/sequence.c
index f6ace0d2d93..31fb270c63e 100644
--- a/src/backend/commands/sequence.c
+++ b/src/backend/commands/sequence.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/commands/sequence.c,v 1.88 2002/09/22 19:42:50 tgl Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/commands/sequence.c,v 1.89 2002/11/10 00:10:20 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -798,11 +798,7 @@ init_params(CreateSeqStmt *seq, Form_pg_sequence new)
 		else if (strcmp(defel->defname, "cache") == 0)
 			cache_value = defel;
 		else if (strcmp(defel->defname, "cycle") == 0)
-		{
-			if (defel->arg != (Node *) NULL)
-				elog(ERROR, "DefineSequence: CYCLE ??");
-			new->is_cycled = true;
-		}
+			new->is_cycled = (defel->arg != NULL);
 		else
 			elog(ERROR, "DefineSequence: option \"%s\" not recognized",
 				 defel->defname);
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
index 5fe83ac41db..1ce4cc1bfde 100644
--- a/src/backend/parser/gram.y
+++ b/src/backend/parser/gram.y
@@ -11,7 +11,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 2.374 2002/11/09 23:56:39 momjian Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 2.375 2002/11/10 00:10:20 momjian Exp $
  *
  * HISTORY
  *	  AUTHOR			DATE			MAJOR EVENT
@@ -1893,11 +1893,15 @@ OptSeqElem: CACHE NumericOnly
 				}
 			| CYCLE
 				{
-					$$ = makeDefElem("cycle", (Node *)NULL);
+					$$ = makeDefElem("cycle", (Node *)true);
 				}
-			| INCREMENT NumericOnly
+			| NO CYCLE
 				{
-					$$ = makeDefElem("increment", (Node *)$2);
+					$$ = makeDefElem("cycle", (Node *)false);
+				}
+			| INCREMENT opt_by NumericOnly
+				{
+					$$ = makeDefElem("increment", (Node *)$3);
 				}
 			| MAXVALUE NumericOnly
 				{
@@ -1907,12 +1911,16 @@ OptSeqElem: CACHE NumericOnly
 				{
 					$$ = makeDefElem("minvalue", (Node *)$2);
 				}
-			| START NumericOnly
+			| START opt_with NumericOnly
 				{
-					$$ = makeDefElem("start", (Node *)$2);
+					$$ = makeDefElem("start", (Node *)$3);
 				}
 		;
 
+opt_by:		BY				{}
+			| /* empty */	{}
+	  ;
+
 NumericOnly:
 			FloatOnly								{ $$ = $1; }
 			| IntegerOnly							{ $$ = $1; }
-- 
GitLab