]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Fix a couple of problems with "RANGE BETWEEN <expr> PRECEDING AND <expr> PRECEDING...
authordan <dan@noemail.net>
Wed, 3 Apr 2019 16:27:44 +0000 (16:27 +0000)
committerdan <dan@noemail.net>
Wed, 3 Apr 2019 16:27:44 +0000 (16:27 +0000)
FossilOrigin-Name: 39225cc77579896214dceb93b7f224b4b3bc95b3505a2e19b41b0b18b184fbc4

manifest
manifest.uuid
src/window.c
test/window1.test
test/window8.tcl
test/window8.test

index fb15c767cb68feebd0e4bf8c5c48c9ad17b4172d..dd057a6757fd17af940882ee2333c10e38ff5f20 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Small\soptimizations\sto\sthe\sgrammar\sfor\swindow\sfunctions\ssave\sabout\s120\sbytes\nof\sspace\sin\sthe\sparser\stables.
-D 2019-04-02T18:12:20.162
+C Fix\sa\scouple\sof\sproblems\swith\s"RANGE\sBETWEEN\s<expr>\sPRECEDING\sAND\s<expr>\sPRECEDING"\sframes.
+D 2019-04-03T16:27:44.377
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
 F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -607,7 +607,7 @@ F src/where.c ff2955dc2743c1af05ba5a8232ab72724d9a63b76dbee256368f40fd3ef82db5
 F src/whereInt.h 5f14db426ca46a83eabab1ae9aa6d4b8f27504ad35b64c290916289b1ddb2e88
 F src/wherecode.c 9572aab9eff42859a5f3e9b212f704521a84bf77e444217f0339d8b811e6333f
 F src/whereexpr.c 90859652920f153d2c03f075488744be2926625ebd36911bcbcb17d0d29c891c
-F src/window.c 1c3e20fc23e1c3cc0c2516626d7b0bcaf6a25d9a19ba397153363fd57bde2325
+F src/window.c 038c248267e74ff70a2bb9b1884d40fd145c5183b017823ecb6cbb14bc781478
 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2
 F test/affinity2.test a6d901b436328bd67a79b41bb0ac2663918fe3bd
 F test/affinity3.test 6a101af2fc945ce2912f6fe54dd646018551710d
@@ -1679,7 +1679,7 @@ F test/win32heap.test 10fd891266bd00af68671e702317726375e5407561d859be1aa04696f2
 F test/win32lock.test fbf107c91d8f5512be5a5b87c4c42ab9fdd54972
 F test/win32longpath.test 169c75a3b2e43481f4a62122510210c67b08f26d
 F test/win32nolock.test ac4f08811a562e45a5755e661f45ca85892bdbbc
-F test/window1.test 71bb9bfb705edff56ac592c1cf47286096558559b3fba7578e2ee5c8448e2a78
+F test/window1.test 8d453bfaa3f8f0873ba16ca1270c7368f18445065a0003a1b5954ac4e95797b4
 F test/window2.tcl 9bfa842d8a62b0d36dc8c1b5972206393c43847433c6d75940b87fec93ce3143
 F test/window2.test 8e6d2a1b9f54dfebee1cde961c8590cd87b4db45c50f44947a211e1b63c2a05e
 F test/window3.tcl acea6e86a4324a210fd608d06741010ca83ded9fde438341cb978c49928faf03
@@ -1690,8 +1690,8 @@ F test/window5.test d328dd18221217c49c144181975eea17339eaeaf0e9aa558cee3afb84652
 F test/window6.test 465e608c021020fb0948a90200e154cd787bc910449e3dafee44c9ca5bd407fe
 F test/window7.tcl 6a1210f05d40ec89c22960213a22cd3f98d4e2f2eb20646c83c8c30d4d76108f
 F test/window7.test ce7f865241fdd1c5c4db869cd7bb2986c3be836bc2e73649a6846dd920f63e0f
-F test/window8.tcl 97de3829e0e1aae2c3aaae41a55c54bc1b0751bbc80dfdd93020431b7a889dad
-F test/window8.test 0dd7e2d32605bf59dc6163b924faeff5951419c1c17a9e506e5a38606e97ab7e
+F test/window8.tcl 9e9a82ae9eea90a4a83481d641a812b974980c38f9247f3b89a6e3c8bed45518
+F test/window8.test df187dc19921f7be0ab709d531d681bd80ccaac96a913a89ecee8b272b91d43f
 F test/windowerr.tcl abf4d6d0c6d360213af98ed7d538295d905689e83692106f3ece0e3afb9d7f36
 F test/windowerr.test 675b5e6debfc9370bfacb0b91e2a93a8923512f92600b16f4ea70a1cd9b8e6e4
 F test/windowfault.test 16e906a2c4110c88372ff4bd5de59ac7397ec2f025912eff8e5677eedd126898
@@ -1815,7 +1815,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 bc0fb1c324be2fd668bc4398c7d364b7e3c5a98537fe5fb58a125b66f3e6d041
-R 31f79484d2e9bc79fcf8ee7f9041a857
-U drh
-Z 869b3f84b6baf5642194100f15e4c54e
+P bce01d9584e52b23d7c07c2e832d5fa5d6e6235711c856b903a296725f61ed6e
+R 2d8f926b545e1ca155da4ee78a88fc73
+U dan
+Z 299eef657559cfc0cc2116a950775914
index d53f759d9f1e7ea2266fa5be21b325bf1d585eb4..0e05c3917fb7914d81468eb788aa36efd4d084ee 100644 (file)
@@ -1 +1 @@
-bce01d9584e52b23d7c07c2e832d5fa5d6e6235711c856b903a296725f61ed6e
\ No newline at end of file
+39225cc77579896214dceb93b7f224b4b3bc95b3505a2e19b41b0b18b184fbc4
\ No newline at end of file
index b01ee7d9df3c605f7e4238c9ed71f8cb0f7c8d2a..4b5184d9187c35d3405e5c642743bc61841ebe37 100644 (file)
@@ -2323,19 +2323,22 @@ static int windowExprGtZero(Parse *pParse, Expr *pExpr){
 **         regEnd = <expr2>
 **         regStart = <expr1>
 **       }else{
-**         while( (csrEnd.key + regEnd) <= csrCurrent.key ){
+**         if( (csrEnd.key + regEnd) <= csrCurrent.key ){
 **           AGGSTEP
 **         }
-**         RETURN_ROW
 **         while( (csrStart.key + regStart) < csrCurrent.key ){
 **           AGGINVERSE
 **         }
+**         RETURN_ROW
 **       }
 **     }
 **     flush:
 **       while( (csrEnd.key + regEnd) <= csrCurrent.key ){
 **         AGGSTEP
 **       }
+**       while( (csrStart.key + regStart) < csrCurrent.key ){
+**         AGGINVERSE
+**       }
 **       RETURN_ROW
 **
 **   RANGE BETWEEN <expr1> FOLLOWING AND <expr2> FOLLOWING
@@ -2576,6 +2579,8 @@ void sqlite3WindowCodeStep(
   sqlite3VdbeAddOp2(v, OP_Goto, 0, lblWhereEnd);
 
   sqlite3VdbeJumpHere(v, addrNe);
+
+  /* Beginning of the block executed for the second and subsequent rows. */
   if( regPeer ){
     windowIfNewPeer(pParse, pOrderBy, regNewPeer, regPeer, lblWhereEnd);
   }
@@ -2597,9 +2602,11 @@ void sqlite3WindowCodeStep(
     }
   }else
   if( pMWin->eEnd==TK_PRECEDING ){
+    int bRPS = (pMWin->eStart==TK_PRECEDING && pMWin->eFrmType==TK_RANGE);
     windowCodeOp(&s, WINDOW_AGGSTEP, regEnd, 0);
+    if( bRPS ) windowCodeOp(&s, WINDOW_AGGINVERSE, regStart, 0);
     windowCodeOp(&s, WINDOW_RETURN_ROW, 0, 0);
-    windowCodeOp(&s, WINDOW_AGGINVERSE, regStart, 0);
+    if( !bRPS ) windowCodeOp(&s, WINDOW_AGGINVERSE, regStart, 0);
   }else{
     int addr = 0;
     windowCodeOp(&s, WINDOW_AGGSTEP, 0, 0);
@@ -2642,7 +2649,9 @@ void sqlite3WindowCodeStep(
   addrEmpty = sqlite3VdbeAddOp1(v, OP_Rewind, csrWrite);
   VdbeCoverage(v);
   if( pMWin->eEnd==TK_PRECEDING ){
+    int bRPS = (pMWin->eStart==TK_PRECEDING && pMWin->eFrmType==TK_RANGE);
     windowCodeOp(&s, WINDOW_AGGSTEP, regEnd, 0);
+    if( bRPS ) windowCodeOp(&s, WINDOW_AGGINVERSE, regStart, 0);
     windowCodeOp(&s, WINDOW_RETURN_ROW, 0, 0);
   }else if( pMWin->eStart==TK_FOLLOWING ){
     int addrStart;
index d99aebec0e67dd0fb952956b4e009c9c282ab1ad..681573896c478c0fe8f31d4123374c831ed91ca1 100644 (file)
@@ -1081,6 +1081,91 @@ do_execsql_test 27.2 {
   WINDOW win AS (ORDER BY rowid ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING)
 } {1 1 1 2 3 4}
 
+#-------------------------------------------------------------------------
+
+reset_db
+do_execsql_test 28.1.1 {
+  CREATE TABLE t1(a INTEGER PRIMARY KEY, b CHAR(1), c CHAR(2), d ANY);
+  INSERT INTO t1 VALUES (3, 'C', 'cc', 1.0);
+  INSERT INTO t1 VALUES (13,'M', 'cc', NULL);
+}
+
+do_execsql_test 28.1.2 {
+  SELECT group_concat(b,'') OVER w1 FROM t1
+    WINDOW w1 AS (ORDER BY a RANGE BETWEEN 3 PRECEDING AND 1 PRECEDING)
+} {
+  {} {}
+}
+
+do_execsql_test 28.2.1 {
+  CREATE TABLE t2(a TEXT, b INTEGER);
+  INSERT INTO t2 VALUES('A', NULL);
+  INSERT INTO t2 VALUES('B', NULL);
+}
+
+do_execsql_test 28.2.1 {
+  DROP TABLE IF EXISTS t1;
+  CREATE TABLE t1(a INTEGER PRIMARY KEY, b CHAR(1), c CHAR(2), d ANY);
+  INSERT INTO t1 VALUES
+    (10,'J', 'cc', NULL),
+    (11,'K', 'cc', 'xyz'),
+    (13,'M', 'cc', NULL);
+}
+
+do_execsql_test 28.2.2 {
+  SELECT a, b, c, quote(d), group_concat(b,'') OVER w1, '|' FROM t1
+    WINDOW w1 AS
+    (ORDER BY d DESC RANGE BETWEEN 7.0 PRECEDING AND 2.5 PRECEDING)
+    ORDER BY c, d, a;
+} {
+  10 J cc NULL JM |
+  13 M cc NULL JM | 
+  11 K cc 'xyz' K |
+}
+
+#-------------------------------------------------------------------------
+reset_db
+
+do_execsql_test 29.1 {
+  DROP TABLE IF EXISTS t1;
+  CREATE TABLE t1(a INTEGER PRIMARY KEY, b CHAR(1), c CHAR(2), d ANY);
+  INSERT INTO t1 VALUES
+    (1, 'A', 'aa', 2.5),
+    (2, 'B', 'bb', 3.75),
+    (3, 'C', 'cc', 1.0),
+    (4, 'D', 'cc', 8.25),
+    (5, 'E', 'bb', 6.5),
+    (6, 'F', 'aa', 6.5),
+    (7, 'G', 'aa', 6.0),
+    (8, 'H', 'bb', 9.0),
+    (9, 'I', 'aa', 3.75),
+    (10,'J', 'cc', NULL),
+    (11,'K', 'cc', 'xyz'),
+    (12,'L', 'cc', 'xyZ'),
+    (13,'M', 'cc', NULL);
+}
+
+do_execsql_test 29.2 {
+  SELECT a, b, c, quote(d), group_concat(b,'') OVER w1, '|' FROM t1
+    WINDOW w1 AS
+    (PARTITION BY c ORDER BY d DESC
+     RANGE BETWEEN 7.0 PRECEDING AND 2.5 PRECEDING)
+    ORDER BY c, d, a;
+} {
+  1 A aa 2.5 FG | 
+  9 I aa 3.75 F | 
+  7 G aa 6 {} | 
+  6 F aa 6.5 {} | 
+  2 B bb 3.75 HE |
+  5 E bb 6.5 H | 
+  8 H bb 9 {} | 
+  10 J cc NULL JM | 
+  13 M cc NULL JM | 
+  3 C cc 1 {} | 
+  4 D cc 8.25 {} | 
+  12 L cc 'xyZ' L | 
+  11 K cc 'xyz' K |
+}
 
 finish_test
 
index 234f0f00323259f2db53cd8b2fa62a574b3e772b..df1fd78ab78b8994788ae2289d21be1671edf28e 100644 (file)
@@ -269,6 +269,31 @@ foreach {tn ex} {
   }
 }
 
+==========
+
+execsql_test 6.0 {
+  DROP TABLE IF EXISTS t2;
+  CREATE TABLE t2(a TEXT, b INTEGER);
+  INSERT INTO t2 VALUES('A', NULL);
+  INSERT INTO t2 VALUES('B', NULL);
+  INSERT INTO t2 VALUES('C', 1);
+}
+
+execsql_test 6.1 {
+  SELECT string_agg(a, '.') OVER (
+    ORDER BY b NULLS FIRST RANGE BETWEEN 7 PRECEDING AND 2 PRECEDING
+  )
+  FROM t2
+}
+
+execsql_test 6.2 {
+  SELECT string_agg(a, '.') OVER (
+    ORDER BY b DESC NULLS LAST RANGE BETWEEN 7 PRECEDING AND 2 PRECEDING
+  )
+  FROM t2
+}
+
+
 finish_test
 
 
index d204d5b77192afbcde5f74b38bdc466ef83696ce..829bd0b252b53de8b67f75aed75a53d88f1aae0c 100644 (file)
@@ -3841,7 +3841,7 @@ do_execsql_test 5.1.7.1 {
              count(a) OVER win
       FROM t3
       WINDOW win AS (  ORDER BY c , b , a 
-        ROWS BETWEEN 6 PRECEDING AND UNBOUNDED FOLLOWING  EXCLUDE NO OTHERS  )
+        ROWS BETWEEN 6 PRECEDING AND UNBOUNDED FOLLOWING   EXCLUDE NO OTHERS  )
       ORDER BY 1 , 2 , 3
 } {979 102 83   979 102 83   979 102 83   979 102 83   979 102 83   979 102 83
   979 102 83   979 113 81   979 113 82   979 133 80   979 148 79   979 158 77
@@ -3865,7 +3865,7 @@ do_execsql_test 5.1.7.2 {
              dense_rank() OVER win
       FROM t3
       WINDOW win AS (  ORDER BY c , b , a 
-        ROWS BETWEEN 6 PRECEDING AND UNBOUNDED FOLLOWING  EXCLUDE NO OTHERS  )
+        ROWS BETWEEN 6 PRECEDING AND UNBOUNDED FOLLOWING   EXCLUDE NO OTHERS  )
       ORDER BY 1 , 2 , 3
 } {3830 89 89   4741 88 88   5640 84 84   5640 85 85   5640 86 86   5640 87 87
   6485 81 81   6485 82 82   6485 83 83   7324 80 80   8163 78 78   8163 79 79
@@ -4166,7 +4166,7 @@ do_execsql_test 5.2.7.1 {
              count(a) OVER win
       FROM t3
       WINDOW win AS (  ORDER BY c , b , a 
-        ROWS BETWEEN 6 PRECEDING AND UNBOUNDED FOLLOWING  EXCLUDE CURRENT ROW  )
+        ROWS BETWEEN 6 PRECEDING AND UNBOUNDED FOLLOWING   EXCLUDE CURRENT ROW  )
       ORDER BY 1 , 2 , 3
 } {963 929 6   979 102 82   979 102 82   979 102 82   979 102 82   979 102 82
   979 102 83   979 113 80   979 113 81   979 113 82   979 133 79   979 148 78
@@ -4190,7 +4190,7 @@ do_execsql_test 5.2.7.2 {
              dense_rank() OVER win
       FROM t3
       WINDOW win AS (  ORDER BY c , b , a 
-        ROWS BETWEEN 6 PRECEDING AND UNBOUNDED FOLLOWING  EXCLUDE CURRENT ROW  )
+        ROWS BETWEEN 6 PRECEDING AND UNBOUNDED FOLLOWING   EXCLUDE CURRENT ROW  )
       ORDER BY 1 , 2 , 3
 } {2851 89 89   3778 88 88   4681 87 87   5556 83 83   5574 82 82   5586 81 81
   5640 84 84   5640 85 85   5640 86 86   7324 80 80   8123 77 77   8129 73 73
@@ -4481,7 +4481,7 @@ do_execsql_test 5.3.7.1 {
              count(a) OVER win
       FROM t3
       WINDOW win AS (  ORDER BY c , b , a 
-        ROWS BETWEEN 6 PRECEDING AND UNBOUNDED FOLLOWING  EXCLUDE GROUP  )
+        ROWS BETWEEN 6 PRECEDING AND UNBOUNDED FOLLOWING   EXCLUDE GROUP  )
       ORDER BY 1 , 2 , 3
 } {963 929 6   979 102 82   979 102 82   979 102 82   979 102 82   979 102 82
   979 102 83   979 113 80   979 113 81   979 113 82   979 133 79   979 148 78
@@ -4505,7 +4505,7 @@ do_execsql_test 5.3.7.2 {
              dense_rank() OVER win
       FROM t3
       WINDOW win AS (  ORDER BY c , b , a 
-        ROWS BETWEEN 6 PRECEDING AND UNBOUNDED FOLLOWING  EXCLUDE GROUP  )
+        ROWS BETWEEN 6 PRECEDING AND UNBOUNDED FOLLOWING   EXCLUDE GROUP  )
       ORDER BY 1 , 2 , 3
 } {2851 89 89   3778 88 88   4681 87 87   5556 83 83   5574 82 82   5586 81 81
   5640 84 84   5640 85 85   5640 86 86   7324 80 80   8123 77 77   8129 73 73
@@ -4804,7 +4804,7 @@ do_execsql_test 5.4.7.1 {
              count(a) OVER win
       FROM t3
       WINDOW win AS (  ORDER BY c , b , a 
-        ROWS BETWEEN 6 PRECEDING AND UNBOUNDED FOLLOWING  EXCLUDE TIES  )
+        ROWS BETWEEN 6 PRECEDING AND UNBOUNDED FOLLOWING   EXCLUDE TIES  )
       ORDER BY 1 , 2 , 3
 } {979 102 83   979 102 83   979 102 83   979 102 83   979 102 83   979 102 83
   979 102 83   979 113 81   979 113 82   979 133 80   979 148 79   979 158 77
@@ -4828,7 +4828,7 @@ do_execsql_test 5.4.7.2 {
              dense_rank() OVER win
       FROM t3
       WINDOW win AS (  ORDER BY c , b , a 
-        ROWS BETWEEN 6 PRECEDING AND UNBOUNDED FOLLOWING  EXCLUDE TIES  )
+        ROWS BETWEEN 6 PRECEDING AND UNBOUNDED FOLLOWING   EXCLUDE TIES  )
       ORDER BY 1 , 2 , 3
 } {3830 89 89   4741 88 88   5640 84 84   5640 85 85   5640 86 86   5640 87 87
   6485 81 81   6485 82 82   6485 83 83   7324 80 80   8163 78 78   8163 79 79
@@ -4848,4 +4848,28 @@ do_execsql_test 5.4.7.2 {
   22796 16 16   22929 10 10   23042 9 9   23155 1 1   23155 2 2   23155 3 3
   23155 4 4   23155 5 5   23155 6 6   23155 7 7   23155 8 8}
 
+#==========================================================================
+
+do_execsql_test 6.0 {
+  DROP TABLE IF EXISTS t2;
+  CREATE TABLE t2(a TEXT, b INTEGER);
+  INSERT INTO t2 VALUES('A', NULL);
+  INSERT INTO t2 VALUES('B', NULL);
+  INSERT INTO t2 VALUES('C', 1);
+} {}
+
+do_execsql_test 6.1 {
+  SELECT group_concat(a, '.') OVER (
+    ORDER BY b  RANGE BETWEEN 7 PRECEDING AND 2 PRECEDING
+  )
+  FROM t2
+} {A.B   A.B   {}}
+
+do_execsql_test 6.2 {
+  SELECT group_concat(a, '.') OVER (
+    ORDER BY b DESC  RANGE BETWEEN 7 PRECEDING AND 2 PRECEDING
+  )
+  FROM t2
+} {{}   A.B   A.B}
+
 finish_test