-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
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
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
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
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
-bce01d9584e52b23d7c07c2e832d5fa5d6e6235711c856b903a296725f61ed6e
\ No newline at end of file
+39225cc77579896214dceb93b7f224b4b3bc95b3505a2e19b41b0b18b184fbc4
\ No newline at end of file
** 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
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);
}
}
}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);
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;
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
}
}
+==========
+
+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
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
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
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
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
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
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
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
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
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