From: drh <> Date: Sat, 25 Mar 2023 19:46:21 +0000 (+0000) Subject: In the byte-code generator, when the result of an expression needs to be in a particular X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=698e4f8b9d6ff8a3c2751a7ce357b1dbe49b398d;p=thirdparty%2Fsqlite.git In the byte-code generator, when the result of an expression needs to be in a particular 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 --- diff --git a/manifest b/manifest index e0a39e96b0..6f0b38ed29 100644 --- 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. diff --git a/manifest.uuid b/manifest.uuid index b67e1f827f..a2e273f007 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -671bf6f5320bb3add6c897b2c3c78db504d3f0a21ba5347247bc9073ef669f55 \ No newline at end of file +2d439ccca4f8fd2bcf2178b4ebea54d6a6434303eeb0fe3c6b0be4f2ea5cbb60 \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index 87adcd344a..15b7a7f2df 100644 --- a/src/expr.c +++ b/src/expr.c @@ -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; }