From: drh Date: Tue, 25 Feb 2014 19:38:46 +0000 (+0000) Subject: Make sure temporary registers used within a co-routine are not also used X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=refs%2Fheads%2Ftkt-8c63ff0eca;p=thirdparty%2Fsqlite.git Make sure temporary registers used within a co-routine are not also used outside of that co-routine, in order to prevent concurrent use of the same register for two different things. Ticket [8c63ff0eca81a9132d8] FossilOrigin-Name: cc5eda54226506652057687f711e0a7d3aa584af --- diff --git a/manifest b/manifest index f25d3185ff..a3fbbf8c07 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Also\sadjust\sthe\sorder\sof\sfiles\sin\sthe\samalgamation\sto\sensure\sthat\n_FILE_OFFSET_BITS\sis\sdefined\sbefore\sany\s#include,\sfor\sQNX. -D 2014-02-25T18:12:58.878 +C Make\ssure\stemporary\sregisters\sused\swithin\sa\sco-routine\sare\snot\salso\sused\noutside\sof\sthat\sco-routine,\sin\sorder\sto\sprevent\sconcurrent\suse\sof\sthe\ssame\nregister\sfor\stwo\sdifferent\sthings.\s\sTicket\s[8c63ff0eca81a9132d8] +D 2014-02-25T19:38:46.123 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 2ef13430cd359f7b361bb863504e227b25cc7f81 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -180,7 +180,7 @@ F src/global.c 1d7bb7ea8254ae6a68ed9bfaf65fcb3d1690b486 F src/hash.c d139319967164f139c8d1bb8a11b14db9c4ba3cd F src/hash.h 8890a25af81fb85a9ad7790d32eedab4b994da22 F src/hwtime.h d32741c8f4df852c7d959236615444e2b1063b08 -F src/insert.c d3d1164299faa53b5347f8ff676d3787537fa9e5 +F src/insert.c 3e875c32678eba2d94bce52c3d588c72889d2db1 F src/journal.c b4124532212b6952f42eb2c12fa3c25701d8ba8d F src/legacy.c 0df0b1550b9cc1f58229644735e317ac89131f12 F src/lempar.c cdf0a000315332fc9b50b62f3b5e22e080a0952b @@ -216,7 +216,7 @@ F src/printf.c 85d07756e45d7496d19439dcae3e6e9e0090f269 F src/random.c d10c1f85b6709ca97278428fd5db5bbb9c74eece F src/resolve.c ca8b99d894164435f5c55cb304c1b8121705c51e F src/rowset.c 64655f1a627c9c212d9ab497899e7424a34222e0 -F src/select.c 28bff39f9bc5ec618b0719fe3f7b4be9f88b6f02 +F src/select.c 7c3aa7b5f1f877fc53a6d18d7674f62806bebe83 F src/shell.c 3dd86bf73ccd079f0e32ef5069600586085e8239 F src/sqlite.h.in a2ef671f92747a5a1c8a47bad5c585a8dd9eca80 F src/sqlite3.rc 11094cc6a157a028b301a9f06b3d03089ea37c3e @@ -1151,7 +1151,10 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh d1a6de74685f360ab718efda6265994b99bbea01 F tool/win/sqlite.vsix 030f3eeaf2cb811a3692ab9c14d021a75ce41fff -P 953cdd6adadfd46b51ad61d7939cecca154a02cb -R d169e5164f16cb0355a3972eba04326c +P 23001a85cd334090cf6c70d4d7e722a01f4f6899 +R 805f25ef58778d8423f464038dea3667 +T *branch * tkt-8c63ff0eca +T *sym-tkt-8c63ff0eca * +T -sym-trunk * U drh -Z 6c6f89e1dd41d2a146386cfa06ae53d9 +Z 5c2047d046179f548648d68a3e09d052 diff --git a/manifest.uuid b/manifest.uuid index a069c374c5..26f46a58d7 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -23001a85cd334090cf6c70d4d7e722a01f4f6899 \ No newline at end of file +cc5eda54226506652057687f711e0a7d3aa584af \ No newline at end of file diff --git a/src/insert.c b/src/insert.c index 1d29da3092..6f2b7dae51 100644 --- a/src/insert.c +++ b/src/insert.c @@ -647,6 +647,7 @@ void sqlite3Insert( assert( pParse->nErr==0 || rc ); if( rc || db->mallocFailed ) goto insert_cleanup; sqlite3VdbeAddOp1(v, OP_EndCoroutine, regYield); + sqlite3ClearTempRegCache(pParse); sqlite3VdbeJumpHere(v, addrTop - 1); /* label B: */ assert( pSelect->pEList ); nColumn = pSelect->pEList->nExpr; diff --git a/src/select.c b/src/select.c index 93947d56b2..7c3666588e 100644 --- a/src/select.c +++ b/src/select.c @@ -2751,6 +2751,7 @@ static int multiSelectOrderBy( explainSetInteger(iSub1, pParse->iNextSelectId); sqlite3Select(pParse, pPrior, &destA); sqlite3VdbeAddOp1(v, OP_EndCoroutine, regAddrA); + sqlite3ClearTempRegCache(pParse); sqlite3VdbeJumpHere(v, j1); /* Generate a coroutine to evaluate the SELECT statement on @@ -2768,6 +2769,7 @@ static int multiSelectOrderBy( p->iLimit = savedLimit; p->iOffset = savedOffset; sqlite3VdbeAddOp1(v, OP_EndCoroutine, regAddrB); + sqlite3ClearTempRegCache(pParse); /* Generate a subroutine that outputs the current row of the A ** select as the next output row of the compound select.