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.
This commit is contained in:
Thomas G. Lockhart 1998-08-25 15:08:12 +00:00
parent 12cf9f8075
commit 7ff198cd46
1 changed files with 42 additions and 3 deletions

View 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);