1
0
mirror of https://github.com/sqlite/sqlite.git synced 2025-08-08 14:02:16 +03:00

Fix a couple of problems with "RANGE BETWEEN <expr> PRECEDING AND <expr> PRECEDING" frames.

FossilOrigin-Name: 39225cc77579896214dceb93b7f224b4b3bc95b3505a2e19b41b0b18b184fbc4
This commit is contained in:
dan
2019-04-03 16:27:44 +00:00
parent 0f134f0267
commit 3f49c321e8
6 changed files with 165 additions and 22 deletions

View File

@@ -1,5 +1,5 @@
C Small\soptimizations\sto\sthe\sgrammar\sfor\swindow\sfunctions\ssave\sabout\s120\sbytes\nof\sspace\sin\sthe\sparser\stables. C Fix\sa\scouple\sof\sproblems\swith\s"RANGE\sBETWEEN\s<expr>\sPRECEDING\sAND\s<expr>\sPRECEDING"\sframes.
D 2019-04-02T18:12:20.162 D 2019-04-03T16:27:44.377
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -607,7 +607,7 @@ F src/where.c ff2955dc2743c1af05ba5a8232ab72724d9a63b76dbee256368f40fd3ef82db5
F src/whereInt.h 5f14db426ca46a83eabab1ae9aa6d4b8f27504ad35b64c290916289b1ddb2e88 F src/whereInt.h 5f14db426ca46a83eabab1ae9aa6d4b8f27504ad35b64c290916289b1ddb2e88
F src/wherecode.c 9572aab9eff42859a5f3e9b212f704521a84bf77e444217f0339d8b811e6333f F src/wherecode.c 9572aab9eff42859a5f3e9b212f704521a84bf77e444217f0339d8b811e6333f
F src/whereexpr.c 90859652920f153d2c03f075488744be2926625ebd36911bcbcb17d0d29c891c F src/whereexpr.c 90859652920f153d2c03f075488744be2926625ebd36911bcbcb17d0d29c891c
F src/window.c 1c3e20fc23e1c3cc0c2516626d7b0bcaf6a25d9a19ba397153363fd57bde2325 F src/window.c 038c248267e74ff70a2bb9b1884d40fd145c5183b017823ecb6cbb14bc781478
F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2
F test/affinity2.test a6d901b436328bd67a79b41bb0ac2663918fe3bd F test/affinity2.test a6d901b436328bd67a79b41bb0ac2663918fe3bd
F test/affinity3.test 6a101af2fc945ce2912f6fe54dd646018551710d F test/affinity3.test 6a101af2fc945ce2912f6fe54dd646018551710d
@@ -1679,7 +1679,7 @@ F test/win32heap.test 10fd891266bd00af68671e702317726375e5407561d859be1aa04696f2
F test/win32lock.test fbf107c91d8f5512be5a5b87c4c42ab9fdd54972 F test/win32lock.test fbf107c91d8f5512be5a5b87c4c42ab9fdd54972
F test/win32longpath.test 169c75a3b2e43481f4a62122510210c67b08f26d F test/win32longpath.test 169c75a3b2e43481f4a62122510210c67b08f26d
F test/win32nolock.test ac4f08811a562e45a5755e661f45ca85892bdbbc F test/win32nolock.test ac4f08811a562e45a5755e661f45ca85892bdbbc
F test/window1.test 71bb9bfb705edff56ac592c1cf47286096558559b3fba7578e2ee5c8448e2a78 F test/window1.test 8d453bfaa3f8f0873ba16ca1270c7368f18445065a0003a1b5954ac4e95797b4
F test/window2.tcl 9bfa842d8a62b0d36dc8c1b5972206393c43847433c6d75940b87fec93ce3143 F test/window2.tcl 9bfa842d8a62b0d36dc8c1b5972206393c43847433c6d75940b87fec93ce3143
F test/window2.test 8e6d2a1b9f54dfebee1cde961c8590cd87b4db45c50f44947a211e1b63c2a05e F test/window2.test 8e6d2a1b9f54dfebee1cde961c8590cd87b4db45c50f44947a211e1b63c2a05e
F test/window3.tcl acea6e86a4324a210fd608d06741010ca83ded9fde438341cb978c49928faf03 F test/window3.tcl acea6e86a4324a210fd608d06741010ca83ded9fde438341cb978c49928faf03
@@ -1690,8 +1690,8 @@ F test/window5.test d328dd18221217c49c144181975eea17339eaeaf0e9aa558cee3afb84652
F test/window6.test 465e608c021020fb0948a90200e154cd787bc910449e3dafee44c9ca5bd407fe F test/window6.test 465e608c021020fb0948a90200e154cd787bc910449e3dafee44c9ca5bd407fe
F test/window7.tcl 6a1210f05d40ec89c22960213a22cd3f98d4e2f2eb20646c83c8c30d4d76108f F test/window7.tcl 6a1210f05d40ec89c22960213a22cd3f98d4e2f2eb20646c83c8c30d4d76108f
F test/window7.test ce7f865241fdd1c5c4db869cd7bb2986c3be836bc2e73649a6846dd920f63e0f F test/window7.test ce7f865241fdd1c5c4db869cd7bb2986c3be836bc2e73649a6846dd920f63e0f
F test/window8.tcl 97de3829e0e1aae2c3aaae41a55c54bc1b0751bbc80dfdd93020431b7a889dad F test/window8.tcl 9e9a82ae9eea90a4a83481d641a812b974980c38f9247f3b89a6e3c8bed45518
F test/window8.test 0dd7e2d32605bf59dc6163b924faeff5951419c1c17a9e506e5a38606e97ab7e F test/window8.test df187dc19921f7be0ab709d531d681bd80ccaac96a913a89ecee8b272b91d43f
F test/windowerr.tcl abf4d6d0c6d360213af98ed7d538295d905689e83692106f3ece0e3afb9d7f36 F test/windowerr.tcl abf4d6d0c6d360213af98ed7d538295d905689e83692106f3ece0e3afb9d7f36
F test/windowerr.test 675b5e6debfc9370bfacb0b91e2a93a8923512f92600b16f4ea70a1cd9b8e6e4 F test/windowerr.test 675b5e6debfc9370bfacb0b91e2a93a8923512f92600b16f4ea70a1cd9b8e6e4
F test/windowfault.test 16e906a2c4110c88372ff4bd5de59ac7397ec2f025912eff8e5677eedd126898 F test/windowfault.test 16e906a2c4110c88372ff4bd5de59ac7397ec2f025912eff8e5677eedd126898
@@ -1815,7 +1815,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
P bc0fb1c324be2fd668bc4398c7d364b7e3c5a98537fe5fb58a125b66f3e6d041 P bce01d9584e52b23d7c07c2e832d5fa5d6e6235711c856b903a296725f61ed6e
R 31f79484d2e9bc79fcf8ee7f9041a857 R 2d8f926b545e1ca155da4ee78a88fc73
U drh U dan
Z 869b3f84b6baf5642194100f15e4c54e Z 299eef657559cfc0cc2116a950775914

View File

@@ -1 +1 @@
bce01d9584e52b23d7c07c2e832d5fa5d6e6235711c856b903a296725f61ed6e 39225cc77579896214dceb93b7f224b4b3bc95b3505a2e19b41b0b18b184fbc4

View File

@@ -2323,19 +2323,22 @@ static int windowExprGtZero(Parse *pParse, Expr *pExpr){
** regEnd = <expr2> ** regEnd = <expr2>
** regStart = <expr1> ** regStart = <expr1>
** }else{ ** }else{
** while( (csrEnd.key + regEnd) <= csrCurrent.key ){ ** if( (csrEnd.key + regEnd) <= csrCurrent.key ){
** AGGSTEP ** AGGSTEP
** } ** }
** RETURN_ROW
** while( (csrStart.key + regStart) < csrCurrent.key ){ ** while( (csrStart.key + regStart) < csrCurrent.key ){
** AGGINVERSE ** AGGINVERSE
** } ** }
** RETURN_ROW
** } ** }
** } ** }
** flush: ** flush:
** while( (csrEnd.key + regEnd) <= csrCurrent.key ){ ** while( (csrEnd.key + regEnd) <= csrCurrent.key ){
** AGGSTEP ** AGGSTEP
** } ** }
** while( (csrStart.key + regStart) < csrCurrent.key ){
** AGGINVERSE
** }
** RETURN_ROW ** RETURN_ROW
** **
** RANGE BETWEEN <expr1> FOLLOWING AND <expr2> FOLLOWING ** RANGE BETWEEN <expr1> FOLLOWING AND <expr2> FOLLOWING
@@ -2576,6 +2579,8 @@ void sqlite3WindowCodeStep(
sqlite3VdbeAddOp2(v, OP_Goto, 0, lblWhereEnd); sqlite3VdbeAddOp2(v, OP_Goto, 0, lblWhereEnd);
sqlite3VdbeJumpHere(v, addrNe); sqlite3VdbeJumpHere(v, addrNe);
/* Beginning of the block executed for the second and subsequent rows. */
if( regPeer ){ if( regPeer ){
windowIfNewPeer(pParse, pOrderBy, regNewPeer, regPeer, lblWhereEnd); windowIfNewPeer(pParse, pOrderBy, regNewPeer, regPeer, lblWhereEnd);
} }
@@ -2597,9 +2602,11 @@ void sqlite3WindowCodeStep(
} }
}else }else
if( pMWin->eEnd==TK_PRECEDING ){ if( pMWin->eEnd==TK_PRECEDING ){
int bRPS = (pMWin->eStart==TK_PRECEDING && pMWin->eFrmType==TK_RANGE);
windowCodeOp(&s, WINDOW_AGGSTEP, regEnd, 0); windowCodeOp(&s, WINDOW_AGGSTEP, regEnd, 0);
if( bRPS ) windowCodeOp(&s, WINDOW_AGGINVERSE, regStart, 0);
windowCodeOp(&s, WINDOW_RETURN_ROW, 0, 0); windowCodeOp(&s, WINDOW_RETURN_ROW, 0, 0);
windowCodeOp(&s, WINDOW_AGGINVERSE, regStart, 0); if( !bRPS ) windowCodeOp(&s, WINDOW_AGGINVERSE, regStart, 0);
}else{ }else{
int addr = 0; int addr = 0;
windowCodeOp(&s, WINDOW_AGGSTEP, 0, 0); windowCodeOp(&s, WINDOW_AGGSTEP, 0, 0);
@@ -2642,7 +2649,9 @@ void sqlite3WindowCodeStep(
addrEmpty = sqlite3VdbeAddOp1(v, OP_Rewind, csrWrite); addrEmpty = sqlite3VdbeAddOp1(v, OP_Rewind, csrWrite);
VdbeCoverage(v); VdbeCoverage(v);
if( pMWin->eEnd==TK_PRECEDING ){ if( pMWin->eEnd==TK_PRECEDING ){
int bRPS = (pMWin->eStart==TK_PRECEDING && pMWin->eFrmType==TK_RANGE);
windowCodeOp(&s, WINDOW_AGGSTEP, regEnd, 0); windowCodeOp(&s, WINDOW_AGGSTEP, regEnd, 0);
if( bRPS ) windowCodeOp(&s, WINDOW_AGGINVERSE, regStart, 0);
windowCodeOp(&s, WINDOW_RETURN_ROW, 0, 0); windowCodeOp(&s, WINDOW_RETURN_ROW, 0, 0);
}else if( pMWin->eStart==TK_FOLLOWING ){ }else if( pMWin->eStart==TK_FOLLOWING ){
int addrStart; int addrStart;

View File

@@ -1081,6 +1081,91 @@ do_execsql_test 27.2 {
WINDOW win AS (ORDER BY rowid ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) WINDOW win AS (ORDER BY rowid ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING)
} {1 1 1 2 3 4} } {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 finish_test

View 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 finish_test

View File

@@ -3841,7 +3841,7 @@ do_execsql_test 5.1.7.1 {
count(a) OVER win count(a) OVER win
FROM t3 FROM t3
WINDOW win AS ( ORDER BY c , b , a 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 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 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 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 dense_rank() OVER win
FROM t3 FROM t3
WINDOW win AS ( ORDER BY c , b , a 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 ORDER BY 1 , 2 , 3
} {3830 89 89 4741 88 88 5640 84 84 5640 85 85 5640 86 86 5640 87 87 } {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 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 count(a) OVER win
FROM t3 FROM t3
WINDOW win AS ( ORDER BY c , b , a 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 ORDER BY 1 , 2 , 3
} {963 929 6 979 102 82 979 102 82 979 102 82 979 102 82 979 102 82 } {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 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 dense_rank() OVER win
FROM t3 FROM t3
WINDOW win AS ( ORDER BY c , b , a 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 ORDER BY 1 , 2 , 3
} {2851 89 89 3778 88 88 4681 87 87 5556 83 83 5574 82 82 5586 81 81 } {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 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 count(a) OVER win
FROM t3 FROM t3
WINDOW win AS ( ORDER BY c , b , a 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 ORDER BY 1 , 2 , 3
} {963 929 6 979 102 82 979 102 82 979 102 82 979 102 82 979 102 82 } {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 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 dense_rank() OVER win
FROM t3 FROM t3
WINDOW win AS ( ORDER BY c , b , a 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 ORDER BY 1 , 2 , 3
} {2851 89 89 3778 88 88 4681 87 87 5556 83 83 5574 82 82 5586 81 81 } {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 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 count(a) OVER win
FROM t3 FROM t3
WINDOW win AS ( ORDER BY c , b , a 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 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 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 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 dense_rank() OVER win
FROM t3 FROM t3
WINDOW win AS ( ORDER BY c , b , a 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 ORDER BY 1 , 2 , 3
} {3830 89 89 4741 88 88 5640 84 84 5640 85 85 5640 86 86 5640 87 87 } {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 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 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} 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 finish_test