]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Make sure USING and NATURAL work on joins even if the columns are renamed
authordrh <drh@noemail.net>
Tue, 18 Jan 2005 17:40:04 +0000 (17:40 +0000)
committerdrh <drh@noemail.net>
Tue, 18 Jan 2005 17:40:04 +0000 (17:40 +0000)
using an AS phrase.  Ticket #523. (CVS 2233)

FossilOrigin-Name: c06add57bf0ce17503181b584ea4197b39b9e538

manifest
manifest.uuid
src/select.c
test/join.test

index ad1af6b95f5735c0d80bc1fe2c33205097597668..f8250235b980748edde6b4afbea87efc60a83aa8 100644 (file)
--- 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
index 6f76adb1cd8a607c29a3690059f88318b769cfb9..bbb4e67408b3b8cb6f84ded1403c763f1ef6ae02 100644 (file)
@@ -1 +1 @@
-b1d4c42d2be07adda68d31c570ba7cf8b115c3ad
\ No newline at end of file
+c06add57bf0ce17503181b584ea4197b39b9e538
\ No newline at end of file
index 278416e1712f402179120112866dafc0d5572b74..8295f0941cfdbbd450839fb9e25ae294262bfea6 100644 (file)
@@ -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; j<pLeftTab->nCol; 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);
       }
     }
   }
index 729c979818bf1700365119db91db0e548ba2da11..12d9c91225ebae55785f29ab73713354df88835f 100644 (file)
@@ -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);