Support SERIAL column type. Expand column marked is_sequence into three
authorThomas G. Lockhart <lockhart@fourpalms.org>
Tue, 25 Aug 1998 15:08:12 +0000 (15:08 +0000)
committerThomas G. Lockhart <lockhart@fourpalms.org>
Tue, 25 Aug 1998 15:08:12 +0000 (15:08 +0000)
 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.

src/backend/parser/analyze.c

index 2bdcef170f3ea72478ec2b500e295c5c456cbebe..ea96f2eb91069e43c6215bb5f3d237b5592f5cb6 100644 (file)
@@ -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);