aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas G. Lockhart <lockhart@fourpalms.org>1998-08-25 15:08:12 +0000
committerThomas G. Lockhart <lockhart@fourpalms.org>1998-08-25 15:08:12 +0000
commit7ff198cd46d646206cab5a8547d8bf8fe1a39cbb (patch)
treea9d0b67f3ab9dd2702872a92cd20a3d327c3571b
parent12cf9f8075dac3bb81efa845285922ed520d9dc7 (diff)
downloadpostgresql-7ff198cd46d646206cab5a8547d8bf8fe1a39cbb.tar.gz
postgresql-7ff198cd46d646206cab5a8547d8bf8fe1a39cbb.zip
Support SERIAL column type. Expand column marked is_sequence into three
statements: - the table definition with a default clause referencing the sequence; - a CREATE SEQUENCE statement; - a UNIQUE constraint, which expands into a CREATE INDEX statement. This is not a perfect solution, since the sequence will remain even if the table is dropped. Also, there is no absolute protection on updating the sequence column.
-rw-r--r--src/backend/parser/analyze.c45
1 files changed, 42 insertions, 3 deletions
diff --git a/src/backend/parser/analyze.c b/src/backend/parser/analyze.c
index 2bdcef170f3..ea96f2eb910 100644
--- a/src/backend/parser/analyze.c
+++ b/src/backend/parser/analyze.c
@@ -7,7 +7,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/parser/analyze.c,v 1.80 1998/08/18 00:48:54 scrappy Exp $
+ * $Header: /cvsroot/pgsql/src/backend/parser/analyze.c,v 1.81 1998/08/25 15:08:12 thomas Exp $
*
*-------------------------------------------------------------------------
*/
@@ -472,7 +472,7 @@ transformCreateStmt(ParseState *pstate, CreateStmt *stmt)
Constraint *constraint;
List *keys;
Ident *key;
- List *ilist;
+ List *ilist = NIL;
IndexStmt *index;
IndexElem *iparam;
@@ -492,6 +492,46 @@ transformCreateStmt(ParseState *pstate, CreateStmt *stmt)
case T_ColumnDef:
column = (ColumnDef *) element;
columns = lappend(columns, column);
+
+ if (column->is_sequence)
+ {
+ char *cstring;
+ CreateSeqStmt *sequence;
+
+ constraint = makeNode(Constraint);
+ constraint->contype = CONSTR_DEFAULT;
+ constraint->name = makeTableName(stmt->relname, column->colname, "seq", NULL);
+ cstring = palloc(9+strlen(constraint->name)+2+1);
+ strcpy(cstring, "nextval('");
+ strcat(cstring, constraint->name);
+ strcat(cstring, "')");
+ constraint->def = cstring;
+ constraint->keys = NULL;
+
+ if (column->constraints != NIL)
+ {
+ column->constraints = lappend(column->constraints, constraint);
+ }
+ else
+ {
+ column->constraints = lcons(constraint, NIL);
+ }
+
+ sequence = makeNode(CreateSeqStmt);
+ sequence->seqname = constraint->name;
+ sequence->options = NIL;
+
+ elog(NOTICE, "CREATE TABLE will create implicit sequence %s for SERIAL column %s.%s",
+ sequence->seqname, stmt->relname, column->colname);
+
+ ilist = lcons(sequence, NIL);
+
+ constraint = makeNode(Constraint);
+ constraint->contype = CONSTR_UNIQUE;
+
+ column->constraints = lappend(column->constraints, constraint);
+ }
+
if (column->constraints != NIL)
{
clist = column->constraints;
@@ -596,7 +636,6 @@ transformCreateStmt(ParseState *pstate, CreateStmt *stmt)
* names for indices turn out to be redundant, or a user might have specified
* extra useless indices which might hurt performance. - thomas 1997-12-08
*/
- ilist = NIL;
while (dlist != NIL)
{
constraint = lfirst(dlist);