From: drh Date: Tue, 18 Jan 2005 17:40:04 +0000 (+0000) Subject: Make sure USING and NATURAL work on joins even if the columns are renamed X-Git-Tag: version-3.1.0~27 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=030530de9bbc13e87762faf4a548442316086648;p=thirdparty%2Fsqlite.git Make sure USING and NATURAL work on joins even if the columns are renamed using an AS phrase. Ticket #523. (CVS 2233) FossilOrigin-Name: c06add57bf0ce17503181b584ea4197b39b9e538 --- diff --git a/manifest b/manifest index ad1af6b95f..f8250235b9 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C CREATE\sTABLE\s...\sAS\s...\suses\sshort\snames\sfor\scolumns.\s\sTicket\s#1036.\s(CVS\s2232) -D 2005-01-18T17:20:10 +C Make\ssure\sUSING\sand\sNATURAL\swork\son\sjoins\seven\sif\sthe\scolumns\sare\srenamed\nusing\san\sAS\sphrase.\s\sTicket\s#523.\s(CVS\s2233) +D 2005-01-18T17:40:04 F Makefile.in ffd81f5e926d40b457071b4de8d7c1fa18f39b5a F Makefile.linux-gcc a9e5a0d309fa7c38e7c14d3ecf7690879d3a5457 F README a01693e454a00cc117967e3f9fdab2d4d52e9bc1 @@ -57,7 +57,7 @@ F src/parse.y ceba179b9703657180963568f54b0e75f33e36e1 F src/pragma.c ac594f74c90ffec043c43e49358719ffeb491eec F src/printf.c 3d20b21cfecadacecac3fb7274e746cb81d3d357 F src/random.c eff68e3f257e05e81eae6c4d50a51eb88beb4ff3 -F src/select.c f9239c5936598de7f20710d82b024ff0a1582cd3 +F src/select.c 29bc58118d75071d1fd4f412581fde82e3e77b7d F src/shell.c 591364a0e9ca4ce53873e21e0294476c0c2b4770 F src/sqlite.h.in 0d5e48e506845b74a845c9470e01d3f472b59611 F src/sqliteInt.h c6414179a23cab108b4b07e8665f30829ce47f2a @@ -138,7 +138,7 @@ F test/insert3.test fa7cb5b01709a1bca3e28c82c80c1d44386b3676 F test/interrupt.test 5b4d8389e6cf2d01b94f87cfd02d9df1073bfb2d F test/intpkey.test b57cf5236fde1bd8cbc1388fa0c91908f6fd9194 F test/ioerr.test 43cdd9dcbdedc2ec952031b3e53d3d5a4ee26000 -F test/join.test 76a6450903d641425bd2f6b773f02f68947f2a0e +F test/join.test 59e5abff5965016e3c75996f1019e2e91664647f F test/join2.test c97e4c5aa65dea462145529e58212a709b4722b8 F test/join3.test 67dc0d7c8dab3fff25796d0f3c3fd9c999aeded3 F test/join4.test 8dec387d06b3a4685e1104048065cf5236b99b93 @@ -269,7 +269,7 @@ F www/tclsqlite.tcl e73f8f8e5f20e8277619433f7970060ab01088fc F www/vdbe.tcl 095f106d93875c94b47367384ebc870517431618 F www/version3.tcl 092a01f5ef430d2c4acc0ae558d74c4bb89638a0 F www/whentouse.tcl c3b50d3ac31c54be2a1af9b488a89d22f1e6e746 -P 9295050af1bf2d9d4dc63adc225a2848d67cbe17 -R a088aa4bf87c4c0ebda525aa7fbfbf2e +P b1d4c42d2be07adda68d31c570ba7cf8b115c3ad +R 2229ecff57bc19695a34edaabfd642a4 U drh -Z 81817808d93adb08227cfb0c57264748 +Z 6801e1d74e0c718113858c851d4ea8ea diff --git a/manifest.uuid b/manifest.uuid index 6f76adb1cd..bbb4e67408 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -b1d4c42d2be07adda68d31c570ba7cf8b115c3ad \ No newline at end of file +c06add57bf0ce17503181b584ea4197b39b9e538 \ No newline at end of file diff --git a/src/select.c b/src/select.c index 278416e171..8295f0941c 100644 --- a/src/select.c +++ b/src/select.c @@ -12,7 +12,7 @@ ** This file contains C code routines that are called by the parser ** to handle SELECT statements in SQLite. ** -** $Id: select.c,v 1.227 2005/01/18 17:20:10 drh Exp $ +** $Id: select.c,v 1.228 2005/01/18 17:40:04 drh Exp $ */ #include "sqliteInt.h" @@ -160,7 +160,9 @@ static void setToken(Token *p, const char *z){ static void addWhereTerm( const char *zCol, /* Name of the column */ const Table *pTab1, /* First table */ + const char *zAlias1, /* Alias for first table. May be NULL */ const Table *pTab2, /* Second table */ + const char *zAlias2, /* Alias for second table. May be NULL */ Expr **ppExpr /* Add the equality term to this expression */ ){ Token dummy; @@ -171,9 +173,15 @@ static void addWhereTerm( setToken(&dummy, zCol); pE1a = sqlite3Expr(TK_ID, 0, 0, &dummy); pE2a = sqlite3Expr(TK_ID, 0, 0, &dummy); - setToken(&dummy, pTab1->zName); + if( zAlias1==0 ){ + zAlias1 = pTab1->zName; + } + setToken(&dummy, zAlias1); pE1b = sqlite3Expr(TK_ID, 0, 0, &dummy); - setToken(&dummy, pTab2->zName); + if( zAlias2==0 ){ + zAlias2 = pTab2->zName; + } + setToken(&dummy, zAlias2); pE2b = sqlite3Expr(TK_ID, 0, 0, &dummy); pE1c = sqlite3Expr(TK_DOT, pE1b, pE1a, 0); pE2c = sqlite3Expr(TK_DOT, pE2b, pE2a, 0); @@ -241,7 +249,8 @@ static int sqliteProcessJoin(Parse *pParse, Select *p){ for(j=0; jnCol; j++){ char *zName = pLeftTab->aCol[j].zName; if( columnIndex(pRightTab, zName)>=0 ){ - addWhereTerm(zName, pLeftTab, pRightTab, &p->pWhere); + addWhereTerm(zName, pLeftTab, pLeft->zAlias, + pRightTab, pRight->zAlias, &p->pWhere); } } } @@ -279,7 +288,8 @@ static int sqliteProcessJoin(Parse *pParse, Select *p){ "not present in both tables", zName); return 1; } - addWhereTerm(zName, pLeftTab, pRightTab, &p->pWhere); + addWhereTerm(zName, pLeftTab, pLeft->zAlias, + pRightTab, pRight->zAlias, &p->pWhere); } } } diff --git a/test/join.test b/test/join.test index 729c979818..12d9c91225 100644 --- a/test/join.test +++ b/test/join.test @@ -12,7 +12,7 @@ # # This file implements tests for joins, including outer joins. # -# $Id: join.test,v 1.14 2005/01/18 16:02:40 drh Exp $ +# $Id: join.test,v 1.15 2005/01/18 17:40:04 drh Exp $ set testdir [file dirname $argv0] source $testdir/tester.tcl @@ -46,11 +46,36 @@ do_test join-1.3.1 { SELECT * FROM t2 NATURAL JOIN t1; } } {b 2 c 3 d 4 a 1 b 3 c 4 d 5 a 2} -do_test join-1.4 { +do_test join-1.3.2 { + execsql2 { + SELECT * FROM t2 AS x NATURAL JOIN t1; + } +} {b 2 c 3 d 4 a 1 b 3 c 4 d 5 a 2} +do_test join-1.3.3 { + execsql2 { + SELECT * FROM t2 NATURAL JOIN t1 AS y; + } +} {b 2 c 3 d 4 a 1 b 3 c 4 d 5 a 2} +do_test join-1.4.1 { execsql2 { SELECT * FROM t1 INNER JOIN t2 USING(b,c); } } {a 1 b 2 c 3 d 4 a 2 b 3 c 4 d 5} +do_test join-1.4.2 { + execsql2 { + SELECT * FROM t1 AS x INNER JOIN t2 USING(b,c); + } +} {a 1 b 2 c 3 d 4 a 2 b 3 c 4 d 5} +do_test join-1.4.3 { + execsql2 { + SELECT * FROM t1 INNER JOIN t2 AS y USING(b,c); + } +} {a 1 b 2 c 3 d 4 a 2 b 3 c 4 d 5} +do_test join-1.4.4 { + execsql2 { + SELECT * FROM t1 AS x INNER JOIN t2 AS y USING(b,c); + } +} {a 1 b 2 c 3 d 4 a 2 b 3 c 4 d 5} do_test join-1.5 { execsql2 { SELECT * FROM t1 INNER JOIN t2 USING(b);