mirror of
https://github.com/sqlite/sqlite.git
synced 2025-08-07 02:42:48 +03:00
Fix problems with "RANGE ... ORDER BY <expr> DESC" window frames.
FossilOrigin-Name: e7bced731aa071c95bc398cdecd53c939841bf0c52fbcd06e47ba68f8c5cc35a
This commit is contained in:
16
manifest
16
manifest
@@ -1,5 +1,5 @@
|
|||||||
C Add\ssupport\sfor\sRANGE\swindow\sframes.\sSome\scases\sstill\sdo\snot\swork.
|
C Fix\sproblems\swith\s"RANGE\s...\sORDER\sBY\s<expr>\sDESC"\swindow\sframes.
|
||||||
D 2019-03-09T20:49:17.662
|
D 2019-03-11T11:12:34.831
|
||||||
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 Makefile.in 236d2739dc3e823c3c909bca2d6cef93009bafbefd7018a8f3281074ecb92954
|
F Makefile.in 236d2739dc3e823c3c909bca2d6cef93009bafbefd7018a8f3281074ecb92954
|
||||||
@@ -604,7 +604,7 @@ F src/where.c 8a207cb2ca6b99e1edb1e4bbff9b0504385a759cbf66180d1deb34d80ca4b799
|
|||||||
F src/whereInt.h 5f14db426ca46a83eabab1ae9aa6d4b8f27504ad35b64c290916289b1ddb2e88
|
F src/whereInt.h 5f14db426ca46a83eabab1ae9aa6d4b8f27504ad35b64c290916289b1ddb2e88
|
||||||
F src/wherecode.c ce7b21e1be2b981d62683fc59c4ca73a04a7ff2f1ebec23d41baf2da2349afd6
|
F src/wherecode.c ce7b21e1be2b981d62683fc59c4ca73a04a7ff2f1ebec23d41baf2da2349afd6
|
||||||
F src/whereexpr.c 36b47f7261d6b6f1a72d774c113b74beddf6745aba1018e64b196e29db233442
|
F src/whereexpr.c 36b47f7261d6b6f1a72d774c113b74beddf6745aba1018e64b196e29db233442
|
||||||
F src/window.c bbdf43afee5bb4178170baae8111d68dd4d6499610028d49c86979a377ac365c
|
F src/window.c 199efb1a0185fe887f4b14edeff903333be3152dfa7701a98c790b44360b376a
|
||||||
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
|
||||||
@@ -1687,8 +1687,8 @@ F test/window5.test d328dd18221217c49c144181975eea17339eaeaf0e9aa558cee3afb84652
|
|||||||
F test/window6.test 604890f2b0f976339e6a1774cd90d48840e57a54b4f21a8b4b3047aa2c9787d1
|
F test/window6.test 604890f2b0f976339e6a1774cd90d48840e57a54b4f21a8b4b3047aa2c9787d1
|
||||||
F test/window7.tcl 6a1210f05d40ec89c22960213a22cd3f98d4e2f2eb20646c83c8c30d4d76108f
|
F test/window7.tcl 6a1210f05d40ec89c22960213a22cd3f98d4e2f2eb20646c83c8c30d4d76108f
|
||||||
F test/window7.test ce7f865241fdd1c5c4db869cd7bb2986c3be836bc2e73649a6846dd920f63e0f
|
F test/window7.test ce7f865241fdd1c5c4db869cd7bb2986c3be836bc2e73649a6846dd920f63e0f
|
||||||
F test/window8.tcl ec44b7ae3add64907950293a02bd1371ead3b8623b16b79076d8adce83b48771
|
F test/window8.tcl d296629022e098c9860933fa1ed61e698b60a7b0d50cf3ea77e9949b87012adc
|
||||||
F test/window8.test 54a2c5baa388a4db35607de34a9dcce5a441a8d43bfae159ff067b765793f943
|
F test/window8.test 5bf663c76a9056235ae864f071d97056c7391f8b1dd18b184d4ea907951eaf08
|
||||||
F test/windowerr.tcl 4f0b111cdbb8de401a8135cd116604fb8add13042bb47a1f1496dd47a690e864
|
F test/windowerr.tcl 4f0b111cdbb8de401a8135cd116604fb8add13042bb47a1f1496dd47a690e864
|
||||||
F test/windowerr.test 461bc504d4af0ae16a081e0c3bdb3724356cdcfb07bdc4b1b2dc4ad91b69bb7e
|
F test/windowerr.test 461bc504d4af0ae16a081e0c3bdb3724356cdcfb07bdc4b1b2dc4ad91b69bb7e
|
||||||
F test/windowfault.test 12ceb6bbb355d13e8fcd88c5731a57256dfdf77b9a7ae20842a76fcd4623df5b
|
F test/windowfault.test 12ceb6bbb355d13e8fcd88c5731a57256dfdf77b9a7ae20842a76fcd4623df5b
|
||||||
@@ -1812,7 +1812,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 53ea550ce759ae4683bcf0ae3af655bfe04f85db70f74edee6bcab56d83bb041
|
P ffc32b246d92d53c66094afe11950b53ffab6a1c230c602eebbfedafb2eb57f4
|
||||||
R 0f4fd4c61f7bf03ea8cd9c353e6d8bba
|
R 27103c6d5c4ac21fa5559af86898ca9a
|
||||||
U dan
|
U dan
|
||||||
Z a0f8d74a60721d288c2aa9343e8b2a5a
|
Z cff247c86123ad16f7fa6838517cb329
|
||||||
|
@@ -1 +1 @@
|
|||||||
ffc32b246d92d53c66094afe11950b53ffab6a1c230c602eebbfedafb2eb57f4
|
e7bced731aa071c95bc398cdecd53c939841bf0c52fbcd06e47ba68f8c5cc35a
|
17
src/window.c
17
src/window.c
@@ -1559,17 +1559,28 @@ static void windowCodeRangeTest(
|
|||||||
Vdbe *v = sqlite3GetVdbe(pParse);
|
Vdbe *v = sqlite3GetVdbe(pParse);
|
||||||
int reg1 = sqlite3GetTempReg(pParse);
|
int reg1 = sqlite3GetTempReg(pParse);
|
||||||
int reg2 = sqlite3GetTempReg(pParse);
|
int reg2 = sqlite3GetTempReg(pParse);
|
||||||
|
int arith = OP_Add;
|
||||||
|
|
||||||
|
assert( op==OP_Ge || op==OP_Gt || op==OP_Le );
|
||||||
|
assert( p->pMWin->pOrderBy && p->pMWin->pOrderBy->nExpr==1 );
|
||||||
|
if( p->pMWin->pOrderBy->a[0].sortOrder ){
|
||||||
|
switch( op ){
|
||||||
|
case OP_Ge: op = OP_Le; break;
|
||||||
|
case OP_Gt: op = OP_Lt; break;
|
||||||
|
default: assert( op==OP_Le ); op = OP_Ge; break;
|
||||||
|
}
|
||||||
|
arith = OP_Subtract;
|
||||||
|
}
|
||||||
|
|
||||||
windowReadPeerValues(p, csr1, reg1);
|
windowReadPeerValues(p, csr1, reg1);
|
||||||
windowReadPeerValues(p, csr2, reg2);
|
windowReadPeerValues(p, csr2, reg2);
|
||||||
sqlite3VdbeAddOp3(v, OP_Add, reg1, regVal, reg1);
|
sqlite3VdbeAddOp3(v, arith, regVal, reg1, reg1);
|
||||||
sqlite3VdbeAddOp3(v, op, reg2, lbl, reg1);
|
sqlite3VdbeAddOp3(v, op, reg2, lbl, reg1);
|
||||||
sqlite3VdbeAddOp2(v, OP_Rowid, csr1, reg1);
|
sqlite3VdbeAddOp2(v, OP_Rowid, csr1, reg1);
|
||||||
sqlite3VdbeAddOp2(v, OP_Rowid, csr2, reg2);
|
sqlite3VdbeAddOp2(v, OP_Rowid, csr2, reg2);
|
||||||
sqlite3VdbeAddOp3(v, OP_Gt, reg2, lbl, reg1);
|
sqlite3VdbeAddOp3(v, OP_Gt, reg2, lbl, reg1);
|
||||||
sqlite3ReleaseTempReg(pParse, reg1);
|
sqlite3ReleaseTempReg(pParse, reg1);
|
||||||
sqlite3ReleaseTempReg(pParse, reg2);
|
sqlite3ReleaseTempReg(pParse, reg2);
|
||||||
|
|
||||||
assert( op==OP_Ge || op==OP_Gt || op==OP_Lt || op==OP_Le );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int windowCodeOp(
|
static int windowCodeOp(
|
||||||
|
@@ -95,13 +95,17 @@ execsql_test 2.0 {
|
|||||||
DROP TABLE IF EXISTS t1;
|
DROP TABLE IF EXISTS t1;
|
||||||
CREATE TABLE t1(a INTEGER, b INTEGER);
|
CREATE TABLE t1(a INTEGER, b INTEGER);
|
||||||
INSERT INTO t1 VALUES
|
INSERT INTO t1 VALUES
|
||||||
(13, 26), (15, 30);
|
(5, 10), (10, 20), (13, 26), (13, 26),
|
||||||
|
(15, 30), (20, 40), (22,80), (30, 90);
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach {tn frame} {
|
foreach {tn frame} {
|
||||||
1 { ORDER BY a RANGE BETWEEN 5 PRECEDING AND 5 FOLLOWING }
|
1 { ORDER BY a RANGE BETWEEN 5 PRECEDING AND 5 FOLLOWING }
|
||||||
2 { ORDER BY a RANGE BETWEEN 10 PRECEDING AND 5 PRECEDING }
|
2 { ORDER BY a RANGE BETWEEN 10 PRECEDING AND 5 PRECEDING }
|
||||||
3 { ORDER BY a RANGE BETWEEN 2 FOLLOWING AND 3 FOLLOWING }
|
3 { ORDER BY a RANGE BETWEEN 2 FOLLOWING AND 3 FOLLOWING }
|
||||||
|
4 { ORDER BY a DESC RANGE BETWEEN 5 PRECEDING AND 5 FOLLOWING }
|
||||||
|
5 { ORDER BY a DESC RANGE BETWEEN 10 PRECEDING AND 5 PRECEDING }
|
||||||
|
6 { ORDER BY a DESC RANGE BETWEEN 2 FOLLOWING AND 3 FOLLOWING }
|
||||||
} {
|
} {
|
||||||
execsql_test 2.$tn "SELECT a, sum(b) OVER win FROM t1 WINDOW win AS ($frame)"
|
execsql_test 2.$tn "SELECT a, sum(b) OVER win FROM t1 WINDOW win AS ($frame)"
|
||||||
}
|
}
|
||||||
|
@@ -439,19 +439,32 @@ do_execsql_test 2.0 {
|
|||||||
DROP TABLE IF EXISTS t1;
|
DROP TABLE IF EXISTS t1;
|
||||||
CREATE TABLE t1(a INTEGER, b INTEGER);
|
CREATE TABLE t1(a INTEGER, b INTEGER);
|
||||||
INSERT INTO t1 VALUES
|
INSERT INTO t1 VALUES
|
||||||
(13, 26), (15, 30);
|
(5, 10), (10, 20), (13, 26), (13, 26),
|
||||||
|
(15, 30), (20, 40), (22,80), (30, 90);
|
||||||
} {}
|
} {}
|
||||||
|
|
||||||
do_execsql_test 2.1 {
|
do_execsql_test 2.1 {
|
||||||
SELECT a, sum(b) OVER win FROM t1 WINDOW win AS ( ORDER BY a RANGE BETWEEN 5 PRECEDING AND 5 FOLLOWING )
|
SELECT a, sum(b) OVER win FROM t1 WINDOW win AS ( ORDER BY a RANGE BETWEEN 5 PRECEDING AND 5 FOLLOWING )
|
||||||
} {13 56 15 56}
|
} {5 30 10 112 13 102 13 102 15 142 20 150 22 120 30 90}
|
||||||
|
|
||||||
do_execsql_test 2.2 {
|
do_execsql_test 2.2 {
|
||||||
SELECT a, sum(b) OVER win FROM t1 WINDOW win AS ( ORDER BY a RANGE BETWEEN 10 PRECEDING AND 5 PRECEDING )
|
SELECT a, sum(b) OVER win FROM t1 WINDOW win AS ( ORDER BY a RANGE BETWEEN 10 PRECEDING AND 5 PRECEDING )
|
||||||
} {13 {} 15 {}}
|
} {5 {} 10 10 13 10 13 10 15 30 20 102 22 82 30 120}
|
||||||
|
|
||||||
do_execsql_test 2.3 {
|
do_execsql_test 2.3 {
|
||||||
SELECT a, sum(b) OVER win FROM t1 WINDOW win AS ( ORDER BY a RANGE BETWEEN 2 FOLLOWING AND 3 FOLLOWING )
|
SELECT a, sum(b) OVER win FROM t1 WINDOW win AS ( ORDER BY a RANGE BETWEEN 2 FOLLOWING AND 3 FOLLOWING )
|
||||||
} {13 30 15 {}}
|
} {5 {} 10 52 13 30 13 30 15 {} 20 80 22 {} 30 {}}
|
||||||
|
|
||||||
|
do_execsql_test 2.4 {
|
||||||
|
SELECT a, sum(b) OVER win FROM t1 WINDOW win AS ( ORDER BY a DESC RANGE BETWEEN 5 PRECEDING AND 5 FOLLOWING )
|
||||||
|
} {30 90 22 120 20 150 15 142 13 102 13 102 10 112 5 30}
|
||||||
|
|
||||||
|
do_execsql_test 2.5 {
|
||||||
|
SELECT a, sum(b) OVER win FROM t1 WINDOW win AS ( ORDER BY a DESC RANGE BETWEEN 10 PRECEDING AND 5 PRECEDING )
|
||||||
|
} {30 {} 22 90 20 90 15 120 13 120 13 120 10 70 5 102}
|
||||||
|
|
||||||
|
do_execsql_test 2.6 {
|
||||||
|
SELECT a, sum(b) OVER win FROM t1 WINDOW win AS ( ORDER BY a DESC RANGE BETWEEN 2 FOLLOWING AND 3 FOLLOWING )
|
||||||
|
} {30 {} 22 40 20 {} 15 52 13 20 13 20 10 {} 5 {}}
|
||||||
|
|
||||||
finish_test
|
finish_test
|
||||||
|
Reference in New Issue
Block a user