From: drh <> Date: Mon, 15 Jun 2026 14:16:13 +0000 (+0000) Subject: Better behavior for generate_series() in cases where constraints involve X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=0cdc6432f7ab07bf7d8006a7426f5f61e683b18d;p=thirdparty%2Fsqlite.git Better behavior for generate_series() in cases where constraints involve floating point number that are near the minimum and maximum 64-bit integer values. FossilOrigin-Name: 236ef21789c4ebb67a8cf0a841341fab1477a6fe8e88b575e9f450a8f868e618 --- diff --git a/ext/misc/series.c b/ext/misc/series.c index 49afc658db..dea7301fd9 100644 --- a/ext/misc/series.c +++ b/ext/misc/series.c @@ -530,15 +530,22 @@ static int seriesFilter( iMin = iMax = sqlite3_value_int64(argv[iArg++]); } }else{ - if( idxNum & 0x0300 ){ /* value>X or value>=X */ + if( idxNum & 0x0300 ){ /* value>X (0x200) or value>=X (0x100) */ if( sqlite3_value_numeric_type(argv[iArg])==SQLITE_FLOAT ){ double r = sqlite3_value_double(argv[iArg++]); - if( r<(double)SMALLEST_INT64 ){ + if( r<=(double)SMALLEST_INT64 ){ iMin = SMALLEST_INT64; - }else if( (idxNum & 0x0200)!=0 && r==seriesCeil(r) ){ - iMin = (sqlite3_int64)seriesCeil(r)+1; + }else if( r>(double)LARGEST_INT64 ){ + goto series_no_rows; }else{ iMin = (sqlite3_int64)seriesCeil(r); + if( iMin<0 && r>0.0 ){ + iMin = LARGEST_INT64; + } + if( (idxNum & 0x0200)!=0 && r==seriesCeil(r) ){ + if( iMin==LARGEST_INT64 ) goto series_no_rows; + iMin++; + } } }else{ iMin = sqlite3_value_int64(argv[iArg++]); @@ -551,15 +558,22 @@ static int seriesFilter( } } } - if( idxNum & 0x3000 ){ /* value(double)LARGEST_INT64 ){ + if( r>=(double)LARGEST_INT64 ){ iMax = LARGEST_INT64; - }else if( (idxNum & 0x2000)!=0 && r==seriesFloor(r) ){ - iMax = ((sqlite3_int64)r)-1; + }else if( r<=(double)SMALLEST_INT64 + && ((idxNum & 0x2000)!=0 || r<(double)SMALLEST_INT64) ){ + goto series_no_rows; }else{ iMax = (sqlite3_int64)seriesFloor(r); + if( iMax<0 && r>0.0 ){ + iMax = LARGEST_INT64; + }else if( (idxNum & 0x2000)!=0 && r==seriesFloor(r) ){ + assert( iMax>SMALLEST_INT64 ); + iMax--; + } } }else{ iMax = sqlite3_value_int64(argv[iArg++]); diff --git a/manifest b/manifest index f044cb076d..730a88663a 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Avoid\sa\spossible\sbuffer\soverrun\sin\s32-bit\sbuilds\sof\sfts5\sthat\scould\soccur\swhen\sprocessing\scorrupt\srecords.\sBug\s[bugs:/info/2026-06-14T12:21:15Z\s|\s2026-06-14T12:21:15Z]. -D 2026-06-15T13:39:20.318 +C Better\sbehavior\sfor\sgenerate_series()\sin\scases\swhere\sconstraints\sinvolve\nfloating\spoint\snumber\sthat\sare\snear\sthe\sminimum\sand\smaximum\s64-bit\sinteger\nvalues. +D 2026-06-15T14:16:13.474 F .fossil-settings/binary-glob 61195414528fb3ea9693577e1980230d78a1f8b0a54c78cf1b9b24d0a409ed6a x F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea @@ -395,7 +395,7 @@ F ext/misc/randomjson.c ef835fc64289e76ac4873b85fe12f9463a036168d7683cf2b773e36e F ext/misc/regexp.c 378e6e84516952a4b9f3f4df88927f20e6538e2609f55b773ed78899dab8206e F ext/misc/remember.c add730f0f7e7436cd15ea3fd6a90fd83c3f706ab44169f7f048438b7d6baa69c F ext/misc/rot13.c 51ac5f51e9d5fd811db58a9c23c628ad5f333c173f1fc53c8491a3603d38556c -F ext/misc/series.c 496f43bac9bad2ee2cea63fb5212036f30ad3003b4cd317d5c2d6f3ad7c7d264 +F ext/misc/series.c 1af4c480d479374ae6e6fa51742add28950d1fb97b597da7e78a2482706dc893 F ext/misc/sha1.c 9a11826db885e8afd997c0a1b28bb799a43e462ef770ac33f19e744887c9c6fa F ext/misc/shathree.c fd22d70620f86a0467acfdd3acd8435d5cb54eb1e2d9ff36ae44e389826993df F ext/misc/showauth.c 732578f0fe4ce42d577e1c86dc89dd14a006ab52 @@ -1709,7 +1709,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 7827c2dfd57a094125b059f51a2200eaf04d417af6b1e720c34a8cbf54e8a14f +F test/tabfunc01.test 532087adcbf6774f1c550a73d30a4d18e9520a40ece7eb60f6fa38f29bcea5ad F test/table.test e87294bf1c80bfd7792142b84ab32ea5beb4f3f71e535d7fb263a6b2068377bf F test/tableapi.test e37c33e6be2276e3a96bb54b00eea7f321277115d10e5b30fdb52a112b432750 F test/tableopts.test dba698ba97251017b7c80d738c198d39ab747930 @@ -2208,8 +2208,11 @@ F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee F tool/warnings.sh a554d13f6e5cf3760f041b87939e3d616ec6961859c3245e8ef701d1eafc2ca2 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f F tool/winmain.c 00c8fb88e365c9017db14c73d3c78af62194d9644feaf60e220ab0f411f3604c -P 4b3ec30c63e3824163a2e6cacceb9630301b61f3ffd2b80f8a7b234f09bc251b -R 4268b2401575f05c1ef13d2885a2b3fd -U dan -Z 5f5badb8d3a0930043dc56d118952b6a +P 0fa3345fe4464804f6846c2598774b9e700df39570e81e020de21e06e2ff044d +R 420f1b91caadadd221bcb8d7b520cc55 +T *branch * series-boundry-cases +T *sym-series-boundry-cases * +T -sym-trunk * +U drh +Z accc4f998a9a8942d7566835deda0da0 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.tags b/manifest.tags index bec971799f..e45fe9bf77 100644 --- a/manifest.tags +++ b/manifest.tags @@ -1,2 +1,2 @@ -branch trunk -tag trunk +branch series-boundry-cases +tag series-boundry-cases diff --git a/manifest.uuid b/manifest.uuid index f7e70d7153..fdac4ce365 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -0fa3345fe4464804f6846c2598774b9e700df39570e81e020de21e06e2ff044d +236ef21789c4ebb67a8cf0a841341fab1477a6fe8e88b575e9f450a8f868e618 diff --git a/test/tabfunc01.test b/test/tabfunc01.test index 9a3196600b..b7f7e8dc5f 100644 --- a/test/tabfunc01.test +++ b/test/tabfunc01.test @@ -716,6 +716,43 @@ do_catchsql_test 1420 { FROM t2 JOIN (t1 RIGHT JOIN generate_series(t2.y,5) AS value) } {1 {no such column: t2.y}} +# Bug 2026-06-15T04:37:48Z +do_execsql_test 1500 { + SELECT value FROM generate_series(1) WHERE value>1e19 LIMIT 3; +} {} +do_execsql_test 1501 { + SELECT value FROM generate_series(1) WHERE value>=1e19 LIMIT 3; +} {} +do_execsql_test 1502 { + SELECT value FROM generate_series(1) WHERE value<-1e19 LIMIT 3; +} {} +do_execsql_test 1503 { + SELECT value FROM generate_series(1) WHERE value<=-1e19 LIMIT 3; +} {} +do_execsql_test 1504 { + SELECT value FROM generate_series(1,9223372036854775807) + WHERE value>=9223372036854775807.0 + LIMIT 3; +} {9223372036854775807} +do_execsql_test 1505 { + SELECT value FROM generate_series(1,9223372036854775807) + WHERE value>9223372036854775807.0 + LIMIT 3; +} {} +do_execsql_test 1506 { + SELECT 9223372036854774784 = 9223372036854775000.0; +} {1} +do_execsql_test 1507 { + SELECT value FROM generate_series(1,9223372036854775807) + WHERE value>=9223372036854775000.0 + LIMIT 3; +} {9223372036854774784 9223372036854774785 9223372036854774786} +do_execsql_test 1508 { + SELECT value FROM generate_series(1,9223372036854775807) + WHERE value>9223372036854775000.0 + LIMIT 3; +} {9223372036854774785 9223372036854774786 9223372036854774787} + # Free up memory allocations intarray_addr