]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Rerun the subroutines that compute row-values if necessary from within
authordrh <>
Thu, 14 Apr 2022 16:34:07 +0000 (16:34 +0000)
committerdrh <>
Thu, 14 Apr 2022 16:34:07 +0000 (16:34 +0000)
the RIGHT JOIN body subroutine.

FossilOrigin-Name: 9b9038bcd0ab5c4f01661456635526cef764f854ff24018a5e6e43825d07eb59

manifest
manifest.uuid
src/expr.c
src/sqliteInt.h
src/where.c
src/wherecode.c

index 119a0315e0e1bb3130e455f5af98f461be8d8e6a..1ed80e82f7c495458683d8ded466fc181e901eb8 100644 (file)
--- 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.
index 0d8f0623a44117225e5eadd0b7c0228ddd99239f..7303907ef29d38b737d708d98faf7899ad2f7281 100644 (file)
@@ -1 +1 @@
-079b7b125206fb295720612f4853a5b786ec431ab595d35407195844779c149d
\ No newline at end of file
+9b9038bcd0ab5c4f01661456635526cef764f854ff24018a5e6e43825d07eb59
\ No newline at end of file
index 20adea5dcadbc80a946dcb2d2703fc9874bf1332..79a79ed05e0270d7e09886475d01c3f3c1978a03 100644 (file)
@@ -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);
index 330d58fa48b51074a4325eed347220abbec0bcb5..1cd3e75b44f83d26184a2f6a94e31e09a178cc3d 100644 (file)
@@ -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
index dca78e11b970c4cb8c1df2dad38df0a8709a34d5..7b37db21582393a8ebce9cdb7b49c76ec021e4c8 100644 (file)
@@ -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 ){
index 62c733bbd4f01232133cb885e8368912068a5cb6..f08a4c2806dbfff1a5cabb723f8e137f65fa1cfc 100644 (file)
@@ -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 */