-C Add\ssupport\sfor\sRANGE\swindow\sframes.\sSome\scases\sstill\sdo\snot\swork.
-D 2019-03-09T20:49:17.662
+C Fix\sproblems\swith\s"RANGE\s...\sORDER\sBY\s<expr>\sDESC"\swindow\sframes.
+D 2019-03-11T11:12:34.831
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F Makefile.in 236d2739dc3e823c3c909bca2d6cef93009bafbefd7018a8f3281074ecb92954
F src/whereInt.h 5f14db426ca46a83eabab1ae9aa6d4b8f27504ad35b64c290916289b1ddb2e88
F src/wherecode.c ce7b21e1be2b981d62683fc59c4ca73a04a7ff2f1ebec23d41baf2da2349afd6
F src/whereexpr.c 36b47f7261d6b6f1a72d774c113b74beddf6745aba1018e64b196e29db233442
-F src/window.c bbdf43afee5bb4178170baae8111d68dd4d6499610028d49c86979a377ac365c
+F src/window.c 199efb1a0185fe887f4b14edeff903333be3152dfa7701a98c790b44360b376a
F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2
F test/affinity2.test a6d901b436328bd67a79b41bb0ac2663918fe3bd
F test/affinity3.test 6a101af2fc945ce2912f6fe54dd646018551710d
F test/window6.test 604890f2b0f976339e6a1774cd90d48840e57a54b4f21a8b4b3047aa2c9787d1
F test/window7.tcl 6a1210f05d40ec89c22960213a22cd3f98d4e2f2eb20646c83c8c30d4d76108f
F test/window7.test ce7f865241fdd1c5c4db869cd7bb2986c3be836bc2e73649a6846dd920f63e0f
-F test/window8.tcl ec44b7ae3add64907950293a02bd1371ead3b8623b16b79076d8adce83b48771
-F test/window8.test 54a2c5baa388a4db35607de34a9dcce5a441a8d43bfae159ff067b765793f943
+F test/window8.tcl d296629022e098c9860933fa1ed61e698b60a7b0d50cf3ea77e9949b87012adc
+F test/window8.test 5bf663c76a9056235ae864f071d97056c7391f8b1dd18b184d4ea907951eaf08
F test/windowerr.tcl 4f0b111cdbb8de401a8135cd116604fb8add13042bb47a1f1496dd47a690e864
F test/windowerr.test 461bc504d4af0ae16a081e0c3bdb3724356cdcfb07bdc4b1b2dc4ad91b69bb7e
F test/windowfault.test 12ceb6bbb355d13e8fcd88c5731a57256dfdf77b9a7ae20842a76fcd4623df5b
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P 53ea550ce759ae4683bcf0ae3af655bfe04f85db70f74edee6bcab56d83bb041
-R 0f4fd4c61f7bf03ea8cd9c353e6d8bba
+P ffc32b246d92d53c66094afe11950b53ffab6a1c230c602eebbfedafb2eb57f4
+R 27103c6d5c4ac21fa5559af86898ca9a
U dan
-Z a0f8d74a60721d288c2aa9343e8b2a5a
+Z cff247c86123ad16f7fa6838517cb329
-ffc32b246d92d53c66094afe11950b53ffab6a1c230c602eebbfedafb2eb57f4
\ No newline at end of file
+e7bced731aa071c95bc398cdecd53c939841bf0c52fbcd06e47ba68f8c5cc35a
\ No newline at end of file
Vdbe *v = sqlite3GetVdbe(pParse);
int reg1 = 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, csr2, reg2);
- sqlite3VdbeAddOp3(v, OP_Add, reg1, regVal, reg1);
+ sqlite3VdbeAddOp3(v, arith, regVal, reg1, reg1);
sqlite3VdbeAddOp3(v, op, reg2, lbl, reg1);
sqlite3VdbeAddOp2(v, OP_Rowid, csr1, reg1);
sqlite3VdbeAddOp2(v, OP_Rowid, csr2, reg2);
sqlite3VdbeAddOp3(v, OP_Gt, reg2, lbl, reg1);
sqlite3ReleaseTempReg(pParse, reg1);
sqlite3ReleaseTempReg(pParse, reg2);
-
- assert( op==OP_Ge || op==OP_Gt || op==OP_Lt || op==OP_Le );
}
static int windowCodeOp(
DROP TABLE IF EXISTS t1;
CREATE TABLE t1(a INTEGER, b INTEGER);
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} {
1 { ORDER BY a RANGE BETWEEN 5 PRECEDING AND 5 FOLLOWING }
2 { ORDER BY a RANGE BETWEEN 10 PRECEDING AND 5 PRECEDING }
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)"
}
DROP TABLE IF EXISTS t1;
CREATE TABLE t1(a INTEGER, b INTEGER);
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 {
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 {
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 {
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