]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Fix a corner-case floating-point rounding problem in the generate_series()
authordrh <>
Sat, 9 May 2026 12:03:14 +0000 (12:03 +0000)
committerdrh <>
Sat, 9 May 2026 12:03:14 +0000 (12:03 +0000)
virtual table, introduced by [c113e31b818d1677] and reported by
[forum:/info/6e6cf9054bea2b1d|forum post 6e6cf9054bea2b1d].

FossilOrigin-Name: ff56785674ebeb1d4bab66ba0827956a2728c8c14419f933d40dc0152efbd4f5

ext/misc/series.c
manifest
manifest.uuid
test/tabfunc01.test

index ac8f4597f00014ad88cecff8da529642ec5f1f60..49afc658db152e2f306c238d03a0f5e77c7e3598 100644 (file)
@@ -536,7 +536,7 @@ static int seriesFilter(
           if( r<(double)SMALLEST_INT64 ){
             iMin = SMALLEST_INT64;
           }else if( (idxNum & 0x0200)!=0 && r==seriesCeil(r) ){
-            iMin = (sqlite3_int64)seriesCeil(r+1.0);
+            iMin = (sqlite3_int64)seriesCeil(r)+1;
           }else{
             iMin = (sqlite3_int64)seriesCeil(r);
           }
@@ -557,7 +557,7 @@ static int seriesFilter(
           if( r>(double)LARGEST_INT64 ){
             iMax = LARGEST_INT64;
           }else if( (idxNum & 0x2000)!=0 && r==seriesFloor(r) ){
-            iMax = (sqlite3_int64)(r-1.0);
+            iMax = ((sqlite3_int64)r)-1;
           }else{
             iMax = (sqlite3_int64)seriesFloor(r);
           }
index e4e3687e8e26e319255c86dcf0ca2c97e3db0b3d..0cda20e597be2ccdbd383558714ee5ad8650ae04 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Remove\sunnecessary\sand\sincorrect\sassert()\sstatements\sin\sthe\snew\s%J\scode.
-D 2026-05-07T20:45:57.859
+C Fix\sa\scorner-case\sfloating-point\srounding\sproblem\sin\sthe\sgenerate_series()\nvirtual\stable,\sintroduced\sby\s[c113e31b818d1677]\sand\sreported\sby\n[forum:/info/6e6cf9054bea2b1d|forum\spost\s6e6cf9054bea2b1d].
+D 2026-05-09T12:03:14.046
 F .fossil-settings/binary-glob 61195414528fb3ea9693577e1980230d78a1f8b0a54c78cf1b9b24d0a409ed6a x
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
@@ -394,7 +394,7 @@ F ext/misc/regexp.c 9dada9e9aa91f0cc23e35429e5d1111f110cc201b4c8dcc49aa6d2fc4b2a
 F ext/misc/remember.c add730f0f7e7436cd15ea3fd6a90fd83c3f706ab44169f7f048438b7d6baa69c
 F ext/misc/rot13.c 51ac5f51e9d5fd811db58a9c23c628ad5f333c173f1fc53c8491a3603d38556c
 F ext/misc/scrub.c df54e202887e480bf9cd73168c9ac829e3b0211381b68b9809e0cb5bc1bdc2cf
-F ext/misc/series.c 9454c7ef27d3729432496f31caabc892aeee1c21377d403f681126d93c09d6e9
+F ext/misc/series.c 496f43bac9bad2ee2cea63fb5212036f30ad3003b4cd317d5c2d6f3ad7c7d264
 F ext/misc/sha1.c 8bf60344c11a525384c2efd1ae77f160b06be336db679effaadf292d4b41451c
 F ext/misc/shathree.c fd22d70620f86a0467acfdd3acd8435d5cb54eb1e2d9ff36ae44e389826993df
 F ext/misc/showauth.c 732578f0fe4ce42d577e1c86dc89dd14a006ab52
@@ -1705,7 +1705,7 @@ F test/sync.test a619e407ede58a7b6e3e44375328628559fc9695a9c24c47cb5690a866b0031
 F test/sync2.test 06152269ed73128782c450c355988fe8dd794d305833af75e1a5e79edd4dae47
 F test/syscall.test a067468b43b8cb2305e9f9fe414e5f40c875bb5d2cba5f00b8154396e95fcf37
 F test/sysfault.test c9f2b0d8d677558f74de750c75e12a5454719d04
-F test/tabfunc01.test cfa96a9a235c39fb0cae69928b989b28bfec108f62d2533486f76e32dcedfdfb
+F test/tabfunc01.test 7827c2dfd57a094125b059f51a2200eaf04d417af6b1e720c34a8cbf54e8a14f
 F test/table.test e87294bf1c80bfd7792142b84ab32ea5beb4f3f71e535d7fb263a6b2068377bf
 F test/tableapi.test e37c33e6be2276e3a96bb54b00eea7f321277115d10e5b30fdb52a112b432750
 F test/tableopts.test dba698ba97251017b7c80d738c198d39ab747930
@@ -2203,8 +2203,8 @@ F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee
 F tool/warnings.sh a554d13f6e5cf3760f041b87939e3d616ec6961859c3245e8ef701d1eafc2ca2
 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
 F tool/winmain.c 00c8fb88e365c9017db14c73d3c78af62194d9644feaf60e220ab0f411f3604c
-P 7e6fd838a15f08bf15d57f1887ed1019b58aa6be9eb7b162e67e0d9412082c6d
-R 06187e74abcd7ba51a19ee0ef6ec6273
+P 5a8497dbec80b55a2dedc8a6f9ee823243e01a08d37ceeed1f87214dfe527d63
+R 650fed987026b994c216b4cae3ea83b3
 U drh
-Z 9e808589c718d909177d4890282c6910
+Z 0f598f77ac40c5db91066a29b5ff49b1
 # Remove this line to create a well-formed Fossil manifest.
index 03c3cd9291364ff81cdbbfde53420ad3ad458963..98a2228dc8c53f8921156df81dc81807c776764d 100644 (file)
@@ -1 +1 @@
-5a8497dbec80b55a2dedc8a6f9ee823243e01a08d37ceeed1f87214dfe527d63
+ff56785674ebeb1d4bab66ba0827956a2728c8c14419f933d40dc0152efbd4f5
index 60f546ce42a7d409984bcd702ff1f947693a2016..9a3196600b70ead9f76e47bf1e801dc30c0e4211 100644 (file)
@@ -668,6 +668,39 @@ do_execsql_test 1370 {
   SELECT * FROM generate_series(0,0,0);
 } {}
 
+# Forum post 2026-05-09T07:41:32Z
+set subtest 1
+foreach bound {
+  9007199254740991.0
+  9007199254740991.1
+  9007199254740991.5
+  9007199254740991.9
+  9007199254740992.0
+  9007199254740992.1
+  9007199254740992.5
+  9007199254740992.9
+  9007199254740993.0
+  9007199254740993.1
+  9007199254740993.5
+} {
+  foreach {range boundsign} {
+    (+9007199254740990,+9007199254740995)  +
+    (-9007199254740995,-9007199254740990)  -
+  } {
+    set bx $boundsign$bound
+    foreach op {< > <= >=} {
+      do_execsql_test 1380.$subtest "
+         SELECT 'value $op $bx' WHERE (
+            SELECT group_concat(value) FROM generate_series $range
+             WHERE value $op $bx)<>(
+            SELECT group_concat(value) FROM generate_series $range
+             WHERE +value $op $bx);
+      " {}
+      incr subtest
+    }
+  }
+}
+
 reset_db
 load_static_extension db series
 do_execsql_test 1400 {