]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Fix a new problem in the BETWEEN operator when applied to a window function.
authordrh <drh@noemail.net>
Fri, 19 Jul 2019 01:25:27 +0000 (01:25 +0000)
committerdrh <drh@noemail.net>
Fri, 19 Jul 2019 01:25:27 +0000 (01:25 +0000)
The problem was introduced yesterday by check-in [7ef7b23cbb1b9ace].
This cherry-pick also needed to remove an assert from sqliteExprDelete().

FossilOrigin-Name: ce6bf395e2440f0e2fb333ff9e7355a733eb8d82aacb6c379b5b1c2779a5df14

manifest
manifest.uuid
src/expr.c
src/window.c
test/window1.test

index edb557f4a3d00d8db9053796c23e1accf4cf0831..4b9de64fe3f9ac3acf51b9a7ff76b1ca92d956dd 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C When\sprocessing\sa\sBETWEEN\sor\sCASE\sexpression,\savoid\stransforming\sa\snode\sof\sthe\soriginal\sexpression\sinto\sa\sTK_REGISTER\snode.\sInstead,\stake\sa\scopy\sand\suse\sit\sinstead.\sFix\sfor\s[1be72aab9].
-D 2019-07-17T18:19:37.055
+C Fix\sa\snew\sproblem\sin\sthe\sBETWEEN\soperator\swhen\sapplied\sto\sa\swindow\sfunction.\nThe\sproblem\swas\sintroduced\syesterday\sby\scheck-in\s[7ef7b23cbb1b9ace].\nThis\scherry-pick\salso\sneeded\sto\sremove\san\sassert\sfrom\ssqliteExprDelete().
+D 2019-07-19T01:25:27.859
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
 F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -474,7 +474,7 @@ F src/date.c e1d8ac7102f3f283e63e13867acb0efa33861cf34f0faf4cdbaf9fa7a1eb7041
 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7
 F src/dbstat.c c12833de69cb655751487d2c5a59607e36be1c58ba1f4bd536609909ad47b319
 F src/delete.c d08c9e01a2664afd12edcfa3a9c6578517e8ff8735f35509582693adbe0edeaf
-F src/expr.c b0107ae64427387b2460c86fc5939ca431e0a1c6070e4e2e91815a7779609c9e
+F src/expr.c 7411b75bcb65789ed17695287ff0f57a342d1dffb2f30becb4e5591d4369e212
 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007
 F src/fkey.c 0e14d4bef8eac2d87bbd517e492d9084c65008d117823f8922c5e7b2b599bd33
 F src/func.c 905c0424900979fade3731b4a271592059425c988cb7d5b245032253712dd7c8
@@ -612,7 +612,7 @@ F src/where.c 2f11eeb14335b7640f886b2fb441f54a94c35ab5cde8b53461a1074bfd587081
 F src/whereInt.h 1b728f71654ebf8421a1715497a587f02d6f538e819af58dc826908f8577e810
 F src/wherecode.c 37a1004237d630d785c47bba2290eac652a7a8b0047518eba3cb7c808b604c4a
 F src/whereexpr.c 5e559bdd24b06e3bc2e68f258bf751302954dc1e432daf71fdd8098a71462326
-F src/window.c 3408c0f606574d41033d461506bad68790239844b23e70610738a71152873d05
+F src/window.c 79a3c9a952b54cd168c258db6476a4becc27c7fbe969bc600b45215e09146027
 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2
 F test/affinity2.test a6d901b436328bd67a79b41bb0ac2663918fe3bd
 F test/affinity3.test 6a101af2fc945ce2912f6fe54dd646018551710d
@@ -1696,7 +1696,7 @@ F test/win32heap.test 10fd891266bd00af68671e702317726375e5407561d859be1aa04696f2
 F test/win32lock.test fbf107c91d8f5512be5a5b87c4c42ab9fdd54972
 F test/win32longpath.test 169c75a3b2e43481f4a62122510210c67b08f26d
 F test/win32nolock.test ac4f08811a562e45a5755e661f45ca85892bdbbc
-F test/window1.test 8d453bfaa3f8f0873ba16ca1270c7368f18445065a0003a1b5954ac4e95797b4
+F test/window1.test 9f42ddb05021c7badfeb7aa5aff1bc8f88482f722cadc872545c62059c765c14
 F test/window2.tcl 0c2918ef2a1640553fd791972d458356808a608418c64c02a0a379cecfc7fb0d
 F test/window2.test 96ef949f0197c025652f6c6e5812cdbfb948989bd40cf79cbb02104249a89513
 F test/window3.tcl acea6e86a4324a210fd608d06741010ca83ded9fde438341cb978c49928faf03
@@ -1833,8 +1833,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
 F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
 F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P bda258834b11545ba6288a78dc469eb99d014182bb36006f441da65b264249a9
-Q +7ef7b23cbb1b9ace9f853238d9133320c153e6c3417e6823ab6394ee1fe56358
-R 21c8a7b5e736be7a88ff7e37e54ca925
+P bc6b0d73ee16c433b012ad3e69c9e09efd7ea34029ff0c29c2f004d7a3214c66
+Q +47e23064ba0205148f89e12803a62d5a4d6d2054f593f60c031e815112170b9b
+R 6b3818d1c8b5baad8fa6aa7051fca074
 U drh
-Z 60243a2d293c2efae2edec47450f483b
+Z 49af44ce1dd22fe5fe3e3e0cda2ce339
index 68c1b08cbafa2dc11386f6c006a815469a66a050..37f3a0073b2f6d695b774eb903ad12a82d53d94e 100644 (file)
@@ -1 +1 @@
-bc6b0d73ee16c433b012ad3e69c9e09efd7ea34029ff0c29c2f004d7a3214c66
\ No newline at end of file
+ce6bf395e2440f0e2fb333ff9e7355a733eb8d82aacb6c379b5b1c2779a5df14
\ No newline at end of file
index b7e0a7d93b35673419330c29a763a6aaf21d8142..c2142e0a8f083a799afe2ae2b5486ae20ffcd2d4 100644 (file)
@@ -1047,7 +1047,6 @@ static SQLITE_NOINLINE void sqlite3ExprDeleteNN(sqlite3 *db, Expr *p){
       sqlite3ExprListDelete(db, p->x.pList);
     }
     if( ExprHasProperty(p, EP_WinFunc) ){
-      assert( p->op==TK_FUNCTION );
       sqlite3WindowDelete(db, p->y.pWin);
     }
   }
index dcd7107a42bbb39ea3a6c007f9b9bf5555b04042..517237369d3869acd918cac6859d5b62af959e5d 100644 (file)
@@ -2017,6 +2017,7 @@ Window *sqlite3WindowDup(sqlite3 *db, Expr *pOwner, Window *p){
       pNew->eEnd = p->eEnd;
       pNew->eStart = p->eStart;
       pNew->eExclude = p->eExclude;
+      pNew->regResult = p->regResult;
       pNew->pStart = sqlite3ExprDup(db, p->pStart, 0);
       pNew->pEnd = sqlite3ExprDup(db, p->pEnd, 0);
       pNew->pOwner = pOwner;
index 681573896c478c0fe8f31d4123374c831ed91ca1..a17651d26b218a4224c74de555dd9436517df60c 100644 (file)
@@ -1167,6 +1167,24 @@ do_execsql_test 29.2 {
   11 K cc 'xyz' K |
 }
 
-finish_test
-
+# 2019-07-18
+# Check-in [7ef7b23cbb1b9ace] (which was itself a fix for ticket
+# https://www.sqlite.org/src/info/1be72aab9) introduced a new problem
+# if the LHS of a BETWEEN operator is a WINDOW function.  The problem
+# was found by (the recently enhanced) dbsqlfuzz.
+#
+do_execsql_test 30.0 {
+  DROP TABLE IF EXISTS t1;
+  CREATE TABLE t1(a, b, c);
+  INSERT INTO t1 VALUES('BB','aa',399);
+  SELECT
+    count () OVER win1 NOT BETWEEN 'a' AND 'mmm',
+    count () OVER win3
+  FROM t1
+  WINDOW win1 AS (ORDER BY a GROUPS BETWEEN 4 PRECEDING AND 1 FOLLOWING
+                  EXCLUDE CURRENT ROW),
+         win2 AS (PARTITION BY b ORDER BY a),
+         win3 AS (win2 RANGE BETWEEN 5.2 PRECEDING AND true PRECEDING );
+} {1 1}
 
+finish_test