From: drh <> Date: Thu, 14 Apr 2022 16:34:07 +0000 (+0000) Subject: Rerun the subroutines that compute row-values if necessary from within X-Git-Tag: version-3.39.0~206^2~55 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=2c31c00bfa7001f9d775a5d137da51c5b2ce78f4;p=thirdparty%2Fsqlite.git Rerun the subroutines that compute row-values if necessary from within the RIGHT JOIN body subroutine. FossilOrigin-Name: 9b9038bcd0ab5c4f01661456635526cef764f854ff24018a5e6e43825d07eb59 --- diff --git a/manifest b/manifest index 119a0315e0..1ed80e82f7 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Adjust\sthe\soutput\sformatting\sof\sbytecode\slistings\sso\sthat\ssubroutines\sused\nto\simplement\ssubqueries\sare\sindented\sone\slevel. -D 2022-04-14T15:55:34.630 +C Rerun\sthe\ssubroutines\sthat\scompute\srow-values\sif\snecessary\sfrom\swithin\nthe\sRIGHT\sJOIN\sbody\ssubroutine. +D 2022-04-14T16:34:07.896 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -503,7 +503,7 @@ F src/date.c 15082566229d4b1e5f24fdb490bf9bcc68824b911d70e3573ef075a1b9e2d26f F src/dbpage.c 90661a87e1db8bfbc8d2ebbdcd3749651ddb287c555c07a28fb17c7c591ffb68 F src/dbstat.c 861e08690fcb0f2ee1165eff0060ea8d4f3e2ea10f80dab7d32ad70443a6ff2d F src/delete.c a8e844af211a48b13b5b358be77a12c860c6a557c21990ad51a548e2536500ce -F src/expr.c e33323313316fc7544fe4f0ed2a089ff3f8e1fc402e7fa77a3db78cf97eb7958 +F src/expr.c f4020ee000cf0d7d891456f09465bc121773a34e2ccb7bcfc18964a470679d08 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 94927f9b46d72a9cb858c208febf04ceb0a3270c5fa5fd0b7f436cf16e09f72a F src/func.c a3407a6fbb0d4088d8d502e46f0ace63e0aeae7467ae23a9ca9815bbf9239761 @@ -557,7 +557,7 @@ F src/shell.c.in eb7f10d5e2c47bd014d92ec5db1def21fcc1ed56ffaaa4ee715b6c37c370b47 F src/sqlite.h.in 2a35f62185eb5e7ecc64a2f68442b538ce9be74f80f28a00abc24837edcf1c17 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h f49e28c25bd941e79794db5415fdf7b202deb3bc072ed6f1ed273d578703684e -F src/sqliteInt.h cfdfe65eeb87d3fa8319481fb541586f49e93d5715e9f487ae83362844a9abc7 +F src/sqliteInt.h ce8d798a966d6cd373fe12a2a5a90c9e6d5c8f2d98cbed4cd3efabd91b3f196b F src/sqliteLimit.h d7323ffea5208c6af2734574bae933ca8ed2ab728083caa117c9738581a31657 F src/status.c 4a3da6d77eeb3531cb0dbdf7047772a2a1b99f98c69e90ce009c75fe6328b2c0 F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 @@ -639,9 +639,9 @@ F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c b9df133a705093da8977da5eb202eaadb844839f1c7297c08d33471f5491843d F src/wal.h c3aa7825bfa2fe0d85bef2db94655f99870a285778baa36307c0a16da32b226a F src/walker.c f890a3298418d7cba3b69b8803594fdc484ea241206a8dfa99db6dd36f8cbb3b -F src/where.c 0db7dcbdacb3568f6b45aa419c37eaf0e25538bba15140acee74caee8b2e77fd +F src/where.c 963c06826218535bcebc8a8c41dcb2a8abf3cd340022d5b2cb503e7ce328cc47 F src/whereInt.h ea1e4b6639c4c32246f4c54b733143df76109894adf08bedee4f3999ece62c2d -F src/wherecode.c 34e4c445371b0ac19d234c5b454fa04d650417f10a702331ca590dc870254c41 +F src/wherecode.c cb747d628e8fdc0396529c07be9c772c2978016a723eba9c3329f8ef5e4411f1 F src/whereexpr.c 174d4ad5be165c610c907abb779ef4a97974d22b84e1ce7898d2d9f6947249e5 F src/window.c 42a71595263dbd8ef8248218e4fc7d4b5ddccece52146ad48e079342d93f6f8f F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 @@ -1947,8 +1947,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 402a89e33e39b00352dc9fb3301d03c6f75d8bb5c2ad540cd22506bff10b4d85 -R 36bb3f178ff0bc5642fa30a4c8645d1c +P 079b7b125206fb295720612f4853a5b786ec431ab595d35407195844779c149d +R af437a21d494eabd20c43af2912355e1 U drh -Z c6740140f49ce0f64d3f4ac433c56e97 +Z 9fe409698cfd512a3fa64bb15b8f5185 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 0d8f0623a4..7303907ef2 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -079b7b125206fb295720612f4853a5b786ec431ab595d35407195844779c149d \ No newline at end of file +9b9038bcd0ab5c4f01661456635526cef764f854ff24018a5e6e43825d07eb59 \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index 20adea5dca..79a79ed05e 100644 --- a/src/expr.c +++ b/src/expr.c @@ -4500,16 +4500,18 @@ expr_code_doover: } case TK_SELECT_COLUMN: { int n; - if( pExpr->pLeft->iTable==0 ){ - pExpr->pLeft->iTable = sqlite3CodeSubselect(pParse, pExpr->pLeft); + Expr *pLeft = pExpr->pLeft; + if( pLeft->iTable==0 || pParse->withinRJSubrtn > pLeft->op2 ){ + pLeft->iTable = sqlite3CodeSubselect(pParse, pLeft); + pLeft->op2 = pParse->withinRJSubrtn; } - assert( pExpr->pLeft->op==TK_SELECT || pExpr->pLeft->op==TK_ERROR ); - n = sqlite3ExprVectorSize(pExpr->pLeft); + assert( pLeft->op==TK_SELECT || pLeft->op==TK_ERROR ); + n = sqlite3ExprVectorSize(pLeft); if( pExpr->iTable!=n ){ sqlite3ErrorMsg(pParse, "%d columns assigned %d values", pExpr->iTable, n); } - return pExpr->pLeft->iTable + pExpr->iColumn; + return pLeft->iTable + pExpr->iColumn; } case TK_IN: { int destIfFalse = sqlite3VdbeMakeLabel(pParse); diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 330d58fa48..1cd3e75b44 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -3570,6 +3570,7 @@ struct Parse { u8 okConstFactor; /* OK to factor out constants */ u8 disableLookaside; /* Number of times lookaside has been disabled */ u8 disableVtab; /* Disable all virtual tables for this parse */ + u8 withinRJSubrtn; /* Nesting level for RIGHT JOIN body subroutines */ #if defined(SQLITE_DEBUG) || defined(SQLITE_COVERAGE_TEST) u8 earlyCleanup; /* OOM inside sqlite3ParserAddCleanup() */ #endif diff --git a/src/where.c b/src/where.c index dca78e11b9..7b37db2158 100644 --- a/src/where.c +++ b/src/where.c @@ -6028,6 +6028,8 @@ void sqlite3WhereEnd(WhereInfo *pWInfo){ sqlite3VdbeResolveLabel(v, pLevel->addrCont); pLevel->addrCont = 0; sqlite3VdbeAddOp2(v, OP_Return, pRJ->regReturn, pRJ->addrSubrtn); + assert( pParse->withinRJSubrtn>0 ); + pParse->withinRJSubrtn--; } pLoop = pLevel->pWLoop; if( pLevel->op!=OP_Noop ){ diff --git a/src/wherecode.c b/src/wherecode.c index 62c733bbd4..f08a4c2806 100644 --- a/src/wherecode.c +++ b/src/wherecode.c @@ -2771,6 +2771,8 @@ Bitmask sqlite3WhereCodeOneLoopStart( */ sqlite3VdbeAddOp2(v, OP_BeginSubrtn, 0, pRJ->regReturn); pRJ->addrSubrtn = sqlite3VdbeCurrentAddr(v); + assert( pParse->withinRJSubrtn < 255 ); + pParse->withinRJSubrtn++; } #if WHERETRACE_ENABLED /* 0x20800 */