]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Always clear the temporary register cache after coding a subroutine.
authordrh <drh@noemail.net>
Wed, 18 Sep 2019 20:34:54 +0000 (20:34 +0000)
committerdrh <drh@noemail.net>
Wed, 18 Sep 2019 20:34:54 +0000 (20:34 +0000)
FossilOrigin-Name: b6f2a7f9cdb547c925f08306df82519e41a7a0dd2cabd9861a48917bb6eef845

manifest
manifest.uuid
src/expr.c
test/tkt-3a77c9714e.test

index 605089739f748b7d10e207d5624bd788c0ec45df..1f01ffe4c45138b665f10b099eb51247742ee3eb 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Add\sextra\stests\sfor\sthe\shandling\sof\scorrupt\srecords\sin\sfts3.
-D 2019-09-18T17:22:00.034
+C Always\sclear\sthe\stemporary\sregister\scache\safter\scoding\sa\ssubroutine.
+D 2019-09-18T20:34:54.304
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
 F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -477,7 +477,7 @@ F src/date.c e1d8ac7102f3f283e63e13867acb0efa33861cf34f0faf4cdbaf9fa7a1eb7041
 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7
 F src/dbstat.c c12833de69cb655751487d2c5a59607e36be1c58ba1f4bd536609909ad47b319
 F src/delete.c d08c9e01a2664afd12edcfa3a9c6578517e8ff8735f35509582693adbe0edeaf
-F src/expr.c 10d90c4676047a75276446779d18fb3f7d3a1f9debc8b322e3772d2bd51f52ff
+F src/expr.c 012dec53bc11cb90dff297ee39cacc63b99ab6bfb41bf70c29fab7975fc64cfc
 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007
 F src/fkey.c 6b79f4c2447691aa9ac86e2a6a774b65f3b3dd053d4220a4893051a0de20f82e
 F src/func.c ed33e38cd642058182a31a3f518f2e34f4bbe53aa483335705c153c4d3e50b12
@@ -1425,7 +1425,7 @@ F test/tkt-313723c356.test 4b306ad45c736cedf2f5221f6155b92143244b6d
 F test/tkt-385a5b56b9.test 5204a7cba0e28c99df0acbf95af5e1af4d32965a7a14de6eccebf949607618b1
 F test/tkt-38cb5df375.test f3cc8671f1eb604d4ae9cf886ed4366bec656678
 F test/tkt-3998683a16.test 6d1d04d551ed1704eb3396ca87bb9ccc8c5c1eb7
-F test/tkt-3a77c9714e.test b08bca26de1140bdf004a37716582a43d7bd8be8
+F test/tkt-3a77c9714e.test 90e3e8455ee945a4076d4c44062b8845708af24a880355328fe7008f2047c9f0
 F test/tkt-3fe897352e.test 27e26eb0f1811aeba4d65aba43a4c52e99da5e70
 F test/tkt-4a03edc4c8.test 91c0e135888cdc3d4eea82406a44b05c8c1648d0
 F test/tkt-4c86b126f2.test cbcc611becd0396890169ab23102dd70048bbc9a
@@ -1844,7 +1844,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 633b214e9b9d99788ed72ab4823a69a43c7c40ed07fb76c7d56c50453c0e58ab
-R 4407aeaf834f805df203d4384ef6a197
-U dan
-Z af6f05aeae27bdb1fdb3efb52bf6a5f9
+P 40e29a47d1266c16a4992e43579a51addcc632503099c4cd128f77dd4e67da3c
+R 19a5d8959f5f4eef14dcfa5cedf39540
+U drh
+Z afa85988f4d7fbda4aae74eea5dadb5a
index fd6c3e6852d63687c1f33afd8d3d3ad28f5152aa..4ea84426003c463b53cd9ba396c5a32bd3fba701 100644 (file)
@@ -1 +1 @@
-40e29a47d1266c16a4992e43579a51addcc632503099c4cd128f77dd4e67da3c
\ No newline at end of file
+b6f2a7f9cdb547c925f08306df82519e41a7a0dd2cabd9861a48917bb6eef845
\ No newline at end of file
index 949758b10eba2e625a66c860890d5e4d8f8d2600..3656782c4d07d2298a0700fb517e1960028f4946 100644 (file)
@@ -2867,6 +2867,7 @@ void sqlite3CodeRhsOfIN(
     /* Subroutine return */
     sqlite3VdbeAddOp1(v, OP_Return, pExpr->y.sub.regReturn);
     sqlite3VdbeChangeP1(v, pExpr->y.sub.iAddr-1, sqlite3VdbeCurrentAddr(v)-1);
+    sqlite3ClearTempRegCache(pParse);
   }
 }
 #endif /* SQLITE_OMIT_SUBQUERY */
@@ -2977,6 +2978,7 @@ int sqlite3CodeSubselect(Parse *pParse, Expr *pExpr){
     /* Subroutine return */
     sqlite3VdbeAddOp1(v, OP_Return, pExpr->y.sub.regReturn);
     sqlite3VdbeChangeP1(v, pExpr->y.sub.iAddr-1, sqlite3VdbeCurrentAddr(v)-1);
+    sqlite3ClearTempRegCache(pParse);
   }
 
   return rReg;
@@ -5608,6 +5610,11 @@ void sqlite3ReleaseTempRange(Parse *pParse, int iReg, int nReg){
 
 /*
 ** Mark all temporary registers as being unavailable for reuse.
+**
+** Always invoke this procedure after coding a subroutine or co-routine
+** that might be invoked from other parts of the code, to ensure that
+** the sub/co-routine does not use registers in common with the code that
+** invokes the sub/co-routine.
 */
 void sqlite3ClearTempRegCache(Parse *pParse){
   pParse->nTempReg = 0;
index b7d366f36e8bc21c5095d0173b7b2ae039efcdfc..734dff38f622c32a9ed79d135ad10038f7a57b12 100644 (file)
@@ -1,4 +1,4 @@
-# 2011 December 06
+# 2011-12-06
 #
 # The author disclaims copyright to this source code.  In place of
 # a legal notice, here is a blessing:
@@ -68,5 +68,19 @@ do_execsql_test 2.2 {
     )
 } {FACTORING FACTOR SWIMMING SWIMM} 
 
+# Similar problem discovered by dbsqlfuzz on 2019-09-18
+#
+do_execsql_test 3.0 {
+  DROP TABLE IF EXISTS t1;
+  CREATE TABLE t1(i INT PRIMARY KEY, a, b);
+  INSERT INTO t1 VALUES(NULL,'one','i');
+  CREATE INDEX i1a ON t1(a);
+  CREATE INDEX i1b ON t1(b);
+  SELECT (SELECT 1
+            FROM (SELECT 1 FROM t1 WHERE a=1 OR b='i')
+           WHERE a='o'
+              OR b IN (SELECT a=('b' IN (SELECT 'a'))))
+    FROM t1;
+} {{}}
 
 finish_test