From: drh Date: Fri, 16 Sep 2011 19:04:03 +0000 (+0000) Subject: Remove unreachable branches from the previous change. Add additional X-Git-Tag: version-3.7.8~8 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=a464c23429d00343201db5f18eeb533b33772846;p=thirdparty%2Fsqlite.git Remove unreachable branches from the previous change. Add additional test cases. FossilOrigin-Name: cf51ef8ab8a610ddf64f66970dd689fe1df405b8 --- diff --git a/manifest b/manifest index bb965adca6..5c4f08aa37 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C When\sanalyzing\sthe\sright-hand\sside\sof\sIN\soperators\sto\ssee\sif\sthe\sIN\soperator\ncan\swork\swith\san\sindex,\sbe\ssure\sto\sdecend\sinto\snested\ssubqueries.\nFix\sfor\sticket\s[1a1308d2538d7] -D 2011-09-16T17:43:06.835 +C Remove\sunreachable\sbranches\sfrom\sthe\sprevious\schange.\s\sAdd\sadditional\ntest\scases. +D 2011-09-16T19:04:03.371 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in d314143fa6be24828021d3f583ad37d9afdce505 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -179,7 +179,7 @@ F src/printf.c 585a36b6a963df832cfb69505afa3a34ed5ef8a1 F src/random.c cd4a67b3953b88019f8cd4ccd81394a8ddfaba50 F src/resolve.c 36368f44569208fa074e61f4dd0b6c4fb60ca2b4 F src/rowset.c 69afa95a97c524ba6faf3805e717b5b7ae85a697 -F src/select.c 2769d297c877e66ce780663867fdcffdeaa8302e +F src/select.c d9b7d20b0365f80761846f00ef3638d4b33eeaf2 F src/shell.c bbe7818ff5bc8614105ceb81ad67b8bdc0b671dd F src/sqlite.h.in 0a6c9c23337fd1352c5c75a613ff9533aa7d91cb F src/sqlite3ext.h 1a1a4f784aa9c3b00edd287940197de52487cd93 @@ -251,7 +251,7 @@ F src/vtab.c 901791a47318c0562cd0c676a2c6ff1bc530e582 F src/wal.c 3154756177d6219e233d84291d5b05f4e06ff5e9 F src/wal.h 66b40bd91bc29a5be1c88ddd1f5ade8f3f48728a F src/walker.c 3112bb3afe1d85dc52317cb1d752055e9a781f8f -F src/where.c 73234bca5efe5cfe0d330ae26b705bf2df03af1e +F src/where.c b641d399cfd8588d0e20d9790d1582b663a732a8 F test/8_3_names.test 631ea964a3edb091cf73c3b540f6bcfdb36ce823 F test/aggerror.test a867e273ef9e3d7919f03ef4f0e8c0d2767944f2 F test/alias.test 4529fbc152f190268a15f9384a5651bbbabc9d87 @@ -687,6 +687,7 @@ F test/sqllimits1.test b1aae27cc98eceb845e7f7adf918561256e31298 F test/stat.test 0997f6a57a35866b14111ed361ed8851ce7978ae F test/stmt.test 25d64e3dbf9a3ce89558667d7f39d966fe2a71b9 F test/subquery.test b524f57c9574b2c0347045b4510ef795d4686796 +F test/subquery2.test edcad5c118f0531c2e21bf16a09bbb105252d4cd F test/subselect.test d24fd8757daf97dafd2e889c73ea4c4272dcf4e4 F test/substr.test 18f57c4ca8a598805c4d64e304c418734d843c1a F test/superlock.test 5d7a4954b0059c903f82c7b67867bc5451a7c082 @@ -961,7 +962,7 @@ F tool/symbols.sh caaf6ccc7300fd43353318b44524853e222557d5 F tool/tostr.awk e75472c2f98dd76e06b8c9c1367f4ab07e122d06 F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f F tool/warnings.sh b7fdb2cc525f5ef4fa43c80e771636dd3690f9d2 -P ff8b76b25b42497a7374de56c6a8f34cbe70cd6a -R 34a35a895569cf9f022e7945a674f5c5 +P 0156f10e23daca0e2504cd293a67ed0233d254d0 +R 6ac04cf9823838428848cb3eecc8467b U drh -Z 3184e4e9148b5fe9b0698bbc6c4cbb58 +Z fc85b6ee205b1fa04072a560842933fc diff --git a/manifest.uuid b/manifest.uuid index 4f77b9b4ca..b05ad8b2ae 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -0156f10e23daca0e2504cd293a67ed0233d254d0 \ No newline at end of file +cf51ef8ab8a610ddf64f66970dd689fe1df405b8 \ No newline at end of file diff --git a/src/select.c b/src/select.c index 82d9a06f0e..89c6b251c3 100644 --- a/src/select.c +++ b/src/select.c @@ -89,6 +89,8 @@ Select *sqlite3SelectNew( clearSelect(db, pNew); if( pNew!=&standin ) sqlite3DbFree(db, pNew); pNew = 0; + }else{ + assert( pNew->pSrc!=0 || pParse->nErr>0 ); } return pNew; } diff --git a/src/where.c b/src/where.c index 4a37945b99..fd7da6274d 100644 --- a/src/where.c +++ b/src/where.c @@ -467,13 +467,13 @@ static Bitmask exprListTableUsage(WhereMaskSet *pMaskSet, ExprList *pList){ static Bitmask exprSelectTableUsage(WhereMaskSet *pMaskSet, Select *pS){ Bitmask mask = 0; while( pS ){ - SrcList *pSrc; + SrcList *pSrc = pS->pSrc; mask |= exprListTableUsage(pMaskSet, pS->pEList); mask |= exprListTableUsage(pMaskSet, pS->pGroupBy); mask |= exprListTableUsage(pMaskSet, pS->pOrderBy); mask |= exprTableUsage(pMaskSet, pS->pWhere); mask |= exprTableUsage(pMaskSet, pS->pHaving); - if( (pSrc = pS->pSrc)!=0 ){ + if( ALWAYS(pSrc!=0) ){ int i; for(i=0; inSrc; i++){ mask |= exprSelectTableUsage(pMaskSet, pSrc->a[i].pSelect); diff --git a/test/subquery2.test b/test/subquery2.test new file mode 100644 index 0000000000..04200046f9 --- /dev/null +++ b/test/subquery2.test @@ -0,0 +1,86 @@ +# 2011 September 16 +# +# The author disclaims copyright to this source code. In place of +# a legal notice, here is a blessing: +# +# May you do good and not evil. +# May you find forgiveness for yourself and forgive others. +# May you share freely, never taking more than you give. +# +#************************************************************************* +# This file implements regression tests for SQLite library. The +# focus of this script is testing correlated subqueries +# +# + +set testdir [file dirname $argv0] +source $testdir/tester.tcl + +ifcapable !subquery { + finish_test + return +} + +do_test subquery2-1.1 { + execsql { + BEGIN; + CREATE TABLE t1(a,b); + INSERT INTO t1 VALUES(1,2); + INSERT INTO t1 VALUES(3,4); + INSERT INTO t1 VALUES(5,6); + INSERT INTO t1 VALUES(7,8); + CREATE TABLE t2(c,d); + INSERT INTO t2 VALUES(1,1); + INSERT INTO t2 VALUES(3,9); + INSERT INTO t2 VALUES(5,25); + INSERT INTO t2 VALUES(7,49); + CREATE TABLE t3(e,f); + INSERT INTO t3 VALUES(1,1); + INSERT INTO t3 VALUES(3,27); + INSERT INTO t3 VALUES(5,125); + INSERT INTO t3 VALUES(7,343); + COMMIT; + } + execsql { + SELECT a FROM t1 + WHERE b IN (SELECT x+1 FROM (SELECT DISTINCT f/(a*a) AS x FROM t3)); + } +} {1 3 5 7} +do_test subquery2-1.2 { + execsql { + CREATE INDEX t1b ON t1(b); + SELECT a FROM t1 + WHERE b IN (SELECT x+1 FROM (SELECT DISTINCT f/(a*a) AS x FROM t3)); + } +} {1 3 5 7} + +do_test subquery2-1.11 { + execsql { + SELECT a FROM t1 + WHERE +b=(SELECT x+1 FROM (SELECT DISTINCT f/(a*a) AS x FROM t3)); + } +} {1} +do_test subquery2-1.12 { + execsql { + SELECT a FROM t1 + WHERE b=(SELECT x+1 FROM (SELECT DISTINCT f/(a*a) AS x FROM t3)); + } +} {1} + +do_test subquery2-1.21 { + execsql { + SELECT a FROM t1 + WHERE +b=(SELECT x+1 FROM + (SELECT DISTINCT f/d AS x FROM t2 JOIN t3 ON d*a=f)) + } +} {1 3 5 7} +do_test subquery2-1.22 { + execsql { + SELECT a FROM t1 + WHERE b=(SELECT x+1 FROM + (SELECT DISTINCT f/d AS x FROM t2 JOIN t3 ON d*a=f)) + } +} {1 3 5 7} + + +finish_test