From: drh Date: Fri, 16 Sep 2011 16:00:51 +0000 (+0000) Subject: Further streamlining of the subquery materializer. New test cases for X-Git-Tag: version-3.7.8~10 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=7157e8eac120d01f8805a14a455eb613ab371c2f;p=thirdparty%2Fsqlite.git Further streamlining of the subquery materializer. New test cases for ticket [002caede898a] FossilOrigin-Name: ff8b76b25b42497a7374de56c6a8f34cbe70cd6a --- diff --git a/manifest b/manifest index 53bb75791c..1ca206f666 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Merge\sthe\s[002caede898]\sfix\sinto\strunk. -D 2011-09-16T01:38:53.253 +C Further\sstreamlining\sof\sthe\ssubquery\smaterializer.\s\sNew\stest\scases\sfor\nticket\s[002caede898a] +D 2011-09-16T16:00:51.082 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 c7ea7cd4462cc44a40012ebbdcd31a83ac1e7274 +F src/select.c 2769d297c877e66ce780663867fdcffdeaa8302e F src/shell.c bbe7818ff5bc8614105ceb81ad67b8bdc0b671dd F src/sqlite.h.in 0a6c9c23337fd1352c5c75a613ff9533aa7d91cb F src/sqlite3ext.h 1a1a4f784aa9c3b00edd287940197de52487cd93 @@ -715,7 +715,7 @@ F test/tkt-02a8e81d44.test 58494de77be2cf249228ada3f313fa399821c6ab F test/tkt-26ff0c2d1e.test 888324e751512972c6e0d1a09df740d8f5aaf660 F test/tkt-2d1a5c67d.test b028a811049eb472cb2d3a43fc8ce4f6894eebda F test/tkt-2ea2425d34.test 1cf13e6f75d149b3209a0cb32927a82d3d79fb28 -F test/tkt-31338dca7e.test cbfc6c0a43dca5b1f46a0f727bfc93e312117fc2 +F test/tkt-31338dca7e.test 099fa7d3062da40b2a187b27b0c76fed677e4919 F test/tkt-313723c356.test c47f8a9330523e6f35698bf4489bcb29609b53ac F test/tkt-38cb5df375.test 9e9b19857dba0896a8efdaf334d405ba423492f2 F test/tkt-3998683a16.test 6d1d04d551ed1704eb3396ca87bb9ccc8c5c1eb7 @@ -961,7 +961,7 @@ F tool/symbols.sh caaf6ccc7300fd43353318b44524853e222557d5 F tool/tostr.awk e75472c2f98dd76e06b8c9c1367f4ab07e122d06 F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f F tool/warnings.sh b7fdb2cc525f5ef4fa43c80e771636dd3690f9d2 -P 3fc566ac5dfce314ee414a3fb79daeeed6d0f179 7f00552b739fad79517b042a6ed61abe743a917b -R dfebcfb6ba63e648417a1c83afb0ef8f +P 95708ae2235658c3a49679e2fe252a058793366a +R ed217ffbd1eb23c46e3dd65abee737cc U drh -Z baf4ff7d9b925e2ad8e253a721fec7c0 +Z a08b3947e57752f2c6077ad25dc8a001 diff --git a/manifest.uuid b/manifest.uuid index 298e9bf272..d66b6a43e7 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -95708ae2235658c3a49679e2fe252a058793366a \ No newline at end of file +ff8b76b25b42497a7374de56c6a8f34cbe70cd6a \ No newline at end of file diff --git a/src/select.c b/src/select.c index 277f5c0264..82d9a06f0e 100644 --- a/src/select.c +++ b/src/select.c @@ -3830,11 +3830,14 @@ int sqlite3Select( ** to the address of the generated subroutine. pItem->regReturn ** is a register allocated to hold the subroutine return address */ - int topAddr = sqlite3VdbeAddOp0(v, OP_Goto); + int topAddr; int onceAddr = 0; + int retAddr; assert( pItem->addrFillSub==0 ); - pItem->addrFillSub = topAddr+1; pItem->regReturn = ++pParse->nMem; + topAddr = sqlite3VdbeAddOp2(v, OP_Integer, 0, pItem->regReturn); + pItem->addrFillSub = topAddr+1; + VdbeNoopComment((v, "materialize %s", pItem->pTab->zName)); if( pItem->isCorrelated==0 && pParse->pTriggerTab==0 ){ /* If the subquery is no correlated and if we are not inside of ** a trigger, then we only need to compute the value of the subquery @@ -3847,9 +3850,10 @@ int sqlite3Select( sqlite3Select(pParse, pSub, &dest); pItem->pTab->nRowEst = (unsigned)pSub->nSelectRow; if( onceAddr ) sqlite3VdbeJumpHere(v, onceAddr); - sqlite3VdbeAddOp1(v, OP_Return, pItem->regReturn); - sqlite3VdbeJumpHere(v, topAddr); - sqlite3VdbeAddOp2(v, OP_Gosub, pItem->regReturn, topAddr+1); + retAddr = sqlite3VdbeAddOp1(v, OP_Return, pItem->regReturn); + VdbeComment((v, "end %s", pItem->pTab->zName)); + sqlite3VdbeChangeP1(v, topAddr, retAddr); + } if( /*pParse->nErr ||*/ db->mallocFailed ){ goto select_end; diff --git a/test/tkt-31338dca7e.test b/test/tkt-31338dca7e.test index e0f3a265b0..3f3485260d 100644 --- a/test/tkt-31338dca7e.test +++ b/test/tkt-31338dca7e.test @@ -110,6 +110,57 @@ do_test tkt-31338-3.2 { )); } } {4 1 2 3 4 {}} +do_test tkt-31338-3.3 { + db eval { + SELECT * FROM t3 LEFT JOIN t1 ON d=g LEFT JOIN t4 ON c=h + WHERE (+a=1 AND h=4) + OR (b IN ( + SELECT x FROM (SELECT e+f AS x, e FROM t2 ORDER BY 1 LIMIT 2) + GROUP BY e + )); + } +} {4 1 2 3 4 {}} +do_test tkt-31338-3.4 { + db eval { + SELECT * FROM t3 LEFT JOIN t1 ON d=g LEFT JOIN t4 ON c=h + WHERE (a=1 AND h=4) + OR (+b IN ( + SELECT x FROM (SELECT e+f AS x, e FROM t2 ORDER BY 1 LIMIT 2) + GROUP BY e + )); + } +} {4 1 2 3 4 {}} + +do_test tkt-31338-3.5 { + db eval { + CREATE TABLE t5(a,b,c,d,e,f); + CREATE TABLE t6(g,h); + CREATE TRIGGER t6r AFTER INSERT ON t6 BEGIN + INSERT INTO t5 + SELECT * FROM t3 LEFT JOIN t1 ON d=g LEFT JOIN t4 ON c=h + WHERE (a=1 AND h=4) + OR (b IN ( + SELECT x FROM (SELECT e+f AS x, e FROM t2 ORDER BY 1 LIMIT 2) + GROUP BY e + )); + END; + INSERT INTO t6 VALUES(88,99); + SELECT * FROM t5; + } +} {4 1 2 3 4 {}} +do_test tkt-31338-3.6 { + db eval { + INSERT INTO t1 VALUES(2,4,3,4); + INSERT INTO t1 VALUES(99,101,3,4); + INSERT INTO t1 VALUES(98,97,3,4); + SELECT * FROM t3 LEFT JOIN t1 ON d=g LEFT JOIN t4 ON c=h + WHERE (a=1 AND h=4) + OR (b IN ( + SELECT x+a FROM (SELECT e+f AS x, e FROM t2 ORDER BY 1 LIMIT 2) + GROUP BY e + )); + } +} {4 2 4 3 4 {} 4 99 101 3 4 {}} finish_test