]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Modify new window functions function so that cursors are stepped immediately after...
authordan <dan@noemail.net>
Thu, 7 Mar 2019 19:26:17 +0000 (19:26 +0000)
committerdan <dan@noemail.net>
Thu, 7 Mar 2019 19:26:17 +0000 (19:26 +0000)
FossilOrigin-Name: 093d2b25f1b656bba57d665aac68109436861b157a5769432b612176dae3f6eb

manifest
manifest.uuid
src/window.c

index 2a46b037e71065ae38b87ea9f11fc3a072fe030a..20f066a065bdf3c269cae65dc5ddaf87aa9f9dc4 100644 (file)
--- 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
index dcc39ad3ae8167817dadf663c0ea0254d17c5b64..9b064598e11adf1f647e49bd6a06972ca19fa097 100644 (file)
@@ -1 +1 @@
-45cbd3b4498cea8856f189e9d0a192556d4f15212055b8328a1beca6083fc47a
\ No newline at end of file
+093d2b25f1b656bba57d665aac68109436861b157a5769432b612176dae3f6eb
\ No newline at end of file
index 33831f87c62c1fc8423745ae29d84b8e9cd1ac86..24f7451548636ad05834c08c11bfd5ffae91c5eb 100644 (file)
@@ -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);