]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Fix problems with "RANGE ... ORDER BY <expr> DESC" window frames.
authordan <dan@noemail.net>
Mon, 11 Mar 2019 11:12:34 +0000 (11:12 +0000)
committerdan <dan@noemail.net>
Mon, 11 Mar 2019 11:12:34 +0000 (11:12 +0000)
FossilOrigin-Name: e7bced731aa071c95bc398cdecd53c939841bf0c52fbcd06e47ba68f8c5cc35a

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

index a70ba4c578754c24f8dddaf4dc5e328b180d9c7b..41997bb8397bec2ae375b753f366646508b50c97 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-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
@@ -604,7 +604,7 @@ F src/where.c 8a207cb2ca6b99e1edb1e4bbff9b0504385a759cbf66180d1deb34d80ca4b799
 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
@@ -1687,8 +1687,8 @@ F test/window5.test d328dd18221217c49c144181975eea17339eaeaf0e9aa558cee3afb84652
 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
@@ -1812,7 +1812,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 53ea550ce759ae4683bcf0ae3af655bfe04f85db70f74edee6bcab56d83bb041
-R 0f4fd4c61f7bf03ea8cd9c353e6d8bba
+P ffc32b246d92d53c66094afe11950b53ffab6a1c230c602eebbfedafb2eb57f4
+R 27103c6d5c4ac21fa5559af86898ca9a
 U dan
-Z a0f8d74a60721d288c2aa9343e8b2a5a
+Z cff247c86123ad16f7fa6838517cb329
index e7773224b2868f74fec15b83c8552e9f88c21444..b9d0cf1325cd5479a93d05e39a02ad3cfdb8a399 100644 (file)
@@ -1 +1 @@
-ffc32b246d92d53c66094afe11950b53ffab6a1c230c602eebbfedafb2eb57f4
\ No newline at end of file
+e7bced731aa071c95bc398cdecd53c939841bf0c52fbcd06e47ba68f8c5cc35a
\ No newline at end of file
index c43e3f11f158469c4c860df89df03111dc17a04a..08d11e166e2872554ea7de5a7b76643711464853 100644 (file)
@@ -1559,17 +1559,28 @@ static void windowCodeRangeTest(
   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(
index f117dd533e8bb1ea47ec305deff92ac90af70977..51db4e225ab7382cbccea130c9755a5ca361e29b 100644 (file)
@@ -95,13 +95,17 @@ execsql_test 2.0 {
   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)"
 }
index b74b7d99209e456be5ccaab5c9d3862236b345c1..e26e2673bda14cb2ebb9f2d0a9931647f113f174 100644 (file)
@@ -439,19 +439,32 @@ do_execsql_test 2.0 {
   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