aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2000-03-24 23:34:19 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2000-03-24 23:34:19 +0000
commit5c462baebcd96d5a7921d116ac9ee11bbced58a5 (patch)
tree3689972b31d293126d3cca6277a2dbb0664e01cc /src
parent8f50f7a29114d4510a1b87cf13b687dcfd2e7f56 (diff)
downloadpostgresql-5c462baebcd96d5a7921d116ac9ee11bbced58a5.tar.gz
postgresql-5c462baebcd96d5a7921d116ac9ee11bbced58a5.zip
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)
Diffstat (limited to 'src')
-rw-r--r--src/backend/parser/analyze.c40
-rw-r--r--src/backend/parser/gram.y28
2 files changed, 36 insertions, 32 deletions
diff --git a/src/backend/parser/analyze.c b/src/backend/parser/analyze.c
index c192b4ce7a1..a874c24f5e1 100644
--- a/src/backend/parser/analyze.c
+++ b/src/backend/parser/analyze.c
@@ -6,7 +6,7 @@
* Portions Copyright (c) 1996-2000, PostgreSQL, Inc
* Portions Copyright (c) 1994, Regents of the University of California
*
- * $Id: analyze.c,v 1.140 2000/03/14 23:06:30 thomas Exp $
+ * $Id: analyze.c,v 1.141 2000/03/24 23:34:19 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -570,7 +570,7 @@ CreateIndexName(char *table_name, char *column_name, char *label, List *indices)
foreach(ilist, indices)
{
IndexStmt *index = lfirst(ilist);
- if (strcasecmp(iname, index->idxname) == 0)
+ if (strcmp(iname, index->idxname) == 0)
break;
}
/* ran through entire list? then no name conflict found so done */
@@ -679,7 +679,7 @@ transformCreateStmt(ParseState *pstate, CreateStmt *stmt)
constraint->name = sname;
constraint->raw_expr = (Node *) funccallnode;
constraint->cooked_expr = NULL;
- constraint->keys = NULL;
+ constraint->keys = NIL;
column->constraints = lappend(column->constraints,
constraint);
@@ -766,7 +766,11 @@ transformCreateStmt(ParseState *pstate, CreateStmt *stmt)
if (constraint->name == NULL)
constraint->name = makeObjectName(stmt->relname, NULL, "pkey");
if (constraint->keys == NIL)
- constraint->keys = lappend(constraint->keys, column);
+ {
+ key = makeNode(Ident);
+ key->name = pstrdup(column->colname);
+ constraint->keys = lcons(key, NIL);
+ }
dlist = lappend(dlist, constraint);
break;
@@ -774,7 +778,11 @@ transformCreateStmt(ParseState *pstate, CreateStmt *stmt)
if (constraint->name == NULL)
constraint->name = makeObjectName(stmt->relname, column->colname, "key");
if (constraint->keys == NIL)
- constraint->keys = lappend(constraint->keys, column);
+ {
+ key = makeNode(Ident);
+ key->name = pstrdup(column->colname);
+ constraint->keys = lcons(key, NIL);
+ }
dlist = lappend(dlist, constraint);
break;
@@ -890,23 +898,21 @@ transformCreateStmt(ParseState *pstate, CreateStmt *stmt)
index->withClause = NIL;
index->whereClause = NULL;
- keys = constraint->keys;
- while (keys != NIL)
+ foreach(keys, constraint->keys)
{
- key = lfirst(keys);
- columns = stmt->tableElts;
+ key = (Ident *) lfirst(keys);
+ Assert(IsA(key, Ident));
column = NULL;
- while (columns != NIL)
+ foreach(columns, stmt->tableElts)
{
column = lfirst(columns);
- if (strcasecmp(column->colname, key->name) == 0)
+ Assert(IsA(column, ColumnDef));
+ if (strcmp(column->colname, key->name) == 0)
break;
- else
- column = NULL;
- columns = lnext(columns);
}
- if (column == NULL)
- elog(ERROR, "CREATE TABLE column '%s' in key does not exist", key->name);
+ if (columns == NIL) /* fell off end of list? */
+ elog(ERROR, "CREATE TABLE: column '%s' named in key does not exist",
+ key->name);
if (constraint->contype == CONSTR_PRIMARY)
column->is_not_null = TRUE;
@@ -919,8 +925,6 @@ transformCreateStmt(ParseState *pstate, CreateStmt *stmt)
if (index->idxname == NULL)
index->idxname = CreateIndexName(stmt->relname, iparam->name, "key", ilist);
-
- keys = lnext(keys);
}
if (index->idxname == NULL) /* should not happen */
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
index 4277f9c7366..3c56dba04f4 100644
--- a/src/backend/parser/gram.y
+++ b/src/backend/parser/gram.y
@@ -11,7 +11,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 2.162 2000/03/21 06:00:40 thomas Exp $
+ * $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 2.163 2000/03/24 23:34:19 tgl Exp $
*
* HISTORY
* AUTHOR DATE MAJOR EVENT
@@ -3969,7 +3969,7 @@ Character: character '(' Iconst ')'
character: CHARACTER opt_varying opt_charset
{
char *type, *c;
- if (($3 == NULL) || (strcasecmp($3, "sql_text") == 0)) {
+ if (($3 == NULL) || (strcmp($3, "sql_text") == 0)) {
if ($2) type = xlateSqlType("varchar");
else type = xlateSqlType("bpchar");
} else {
@@ -5544,11 +5544,11 @@ mapTargetColumns(List *src, List *dst)
static char *
xlateSqlFunc(char *name)
{
- if (!strcasecmp(name,"character_length"))
+ if (!strcmp(name,"character_length"))
return "char_length";
- else if (!strcasecmp(name,"datetime"))
+ else if (!strcmp(name,"datetime"))
return "timestamp";
- else if (!strcasecmp(name,"timespan"))
+ else if (!strcmp(name,"timespan"))
return "interval";
else
return name;
@@ -5564,21 +5564,21 @@ xlateSqlFunc(char *name)
static char *
xlateSqlType(char *name)
{
- if (!strcasecmp(name,"int")
- || !strcasecmp(name,"integer"))
+ if (!strcmp(name,"int")
+ || !strcmp(name,"integer"))
return "int4";
- else if (!strcasecmp(name, "smallint"))
+ else if (!strcmp(name, "smallint"))
return "int2";
- else if (!strcasecmp(name, "real")
- || !strcasecmp(name, "float"))
+ else if (!strcmp(name, "real")
+ || !strcmp(name, "float"))
return "float8";
- else if (!strcasecmp(name, "decimal"))
+ else if (!strcmp(name, "decimal"))
return "numeric";
- else if (!strcasecmp(name, "datetime"))
+ else if (!strcmp(name, "datetime"))
return "timestamp";
- else if (!strcasecmp(name, "timespan"))
+ else if (!strcmp(name, "timespan"))
return "interval";
- else if (!strcasecmp(name, "boolean"))
+ else if (!strcmp(name, "boolean"))
return "bool";
else
return name;