Add double quotes around the sequence name generated to support the

SERIAL data type DEFAULT clause.
This fixes a problem finding the sequence name when mixed case table names
 are involved.
This commit is contained in:
Thomas G. Lockhart 1999-05-13 15:01:32 +00:00
parent 81c83db3bb
commit 9bbc1657a1
1 changed files with 18 additions and 45 deletions

View File

@ -5,7 +5,7 @@
* *
* Copyright (c) 1994, Regents of the University of California * Copyright (c) 1994, Regents of the University of California
* *
* $Id: analyze.c,v 1.103 1999/05/13 07:28:34 tgl Exp $ * $Id: analyze.c,v 1.104 1999/05/13 15:01:32 thomas Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
@ -546,39 +546,22 @@ transformCreateStmt(ParseState *pstate, CreateStmt *stmt)
constraint->contype = CONSTR_DEFAULT; constraint->contype = CONSTR_DEFAULT;
constraint->name = sname; constraint->name = sname;
cstring = palloc(9 + strlen(constraint->name) + 2 + 1); cstring = palloc(9 + strlen(constraint->name) + 2 + 1);
strcpy(cstring, "nextval('"); strcpy(cstring, "nextval('\"");
strcat(cstring, constraint->name); strcat(cstring, constraint->name);
strcat(cstring, "')"); strcat(cstring, "\"')");
constraint->def = cstring; constraint->def = cstring;
constraint->keys = NULL; constraint->keys = NULL;
#if 0 column->constraints = lappend(column->constraints, constraint);
/* The parser only allows PRIMARY KEY as a constraint for the SERIAL type.
* So, if there is a constraint of any kind, assume it is that.
* If PRIMARY KEY is specified, then don't need to gin up a UNIQUE constraint
* since that will be covered already.
* - thomas 1998-09-15
*/
if (column->constraints != NIL)
{
column->constraints = lappend(column->constraints, constraint);
}
else
{
#endif
column->constraints = lappend(column->constraints, constraint);
constraint = makeNode(Constraint); constraint = makeNode(Constraint);
constraint->contype = CONSTR_UNIQUE; constraint->contype = CONSTR_UNIQUE;
constraint->name = makeTableName(stmt->relname, column->colname, "key", NULL); constraint->name = makeTableName(stmt->relname, column->colname, "key", NULL);
if (constraint->name == NULL) if (constraint->name == NULL)
elog(ERROR, "CREATE TABLE/SERIAL implicit index name must be less than %d characters" elog(ERROR, "CREATE TABLE/SERIAL implicit index name must be less than %d characters"
"\n\tSum of lengths of '%s' and '%s' must be less than %d", "\n\tSum of lengths of '%s' and '%s' must be less than %d",
NAMEDATALEN, stmt->relname, column->colname, (NAMEDATALEN-5)); NAMEDATALEN, stmt->relname, column->colname, (NAMEDATALEN-5));
column->constraints = lappend(column->constraints, constraint); column->constraints = lappend(column->constraints, constraint);
#if 0
}
#endif
sequence = makeNode(CreateSeqStmt); sequence = makeNode(CreateSeqStmt);
sequence->seqname = pstrdup(sname); sequence->seqname = pstrdup(sname);
@ -604,21 +587,21 @@ transformCreateStmt(ParseState *pstate, CreateStmt *stmt)
*/ */
if (column->is_not_null) if (column->is_not_null)
elog(ERROR, "CREATE TABLE/(NOT) NULL conflicting declaration" elog(ERROR, "CREATE TABLE/(NOT) NULL conflicting declaration"
" for %s.%s", stmt->relname, column->colname); " for '%s.%s'", stmt->relname, column->colname);
column->is_not_null = FALSE; column->is_not_null = FALSE;
break; break;
case CONSTR_NOTNULL: case CONSTR_NOTNULL:
if (column->is_not_null) if (column->is_not_null)
elog(ERROR, "CREATE TABLE/NOT NULL already specified" elog(ERROR, "CREATE TABLE/NOT NULL already specified"
" for %s.%s", stmt->relname, column->colname); " for '%s.%s'", stmt->relname, column->colname);
column->is_not_null = TRUE; column->is_not_null = TRUE;
break; break;
case CONSTR_DEFAULT: case CONSTR_DEFAULT:
if (column->defval != NULL) if (column->defval != NULL)
elog(ERROR, "CREATE TABLE/DEFAULT multiple values specified" elog(ERROR, "CREATE TABLE/DEFAULT multiple values specified"
" for %s.%s", stmt->relname, column->colname); " for '%s.%s'", stmt->relname, column->colname);
column->defval = constraint->def; column->defval = constraint->def;
break; break;
@ -680,10 +663,6 @@ transformCreateStmt(ParseState *pstate, CreateStmt *stmt)
break; break;
case CONSTR_UNIQUE: case CONSTR_UNIQUE:
#ifdef NOT_USED
if (constraint->name == NULL)
constraint->name = makeTableName(stmt->relname, "key", NULL);
#endif
dlist = lappend(dlist, constraint); dlist = lappend(dlist, constraint);
break; break;
@ -735,7 +714,7 @@ transformCreateStmt(ParseState *pstate, CreateStmt *stmt)
{ {
if (pkey != NULL) if (pkey != NULL)
elog(ERROR, "CREATE TABLE/PRIMARY KEY multiple primary keys" elog(ERROR, "CREATE TABLE/PRIMARY KEY multiple primary keys"
" for table %s are not legal", stmt->relname); " for table '%s' are not allowed", stmt->relname);
pkey = (IndexStmt *) index; pkey = (IndexStmt *) index;
} }
@ -796,14 +775,8 @@ transformCreateStmt(ParseState *pstate, CreateStmt *stmt)
} }
if (index->idxname == NULL) if (index->idxname == NULL)
elog(ERROR, "CREATE TABLE unable to construct implicit index for table %s" elog(ERROR, "CREATE TABLE unable to construct implicit index for table '%s'"
"; name too long", stmt->relname); "; name too long", stmt->relname);
#if 0
else
elog(NOTICE, "CREATE TABLE/%s will create implicit index '%s' for table '%s'",
((constraint->contype == CONSTR_PRIMARY) ? "PRIMARY KEY" : "UNIQUE"),
index->idxname, stmt->relname);
#endif
ilist = lappend(ilist, index); ilist = lappend(ilist, index);
dlist = lnext(dlist); dlist = lnext(dlist);
@ -855,7 +828,7 @@ transformCreateStmt(ParseState *pstate, CreateStmt *stmt)
extras_after = ilist; extras_after = ilist;
return q; return q;
} } /* transformCreateStmt() */
/* /*
* transformIndexStmt - * transformIndexStmt -