From f249daf9b7aef0bf0685efb35c159842e8f6df51 Mon Sep 17 00:00:00 2001
From: Bruce Momjian <bruce@momjian.us>
Date: Thu, 13 Feb 2003 05:25:24 +0000
Subject: [PATCH] Adds in NO MAXVALUE and NO MINVALUE options for create
 sequence per 200X 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 | 32 +++++++++++++++++++++++++++++---
 src/backend/parser/gram.y       | 10 +++++++++-
 2 files changed, 38 insertions(+), 4 deletions(-)

diff --git a/src/backend/commands/sequence.c b/src/backend/commands/sequence.c
index f5d41b3df2c..c3ea6a14c00 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.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 */
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
index f6ce850f37b..5a7dff919d8 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.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);
-- 
GitLab