]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
In the byte-code generator, when the result of an expression needs to be in a particular
authordrh <>
Sat, 25 Mar 2023 19:46:21 +0000 (19:46 +0000)
committerdrh <>
Sat, 25 Mar 2023 19:46:21 +0000 (19:46 +0000)
register, always use the sqlite3ExprCode() routine because it has the smarts
to know whether to use OP_Copy or OP_SCopy.  Do not try to OP_SCopy inline
because an OP_Copy might be required.

FossilOrigin-Name: 2d439ccca4f8fd2bcf2178b4ebea54d6a6434303eeb0fe3c6b0be4f2ea5cbb60

manifest
manifest.uuid
src/expr.c

index e0a39e96b01e5e540a6ee9a82373f58292f390c5..6f0b38ed29a4111b5fa24a6251df408172593c1e 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C The\sfix\sat\s[13c8c60bb6b4447b]\swas\sincomplete\sin\sthat\sit\sfailed\sto\sclear\nthe\sreusable\sregister\scache\sthat\smight\scontain\sregisters\sin\sthe\sSTAT4\nbuffer\sregion.\s\sThis\sadditional\schange\scorrects\sthe\sproblem.
-D 2023-03-25T18:33:42.474
+C In\sthe\sbyte-code\sgenerator,\swhen\sthe\sresult\sof\san\sexpression\sneeds\sto\sbe\sin\sa\sparticular\nregister,\salways\suse\sthe\ssqlite3ExprCode()\sroutine\sbecause\sit\shas\sthe\ssmarts\nto\sknow\swhether\sto\suse\sOP_Copy\sor\sOP_SCopy.\s\sDo\snot\stry\sto\sOP_SCopy\sinline\nbecause\san\sOP_Copy\smight\sbe\srequired.
+D 2023-03-25T19:46:21.347
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
 F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -571,7 +571,7 @@ F src/date.c f21815ca7172ce073db3163ac54c8d9f2841077165c1a6123b4d1c376a0c7ec7
 F src/dbpage.c d47549716549311f79dc39fe5c8fb19390a6eb2c960f8e37c89a9c4de0c1052e
 F src/dbstat.c ec92074baa61d883de58c945162d9e666c13cd7cf3a23bc38b4d1c4d0b2c2bef
 F src/delete.c 201fe0763c52783d205c8c13cdd9d55c1bd5cb21c1f036753f99103b43284b90
-F src/expr.c e7c0cdde3bc5e5b82b02264547456e4454e1ea5a91b9649b3a02b6422a660122
+F src/expr.c 0c60fbb9959c89f5189a5c37f2a6b07f64617d965f0e528bd7490b050d2b6128
 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007
 F src/fkey.c 722f20779f5342a787922deded3628d8c74b5249cab04098cf17ee2f2aaff002
 F src/func.c d187be57a886ddf4e6b7ef584a494361899be3df5eee6d4a747b68ff4aff4122
@@ -2045,9 +2045,9 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
 F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
 F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P fc8ec188d943245ce10595aecf4095d3077f5fbafdeef7de8183afe9ad26eaf7
-Q +5d554e4d0f59a4309fed40e4fb26c7be42f1d4d55ccdcaaf7b4d445aa3122955
-R 9b3b63b10d0f39bb313cef16c904b71a
+P 671bf6f5320bb3add6c897b2c3c78db504d3f0a21ba5347247bc9073ef669f55
+Q +c104e5c6eeb89575319d9f94f49446142b06912fa8b283c19d46aa2ccddc5bda
+R f04882717cc138a296ec31363b93f6f2
 U drh
-Z 16f75e412c572f7268b1b1567e115867
+Z c5b862812ffdba692a1c16d183413668
 # Remove this line to create a well-formed Fossil manifest.
index b67e1f827faf2d837edc8ae011243550c8cb1382..a2e273f007ca59830144fa5c5d8812b5d9a98f4a 100644 (file)
@@ -1 +1 @@
-671bf6f5320bb3add6c897b2c3c78db504d3f0a21ba5347247bc9073ef669f55
\ No newline at end of file
+2d439ccca4f8fd2bcf2178b4ebea54d6a6434303eeb0fe3c6b0be4f2ea5cbb60
\ No newline at end of file
index 87adcd344afbc5268d0a7f6356bd498c35ee7c2b..15b7a7f2dfb8e95a13a76f3e6dc8a8d8684a277d 100644 (file)
@@ -4397,11 +4397,8 @@ expr_code_doover:
 #ifndef SQLITE_OMIT_CAST
     case TK_CAST: {
       /* Expressions of the form:   CAST(pLeft AS token) */
-      inReg = sqlite3ExprCodeTarget(pParse, pExpr->pLeft, target);
-      if( inReg!=target ){
-        sqlite3VdbeAddOp2(v, OP_SCopy, inReg, target);
-        inReg = target;
-      }
+      sqlite3ExprCode(pParse, pExpr->pLeft, target);
+      assert( inReg==target );
       assert( !ExprHasProperty(pExpr, EP_IntValue) );
       sqlite3VdbeAddOp2(v, OP_Cast, target,
                         sqlite3AffinityType(pExpr->u.zToken, 0));
@@ -4740,13 +4737,9 @@ expr_code_doover:
         ** Clear subtypes as subtypes may not cross a subquery boundary.
         */
         assert( pExpr->pLeft );
-        inReg = sqlite3ExprCodeTarget(pParse, pExpr->pLeft, target);
-        if( inReg!=target ){
-          sqlite3VdbeAddOp2(v, OP_SCopy, inReg, target);
-          inReg = target;
-        }
-        sqlite3VdbeAddOp1(v, OP_ClrSubtype, inReg);
-        return inReg;
+        sqlite3ExprCode(pParse, pExpr->pLeft, target);
+        sqlite3VdbeAddOp1(v, OP_ClrSubtype, target);
+        return target;
       }else{
         pExpr = pExpr->pLeft;
         goto expr_code_doover; /* 2018-04-28: Prevent deep recursion. */
@@ -4856,12 +4849,9 @@ expr_code_doover:
       **        "target" and not someplace else.
       */
       pParse->okConstFactor = 0;   /* note (1) above */
-      inReg = sqlite3ExprCodeTarget(pParse, pExpr->pLeft, target);
+      sqlite3ExprCode(pParse, pExpr->pLeft, target);
+      assert( target==inReg );
       pParse->okConstFactor = okConstFactor;
-      if( inReg!=target ){         /* note (2) above */
-        sqlite3VdbeAddOp2(v, OP_SCopy, inReg, target);
-        inReg = target;
-      }
       sqlite3VdbeJumpHere(v, addrINR);
       break;
     }