]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Fix a problem with handling of statements containing two or more different
authordan <dan@noemail.net>
Thu, 14 Jun 2018 20:52:08 +0000 (20:52 +0000)
committerdan <dan@noemail.net>
Thu, 14 Jun 2018 20:52:08 +0000 (20:52 +0000)
windows.

FossilOrigin-Name: 567e09ef2a8cd84a2481117e52595bed0f3b588745a9e441aae0f87680f3a2e8

manifest
manifest.uuid
src/window.c
test/pg_common.tcl
test/window4.tcl
test/window4.test

index fa813d09b48021ad6ccccb48b83a88fd38f9327c..648c77643ce0103263f90d72f878361b6ba8781f 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Fix\sproblem\swith\swindow\sfunctions\smin()\sand\smax()\swhen\sused\swith\sa\sPARTITION\nclause\sand\sa\sframe\sstarting\spoint\sother\sthan\s"UNBOUNDED\sPRECEDING".
-D 2018-06-14T19:06:36.904
+C Fix\sa\sproblem\swith\shandling\sof\sstatements\scontaining\stwo\sor\smore\sdifferent\nwindows.
+D 2018-06-14T20:52:08.656
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
 F Makefile.in 498b77b89a8cb42f2ee20fcd6317f279a45c0d6ff40d27825f94b69884c09bbe
@@ -583,7 +583,7 @@ F src/where.c 0bcbf9e191ca07f9ea2008aa80e70ded46bcdffd26560c83397da501f00aece6
 F src/whereInt.h b90ef9b9707ef750eab2a7a080c48fb4900315033274689def32d0cf5a81ebe4
 F src/wherecode.c 3317f2b083a66d3e65a03edf316ade4ccb0a99c9956273282ebb579b95d4ba96
 F src/whereexpr.c 19cf35cdd9bf6d5589d8a5c960d99259761136187a2319a6e14d11cf1abe14c2
-F src/window.c 3fc03f5ac20516d218933bc9eaf37863a511d9b9fffb3e37a9409e7a25efca99
+F src/window.c 8d9999b2dd3c0d9fe49523480b20100478875eedf652bfc7811046f4db54c761
 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2
 F test/affinity2.test a6d901b436328bd67a79b41bb0ac2663918fe3bd
 F test/affinity3.test 6a101af2fc945ce2912f6fe54dd646018551710d
@@ -1150,7 +1150,7 @@ F test/pcache.test c8acbedd3b6fd0f9a7ca887a83b11d24a007972b
 F test/pcache2.test af7f3deb1a819f77a6d0d81534e97d1cf62cd442
 F test/percentile.test 4243af26b8f3f4555abe166f723715a1f74c77ff
 F test/permutations.test 5c2167e03dc55ff697e11bb3abf10c66ba452e4afb2dbd85a2b144048355300e
-F test/pg_common.tcl b50727fe1ee3369d0421eadea2c2fd247bfb9d89a8e06ececf2f6866de17abd8
+F test/pg_common.tcl 5cd48d499eacc5e2c446c2ed6e0774d2539f93f3d5fa184763cde02dd824d0c8
 F test/pragma.test 7c8cfc328a1717a95663cf8edb06c52ddfeaf97bb0aee69ae7457132e8d39e7d
 F test/pragma2.test e5d5c176360c321344249354c0c16aec46214c9f
 F test/pragma3.test 14c12bc5352b1e100e0b6b44f371053a81ccf8ed
@@ -1622,8 +1622,8 @@ F test/window2.tcl 0983de5eade5eeda49469244799d5331bfe3199fca3f6c6d2a836aa08f4fb
 F test/window2.test 79747b2edde4ad424e0752b27529aedc86e91f3d8d88846fa17ff0cb67f65086
 F test/window3.tcl 654d61d73e10db089b22514d498bb23ec310f720c0f4b5f69f67fda83d672048
 F test/window3.test 41727668ee31d2ba50f78efcb5bf1bda2c5cffd889aa65243511004669d1ac25
-F test/window4.tcl 3388b29669144bccd012bf5e237d165cf8eff2a310c26cc43a70279775f2fb01
-F test/window4.test f14ecc20c004a2a0d5fd8530266ea4255e3c0a55681bce1fea24af04ea82005f
+F test/window4.tcl 9a04d14649ba625608a7b0ddd1640b41619632ee5550bdb772d466b628ede95a
+F test/window4.test 2959afeb5dc86c85711a80ad920f7f65d7d158d7bbce37bf2460c862b8c74de6
 F test/with1.test 58475190cd8caaeebea8cfeb2a264ec97a0c492b8ffe9ad20cefbb23df462f96
 F test/with2.test e0030e2f0267a910d6c0e4f46f2dfe941c1cc0d4f659ba69b3597728e7e8f1ab
 F test/with3.test 5e8ce2c585170bbbc0544e2a01a4941fa0be173ba5265e5c92eb588cd99a232d
@@ -1740,7 +1740,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 5cf5f1808a51f9c2cfc98dd49b4f1ce860b53e935287f89868ce2fdbace8eb06
-R ef2b7f57cdc1146bf754373b3823f53c
+P 43eb1e75a4d7ac0973ed8589bbaf379c24cdc8eacc4e613610d2d4c24d385dc1
+R 8fa685be6b05cccf51d69be1e42b3c72
 U dan
-Z e015141b8a297bc169625a565b97966a
+Z 5df8e391006a1a484745351d3ef4fda5
index fe46aaa1666272a340d9f67d4fe22c8e79e3d976..e8793de8a79cb9a0e00a522b910f7532c2c556ef 100644 (file)
@@ -1 +1 @@
-43eb1e75a4d7ac0973ed8589bbaf379c24cdc8eacc4e613610d2d4c24d385dc1
\ No newline at end of file
+567e09ef2a8cd84a2481117e52595bed0f3b588745a9e441aae0f87680f3a2e8
\ No newline at end of file
index 0ec6bd34f8f3599deb8ce5517e85e1f55898ca13..babbf3f3ff7c8543d5e67bd2792ba3d28f0cf132 100644 (file)
@@ -1937,8 +1937,8 @@ Window *sqlite3WindowDup(sqlite3 *db, Expr *pOwner, Window *p){
       pNew->eType = p->eType;
       pNew->eEnd = p->eEnd;
       pNew->eStart = p->eStart;
-      pNew->pStart = sqlite3ExprDup(db, pNew->pStart, 0);
-      pNew->pEnd = sqlite3ExprDup(db, pNew->pEnd, 0);
+      pNew->pStart = sqlite3ExprDup(db, p->pStart, 0);
+      pNew->pEnd = sqlite3ExprDup(db, p->pEnd, 0);
       pNew->pOwner = pOwner;
     }
   }
index fcf380e9ff53747664a531801db0ac3d71e25529..c957b433ccbc683aeda3dcb6be6e5d224e25a207 100644 (file)
@@ -74,7 +74,10 @@ proc execsql_float_test {tn sql} {
   set F "%.2f"
   set res [execsql $sql]
   set res2 [list]
-  foreach r $res { lappend res2 [format $F $r] }
+  foreach r $res { 
+    if {$r != ""} { set r [format $F $r] }
+    lappend res2 $r
+  }
 
   puts $::fd "do_test $tn {"
   puts $::fd "  set myres {}"
index e96782afdc41b387335a0b5ff2d74666c9470b31..bb76d26f5958bed26e143306a58a8160714ecf25 100644 (file)
@@ -167,21 +167,29 @@ execsql_test 4.4 {
 set lPart  [list "PARTITION BY b" "PARTITION BY b, a" "" "PARTITION BY a"]
 set lOrder [list "ORDER BY a" "ORDER BY a DESC" "" "ORDER BY b, a"]
 set lRange {
-    "BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW"
-    "BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING"
-    "BETWEEN CURRENT ROW AND CURRENT ROW"
-    "BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING"
+    "RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW"
+    "RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING"
+    "RANGE BETWEEN CURRENT ROW AND CURRENT ROW"
+    "RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING"
+}
+
+set lRows {
+    "ROWS BETWEEN 3 PRECEDING AND 1 FOLLOWING"
+    "ROWS BETWEEN 3 PRECEDING AND 2 FOLLOWING"
+    "ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING"
+    "ROWS BETWEEN 0 PRECEDING AND 1 PRECEDING"
+    "ROWS BETWEEN 1 FOLLOWING AND 500 FOLLOWING"
 }
 
 set tn 1
 set SQL {
-  SELECT max(c) OVER ($p1 $o1 RANGE $r1), 
-  min(c) OVER ($p2 $o2 RANGE $r2)
+  SELECT max(c) OVER ($p1 $o1 $r1), 
+  min(c) OVER ($p2 $o2 $r2)
   FROM ttt ORDER BY a
 }
 set SQL2 {
-  SELECT avg(c) OVER ($p1 $o1 RANGE $r1), 
-         avg(c) OVER ($p2 $o2 RANGE $r2)
+  SELECT sum(c) OVER ($p1 $o1 $r1), 
+         sum(c) OVER ($p2 $o2 $r2)
   FROM ttt ORDER BY a
 }
 
@@ -191,7 +199,7 @@ set r1 [lindex $lRange 0]
 set r2 [lindex $lRange 0]
 foreach p1 $lPart { foreach p2 $lPart { 
   execsql_test 4.5.$tn.1 [subst $SQL]
-  execsql_float_test 4.5.$tn.2 [subst $SQL2]
+  execsql_test 4.5.$tn.2 [subst $SQL2]
   incr tn
 }}
 
@@ -201,7 +209,12 @@ set p1 [lindex $lPart 0]
 set p2 [lindex $lPart 0]
 foreach r1 $lRange { foreach r2 $lRange { 
   execsql_test 4.5.$tn.1 [subst $SQL]
-  execsql_float_test 4.5.$tn.2 [subst $SQL2]
+  execsql_test 4.5.$tn.2 [subst $SQL2]
+  incr tn
+}}
+foreach r1 $lRows { foreach r2 $lRows { 
+  execsql_test 4.5.$tn.1 [subst $SQL]
+  execsql_test 4.5.$tn.2 [subst $SQL2]
   incr tn
 }}
 
@@ -211,7 +224,7 @@ set p1 [lindex $lPart 0]
 set p2 [lindex $lPart 0]
 foreach o1 $lOrder { foreach o2 $lOrder { 
   execsql_test 4.5.$tn.1 [subst $SQL]
-  execsql_float_test 4.5.$tn.2 [subst $SQL2]
+  execsql_test 4.5.$tn.2 [subst $SQL2]
   incr tn
 }}
 
index a57fc16b74af40915a0d66bda20e62447aa8b3e5..a6f3a020c0b6bb1cd94d57b7abb403f4f5156d3f 100644 (file)
@@ -253,15 +253,11 @@ do_execsql_test 4.5.1.1 {
   FROM ttt ORDER BY a
 } {1 1   2 2   3 3   2 1   3 2   4 3   3 1   4 2   5 3}
 
-do_test 4.5.1.2 {
-  set myres {}
-  foreach r [db eval {SELECT avg(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), 
-         avg(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
-  FROM ttt ORDER BY a}] {
-    lappend myres [format %.2f [set r]]
-  }
-  set myres
-} {1.00 1.00 2.00 2.00 3.00 3.00 1.50 1.50 2.50 2.50 3.50 3.50 2.00 2.00 3.00 3.00 4.00 4.00}
+do_execsql_test 4.5.1.2 {
+  SELECT sum(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), 
+         sum(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
+  FROM ttt ORDER BY a
+} {1 1   2 2   3 3   3 3   5 5   7 7   6 6   9 9   12 12}
 
 do_execsql_test 4.5.2.1 {
   SELECT max(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), 
@@ -269,15 +265,11 @@ do_execsql_test 4.5.2.1 {
   FROM ttt ORDER BY a
 } {1 1   2 2   3 3   2 2   3 3   4 4   3 3   4 4   5 5}
 
-do_test 4.5.2.2 {
-  set myres {}
-  foreach r [db eval {SELECT avg(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), 
-         avg(c) OVER (PARTITION BY b, a ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
-  FROM ttt ORDER BY a}] {
-    lappend myres [format %.2f [set r]]
-  }
-  set myres
-} {1.00 1.00 2.00 2.00 3.00 3.00 1.50 2.00 2.50 3.00 3.50 4.00 2.00 3.00 3.00 4.00 4.00 5.00}
+do_execsql_test 4.5.2.2 {
+  SELECT sum(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), 
+         sum(c) OVER (PARTITION BY b, a ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
+  FROM ttt ORDER BY a
+} {1 1   2 2   3 3   3 2   5 3   7 4   6 3   9 4   12 5}
 
 do_execsql_test 4.5.3.1 {
   SELECT max(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), 
@@ -285,15 +277,11 @@ do_execsql_test 4.5.3.1 {
   FROM ttt ORDER BY a
 } {1 1   2 1   3 1   2 1   3 1   4 1   3 1   4 1   5 1}
 
-do_test 4.5.3.2 {
-  set myres {}
-  foreach r [db eval {SELECT avg(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), 
-         avg(c) OVER ( ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
-  FROM ttt ORDER BY a}] {
-    lappend myres [format %.2f [set r]]
-  }
-  set myres
-} {1.00 1.00 2.00 1.50 3.00 2.00 1.50 2.00 2.50 2.20 3.50 2.50 2.00 2.57 3.00 2.75 4.00 3.00}
+do_execsql_test 4.5.3.2 {
+  SELECT sum(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), 
+         sum(c) OVER ( ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
+  FROM ttt ORDER BY a
+} {1 1   2 3   3 6   3 8   5 11   7 15   6 18   9 22   12 27}
 
 do_execsql_test 4.5.4.1 {
   SELECT max(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), 
@@ -301,15 +289,11 @@ do_execsql_test 4.5.4.1 {
   FROM ttt ORDER BY a
 } {1 1   2 2   3 3   2 2   3 3   4 4   3 3   4 4   5 5}
 
-do_test 4.5.4.2 {
-  set myres {}
-  foreach r [db eval {SELECT avg(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), 
-         avg(c) OVER (PARTITION BY a ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
-  FROM ttt ORDER BY a}] {
-    lappend myres [format %.2f [set r]]
-  }
-  set myres
-} {1.00 1.00 2.00 2.00 3.00 3.00 1.50 2.00 2.50 3.00 3.50 4.00 2.00 3.00 3.00 4.00 4.00 5.00}
+do_execsql_test 4.5.4.2 {
+  SELECT sum(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), 
+         sum(c) OVER (PARTITION BY a ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
+  FROM ttt ORDER BY a
+} {1 1   2 2   3 3   3 2   5 3   7 4   6 3   9 4   12 5}
 
 do_execsql_test 4.5.5.1 {
   SELECT max(c) OVER (PARTITION BY b, a ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), 
@@ -317,15 +301,11 @@ do_execsql_test 4.5.5.1 {
   FROM ttt ORDER BY a
 } {1 1   2 2   3 3   2 1   3 2   4 3   3 1   4 2   5 3}
 
-do_test 4.5.5.2 {
-  set myres {}
-  foreach r [db eval {SELECT avg(c) OVER (PARTITION BY b, a ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), 
-         avg(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
-  FROM ttt ORDER BY a}] {
-    lappend myres [format %.2f [set r]]
-  }
-  set myres
-} {1.00 1.00 2.00 2.00 3.00 3.00 2.00 1.50 3.00 2.50 4.00 3.50 3.00 2.00 4.00 3.00 5.00 4.00}
+do_execsql_test 4.5.5.2 {
+  SELECT sum(c) OVER (PARTITION BY b, a ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), 
+         sum(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
+  FROM ttt ORDER BY a
+} {1 1   2 2   3 3   2 3   3 5   4 7   3 6   4 9   5 12}
 
 do_execsql_test 4.5.6.1 {
   SELECT max(c) OVER (PARTITION BY b, a ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), 
@@ -333,15 +313,11 @@ do_execsql_test 4.5.6.1 {
   FROM ttt ORDER BY a
 } {1 1   2 2   3 3   2 2   3 3   4 4   3 3   4 4   5 5}
 
-do_test 4.5.6.2 {
-  set myres {}
-  foreach r [db eval {SELECT avg(c) OVER (PARTITION BY b, a ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), 
-         avg(c) OVER (PARTITION BY b, a ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
-  FROM ttt ORDER BY a}] {
-    lappend myres [format %.2f [set r]]
-  }
-  set myres
-} {1.00 1.00 2.00 2.00 3.00 3.00 2.00 2.00 3.00 3.00 4.00 4.00 3.00 3.00 4.00 4.00 5.00 5.00}
+do_execsql_test 4.5.6.2 {
+  SELECT sum(c) OVER (PARTITION BY b, a ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), 
+         sum(c) OVER (PARTITION BY b, a ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
+  FROM ttt ORDER BY a
+} {1 1   2 2   3 3   2 2   3 3   4 4   3 3   4 4   5 5}
 
 do_execsql_test 4.5.7.1 {
   SELECT max(c) OVER (PARTITION BY b, a ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), 
@@ -349,15 +325,11 @@ do_execsql_test 4.5.7.1 {
   FROM ttt ORDER BY a
 } {1 1   2 1   3 1   2 1   3 1   4 1   3 1   4 1   5 1}
 
-do_test 4.5.7.2 {
-  set myres {}
-  foreach r [db eval {SELECT avg(c) OVER (PARTITION BY b, a ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), 
-         avg(c) OVER ( ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
-  FROM ttt ORDER BY a}] {
-    lappend myres [format %.2f [set r]]
-  }
-  set myres
-} {1.00 1.00 2.00 1.50 3.00 2.00 2.00 2.00 3.00 2.20 4.00 2.50 3.00 2.57 4.00 2.75 5.00 3.00}
+do_execsql_test 4.5.7.2 {
+  SELECT sum(c) OVER (PARTITION BY b, a ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), 
+         sum(c) OVER ( ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
+  FROM ttt ORDER BY a
+} {1 1   2 3   3 6   2 8   3 11   4 15   3 18   4 22   5 27}
 
 do_execsql_test 4.5.8.1 {
   SELECT max(c) OVER (PARTITION BY b, a ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), 
@@ -365,15 +337,11 @@ do_execsql_test 4.5.8.1 {
   FROM ttt ORDER BY a
 } {1 1   2 2   3 3   2 2   3 3   4 4   3 3   4 4   5 5}
 
-do_test 4.5.8.2 {
-  set myres {}
-  foreach r [db eval {SELECT avg(c) OVER (PARTITION BY b, a ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), 
-         avg(c) OVER (PARTITION BY a ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
-  FROM ttt ORDER BY a}] {
-    lappend myres [format %.2f [set r]]
-  }
-  set myres
-} {1.00 1.00 2.00 2.00 3.00 3.00 2.00 2.00 3.00 3.00 4.00 4.00 3.00 3.00 4.00 4.00 5.00 5.00}
+do_execsql_test 4.5.8.2 {
+  SELECT sum(c) OVER (PARTITION BY b, a ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), 
+         sum(c) OVER (PARTITION BY a ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
+  FROM ttt ORDER BY a
+} {1 1   2 2   3 3   2 2   3 3   4 4   3 3   4 4   5 5}
 
 do_execsql_test 4.5.9.1 {
   SELECT max(c) OVER ( ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), 
@@ -381,15 +349,11 @@ do_execsql_test 4.5.9.1 {
   FROM ttt ORDER BY a
 } {1 1   2 2   3 3   3 1   3 2   4 3   4 1   4 2   5 3}
 
-do_test 4.5.9.2 {
-  set myres {}
-  foreach r [db eval {SELECT avg(c) OVER ( ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), 
-         avg(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
-  FROM ttt ORDER BY a}] {
-    lappend myres [format %.2f [set r]]
-  }
-  set myres
-} {1.00 1.00 1.50 2.00 2.00 3.00 2.00 1.50 2.20 2.50 2.50 3.50 2.57 2.00 2.75 3.00 3.00 4.00}
+do_execsql_test 4.5.9.2 {
+  SELECT sum(c) OVER ( ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), 
+         sum(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
+  FROM ttt ORDER BY a
+} {1 1   3 2   6 3   8 3   11 5   15 7   18 6   22 9   27 12}
 
 do_execsql_test 4.5.10.1 {
   SELECT max(c) OVER ( ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), 
@@ -397,15 +361,11 @@ do_execsql_test 4.5.10.1 {
   FROM ttt ORDER BY a
 } {1 1   2 2   3 3   3 2   3 3   4 4   4 3   4 4   5 5}
 
-do_test 4.5.10.2 {
-  set myres {}
-  foreach r [db eval {SELECT avg(c) OVER ( ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), 
-         avg(c) OVER (PARTITION BY b, a ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
-  FROM ttt ORDER BY a}] {
-    lappend myres [format %.2f [set r]]
-  }
-  set myres
-} {1.00 1.00 1.50 2.00 2.00 3.00 2.00 2.00 2.20 3.00 2.50 4.00 2.57 3.00 2.75 4.00 3.00 5.00}
+do_execsql_test 4.5.10.2 {
+  SELECT sum(c) OVER ( ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), 
+         sum(c) OVER (PARTITION BY b, a ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
+  FROM ttt ORDER BY a
+} {1 1   3 2   6 3   8 2   11 3   15 4   18 3   22 4   27 5}
 
 do_execsql_test 4.5.11.1 {
   SELECT max(c) OVER ( ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), 
@@ -413,15 +373,11 @@ do_execsql_test 4.5.11.1 {
   FROM ttt ORDER BY a
 } {1 1   2 1   3 1   3 1   3 1   4 1   4 1   4 1   5 1}
 
-do_test 4.5.11.2 {
-  set myres {}
-  foreach r [db eval {SELECT avg(c) OVER ( ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), 
-         avg(c) OVER ( ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
-  FROM ttt ORDER BY a}] {
-    lappend myres [format %.2f [set r]]
-  }
-  set myres
-} {1.00 1.00 1.50 1.50 2.00 2.00 2.00 2.00 2.20 2.20 2.50 2.50 2.57 2.57 2.75 2.75 3.00 3.00}
+do_execsql_test 4.5.11.2 {
+  SELECT sum(c) OVER ( ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), 
+         sum(c) OVER ( ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
+  FROM ttt ORDER BY a
+} {1 1   3 3   6 6   8 8   11 11   15 15   18 18   22 22   27 27}
 
 do_execsql_test 4.5.12.1 {
   SELECT max(c) OVER ( ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), 
@@ -429,15 +385,11 @@ do_execsql_test 4.5.12.1 {
   FROM ttt ORDER BY a
 } {1 1   2 2   3 3   3 2   3 3   4 4   4 3   4 4   5 5}
 
-do_test 4.5.12.2 {
-  set myres {}
-  foreach r [db eval {SELECT avg(c) OVER ( ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), 
-         avg(c) OVER (PARTITION BY a ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
-  FROM ttt ORDER BY a}] {
-    lappend myres [format %.2f [set r]]
-  }
-  set myres
-} {1.00 1.00 1.50 2.00 2.00 3.00 2.00 2.00 2.20 3.00 2.50 4.00 2.57 3.00 2.75 4.00 3.00 5.00}
+do_execsql_test 4.5.12.2 {
+  SELECT sum(c) OVER ( ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), 
+         sum(c) OVER (PARTITION BY a ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
+  FROM ttt ORDER BY a
+} {1 1   3 2   6 3   8 2   11 3   15 4   18 3   22 4   27 5}
 
 do_execsql_test 4.5.13.1 {
   SELECT max(c) OVER (PARTITION BY a ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), 
@@ -445,15 +397,11 @@ do_execsql_test 4.5.13.1 {
   FROM ttt ORDER BY a
 } {1 1   2 2   3 3   2 1   3 2   4 3   3 1   4 2   5 3}
 
-do_test 4.5.13.2 {
-  set myres {}
-  foreach r [db eval {SELECT avg(c) OVER (PARTITION BY a ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), 
-         avg(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
-  FROM ttt ORDER BY a}] {
-    lappend myres [format %.2f [set r]]
-  }
-  set myres
-} {1.00 1.00 2.00 2.00 3.00 3.00 2.00 1.50 3.00 2.50 4.00 3.50 3.00 2.00 4.00 3.00 5.00 4.00}
+do_execsql_test 4.5.13.2 {
+  SELECT sum(c) OVER (PARTITION BY a ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), 
+         sum(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
+  FROM ttt ORDER BY a
+} {1 1   2 2   3 3   2 3   3 5   4 7   3 6   4 9   5 12}
 
 do_execsql_test 4.5.14.1 {
   SELECT max(c) OVER (PARTITION BY a ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), 
@@ -461,15 +409,11 @@ do_execsql_test 4.5.14.1 {
   FROM ttt ORDER BY a
 } {1 1   2 2   3 3   2 2   3 3   4 4   3 3   4 4   5 5}
 
-do_test 4.5.14.2 {
-  set myres {}
-  foreach r [db eval {SELECT avg(c) OVER (PARTITION BY a ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), 
-         avg(c) OVER (PARTITION BY b, a ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
-  FROM ttt ORDER BY a}] {
-    lappend myres [format %.2f [set r]]
-  }
-  set myres
-} {1.00 1.00 2.00 2.00 3.00 3.00 2.00 2.00 3.00 3.00 4.00 4.00 3.00 3.00 4.00 4.00 5.00 5.00}
+do_execsql_test 4.5.14.2 {
+  SELECT sum(c) OVER (PARTITION BY a ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), 
+         sum(c) OVER (PARTITION BY b, a ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
+  FROM ttt ORDER BY a
+} {1 1   2 2   3 3   2 2   3 3   4 4   3 3   4 4   5 5}
 
 do_execsql_test 4.5.15.1 {
   SELECT max(c) OVER (PARTITION BY a ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), 
@@ -477,15 +421,11 @@ do_execsql_test 4.5.15.1 {
   FROM ttt ORDER BY a
 } {1 1   2 1   3 1   2 1   3 1   4 1   3 1   4 1   5 1}
 
-do_test 4.5.15.2 {
-  set myres {}
-  foreach r [db eval {SELECT avg(c) OVER (PARTITION BY a ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), 
-         avg(c) OVER ( ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
-  FROM ttt ORDER BY a}] {
-    lappend myres [format %.2f [set r]]
-  }
-  set myres
-} {1.00 1.00 2.00 1.50 3.00 2.00 2.00 2.00 3.00 2.20 4.00 2.50 3.00 2.57 4.00 2.75 5.00 3.00}
+do_execsql_test 4.5.15.2 {
+  SELECT sum(c) OVER (PARTITION BY a ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), 
+         sum(c) OVER ( ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
+  FROM ttt ORDER BY a
+} {1 1   2 3   3 6   2 8   3 11   4 15   3 18   4 22   5 27}
 
 do_execsql_test 4.5.16.1 {
   SELECT max(c) OVER (PARTITION BY a ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), 
@@ -493,15 +433,11 @@ do_execsql_test 4.5.16.1 {
   FROM ttt ORDER BY a
 } {1 1   2 2   3 3   2 2   3 3   4 4   3 3   4 4   5 5}
 
-do_test 4.5.16.2 {
-  set myres {}
-  foreach r [db eval {SELECT avg(c) OVER (PARTITION BY a ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), 
-         avg(c) OVER (PARTITION BY a ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
-  FROM ttt ORDER BY a}] {
-    lappend myres [format %.2f [set r]]
-  }
-  set myres
-} {1.00 1.00 2.00 2.00 3.00 3.00 2.00 2.00 3.00 3.00 4.00 4.00 3.00 3.00 4.00 4.00 5.00 5.00}
+do_execsql_test 4.5.16.2 {
+  SELECT sum(c) OVER (PARTITION BY a ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), 
+         sum(c) OVER (PARTITION BY a ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
+  FROM ttt ORDER BY a
+} {1 1   2 2   3 3   2 2   3 3   4 4   3 3   4 4   5 5}
 
 do_execsql_test 4.5.17.1 {
   SELECT max(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), 
@@ -509,15 +445,11 @@ do_execsql_test 4.5.17.1 {
   FROM ttt ORDER BY a
 } {1 1   2 2   3 3   2 1   3 2   4 3   3 1   4 2   5 3}
 
-do_test 4.5.17.2 {
-  set myres {}
-  foreach r [db eval {SELECT avg(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), 
-         avg(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
-  FROM ttt ORDER BY a}] {
-    lappend myres [format %.2f [set r]]
-  }
-  set myres
-} {1.00 1.00 2.00 2.00 3.00 3.00 1.50 1.50 2.50 2.50 3.50 3.50 2.00 2.00 3.00 3.00 4.00 4.00}
+do_execsql_test 4.5.17.2 {
+  SELECT sum(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), 
+         sum(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
+  FROM ttt ORDER BY a
+} {1 1   2 2   3 3   3 3   5 5   7 7   6 6   9 9   12 12}
 
 do_execsql_test 4.5.18.1 {
   SELECT max(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), 
@@ -525,15 +457,11 @@ do_execsql_test 4.5.18.1 {
   FROM ttt ORDER BY a
 } {1 1   2 2   3 3   2 1   3 2   4 3   3 1   4 2   5 3}
 
-do_test 4.5.18.2 {
-  set myres {}
-  foreach r [db eval {SELECT avg(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), 
-         avg(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
-  FROM ttt ORDER BY a}] {
-    lappend myres [format %.2f [set r]]
-  }
-  set myres
-} {1.00 2.00 2.00 3.00 3.00 4.00 1.50 2.00 2.50 3.00 3.50 4.00 2.00 2.00 3.00 3.00 4.00 4.00}
+do_execsql_test 4.5.18.2 {
+  SELECT sum(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), 
+         sum(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
+  FROM ttt ORDER BY a
+} {1 6   2 9   3 12   3 6   5 9   7 12   6 6   9 9   12 12}
 
 do_execsql_test 4.5.19.1 {
   SELECT max(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), 
@@ -541,15 +469,11 @@ do_execsql_test 4.5.19.1 {
   FROM ttt ORDER BY a
 } {1 1   2 2   3 3   2 2   3 3   4 4   3 3   4 4   5 5}
 
-do_test 4.5.19.2 {
-  set myres {}
-  foreach r [db eval {SELECT avg(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), 
-         avg(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN CURRENT ROW AND CURRENT ROW)
-  FROM ttt ORDER BY a}] {
-    lappend myres [format %.2f [set r]]
-  }
-  set myres
-} {1.00 1.00 2.00 2.00 3.00 3.00 1.50 2.00 2.50 3.00 3.50 4.00 2.00 3.00 3.00 4.00 4.00 5.00}
+do_execsql_test 4.5.19.2 {
+  SELECT sum(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), 
+         sum(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN CURRENT ROW AND CURRENT ROW)
+  FROM ttt ORDER BY a
+} {1 1   2 2   3 3   3 2   5 3   7 4   6 3   9 4   12 5}
 
 do_execsql_test 4.5.20.1 {
   SELECT max(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), 
@@ -557,15 +481,11 @@ do_execsql_test 4.5.20.1 {
   FROM ttt ORDER BY a
 } {1 1   2 2   3 3   2 2   3 3   4 4   3 3   4 4   5 5}
 
-do_test 4.5.20.2 {
-  set myres {}
-  foreach r [db eval {SELECT avg(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), 
-         avg(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING)
-  FROM ttt ORDER BY a}] {
-    lappend myres [format %.2f [set r]]
-  }
-  set myres
-} {1.00 2.00 2.00 3.00 3.00 4.00 1.50 2.50 2.50 3.50 3.50 4.50 2.00 3.00 3.00 4.00 4.00 5.00}
+do_execsql_test 4.5.20.2 {
+  SELECT sum(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), 
+         sum(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING)
+  FROM ttt ORDER BY a
+} {1 6   2 9   3 12   3 5   5 7   7 9   6 3   9 4   12 5}
 
 do_execsql_test 4.5.21.1 {
   SELECT max(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING), 
@@ -573,15 +493,11 @@ do_execsql_test 4.5.21.1 {
   FROM ttt ORDER BY a
 } {3 1   4 2   5 3   3 1   4 2   5 3   3 1   4 2   5 3}
 
-do_test 4.5.21.2 {
-  set myres {}
-  foreach r [db eval {SELECT avg(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING), 
-         avg(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
-  FROM ttt ORDER BY a}] {
-    lappend myres [format %.2f [set r]]
-  }
-  set myres
-} {2.00 1.00 3.00 2.00 4.00 3.00 2.00 1.50 3.00 2.50 4.00 3.50 2.00 2.00 3.00 3.00 4.00 4.00}
+do_execsql_test 4.5.21.2 {
+  SELECT sum(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING), 
+         sum(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
+  FROM ttt ORDER BY a
+} {6 1   9 2   12 3   6 3   9 5   12 7   6 6   9 9   12 12}
 
 do_execsql_test 4.5.22.1 {
   SELECT max(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING), 
@@ -589,15 +505,11 @@ do_execsql_test 4.5.22.1 {
   FROM ttt ORDER BY a
 } {3 1   4 2   5 3   3 1   4 2   5 3   3 1   4 2   5 3}
 
-do_test 4.5.22.2 {
-  set myres {}
-  foreach r [db eval {SELECT avg(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING), 
-         avg(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
-  FROM ttt ORDER BY a}] {
-    lappend myres [format %.2f [set r]]
-  }
-  set myres
-} {2.00 2.00 3.00 3.00 4.00 4.00 2.00 2.00 3.00 3.00 4.00 4.00 2.00 2.00 3.00 3.00 4.00 4.00}
+do_execsql_test 4.5.22.2 {
+  SELECT sum(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING), 
+         sum(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
+  FROM ttt ORDER BY a
+} {6 6   9 9   12 12   6 6   9 9   12 12   6 6   9 9   12 12}
 
 do_execsql_test 4.5.23.1 {
   SELECT max(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING), 
@@ -605,15 +517,11 @@ do_execsql_test 4.5.23.1 {
   FROM ttt ORDER BY a
 } {3 1   4 2   5 3   3 2   4 3   5 4   3 3   4 4   5 5}
 
-do_test 4.5.23.2 {
-  set myres {}
-  foreach r [db eval {SELECT avg(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING), 
-         avg(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN CURRENT ROW AND CURRENT ROW)
-  FROM ttt ORDER BY a}] {
-    lappend myres [format %.2f [set r]]
-  }
-  set myres
-} {2.00 1.00 3.00 2.00 4.00 3.00 2.00 2.00 3.00 3.00 4.00 4.00 2.00 3.00 3.00 4.00 4.00 5.00}
+do_execsql_test 4.5.23.2 {
+  SELECT sum(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING), 
+         sum(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN CURRENT ROW AND CURRENT ROW)
+  FROM ttt ORDER BY a
+} {6 1   9 2   12 3   6 2   9 3   12 4   6 3   9 4   12 5}
 
 do_execsql_test 4.5.24.1 {
   SELECT max(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING), 
@@ -621,15 +529,11 @@ do_execsql_test 4.5.24.1 {
   FROM ttt ORDER BY a
 } {3 1   4 2   5 3   3 2   4 3   5 4   3 3   4 4   5 5}
 
-do_test 4.5.24.2 {
-  set myres {}
-  foreach r [db eval {SELECT avg(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING), 
-         avg(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING)
-  FROM ttt ORDER BY a}] {
-    lappend myres [format %.2f [set r]]
-  }
-  set myres
-} {2.00 2.00 3.00 3.00 4.00 4.00 2.00 2.50 3.00 3.50 4.00 4.50 2.00 3.00 3.00 4.00 4.00 5.00}
+do_execsql_test 4.5.24.2 {
+  SELECT sum(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING), 
+         sum(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING)
+  FROM ttt ORDER BY a
+} {6 6   9 9   12 12   6 5   9 7   12 9   6 3   9 4   12 5}
 
 do_execsql_test 4.5.25.1 {
   SELECT max(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN CURRENT ROW AND CURRENT ROW), 
@@ -637,15 +541,11 @@ do_execsql_test 4.5.25.1 {
   FROM ttt ORDER BY a
 } {1 1   2 2   3 3   2 1   3 2   4 3   3 1   4 2   5 3}
 
-do_test 4.5.25.2 {
-  set myres {}
-  foreach r [db eval {SELECT avg(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN CURRENT ROW AND CURRENT ROW), 
-         avg(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
-  FROM ttt ORDER BY a}] {
-    lappend myres [format %.2f [set r]]
-  }
-  set myres
-} {1.00 1.00 2.00 2.00 3.00 3.00 2.00 1.50 3.00 2.50 4.00 3.50 3.00 2.00 4.00 3.00 5.00 4.00}
+do_execsql_test 4.5.25.2 {
+  SELECT sum(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN CURRENT ROW AND CURRENT ROW), 
+         sum(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
+  FROM ttt ORDER BY a
+} {1 1   2 2   3 3   2 3   3 5   4 7   3 6   4 9   5 12}
 
 do_execsql_test 4.5.26.1 {
   SELECT max(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN CURRENT ROW AND CURRENT ROW), 
@@ -653,15 +553,11 @@ do_execsql_test 4.5.26.1 {
   FROM ttt ORDER BY a
 } {1 1   2 2   3 3   2 1   3 2   4 3   3 1   4 2   5 3}
 
-do_test 4.5.26.2 {
-  set myres {}
-  foreach r [db eval {SELECT avg(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN CURRENT ROW AND CURRENT ROW), 
-         avg(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
-  FROM ttt ORDER BY a}] {
-    lappend myres [format %.2f [set r]]
-  }
-  set myres
-} {1.00 2.00 2.00 3.00 3.00 4.00 2.00 2.00 3.00 3.00 4.00 4.00 3.00 2.00 4.00 3.00 5.00 4.00}
+do_execsql_test 4.5.26.2 {
+  SELECT sum(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN CURRENT ROW AND CURRENT ROW), 
+         sum(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
+  FROM ttt ORDER BY a
+} {1 6   2 9   3 12   2 6   3 9   4 12   3 6   4 9   5 12}
 
 do_execsql_test 4.5.27.1 {
   SELECT max(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN CURRENT ROW AND CURRENT ROW), 
@@ -669,15 +565,11 @@ do_execsql_test 4.5.27.1 {
   FROM ttt ORDER BY a
 } {1 1   2 2   3 3   2 2   3 3   4 4   3 3   4 4   5 5}
 
-do_test 4.5.27.2 {
-  set myres {}
-  foreach r [db eval {SELECT avg(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN CURRENT ROW AND CURRENT ROW), 
-         avg(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN CURRENT ROW AND CURRENT ROW)
-  FROM ttt ORDER BY a}] {
-    lappend myres [format %.2f [set r]]
-  }
-  set myres
-} {1.00 1.00 2.00 2.00 3.00 3.00 2.00 2.00 3.00 3.00 4.00 4.00 3.00 3.00 4.00 4.00 5.00 5.00}
+do_execsql_test 4.5.27.2 {
+  SELECT sum(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN CURRENT ROW AND CURRENT ROW), 
+         sum(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN CURRENT ROW AND CURRENT ROW)
+  FROM ttt ORDER BY a
+} {1 1   2 2   3 3   2 2   3 3   4 4   3 3   4 4   5 5}
 
 do_execsql_test 4.5.28.1 {
   SELECT max(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN CURRENT ROW AND CURRENT ROW), 
@@ -685,15 +577,11 @@ do_execsql_test 4.5.28.1 {
   FROM ttt ORDER BY a
 } {1 1   2 2   3 3   2 2   3 3   4 4   3 3   4 4   5 5}
 
-do_test 4.5.28.2 {
-  set myres {}
-  foreach r [db eval {SELECT avg(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN CURRENT ROW AND CURRENT ROW), 
-         avg(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING)
-  FROM ttt ORDER BY a}] {
-    lappend myres [format %.2f [set r]]
-  }
-  set myres
-} {1.00 2.00 2.00 3.00 3.00 4.00 2.00 2.50 3.00 3.50 4.00 4.50 3.00 3.00 4.00 4.00 5.00 5.00}
+do_execsql_test 4.5.28.2 {
+  SELECT sum(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN CURRENT ROW AND CURRENT ROW), 
+         sum(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING)
+  FROM ttt ORDER BY a
+} {1 6   2 9   3 12   2 5   3 7   4 9   3 3   4 4   5 5}
 
 do_execsql_test 4.5.29.1 {
   SELECT max(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING), 
@@ -701,15 +589,11 @@ do_execsql_test 4.5.29.1 {
   FROM ttt ORDER BY a
 } {3 1   4 2   5 3   3 1   4 2   5 3   3 1   4 2   5 3}
 
-do_test 4.5.29.2 {
-  set myres {}
-  foreach r [db eval {SELECT avg(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING), 
-         avg(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
-  FROM ttt ORDER BY a}] {
-    lappend myres [format %.2f [set r]]
-  }
-  set myres
-} {2.00 1.00 3.00 2.00 4.00 3.00 2.50 1.50 3.50 2.50 4.50 3.50 3.00 2.00 4.00 3.00 5.00 4.00}
+do_execsql_test 4.5.29.2 {
+  SELECT sum(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING), 
+         sum(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
+  FROM ttt ORDER BY a
+} {6 1   9 2   12 3   5 3   7 5   9 7   3 6   4 9   5 12}
 
 do_execsql_test 4.5.30.1 {
   SELECT max(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING), 
@@ -717,15 +601,11 @@ do_execsql_test 4.5.30.1 {
   FROM ttt ORDER BY a
 } {3 1   4 2   5 3   3 1   4 2   5 3   3 1   4 2   5 3}
 
-do_test 4.5.30.2 {
-  set myres {}
-  foreach r [db eval {SELECT avg(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING), 
-         avg(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
-  FROM ttt ORDER BY a}] {
-    lappend myres [format %.2f [set r]]
-  }
-  set myres
-} {2.00 2.00 3.00 3.00 4.00 4.00 2.50 2.00 3.50 3.00 4.50 4.00 3.00 2.00 4.00 3.00 5.00 4.00}
+do_execsql_test 4.5.30.2 {
+  SELECT sum(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING), 
+         sum(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
+  FROM ttt ORDER BY a
+} {6 6   9 9   12 12   5 6   7 9   9 12   3 6   4 9   5 12}
 
 do_execsql_test 4.5.31.1 {
   SELECT max(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING), 
@@ -733,15 +613,11 @@ do_execsql_test 4.5.31.1 {
   FROM ttt ORDER BY a
 } {3 1   4 2   5 3   3 2   4 3   5 4   3 3   4 4   5 5}
 
-do_test 4.5.31.2 {
-  set myres {}
-  foreach r [db eval {SELECT avg(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING), 
-         avg(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN CURRENT ROW AND CURRENT ROW)
-  FROM ttt ORDER BY a}] {
-    lappend myres [format %.2f [set r]]
-  }
-  set myres
-} {2.00 1.00 3.00 2.00 4.00 3.00 2.50 2.00 3.50 3.00 4.50 4.00 3.00 3.00 4.00 4.00 5.00 5.00}
+do_execsql_test 4.5.31.2 {
+  SELECT sum(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING), 
+         sum(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN CURRENT ROW AND CURRENT ROW)
+  FROM ttt ORDER BY a
+} {6 1   9 2   12 3   5 2   7 3   9 4   3 3   4 4   5 5}
 
 do_execsql_test 4.5.32.1 {
   SELECT max(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING), 
@@ -749,270 +625,502 @@ do_execsql_test 4.5.32.1 {
   FROM ttt ORDER BY a
 } {3 1   4 2   5 3   3 2   4 3   5 4   3 3   4 4   5 5}
 
-do_test 4.5.32.2 {
-  set myres {}
-  foreach r [db eval {SELECT avg(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING), 
-         avg(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING)
-  FROM ttt ORDER BY a}] {
-    lappend myres [format %.2f [set r]]
-  }
-  set myres
-} {2.00 2.00 3.00 3.00 4.00 4.00 2.50 2.50 3.50 3.50 4.50 4.50 3.00 3.00 4.00 4.00 5.00 5.00}
+do_execsql_test 4.5.32.2 {
+  SELECT sum(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING), 
+         sum(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING)
+  FROM ttt ORDER BY a
+} {6 6   9 9   12 12   5 5   7 7   9 9   3 3   4 4   5 5}
 
 do_execsql_test 4.5.33.1 {
+  SELECT max(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 3 PRECEDING AND 1 FOLLOWING), 
+  min(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 3 PRECEDING AND 1 FOLLOWING)
+  FROM ttt ORDER BY a
+} {2 1   3 2   4 3   3 1   4 2   5 3   3 1   4 2   5 3}
+
+do_execsql_test 4.5.33.2 {
+  SELECT sum(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 3 PRECEDING AND 1 FOLLOWING), 
+         sum(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 3 PRECEDING AND 1 FOLLOWING)
+  FROM ttt ORDER BY a
+} {3 3   5 5   7 7   6 6   9 9   12 12   6 6   9 9   12 12}
+
+do_execsql_test 4.5.34.1 {
+  SELECT max(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 3 PRECEDING AND 1 FOLLOWING), 
+  min(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 3 PRECEDING AND 2 FOLLOWING)
+  FROM ttt ORDER BY a
+} {2 1   3 2   4 3   3 1   4 2   5 3   3 1   4 2   5 3}
+
+do_execsql_test 4.5.34.2 {
+  SELECT sum(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 3 PRECEDING AND 1 FOLLOWING), 
+         sum(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 3 PRECEDING AND 2 FOLLOWING)
+  FROM ttt ORDER BY a
+} {3 6   5 9   7 12   6 6   9 9   12 12   6 6   9 9   12 12}
+
+do_execsql_test 4.5.35.1 {
+  SELECT max(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 3 PRECEDING AND 1 FOLLOWING), 
+  min(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING)
+  FROM ttt ORDER BY a
+} {2 {}   3 {}   4 {}   3 1   4 2   5 3   3 2   4 3   5 4}
+
+do_execsql_test 4.5.35.2 {
+  SELECT sum(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 3 PRECEDING AND 1 FOLLOWING), 
+         sum(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING)
+  FROM ttt ORDER BY a
+} {3 {}   5 {}   7 {}   6 1   9 2   12 3   6 2   9 3   12 4}
+
+do_execsql_test 4.5.36.1 {
+  SELECT max(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 3 PRECEDING AND 1 FOLLOWING), 
+  min(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 0 PRECEDING AND 1 PRECEDING)
+  FROM ttt ORDER BY a
+} {2 {}   3 {}   4 {}   3 {}   4 {}   5 {}   3 {}   4 {}   5 {}}
+
+do_execsql_test 4.5.36.2 {
+  SELECT sum(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 3 PRECEDING AND 1 FOLLOWING), 
+         sum(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 0 PRECEDING AND 1 PRECEDING)
+  FROM ttt ORDER BY a
+} {3 {}   5 {}   7 {}   6 {}   9 {}   12 {}   6 {}   9 {}   12 {}}
+
+do_execsql_test 4.5.37.1 {
+  SELECT max(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 3 PRECEDING AND 1 FOLLOWING), 
+  min(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 1 FOLLOWING AND 500 FOLLOWING)
+  FROM ttt ORDER BY a
+} {2 2   3 3   4 4   3 3   4 4   5 5   3 {}   4 {}   5 {}}
+
+do_execsql_test 4.5.37.2 {
+  SELECT sum(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 3 PRECEDING AND 1 FOLLOWING), 
+         sum(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 1 FOLLOWING AND 500 FOLLOWING)
+  FROM ttt ORDER BY a
+} {3 5   5 7   7 9   6 3   9 4   12 5   6 {}   9 {}   12 {}}
+
+do_execsql_test 4.5.38.1 {
+  SELECT max(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 3 PRECEDING AND 2 FOLLOWING), 
+  min(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 3 PRECEDING AND 1 FOLLOWING)
+  FROM ttt ORDER BY a
+} {3 1   4 2   5 3   3 1   4 2   5 3   3 1   4 2   5 3}
+
+do_execsql_test 4.5.38.2 {
+  SELECT sum(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 3 PRECEDING AND 2 FOLLOWING), 
+         sum(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 3 PRECEDING AND 1 FOLLOWING)
+  FROM ttt ORDER BY a
+} {6 3   9 5   12 7   6 6   9 9   12 12   6 6   9 9   12 12}
+
+do_execsql_test 4.5.39.1 {
+  SELECT max(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 3 PRECEDING AND 2 FOLLOWING), 
+  min(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 3 PRECEDING AND 2 FOLLOWING)
+  FROM ttt ORDER BY a
+} {3 1   4 2   5 3   3 1   4 2   5 3   3 1   4 2   5 3}
+
+do_execsql_test 4.5.39.2 {
+  SELECT sum(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 3 PRECEDING AND 2 FOLLOWING), 
+         sum(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 3 PRECEDING AND 2 FOLLOWING)
+  FROM ttt ORDER BY a
+} {6 6   9 9   12 12   6 6   9 9   12 12   6 6   9 9   12 12}
+
+do_execsql_test 4.5.40.1 {
+  SELECT max(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 3 PRECEDING AND 2 FOLLOWING), 
+  min(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING)
+  FROM ttt ORDER BY a
+} {3 {}   4 {}   5 {}   3 1   4 2   5 3   3 2   4 3   5 4}
+
+do_execsql_test 4.5.40.2 {
+  SELECT sum(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 3 PRECEDING AND 2 FOLLOWING), 
+         sum(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING)
+  FROM ttt ORDER BY a
+} {6 {}   9 {}   12 {}   6 1   9 2   12 3   6 2   9 3   12 4}
+
+do_execsql_test 4.5.41.1 {
+  SELECT max(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 3 PRECEDING AND 2 FOLLOWING), 
+  min(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 0 PRECEDING AND 1 PRECEDING)
+  FROM ttt ORDER BY a
+} {3 {}   4 {}   5 {}   3 {}   4 {}   5 {}   3 {}   4 {}   5 {}}
+
+do_execsql_test 4.5.41.2 {
+  SELECT sum(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 3 PRECEDING AND 2 FOLLOWING), 
+         sum(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 0 PRECEDING AND 1 PRECEDING)
+  FROM ttt ORDER BY a
+} {6 {}   9 {}   12 {}   6 {}   9 {}   12 {}   6 {}   9 {}   12 {}}
+
+do_execsql_test 4.5.42.1 {
+  SELECT max(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 3 PRECEDING AND 2 FOLLOWING), 
+  min(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 1 FOLLOWING AND 500 FOLLOWING)
+  FROM ttt ORDER BY a
+} {3 2   4 3   5 4   3 3   4 4   5 5   3 {}   4 {}   5 {}}
+
+do_execsql_test 4.5.42.2 {
+  SELECT sum(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 3 PRECEDING AND 2 FOLLOWING), 
+         sum(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 1 FOLLOWING AND 500 FOLLOWING)
+  FROM ttt ORDER BY a
+} {6 5   9 7   12 9   6 3   9 4   12 5   6 {}   9 {}   12 {}}
+
+do_execsql_test 4.5.43.1 {
+  SELECT max(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING), 
+  min(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 3 PRECEDING AND 1 FOLLOWING)
+  FROM ttt ORDER BY a
+} {{} 1   {} 2   {} 3   1 1   2 2   3 3   2 1   3 2   4 3}
+
+do_execsql_test 4.5.43.2 {
+  SELECT sum(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING), 
+         sum(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 3 PRECEDING AND 1 FOLLOWING)
+  FROM ttt ORDER BY a
+} {{} 3   {} 5   {} 7   1 6   2 9   3 12   2 6   3 9   4 12}
+
+do_execsql_test 4.5.44.1 {
+  SELECT max(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING), 
+  min(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 3 PRECEDING AND 2 FOLLOWING)
+  FROM ttt ORDER BY a
+} {{} 1   {} 2   {} 3   1 1   2 2   3 3   2 1   3 2   4 3}
+
+do_execsql_test 4.5.44.2 {
+  SELECT sum(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING), 
+         sum(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 3 PRECEDING AND 2 FOLLOWING)
+  FROM ttt ORDER BY a
+} {{} 6   {} 9   {} 12   1 6   2 9   3 12   2 6   3 9   4 12}
+
+do_execsql_test 4.5.45.1 {
+  SELECT max(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING), 
+  min(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING)
+  FROM ttt ORDER BY a
+} {{} {}   {} {}   {} {}   1 1   2 2   3 3   2 2   3 3   4 4}
+
+do_execsql_test 4.5.45.2 {
+  SELECT sum(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING), 
+         sum(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING)
+  FROM ttt ORDER BY a
+} {{} {}   {} {}   {} {}   1 1   2 2   3 3   2 2   3 3   4 4}
+
+do_execsql_test 4.5.46.1 {
+  SELECT max(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING), 
+  min(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 0 PRECEDING AND 1 PRECEDING)
+  FROM ttt ORDER BY a
+} {{} {}   {} {}   {} {}   1 {}   2 {}   3 {}   2 {}   3 {}   4 {}}
+
+do_execsql_test 4.5.46.2 {
+  SELECT sum(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING), 
+         sum(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 0 PRECEDING AND 1 PRECEDING)
+  FROM ttt ORDER BY a
+} {{} {}   {} {}   {} {}   1 {}   2 {}   3 {}   2 {}   3 {}   4 {}}
+
+do_execsql_test 4.5.47.1 {
+  SELECT max(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING), 
+  min(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 1 FOLLOWING AND 500 FOLLOWING)
+  FROM ttt ORDER BY a
+} {{} 2   {} 3   {} 4   1 3   2 4   3 5   2 {}   3 {}   4 {}}
+
+do_execsql_test 4.5.47.2 {
+  SELECT sum(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING), 
+         sum(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 1 FOLLOWING AND 500 FOLLOWING)
+  FROM ttt ORDER BY a
+} {{} 5   {} 7   {} 9   1 3   2 4   3 5   2 {}   3 {}   4 {}}
+
+do_execsql_test 4.5.48.1 {
+  SELECT max(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 0 PRECEDING AND 1 PRECEDING), 
+  min(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 3 PRECEDING AND 1 FOLLOWING)
+  FROM ttt ORDER BY a
+} {{} 1   {} 2   {} 3   {} 1   {} 2   {} 3   {} 1   {} 2   {} 3}
+
+do_execsql_test 4.5.48.2 {
+  SELECT sum(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 0 PRECEDING AND 1 PRECEDING), 
+         sum(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 3 PRECEDING AND 1 FOLLOWING)
+  FROM ttt ORDER BY a
+} {{} 3   {} 5   {} 7   {} 6   {} 9   {} 12   {} 6   {} 9   {} 12}
+
+do_execsql_test 4.5.49.1 {
+  SELECT max(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 0 PRECEDING AND 1 PRECEDING), 
+  min(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 3 PRECEDING AND 2 FOLLOWING)
+  FROM ttt ORDER BY a
+} {{} 1   {} 2   {} 3   {} 1   {} 2   {} 3   {} 1   {} 2   {} 3}
+
+do_execsql_test 4.5.49.2 {
+  SELECT sum(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 0 PRECEDING AND 1 PRECEDING), 
+         sum(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 3 PRECEDING AND 2 FOLLOWING)
+  FROM ttt ORDER BY a
+} {{} 6   {} 9   {} 12   {} 6   {} 9   {} 12   {} 6   {} 9   {} 12}
+
+do_execsql_test 4.5.50.1 {
+  SELECT max(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 0 PRECEDING AND 1 PRECEDING), 
+  min(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING)
+  FROM ttt ORDER BY a
+} {{} {}   {} {}   {} {}   {} 1   {} 2   {} 3   {} 2   {} 3   {} 4}
+
+do_execsql_test 4.5.50.2 {
+  SELECT sum(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 0 PRECEDING AND 1 PRECEDING), 
+         sum(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING)
+  FROM ttt ORDER BY a
+} {{} {}   {} {}   {} {}   {} 1   {} 2   {} 3   {} 2   {} 3   {} 4}
+
+do_execsql_test 4.5.51.1 {
+  SELECT max(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 0 PRECEDING AND 1 PRECEDING), 
+  min(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 0 PRECEDING AND 1 PRECEDING)
+  FROM ttt ORDER BY a
+} {{} {}   {} {}   {} {}   {} {}   {} {}   {} {}   {} {}   {} {}   {} {}}
+
+do_execsql_test 4.5.51.2 {
+  SELECT sum(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 0 PRECEDING AND 1 PRECEDING), 
+         sum(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 0 PRECEDING AND 1 PRECEDING)
+  FROM ttt ORDER BY a
+} {{} {}   {} {}   {} {}   {} {}   {} {}   {} {}   {} {}   {} {}   {} {}}
+
+do_execsql_test 4.5.52.1 {
+  SELECT max(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 0 PRECEDING AND 1 PRECEDING), 
+  min(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 1 FOLLOWING AND 500 FOLLOWING)
+  FROM ttt ORDER BY a
+} {{} 2   {} 3   {} 4   {} 3   {} 4   {} 5   {} {}   {} {}   {} {}}
+
+do_execsql_test 4.5.52.2 {
+  SELECT sum(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 0 PRECEDING AND 1 PRECEDING), 
+         sum(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 1 FOLLOWING AND 500 FOLLOWING)
+  FROM ttt ORDER BY a
+} {{} 5   {} 7   {} 9   {} 3   {} 4   {} 5   {} {}   {} {}   {} {}}
+
+do_execsql_test 4.5.53.1 {
+  SELECT max(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 1 FOLLOWING AND 500 FOLLOWING), 
+  min(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 3 PRECEDING AND 1 FOLLOWING)
+  FROM ttt ORDER BY a
+} {3 1   4 2   5 3   3 1   4 2   5 3   {} 1   {} 2   {} 3}
+
+do_execsql_test 4.5.53.2 {
+  SELECT sum(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 1 FOLLOWING AND 500 FOLLOWING), 
+         sum(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 3 PRECEDING AND 1 FOLLOWING)
+  FROM ttt ORDER BY a
+} {5 3   7 5   9 7   3 6   4 9   5 12   {} 6   {} 9   {} 12}
+
+do_execsql_test 4.5.54.1 {
+  SELECT max(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 1 FOLLOWING AND 500 FOLLOWING), 
+  min(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 3 PRECEDING AND 2 FOLLOWING)
+  FROM ttt ORDER BY a
+} {3 1   4 2   5 3   3 1   4 2   5 3   {} 1   {} 2   {} 3}
+
+do_execsql_test 4.5.54.2 {
+  SELECT sum(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 1 FOLLOWING AND 500 FOLLOWING), 
+         sum(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 3 PRECEDING AND 2 FOLLOWING)
+  FROM ttt ORDER BY a
+} {5 6   7 9   9 12   3 6   4 9   5 12   {} 6   {} 9   {} 12}
+
+do_execsql_test 4.5.55.1 {
+  SELECT max(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 1 FOLLOWING AND 500 FOLLOWING), 
+  min(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING)
+  FROM ttt ORDER BY a
+} {3 {}   4 {}   5 {}   3 1   4 2   5 3   {} 2   {} 3   {} 4}
+
+do_execsql_test 4.5.55.2 {
+  SELECT sum(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 1 FOLLOWING AND 500 FOLLOWING), 
+         sum(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING)
+  FROM ttt ORDER BY a
+} {5 {}   7 {}   9 {}   3 1   4 2   5 3   {} 2   {} 3   {} 4}
+
+do_execsql_test 4.5.56.1 {
+  SELECT max(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 1 FOLLOWING AND 500 FOLLOWING), 
+  min(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 0 PRECEDING AND 1 PRECEDING)
+  FROM ttt ORDER BY a
+} {3 {}   4 {}   5 {}   3 {}   4 {}   5 {}   {} {}   {} {}   {} {}}
+
+do_execsql_test 4.5.56.2 {
+  SELECT sum(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 1 FOLLOWING AND 500 FOLLOWING), 
+         sum(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 0 PRECEDING AND 1 PRECEDING)
+  FROM ttt ORDER BY a
+} {5 {}   7 {}   9 {}   3 {}   4 {}   5 {}   {} {}   {} {}   {} {}}
+
+do_execsql_test 4.5.57.1 {
+  SELECT max(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 1 FOLLOWING AND 500 FOLLOWING), 
+  min(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 1 FOLLOWING AND 500 FOLLOWING)
+  FROM ttt ORDER BY a
+} {3 2   4 3   5 4   3 3   4 4   5 5   {} {}   {} {}   {} {}}
+
+do_execsql_test 4.5.57.2 {
+  SELECT sum(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 1 FOLLOWING AND 500 FOLLOWING), 
+         sum(c) OVER (PARTITION BY b ORDER BY a ROWS BETWEEN 1 FOLLOWING AND 500 FOLLOWING)
+  FROM ttt ORDER BY a
+} {5 5   7 7   9 9   3 3   4 4   5 5   {} {}   {} {}   {} {}}
+
+do_execsql_test 4.5.58.1 {
   SELECT max(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), 
   min(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
   FROM ttt ORDER BY a
 } {1 1   2 2   3 3   2 1   3 2   4 3   3 1   4 2   5 3}
 
-do_test 4.5.33.2 {
-  set myres {}
-  foreach r [db eval {SELECT avg(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), 
-         avg(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
-  FROM ttt ORDER BY a}] {
-    lappend myres [format %.2f [set r]]
-  }
-  set myres
-} {1.00 1.00 2.00 2.00 3.00 3.00 1.50 1.50 2.50 2.50 3.50 3.50 2.00 2.00 3.00 3.00 4.00 4.00}
+do_execsql_test 4.5.58.2 {
+  SELECT sum(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), 
+         sum(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
+  FROM ttt ORDER BY a
+} {1 1   2 2   3 3   3 3   5 5   7 7   6 6   9 9   12 12}
 
-do_execsql_test 4.5.34.1 {
+do_execsql_test 4.5.59.1 {
   SELECT max(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), 
   min(c) OVER (PARTITION BY b ORDER BY a DESC RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
   FROM ttt ORDER BY a
 } {1 1   2 2   3 3   2 2   3 3   4 4   3 3   4 4   5 5}
 
-do_test 4.5.34.2 {
-  set myres {}
-  foreach r [db eval {SELECT avg(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), 
-         avg(c) OVER (PARTITION BY b ORDER BY a DESC RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
-  FROM ttt ORDER BY a}] {
-    lappend myres [format %.2f [set r]]
-  }
-  set myres
-} {1.00 2.00 2.00 3.00 3.00 4.00 1.50 2.50 2.50 3.50 3.50 4.50 2.00 3.00 3.00 4.00 4.00 5.00}
+do_execsql_test 4.5.59.2 {
+  SELECT sum(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), 
+         sum(c) OVER (PARTITION BY b ORDER BY a DESC RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
+  FROM ttt ORDER BY a
+} {1 6   2 9   3 12   3 5   5 7   7 9   6 3   9 4   12 5}
 
-do_execsql_test 4.5.35.1 {
+do_execsql_test 4.5.60.1 {
   SELECT max(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), 
   min(c) OVER (PARTITION BY b  RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
   FROM ttt ORDER BY a
 } {1 1   2 2   3 3   2 1   3 2   4 3   3 1   4 2   5 3}
 
-do_test 4.5.35.2 {
-  set myres {}
-  foreach r [db eval {SELECT avg(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), 
-         avg(c) OVER (PARTITION BY b  RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
-  FROM ttt ORDER BY a}] {
-    lappend myres [format %.2f [set r]]
-  }
-  set myres
-} {1.00 2.00 2.00 3.00 3.00 4.00 1.50 2.00 2.50 3.00 3.50 4.00 2.00 2.00 3.00 3.00 4.00 4.00}
+do_execsql_test 4.5.60.2 {
+  SELECT sum(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), 
+         sum(c) OVER (PARTITION BY b  RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
+  FROM ttt ORDER BY a
+} {1 6   2 9   3 12   3 6   5 9   7 12   6 6   9 9   12 12}
 
-do_execsql_test 4.5.36.1 {
+do_execsql_test 4.5.61.1 {
   SELECT max(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), 
   min(c) OVER (PARTITION BY b ORDER BY b, a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
   FROM ttt ORDER BY a
 } {1 1   2 2   3 3   2 1   3 2   4 3   3 1   4 2   5 3}
 
-do_test 4.5.36.2 {
-  set myres {}
-  foreach r [db eval {SELECT avg(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), 
-         avg(c) OVER (PARTITION BY b ORDER BY b, a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
-  FROM ttt ORDER BY a}] {
-    lappend myres [format %.2f [set r]]
-  }
-  set myres
-} {1.00 1.00 2.00 2.00 3.00 3.00 1.50 1.50 2.50 2.50 3.50 3.50 2.00 2.00 3.00 3.00 4.00 4.00}
+do_execsql_test 4.5.61.2 {
+  SELECT sum(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), 
+         sum(c) OVER (PARTITION BY b ORDER BY b, a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
+  FROM ttt ORDER BY a
+} {1 1   2 2   3 3   3 3   5 5   7 7   6 6   9 9   12 12}
 
-do_execsql_test 4.5.37.1 {
+do_execsql_test 4.5.62.1 {
   SELECT max(c) OVER (PARTITION BY b ORDER BY a DESC RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), 
   min(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
   FROM ttt ORDER BY a
 } {3 1   4 2   5 3   3 1   4 2   5 3   3 1   4 2   5 3}
 
-do_test 4.5.37.2 {
-  set myres {}
-  foreach r [db eval {SELECT avg(c) OVER (PARTITION BY b ORDER BY a DESC RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), 
-         avg(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
-  FROM ttt ORDER BY a}] {
-    lappend myres [format %.2f [set r]]
-  }
-  set myres
-} {2.00 1.00 3.00 2.00 4.00 3.00 2.50 1.50 3.50 2.50 4.50 3.50 3.00 2.00 4.00 3.00 5.00 4.00}
+do_execsql_test 4.5.62.2 {
+  SELECT sum(c) OVER (PARTITION BY b ORDER BY a DESC RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), 
+         sum(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
+  FROM ttt ORDER BY a
+} {6 1   9 2   12 3   5 3   7 5   9 7   3 6   4 9   5 12}
 
-do_execsql_test 4.5.38.1 {
+do_execsql_test 4.5.63.1 {
   SELECT max(c) OVER (PARTITION BY b ORDER BY a DESC RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), 
   min(c) OVER (PARTITION BY b ORDER BY a DESC RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
   FROM ttt ORDER BY a
 } {3 1   4 2   5 3   3 2   4 3   5 4   3 3   4 4   5 5}
 
-do_test 4.5.38.2 {
-  set myres {}
-  foreach r [db eval {SELECT avg(c) OVER (PARTITION BY b ORDER BY a DESC RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), 
-         avg(c) OVER (PARTITION BY b ORDER BY a DESC RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
-  FROM ttt ORDER BY a}] {
-    lappend myres [format %.2f [set r]]
-  }
-  set myres
-} {2.00 2.00 3.00 3.00 4.00 4.00 2.50 2.50 3.50 3.50 4.50 4.50 3.00 3.00 4.00 4.00 5.00 5.00}
+do_execsql_test 4.5.63.2 {
+  SELECT sum(c) OVER (PARTITION BY b ORDER BY a DESC RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), 
+         sum(c) OVER (PARTITION BY b ORDER BY a DESC RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
+  FROM ttt ORDER BY a
+} {6 6   9 9   12 12   5 5   7 7   9 9   3 3   4 4   5 5}
 
-do_execsql_test 4.5.39.1 {
+do_execsql_test 4.5.64.1 {
   SELECT max(c) OVER (PARTITION BY b ORDER BY a DESC RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), 
   min(c) OVER (PARTITION BY b  RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
   FROM ttt ORDER BY a
 } {3 1   4 2   5 3   3 1   4 2   5 3   3 1   4 2   5 3}
 
-do_test 4.5.39.2 {
-  set myres {}
-  foreach r [db eval {SELECT avg(c) OVER (PARTITION BY b ORDER BY a DESC RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), 
-         avg(c) OVER (PARTITION BY b  RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
-  FROM ttt ORDER BY a}] {
-    lappend myres [format %.2f [set r]]
-  }
-  set myres
-} {2.00 2.00 3.00 3.00 4.00 4.00 2.50 2.00 3.50 3.00 4.50 4.00 3.00 2.00 4.00 3.00 5.00 4.00}
+do_execsql_test 4.5.64.2 {
+  SELECT sum(c) OVER (PARTITION BY b ORDER BY a DESC RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), 
+         sum(c) OVER (PARTITION BY b  RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
+  FROM ttt ORDER BY a
+} {6 6   9 9   12 12   5 6   7 9   9 12   3 6   4 9   5 12}
 
-do_execsql_test 4.5.40.1 {
+do_execsql_test 4.5.65.1 {
   SELECT max(c) OVER (PARTITION BY b ORDER BY a DESC RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), 
   min(c) OVER (PARTITION BY b ORDER BY b, a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
   FROM ttt ORDER BY a
 } {3 1   4 2   5 3   3 1   4 2   5 3   3 1   4 2   5 3}
 
-do_test 4.5.40.2 {
-  set myres {}
-  foreach r [db eval {SELECT avg(c) OVER (PARTITION BY b ORDER BY a DESC RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), 
-         avg(c) OVER (PARTITION BY b ORDER BY b, a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
-  FROM ttt ORDER BY a}] {
-    lappend myres [format %.2f [set r]]
-  }
-  set myres
-} {2.00 1.00 3.00 2.00 4.00 3.00 2.50 1.50 3.50 2.50 4.50 3.50 3.00 2.00 4.00 3.00 5.00 4.00}
+do_execsql_test 4.5.65.2 {
+  SELECT sum(c) OVER (PARTITION BY b ORDER BY a DESC RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), 
+         sum(c) OVER (PARTITION BY b ORDER BY b, a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
+  FROM ttt ORDER BY a
+} {6 1   9 2   12 3   5 3   7 5   9 7   3 6   4 9   5 12}
 
-do_execsql_test 4.5.41.1 {
+do_execsql_test 4.5.66.1 {
   SELECT max(c) OVER (PARTITION BY b  RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), 
   min(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
   FROM ttt ORDER BY a
 } {3 1   4 2   5 3   3 1   4 2   5 3   3 1   4 2   5 3}
 
-do_test 4.5.41.2 {
-  set myres {}
-  foreach r [db eval {SELECT avg(c) OVER (PARTITION BY b  RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), 
-         avg(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
-  FROM ttt ORDER BY a}] {
-    lappend myres [format %.2f [set r]]
-  }
-  set myres
-} {2.00 1.00 3.00 2.00 4.00 3.00 2.00 1.50 3.00 2.50 4.00 3.50 2.00 2.00 3.00 3.00 4.00 4.00}
+do_execsql_test 4.5.66.2 {
+  SELECT sum(c) OVER (PARTITION BY b  RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), 
+         sum(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
+  FROM ttt ORDER BY a
+} {6 1   9 2   12 3   6 3   9 5   12 7   6 6   9 9   12 12}
 
-do_execsql_test 4.5.42.1 {
+do_execsql_test 4.5.67.1 {
   SELECT max(c) OVER (PARTITION BY b  RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), 
   min(c) OVER (PARTITION BY b ORDER BY a DESC RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
   FROM ttt ORDER BY a
 } {3 1   4 2   5 3   3 2   4 3   5 4   3 3   4 4   5 5}
 
-do_test 4.5.42.2 {
-  set myres {}
-  foreach r [db eval {SELECT avg(c) OVER (PARTITION BY b  RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), 
-         avg(c) OVER (PARTITION BY b ORDER BY a DESC RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
-  FROM ttt ORDER BY a}] {
-    lappend myres [format %.2f [set r]]
-  }
-  set myres
-} {2.00 2.00 3.00 3.00 4.00 4.00 2.00 2.50 3.00 3.50 4.00 4.50 2.00 3.00 3.00 4.00 4.00 5.00}
+do_execsql_test 4.5.67.2 {
+  SELECT sum(c) OVER (PARTITION BY b  RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), 
+         sum(c) OVER (PARTITION BY b ORDER BY a DESC RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
+  FROM ttt ORDER BY a
+} {6 6   9 9   12 12   6 5   9 7   12 9   6 3   9 4   12 5}
 
-do_execsql_test 4.5.43.1 {
+do_execsql_test 4.5.68.1 {
   SELECT max(c) OVER (PARTITION BY b  RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), 
   min(c) OVER (PARTITION BY b  RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
   FROM ttt ORDER BY a
 } {3 1   4 2   5 3   3 1   4 2   5 3   3 1   4 2   5 3}
 
-do_test 4.5.43.2 {
-  set myres {}
-  foreach r [db eval {SELECT avg(c) OVER (PARTITION BY b  RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), 
-         avg(c) OVER (PARTITION BY b  RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
-  FROM ttt ORDER BY a}] {
-    lappend myres [format %.2f [set r]]
-  }
-  set myres
-} {2.00 2.00 3.00 3.00 4.00 4.00 2.00 2.00 3.00 3.00 4.00 4.00 2.00 2.00 3.00 3.00 4.00 4.00}
+do_execsql_test 4.5.68.2 {
+  SELECT sum(c) OVER (PARTITION BY b  RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), 
+         sum(c) OVER (PARTITION BY b  RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
+  FROM ttt ORDER BY a
+} {6 6   9 9   12 12   6 6   9 9   12 12   6 6   9 9   12 12}
 
-do_execsql_test 4.5.44.1 {
+do_execsql_test 4.5.69.1 {
   SELECT max(c) OVER (PARTITION BY b  RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), 
   min(c) OVER (PARTITION BY b ORDER BY b, a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
   FROM ttt ORDER BY a
 } {3 1   4 2   5 3   3 1   4 2   5 3   3 1   4 2   5 3}
 
-do_test 4.5.44.2 {
-  set myres {}
-  foreach r [db eval {SELECT avg(c) OVER (PARTITION BY b  RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), 
-         avg(c) OVER (PARTITION BY b ORDER BY b, a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
-  FROM ttt ORDER BY a}] {
-    lappend myres [format %.2f [set r]]
-  }
-  set myres
-} {2.00 1.00 3.00 2.00 4.00 3.00 2.00 1.50 3.00 2.50 4.00 3.50 2.00 2.00 3.00 3.00 4.00 4.00}
+do_execsql_test 4.5.69.2 {
+  SELECT sum(c) OVER (PARTITION BY b  RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), 
+         sum(c) OVER (PARTITION BY b ORDER BY b, a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
+  FROM ttt ORDER BY a
+} {6 1   9 2   12 3   6 3   9 5   12 7   6 6   9 9   12 12}
 
-do_execsql_test 4.5.45.1 {
+do_execsql_test 4.5.70.1 {
   SELECT max(c) OVER (PARTITION BY b ORDER BY b, a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), 
   min(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
   FROM ttt ORDER BY a
 } {1 1   2 2   3 3   2 1   3 2   4 3   3 1   4 2   5 3}
 
-do_test 4.5.45.2 {
-  set myres {}
-  foreach r [db eval {SELECT avg(c) OVER (PARTITION BY b ORDER BY b, a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), 
-         avg(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
-  FROM ttt ORDER BY a}] {
-    lappend myres [format %.2f [set r]]
-  }
-  set myres
-} {1.00 1.00 2.00 2.00 3.00 3.00 1.50 1.50 2.50 2.50 3.50 3.50 2.00 2.00 3.00 3.00 4.00 4.00}
+do_execsql_test 4.5.70.2 {
+  SELECT sum(c) OVER (PARTITION BY b ORDER BY b, a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), 
+         sum(c) OVER (PARTITION BY b ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
+  FROM ttt ORDER BY a
+} {1 1   2 2   3 3   3 3   5 5   7 7   6 6   9 9   12 12}
 
-do_execsql_test 4.5.46.1 {
+do_execsql_test 4.5.71.1 {
   SELECT max(c) OVER (PARTITION BY b ORDER BY b, a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), 
   min(c) OVER (PARTITION BY b ORDER BY a DESC RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
   FROM ttt ORDER BY a
 } {1 1   2 2   3 3   2 2   3 3   4 4   3 3   4 4   5 5}
 
-do_test 4.5.46.2 {
-  set myres {}
-  foreach r [db eval {SELECT avg(c) OVER (PARTITION BY b ORDER BY b, a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), 
-         avg(c) OVER (PARTITION BY b ORDER BY a DESC RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
-  FROM ttt ORDER BY a}] {
-    lappend myres [format %.2f [set r]]
-  }
-  set myres
-} {1.00 2.00 2.00 3.00 3.00 4.00 1.50 2.50 2.50 3.50 3.50 4.50 2.00 3.00 3.00 4.00 4.00 5.00}
+do_execsql_test 4.5.71.2 {
+  SELECT sum(c) OVER (PARTITION BY b ORDER BY b, a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), 
+         sum(c) OVER (PARTITION BY b ORDER BY a DESC RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
+  FROM ttt ORDER BY a
+} {1 6   2 9   3 12   3 5   5 7   7 9   6 3   9 4   12 5}
 
-do_execsql_test 4.5.47.1 {
+do_execsql_test 4.5.72.1 {
   SELECT max(c) OVER (PARTITION BY b ORDER BY b, a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), 
   min(c) OVER (PARTITION BY b  RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
   FROM ttt ORDER BY a
 } {1 1   2 2   3 3   2 1   3 2   4 3   3 1   4 2   5 3}
 
-do_test 4.5.47.2 {
-  set myres {}
-  foreach r [db eval {SELECT avg(c) OVER (PARTITION BY b ORDER BY b, a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), 
-         avg(c) OVER (PARTITION BY b  RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
-  FROM ttt ORDER BY a}] {
-    lappend myres [format %.2f [set r]]
-  }
-  set myres
-} {1.00 2.00 2.00 3.00 3.00 4.00 1.50 2.00 2.50 3.00 3.50 4.00 2.00 2.00 3.00 3.00 4.00 4.00}
+do_execsql_test 4.5.72.2 {
+  SELECT sum(c) OVER (PARTITION BY b ORDER BY b, a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), 
+         sum(c) OVER (PARTITION BY b  RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
+  FROM ttt ORDER BY a
+} {1 6   2 9   3 12   3 6   5 9   7 12   6 6   9 9   12 12}
 
-do_execsql_test 4.5.48.1 {
+do_execsql_test 4.5.73.1 {
   SELECT max(c) OVER (PARTITION BY b ORDER BY b, a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), 
   min(c) OVER (PARTITION BY b ORDER BY b, a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
   FROM ttt ORDER BY a
 } {1 1   2 2   3 3   2 1   3 2   4 3   3 1   4 2   5 3}
 
-do_test 4.5.48.2 {
-  set myres {}
-  foreach r [db eval {SELECT avg(c) OVER (PARTITION BY b ORDER BY b, a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), 
-         avg(c) OVER (PARTITION BY b ORDER BY b, a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
-  FROM ttt ORDER BY a}] {
-    lappend myres [format %.2f [set r]]
-  }
-  set myres
-} {1.00 1.00 2.00 2.00 3.00 3.00 1.50 1.50 2.50 2.50 3.50 3.50 2.00 2.00 3.00 3.00 4.00 4.00}
+do_execsql_test 4.5.73.2 {
+  SELECT sum(c) OVER (PARTITION BY b ORDER BY b, a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), 
+         sum(c) OVER (PARTITION BY b ORDER BY b, a RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
+  FROM ttt ORDER BY a
+} {1 1   2 2   3 3   3 3   5 5   7 7   6 6   9 9   12 12}
 
 finish_test