diff --git a/src/backend/commands/sequence.c b/src/backend/commands/sequence.c index f5d41b3df2c9d2b4d53aca8de358fc4a8af2499a..c3ea6a14c0064ab8052b43e96718e2c8fd4ffdba 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 f6ce850f37ba8400268905a741e1d4c5f11da4df..5a7dff919d89c254b4e2479548c4872f53c7c224 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);