From: dan Date: Mon, 11 Mar 2019 11:12:34 +0000 (+0000) Subject: Fix problems with "RANGE ... ORDER BY DESC" window frames. X-Git-Tag: version-3.28.0~88^2~25 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=71fddaf195df9848b95a96e20bc5401b8e267858;p=thirdparty%2Fsqlite.git Fix problems with "RANGE ... ORDER BY DESC" window frames. FossilOrigin-Name: e7bced731aa071c95bc398cdecd53c939841bf0c52fbcd06e47ba68f8c5cc35a --- diff --git a/manifest b/manifest index a70ba4c578..41997bb839 100644 --- 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\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 diff --git a/manifest.uuid b/manifest.uuid index e7773224b2..b9d0cf1325 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -ffc32b246d92d53c66094afe11950b53ffab6a1c230c602eebbfedafb2eb57f4 \ No newline at end of file +e7bced731aa071c95bc398cdecd53c939841bf0c52fbcd06e47ba68f8c5cc35a \ No newline at end of file diff --git a/src/window.c b/src/window.c index c43e3f11f1..08d11e166e 100644 --- a/src/window.c +++ b/src/window.c @@ -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( diff --git a/test/window8.tcl b/test/window8.tcl index f117dd533e..51db4e225a 100644 --- a/test/window8.tcl +++ b/test/window8.tcl @@ -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)" } diff --git a/test/window8.test b/test/window8.test index b74b7d9920..e26e2673bd 100644 --- a/test/window8.test +++ b/test/window8.test @@ -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