]> granicus.if.org Git - postgresql/commitdiff
transformCreateStmt should put Ident nodes, not ColumnDef nodes, into
authorTom Lane <tgl@sss.pgh.pa.us>
Fri, 24 Mar 2000 23:34:19 +0000 (23:34 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Fri, 24 Mar 2000 23:34:19 +0000 (23:34 +0000)
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)

src/backend/parser/analyze.c
src/backend/parser/gram.y

index c192b4ce7a14e8b68598252723c4fe7955b7582c..a874c24f5e139229f572c7d903b93dba57258029 100644 (file)
@@ -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 */
index 4277f9c73661b9271a0e153b98fa2e263494a7e9..3c56dba04f4819e7122cc3ddd0fee19e7040c2cf 100644 (file)
@@ -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;