From: dan Date: Thu, 7 Mar 2019 19:26:17 +0000 (+0000) Subject: Modify new window functions function so that cursors are stepped immediately after... X-Git-Tag: version-3.28.0~88^2~31 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=c813750b7b485f00346ff6a2bfde0fcb5786da43;p=thirdparty%2Fsqlite.git Modify new window functions function so that cursors are stepped immediately after each operation, instead of immediately before. FossilOrigin-Name: 093d2b25f1b656bba57d665aac68109436861b157a5769432b612176dae3f6eb --- diff --git a/manifest b/manifest index 2a46b037e7..20f066a065 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Simplify\sthe\swindow\sfunction\scode\sgenerator\ssome\smore. -D 2019-03-06T21:04:11.725 +C Modify\snew\swindow\sfunctions\sfunction\sso\sthat\scursors\sare\sstepped\simmediately\safter\seach\soperation,\sinstead\sof\simmediately\sbefore. +D 2019-03-07T19:26:17.600 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 1ad7263f38329c0ecea543c80f30af839ee714ea77fc391bf1a3fbb919a5b6b5 @@ -604,7 +604,7 @@ F src/where.c 8a207cb2ca6b99e1edb1e4bbff9b0504385a759cbf66180d1deb34d80ca4b799 F src/whereInt.h 5f14db426ca46a83eabab1ae9aa6d4b8f27504ad35b64c290916289b1ddb2e88 F src/wherecode.c ce7b21e1be2b981d62683fc59c4ca73a04a7ff2f1ebec23d41baf2da2349afd6 F src/whereexpr.c 36b47f7261d6b6f1a72d774c113b74beddf6745aba1018e64b196e29db233442 -F src/window.c 06257715857cb9c6fe51b5a6f9558701821d431b85313d27e1b96d1a81e1f8eb +F src/window.c 00962a6b3434fd44a1c6e0446faaa27a0715b9234d9467e2b2f0516cc22d3ced F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/affinity2.test a6d901b436328bd67a79b41bb0ac2663918fe3bd F test/affinity3.test 6a101af2fc945ce2912f6fe54dd646018551710d @@ -1809,7 +1809,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 e8eee566dfca6f4c8af074731dfe91f7fbcd9ca72f0303235b52e4e2e80d5b71 -R 10fe6da0769422f36eeeb42d0ed4992d +P 45cbd3b4498cea8856f189e9d0a192556d4f15212055b8328a1beca6083fc47a +R 8a700321d1f21bd34463dfe3468362b4 U dan -Z 42de440ac1d651cb610f16495ca5b34a +Z 66270c88444ad4957a492203232c2b1a diff --git a/manifest.uuid b/manifest.uuid index dcc39ad3ae..9b064598e1 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -45cbd3b4498cea8856f189e9d0a192556d4f15212055b8328a1beca6083fc47a \ No newline at end of file +093d2b25f1b656bba57d665aac68109436861b157a5769432b612176dae3f6eb \ No newline at end of file diff --git a/src/window.c b/src/window.c index 33831f87c6..24f7451548 100644 --- a/src/window.c +++ b/src/window.c @@ -1892,13 +1892,6 @@ static int windowCodeOp( addrIf = sqlite3VdbeAddOp3(v, OP_IfPos, regCountdown, 0, 1); } - if( jumpOnEof ){ - sqlite3VdbeAddOp2(v, OP_Next, csr, sqlite3VdbeCurrentAddr(v)+2); - ret = sqlite3VdbeAddOp0(v, OP_Goto); - }else{ - sqlite3VdbeAddOp2(v, OP_Next, csr, sqlite3VdbeCurrentAddr(v)+1); - } - switch( op ){ case WINDOW_RETURN_ROW: windowAggFinal(p->pParse, p->pMWin, 0); @@ -1914,9 +1907,13 @@ static int windowCodeOp( break; } - if( ret ){ - sqlite3VdbeJumpHere(v, ret); + if( jumpOnEof ){ + sqlite3VdbeAddOp2(v, OP_Next, csr, sqlite3VdbeCurrentAddr(v)+2); + ret = sqlite3VdbeAddOp0(v, OP_Goto); + }else{ + sqlite3VdbeAddOp2(v, OP_Next, csr, sqlite3VdbeCurrentAddr(v)+1); } + if( regCountdown>0 ){ sqlite3VdbeJumpHere(v, addrIf); } @@ -2024,6 +2021,7 @@ static void windowCodeStep( int addrCacheNext; int addrShortcut = 0; + int addrEmpty = 0; int bCache = windowCachePartition(pMWin); @@ -2137,9 +2135,9 @@ static void windowCodeStep( sqlite3VdbeAddOp3(v, OP_Subtract, regStart, regEnd, regStart); } - sqlite3VdbeAddOp2(v, OP_Rewind, csrStart, 1); sqlite3VdbeChangeP5(v, 1); - sqlite3VdbeAddOp2(v, OP_Rewind, csrCurrent, 1); sqlite3VdbeChangeP5(v, 1); - sqlite3VdbeAddOp2(v, OP_Rewind, csrEnd, 1); sqlite3VdbeChangeP5(v, 1); + sqlite3VdbeAddOp2(v, OP_Rewind, csrStart, 1); + sqlite3VdbeAddOp2(v, OP_Rewind, csrCurrent, 1); + sqlite3VdbeAddOp2(v, OP_Rewind, csrEnd, 1); sqlite3VdbeAddOp2(v, OP_Integer, 0, pMWin->regFirst); addrGoto = sqlite3VdbeAddOp0(v, OP_Goto); @@ -2152,6 +2150,7 @@ static void windowCodeStep( sqlite3VdbeJumpHere(v, addrIf); } if( pMWin->eStart==TK_FOLLOWING ){ + windowCodeOp(&s, WINDOW_AGGSTEP, csrEnd, 0, 0); windowCodeOp(&s, WINDOW_RETURN_ROW, csrCurrent, regEnd, 0); windowCodeOp(&s, WINDOW_AGGINVERSE, csrStart, regStart, 0); }else @@ -2160,21 +2159,17 @@ static void windowCodeStep( windowCodeOp(&s, WINDOW_RETURN_ROW, csrCurrent, 0, 0); windowCodeOp(&s, WINDOW_AGGINVERSE, csrStart, regStart, 0); }else{ - int addr = sqlite3VdbeAddOp3(v, OP_IfPos, regEnd, 0, 1); + int addr; + windowCodeOp(&s, WINDOW_AGGSTEP, csrEnd, 0, 0); + addr = sqlite3VdbeAddOp3(v, OP_IfPos, regEnd, 0, 1); windowCodeOp(&s, WINDOW_RETURN_ROW, csrCurrent, 0, 0); windowCodeOp(&s, WINDOW_AGGINVERSE, csrStart, regStart, 0); sqlite3VdbeJumpHere(v, addr); } VdbeModuleComment((pParse->pVdbe, "End windowCodeStep.SECOND_ROW_CODE")); - VdbeModuleComment((pParse->pVdbe, "Begin windowCodeStep.ALL_ROW_CODE")); - sqlite3VdbeJumpHere(v, addrGoto); - if( pMWin->eEnd!=TK_PRECEDING ){ - windowCodeOp(&s, WINDOW_AGGSTEP, csrEnd, 0, 0); - } - VdbeModuleComment((pParse->pVdbe, "End windowCodeStep.ALL_ROW_CODE")); - /* End of the main input loop */ + sqlite3VdbeJumpHere(v, addrGoto); if( bCache ){ sqlite3VdbeAddOp2(v, OP_Next, csrWrite, addrCacheNext); sqlite3VdbeJumpHere(v, addrCacheRewind); @@ -2184,30 +2179,45 @@ static void windowCodeStep( } /* Fall through */ - - VdbeModuleComment((pParse->pVdbe, "Begin windowCodeStep.FLUSH_CODE")); if( pMWin->pPartition && bCache==0 ){ addrInteger = sqlite3VdbeAddOp2(v, OP_Integer, 0, regFlushPart); sqlite3VdbeJumpHere(v, addrGosubFlush); } + VdbeModuleComment((pParse->pVdbe, "Begin windowCodeStep.FLUSH_CODE")); + addrEmpty = sqlite3VdbeAddOp1(v, OP_Rewind, csrWrite); if( pMWin->eEnd==TK_PRECEDING ){ - windowCodeOp(&s, WINDOW_AGGSTEP, csrEnd, regEnd, 1); - windowCodeOp(&s, WINDOW_RETURN_ROW, csrCurrent, 0, 1); + windowCodeOp(&s, WINDOW_AGGSTEP, csrEnd, regEnd, 0); + windowCodeOp(&s, WINDOW_RETURN_ROW, csrCurrent, 0, 0); + }else if( pMWin->eStart==TK_FOLLOWING ){ + int addrStart; + int addrBreak1; + int addrBreak2; + int addrBreak3; + windowCodeOp(&s, WINDOW_AGGSTEP, csrEnd, 0, 0); + addrStart = sqlite3VdbeCurrentAddr(v); + addrBreak1 = windowCodeOp(&s, WINDOW_RETURN_ROW, csrCurrent, regEnd, 1); + addrBreak2 = windowCodeOp(&s, WINDOW_AGGINVERSE, csrStart, regStart, 1); + sqlite3VdbeAddOp2(v, OP_Goto, 0, addrStart); + sqlite3VdbeJumpHere(v, addrBreak2); + addrStart = sqlite3VdbeCurrentAddr(v); + addrBreak3 = windowCodeOp(&s, WINDOW_RETURN_ROW, csrCurrent, 0, 1); + sqlite3VdbeAddOp2(v, OP_Goto, 0, addrStart); + sqlite3VdbeJumpHere(v, addrBreak1); + sqlite3VdbeJumpHere(v, addrBreak3); }else{ int addrBreak; - int addrStart = sqlite3VdbeCurrentAddr(v); - if( pMWin->eStart==TK_FOLLOWING ){ - addrBreak = windowCodeOp(&s, WINDOW_RETURN_ROW, csrCurrent, regEnd, 1); - windowCodeOp(&s, WINDOW_AGGINVERSE, csrStart, regStart, 1); - }else{ - addrBreak = windowCodeOp(&s, WINDOW_RETURN_ROW, csrCurrent, 0, 1); - windowCodeOp(&s, WINDOW_AGGINVERSE, csrStart, regStart, 0); - } + int addrStart; + windowCodeOp(&s, WINDOW_AGGSTEP, csrEnd, 0, 0); + addrStart = sqlite3VdbeCurrentAddr(v); + addrBreak = windowCodeOp(&s, WINDOW_RETURN_ROW, csrCurrent, 0, 1); + windowCodeOp(&s, WINDOW_AGGINVERSE, csrStart, regStart, 0); sqlite3VdbeAddOp2(v, OP_Goto, 0, addrStart); sqlite3VdbeJumpHere(v, addrBreak); } + sqlite3VdbeJumpHere(v, addrEmpty); + if( bCache && addrShortcut>0 ) sqlite3VdbeJumpHere(v, addrShortcut); sqlite3VdbeAddOp1(v, OP_ResetSorter, csrCurrent); sqlite3VdbeAddOp2(v, OP_Integer, 0, pMWin->regSize); @@ -2681,8 +2691,9 @@ void sqlite3WindowCodeStep( if( pMWin->eType==TK_ROWS && (pMWin->eStart!=TK_UNBOUNDED||pMWin->eEnd!=TK_CURRENT||!pMWin->pOrderBy) ){ - if( (pMWin->eStart!=TK_PRECEDING && pMWin->eStart!=TK_FOLLOWING) - || (pMWin->eEnd!=TK_FOLLOWING && pMWin->eEnd!=TK_PRECEDING) + int bCache = windowCachePartition(pMWin); + if( (pMWin->eEnd!=TK_FOLLOWING && pMWin->eEnd!=TK_PRECEDING) + || (pMWin->eStart!=TK_FOLLOWING && pMWin->eStart!=TK_PRECEDING) ){ VdbeModuleComment((pParse->pVdbe, "Begin RowExprStep()")); windowCodeRowExprStep(pParse, p, pWInfo, regGosub, addrGosub);