From 7ff198cd46d646206cab5a8547d8bf8fe1a39cbb Mon Sep 17 00:00:00 2001 From: "Thomas G. Lockhart" Date: Tue, 25 Aug 1998 15:08:12 +0000 Subject: [PATCH] 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. --- src/backend/parser/analyze.c | 45 +++++++++++++++++++++++++++++++++--- 1 file changed, 42 insertions(+), 3 deletions(-) diff --git a/src/backend/parser/analyze.c b/src/backend/parser/analyze.c index 2bdcef170f..ea96f2eb91 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); -- GitLab