]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Do not use HIDDEN columns for NATURAL joins. Fix for [7c0e06b16].
authordan <dan@noemail.net>
Mon, 30 Dec 2019 14:32:27 +0000 (14:32 +0000)
committerdan <dan@noemail.net>
Mon, 30 Dec 2019 14:32:27 +0000 (14:32 +0000)
FossilOrigin-Name: ab09ef427181130be09a087b7e572ad4cfb6b3e1b459769ee5ebf046b3ead682

ext/fts5/test/fts5misc.test
manifest
manifest.uuid
src/select.c

index 9a61210c65c3ed9292b4e03a8bd17fdcbac4f291..9abc92b23f01dcc7e801fc75964d3ac260c82c1e 100644 (file)
@@ -296,5 +296,32 @@ do_execsql_test 11.1 {
   INSERT INTO vt0(vt0) VALUES('integrity-check');
 }
 
+#-------------------------------------------------------------------------
+# Ticket [7c0e06b16] 
+#
+do_execsql_test 12.0 {
+  CREATE TABLE t1(a, b, rank);
+  INSERT INTO t1 VALUES('a', 'hello', '');
+  INSERT INTO t1 VALUES('b', 'world', '');
+
+  CREATE VIRTUAL TABLE ft USING fts5(a);
+  INSERT INTO ft VALUES('b');
+  INSERT INTO ft VALUES('y');
+
+  CREATE TABLE t2(x, y, ft);
+  INSERT INTO t2 VALUES(1, 2, 'x');
+  INSERT INTO t2 VALUES(3, 4, 'b');
+}
+
+do_execsql_test 12.1 {
+  SELECT * FROM t1 NATURAL JOIN ft WHERE ft MATCH('b')
+} {b world {}}
+do_execsql_test 12.2 {
+  SELECT * FROM ft NATURAL JOIN t1 WHERE ft MATCH('b')
+} {b world {}}
+do_execsql_test 12.3 {
+  SELECT * FROM t2 JOIN ft USING (ft)
+} {3 4 b b}
+
 finish_test
 
index b8ff4d4e021b721699abe6b21a51050371b64fab..6e0bf6dbe3d23a7140849db321e2f364fe98ecfa 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C In\sALTER\sTABLE,\srename\scolumns\sand\stables\sin\sexpressions\sthat\sare\soptimized\sout\sby\sthe\s"AND\s0"\soptimization.\sDoing\sthis\salso\sfixes\san\sotherwise\sharmless\sassert()\sfailure.
-D 2019-12-30T06:55:31.748
+C Do\snot\suse\sHIDDEN\scolumns\sfor\sNATURAL\sjoins.\sFix\sfor\s[7c0e06b16].
+D 2019-12-30T14:32:27.220
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
 F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -189,7 +189,7 @@ F ext/fts5/test/fts5leftjoin.test c0b4cafb9661379e576dc4405c0891d8fcc27826807405
 F ext/fts5/test/fts5matchinfo.test 50d86da66ec5b27603dcd90ba0227f5d9deb10351cbc52974a88e24f6fc9b076
 F ext/fts5/test/fts5merge.test e92a8db28b45931e7a9c7b1bbd36101692759d00274df74d83fd29d25d53b3a6
 F ext/fts5/test/fts5merge2.test 3ebad1a59d6ad3fb66eff6523a09e95dc6367cbefb3cd73196801dea0425c8e2
-F ext/fts5/test/fts5misc.test 1da7c54fff4c3584dbf60a770e997792459c5930dc36b5182d68595e39bbf8f9
+F ext/fts5/test/fts5misc.test 088ac5f0f5de1ad45b0f83197ab5263bcae8130156cdc901bff2375ff2b8af86
 F ext/fts5/test/fts5multi.test a15bc91cdb717492e6e1b66fec1c356cb57386b980c7ba5af1915f97fe878581
 F ext/fts5/test/fts5multiclient.test 5ff811c028d6108045ffef737f1e9f05028af2458e456c0937c1d1b8dea56d45
 F ext/fts5/test/fts5near.test 211477940142d733ac04fad97cb24095513ab2507073a99c2765c3ddd2ef58bd
@@ -528,7 +528,7 @@ F src/printf.c 9be6945837c839ba57837b4bc3af349eba630920fa5532aa518816defe42a7d4
 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384
 F src/resolve.c e231da7dd307f99772c40e76096abaf05c6fedcb4f1f045de23a61c194df6da6
 F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93
-F src/select.c dafb9d298e231a58365074215920431956ca606cd2bcda682b4d3d3e93d4327b
+F src/select.c 71234f813ccb9dc5bc6f3cd365a64bcadf7fc4100adcf201ded96cae8fe33d87
 F src/shell.c.in 4a3a9e1c11847b1904f2b01d087af1c052f660902755abab457cab1756817ded
 F src/sqlite.h.in 51f69c62ba3e980aca1e39badcaf9ad13f008774fe1bb8e7f57e3e456c656670
 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8
@@ -1853,7 +1853,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
 F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
 F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P db4b7e1dc399c1f16b827ac087aa37c0815f4b2f41f1ffad59963eead2ab5562
-R d015eff90d79dae7805d6393f409ae2c
+P a9e0354c992b0287608ddd18fd35fe7e6102a8f293d6e6e1b3488644bcda8168
+R 12c631b55f929cadc9a16f06264f1b7b
 U dan
-Z 4676afd3b05e3706903e7277aaa2fd67
+Z 065a161e87fc20e8a08ebf4d8e684dfd
index 9f6809bcbc4570c948bde21a5f63d074b2b8b983..8cac8f6c9a567ac60b7a402fdaecdbc7e2057f8c 100644 (file)
@@ -1 +1 @@
-a9e0354c992b0287608ddd18fd35fe7e6102a8f293d6e6e1b3488644bcda8168
\ No newline at end of file
+ab09ef427181130be09a087b7e572ad4cfb6b3e1b459769ee5ebf046b3ead682
\ No newline at end of file
index 327027f02cd58e7b2762947d44cfa4d22cf64215..d262d97c1a12b9a175b6096a5934da3f45fc3287 100644 (file)
@@ -313,7 +313,8 @@ static int tableAndColumnIndex(
   int N,               /* Number of tables in pSrc->a[] to search */
   const char *zCol,    /* Name of the column we are looking for */
   int *piTab,          /* Write index of pSrc->a[] here */
-  int *piCol           /* Write index of pSrc->a[*piTab].pTab->aCol[] here */
+  int *piCol,          /* Write index of pSrc->a[*piTab].pTab->aCol[] here */
+  int bIgnoreHidden    /* True to ignore hidden columns */
 ){
   int i;               /* For looping over tables in pSrc */
   int iCol;            /* Index of column matching zCol */
@@ -321,7 +322,9 @@ static int tableAndColumnIndex(
   assert( (piTab==0)==(piCol==0) );  /* Both or neither are NULL */
   for(i=0; i<N; i++){
     iCol = columnIndex(pSrc->a[i].pTab, zCol);
-    if( iCol>=0 ){
+    if( iCol>=0 
+     && (bIgnoreHidden==0 || IsHiddenColumn(&pSrc->a[i].pTab->aCol[iCol])==0)
+    ){
       if( piTab ){
         *piTab = i;
         *piCol = iCol;
@@ -486,10 +489,11 @@ static int sqliteProcessJoin(Parse *pParse, Select *p){
         int iLeft;     /* Matching left table */
         int iLeftCol;  /* Matching column in the left table */
 
+        if( IsHiddenColumn(&pRightTab->aCol[j]) ) continue;
         zName = pRightTab->aCol[j].zName;
-        if( tableAndColumnIndex(pSrc, i+1, zName, &iLeft, &iLeftCol) ){
+        if( tableAndColumnIndex(pSrc, i+1, zName, &iLeft, &iLeftCol, 1) ){
           addWhereTerm(pParse, pSrc, iLeft, iLeftCol, i+1, j,
-                       isOuter, &p->pWhere);
+                isOuter, &p->pWhere);
         }
       }
     }
@@ -529,7 +533,7 @@ static int sqliteProcessJoin(Parse *pParse, Select *p){
         zName = pList->a[j].zName;
         iRightCol = columnIndex(pRightTab, zName);
         if( iRightCol<0
-         || !tableAndColumnIndex(pSrc, i+1, zName, &iLeft, &iLeftCol)
+         || !tableAndColumnIndex(pSrc, i+1, zName, &iLeft, &iLeftCol, 0)
         ){
           sqlite3ErrorMsg(pParse, "cannot join using column %s - column "
             "not present in both tables", zName);
@@ -5087,7 +5091,7 @@ static int selectExpander(Walker *pWalker, Select *p){
 
             if( i>0 && zTName==0 ){
               if( (pFrom->fg.jointype & JT_NATURAL)!=0
-                && tableAndColumnIndex(pTabList, i, zName, 0, 0)
+                && tableAndColumnIndex(pTabList, i, zName, 0, 0, 1)
               ){
                 /* In a NATURAL join, omit the join columns from the 
                 ** table to the right of the join */