1
0
mirror of https://github.com/sqlite/sqlite.git synced 2025-08-05 15:55:57 +03:00

Do not use HIDDEN columns for NATURAL joins. Fix for [7c0e06b16].

FossilOrigin-Name: ab09ef427181130be09a087b7e572ad4cfb6b3e1b459769ee5ebf046b3ead682
This commit is contained in:
dan
2019-12-30 14:32:27 +00:00
parent 2b6e670f73
commit 9d41af23a4
4 changed files with 45 additions and 14 deletions

View File

@@ -296,5 +296,32 @@ do_execsql_test 11.1 {
INSERT INTO vt0(vt0) VALUES('integrity-check'); 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 finish_test

View File

@@ -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. C Do\snot\suse\sHIDDEN\scolumns\sfor\sNATURAL\sjoins.\sFix\sfor\s[7c0e06b16].
D 2019-12-30T06:55:31.748 D 2019-12-30T14:32:27.220
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 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/fts5matchinfo.test 50d86da66ec5b27603dcd90ba0227f5d9deb10351cbc52974a88e24f6fc9b076
F ext/fts5/test/fts5merge.test e92a8db28b45931e7a9c7b1bbd36101692759d00274df74d83fd29d25d53b3a6 F ext/fts5/test/fts5merge.test e92a8db28b45931e7a9c7b1bbd36101692759d00274df74d83fd29d25d53b3a6
F ext/fts5/test/fts5merge2.test 3ebad1a59d6ad3fb66eff6523a09e95dc6367cbefb3cd73196801dea0425c8e2 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/fts5multi.test a15bc91cdb717492e6e1b66fec1c356cb57386b980c7ba5af1915f97fe878581
F ext/fts5/test/fts5multiclient.test 5ff811c028d6108045ffef737f1e9f05028af2458e456c0937c1d1b8dea56d45 F ext/fts5/test/fts5multiclient.test 5ff811c028d6108045ffef737f1e9f05028af2458e456c0937c1d1b8dea56d45
F ext/fts5/test/fts5near.test 211477940142d733ac04fad97cb24095513ab2507073a99c2765c3ddd2ef58bd F ext/fts5/test/fts5near.test 211477940142d733ac04fad97cb24095513ab2507073a99c2765c3ddd2ef58bd
@@ -528,7 +528,7 @@ F src/printf.c 9be6945837c839ba57837b4bc3af349eba630920fa5532aa518816defe42a7d4
F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384
F src/resolve.c e231da7dd307f99772c40e76096abaf05c6fedcb4f1f045de23a61c194df6da6 F src/resolve.c e231da7dd307f99772c40e76096abaf05c6fedcb4f1f045de23a61c194df6da6
F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93
F src/select.c dafb9d298e231a58365074215920431956ca606cd2bcda682b4d3d3e93d4327b F src/select.c 71234f813ccb9dc5bc6f3cd365a64bcadf7fc4100adcf201ded96cae8fe33d87
F src/shell.c.in 4a3a9e1c11847b1904f2b01d087af1c052f660902755abab457cab1756817ded F src/shell.c.in 4a3a9e1c11847b1904f2b01d087af1c052f660902755abab457cab1756817ded
F src/sqlite.h.in 51f69c62ba3e980aca1e39badcaf9ad13f008774fe1bb8e7f57e3e456c656670 F src/sqlite.h.in 51f69c62ba3e980aca1e39badcaf9ad13f008774fe1bb8e7f57e3e456c656670
F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8
@@ -1853,7 +1853,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
P db4b7e1dc399c1f16b827ac087aa37c0815f4b2f41f1ffad59963eead2ab5562 P a9e0354c992b0287608ddd18fd35fe7e6102a8f293d6e6e1b3488644bcda8168
R d015eff90d79dae7805d6393f409ae2c R 12c631b55f929cadc9a16f06264f1b7b
U dan U dan
Z 4676afd3b05e3706903e7277aaa2fd67 Z 065a161e87fc20e8a08ebf4d8e684dfd

View File

@@ -1 +1 @@
a9e0354c992b0287608ddd18fd35fe7e6102a8f293d6e6e1b3488644bcda8168 ab09ef427181130be09a087b7e572ad4cfb6b3e1b459769ee5ebf046b3ead682

View File

@@ -313,7 +313,8 @@ static int tableAndColumnIndex(
int N, /* Number of tables in pSrc->a[] to search */ int N, /* Number of tables in pSrc->a[] to search */
const char *zCol, /* Name of the column we are looking for */ const char *zCol, /* Name of the column we are looking for */
int *piTab, /* Write index of pSrc->a[] here */ 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 i; /* For looping over tables in pSrc */
int iCol; /* Index of column matching zCol */ int iCol; /* Index of column matching zCol */
@@ -321,7 +322,9 @@ static int tableAndColumnIndex(
assert( (piTab==0)==(piCol==0) ); /* Both or neither are NULL */ assert( (piTab==0)==(piCol==0) ); /* Both or neither are NULL */
for(i=0; i<N; i++){ for(i=0; i<N; i++){
iCol = columnIndex(pSrc->a[i].pTab, zCol); 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 ){ if( piTab ){
*piTab = i; *piTab = i;
*piCol = iCol; *piCol = iCol;
@@ -486,10 +489,11 @@ static int sqliteProcessJoin(Parse *pParse, Select *p){
int iLeft; /* Matching left table */ int iLeft; /* Matching left table */
int iLeftCol; /* Matching column in the left table */ int iLeftCol; /* Matching column in the left table */
if( IsHiddenColumn(&pRightTab->aCol[j]) ) continue;
zName = pRightTab->aCol[j].zName; 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, 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; zName = pList->a[j].zName;
iRightCol = columnIndex(pRightTab, zName); iRightCol = columnIndex(pRightTab, zName);
if( iRightCol<0 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 " sqlite3ErrorMsg(pParse, "cannot join using column %s - column "
"not present in both tables", zName); "not present in both tables", zName);
@@ -5087,7 +5091,7 @@ static int selectExpander(Walker *pWalker, Select *p){
if( i>0 && zTName==0 ){ if( i>0 && zTName==0 ){
if( (pFrom->fg.jointype & JT_NATURAL)!=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 /* In a NATURAL join, omit the join columns from the
** table to the right of the join */ ** table to the right of the join */