Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit5c462ba

Browse files
committed
transformCreateStmt should put Ident nodes, not ColumnDef nodes, into
keys lists of Constraint nodes. This eliminates a type pun that wouldprobably have caused trouble someday, and eliminates circular referencesin the parsetree that were causing trouble now.Also, change parser's uses of strcasecmp() to strcmp(). Since scan.lhas downcased any unquoted identifier, it is never correct to check anidentifier 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 parent8f50f7a commit5c462ba

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
caseCONSTR_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
* AUTHORDATEMAJOR EVENT
@@ -3969,7 +3969,7 @@ Character: character '(' Iconst ')'
39693969
character:CHARACTERopt_varyingopt_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
staticchar *
55455545
xlateSqlFunc(char *name)
55465546
{
5547-
if (!strcasecmp(name,"character_length"))
5547+
if (!strcmp(name,"character_length"))
55485548
return"char_length";
5549-
elseif (!strcasecmp(name,"datetime"))
5549+
elseif (!strcmp(name,"datetime"))
55505550
return"timestamp";
5551-
elseif (!strcasecmp(name,"timespan"))
5551+
elseif (!strcmp(name,"timespan"))
55525552
return"interval";
55535553
else
55545554
return name;
@@ -5564,21 +5564,21 @@ xlateSqlFunc(char *name)
55645564
staticchar *
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-
elseif (!strcasecmp(name,"smallint"))
5570+
elseif (!strcmp(name,"smallint"))
55715571
return"int2";
5572-
elseif (!strcasecmp(name,"real")
5573-
|| !strcasecmp(name,"float"))
5572+
elseif (!strcmp(name,"real")
5573+
|| !strcmp(name,"float"))
55745574
return"float8";
5575-
elseif (!strcasecmp(name,"decimal"))
5575+
elseif (!strcmp(name,"decimal"))
55765576
return"numeric";
5577-
elseif (!strcasecmp(name,"datetime"))
5577+
elseif (!strcmp(name,"datetime"))
55785578
return"timestamp";
5579-
elseif (!strcasecmp(name,"timespan"))
5579+
elseif (!strcmp(name,"timespan"))
55805580
return"interval";
5581-
elseif (!strcasecmp(name,"boolean"))
5581+
elseif (!strcmp(name,"boolean"))
55825582
return"bool";
55835583
else
55845584
return name;

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp