Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit 5c462ba

Browse files
committed
transformCreateStmt should put Ident nodes, not ColumnDef nodes, into
keys lists of Constraint nodes. This eliminates a type pun that would probably have caused trouble someday, and eliminates circular references in the parsetree that were causing trouble now. Also, change parser's uses of strcasecmp() to strcmp(). Since scan.l has downcased any unquoted identifier, it is never correct to check an identifier with strcasecmp() in the parser. For example, CREATE TABLE FOO (f1 int, UNIQUE("F1")); was accepted, which is wrong, and xlateSqlFunc did more than it should: select datetime(); ERROR: Function 'timestamp()' does not exist (good) select "DateTime"(); ERROR: Function 'timestamp()' does not exist (bad)
1 parent 8f50f7a commit 5c462ba

File tree

2 files changed

+36
-32
lines changed

2 files changed

+36
-32
lines changed

src/backend/parser/analyze.c

Lines changed: 22 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
* Portions Copyright (c) 1996-2000, PostgreSQL, Inc
77
* Portions Copyright (c) 1994, Regents of the University of California
88
*
9-
* $Id: analyze.c,v 1.140 2000/03/14 23:06:30 thomas Exp $
9+
* $Id: analyze.c,v 1.141 2000/03/24 23:34:19 tgl Exp $
1010
*
1111
*-------------------------------------------------------------------------
1212
*/
@@ -570,7 +570,7 @@ CreateIndexName(char *table_name, char *column_name, char *label, List *indices)
570570
foreach(ilist, indices)
571571
{
572572
IndexStmt *index = lfirst(ilist);
573-
if (strcasecmp(iname, index->idxname) == 0)
573+
if (strcmp(iname, index->idxname) == 0)
574574
break;
575575
}
576576
/* ran through entire list? then no name conflict found so done */
@@ -679,7 +679,7 @@ transformCreateStmt(ParseState *pstate, CreateStmt *stmt)
679679
constraint->name = sname;
680680
constraint->raw_expr = (Node *) funccallnode;
681681
constraint->cooked_expr = NULL;
682-
constraint->keys = NULL;
682+
constraint->keys = NIL;
683683
column->constraints = lappend(column->constraints,
684684
constraint);
685685

@@ -766,15 +766,23 @@ transformCreateStmt(ParseState *pstate, CreateStmt *stmt)
766766
if (constraint->name == NULL)
767767
constraint->name = makeObjectName(stmt->relname, NULL, "pkey");
768768
if (constraint->keys == NIL)
769-
constraint->keys = lappend(constraint->keys, column);
769+
{
770+
key = makeNode(Ident);
771+
key->name = pstrdup(column->colname);
772+
constraint->keys = lcons(key, NIL);
773+
}
770774
dlist = lappend(dlist, constraint);
771775
break;
772776

773777
case CONSTR_UNIQUE:
774778
if (constraint->name == NULL)
775779
constraint->name = makeObjectName(stmt->relname, column->colname, "key");
776780
if (constraint->keys == NIL)
777-
constraint->keys = lappend(constraint->keys, column);
781+
{
782+
key = makeNode(Ident);
783+
key->name = pstrdup(column->colname);
784+
constraint->keys = lcons(key, NIL);
785+
}
778786
dlist = lappend(dlist, constraint);
779787
break;
780788

@@ -890,23 +898,21 @@ transformCreateStmt(ParseState *pstate, CreateStmt *stmt)
890898
index->withClause = NIL;
891899
index->whereClause = NULL;
892900

893-
keys = constraint->keys;
894-
while (keys != NIL)
901+
foreach(keys, constraint->keys)
895902
{
896-
key = lfirst(keys);
897-
columns = stmt->tableElts;
903+
key = (Ident *) lfirst(keys);
904+
Assert(IsA(key, Ident));
898905
column = NULL;
899-
while (columns != NIL)
906+
foreach(columns, stmt->tableElts)
900907
{
901908
column = lfirst(columns);
902-
if (strcasecmp(column->colname, key->name) == 0)
909+
Assert(IsA(column, ColumnDef));
910+
if (strcmp(column->colname, key->name) == 0)
903911
break;
904-
else
905-
column = NULL;
906-
columns = lnext(columns);
907912
}
908-
if (column == NULL)
909-
elog(ERROR, "CREATE TABLE column '%s' in key does not exist", key->name);
913+
if (columns == NIL) /* fell off end of list? */
914+
elog(ERROR, "CREATE TABLE: column '%s' named in key does not exist",
915+
key->name);
910916

911917
if (constraint->contype == CONSTR_PRIMARY)
912918
column->is_not_null = TRUE;
@@ -919,8 +925,6 @@ transformCreateStmt(ParseState *pstate, CreateStmt *stmt)
919925

920926
if (index->idxname == NULL)
921927
index->idxname = CreateIndexName(stmt->relname, iparam->name, "key", ilist);
922-
923-
keys = lnext(keys);
924928
}
925929

926930
if (index->idxname == NULL) /* should not happen */

src/backend/parser/gram.y

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
*
1212
*
1313
* IDENTIFICATION
14-
* $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 2.162 2000/03/21 06:00:40 thomas Exp $
14+
* $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 2.163 2000/03/24 23:34:19 tgl Exp $
1515
*
1616
* HISTORY
1717
* AUTHOR DATE MAJOR EVENT
@@ -3969,7 +3969,7 @@ Character: character '(' Iconst ')'
39693969
character: CHARACTER opt_varying opt_charset
39703970
{
39713971
char *type, *c;
3972-
if (($3 == NULL) || (strcasecmp($3, "sql_text") == 0)) {
3972+
if (($3 == NULL) || (strcmp($3, "sql_text") == 0)) {
39733973
if ($2) type = xlateSqlType("varchar");
39743974
else type = xlateSqlType("bpchar");
39753975
} else {
@@ -5544,11 +5544,11 @@ mapTargetColumns(List *src, List *dst)
55445544
static char *
55455545
xlateSqlFunc(char *name)
55465546
{
5547-
if (!strcasecmp(name,"character_length"))
5547+
if (!strcmp(name,"character_length"))
55485548
return "char_length";
5549-
else if (!strcasecmp(name,"datetime"))
5549+
else if (!strcmp(name,"datetime"))
55505550
return "timestamp";
5551-
else if (!strcasecmp(name,"timespan"))
5551+
else if (!strcmp(name,"timespan"))
55525552
return "interval";
55535553
else
55545554
return name;
@@ -5564,21 +5564,21 @@ xlateSqlFunc(char *name)
55645564
static char *
55655565
xlateSqlType(char *name)
55665566
{
5567-
if (!strcasecmp(name,"int")
5568-
|| !strcasecmp(name,"integer"))
5567+
if (!strcmp(name,"int")
5568+
|| !strcmp(name,"integer"))
55695569
return "int4";
5570-
else if (!strcasecmp(name, "smallint"))
5570+
else if (!strcmp(name, "smallint"))
55715571
return "int2";
5572-
else if (!strcasecmp(name, "real")
5573-
|| !strcasecmp(name, "float"))
5572+
else if (!strcmp(name, "real")
5573+
|| !strcmp(name, "float"))
55745574
return "float8";
5575-
else if (!strcasecmp(name, "decimal"))
5575+
else if (!strcmp(name, "decimal"))
55765576
return "numeric";
5577-
else if (!strcasecmp(name, "datetime"))
5577+
else if (!strcmp(name, "datetime"))
55785578
return "timestamp";
5579-
else if (!strcasecmp(name, "timespan"))
5579+
else if (!strcmp(name, "timespan"))
55805580
return "interval";
5581-
else if (!strcasecmp(name, "boolean"))
5581+
else if (!strcmp(name, "boolean"))
55825582
return "bool";
55835583
else
55845584
return name;

0 commit comments

Comments
 (0)