1
0
mirror of https://github.com/sqlite/sqlite.git synced 2026-10-23 21:49:02 +03:00

Improvements to handling of inequality constraints on generate_series().value

against very large floating-point values.

FossilOrigin-Name: e10ff7cd09e962c207f897c38b83a813a3214fd4ac11e6a71ac577f21ba09fba
This commit is contained in:
drh
2026-06-15 16:27:51 +00:00
parent 051745a6c3
commit 2161a3d88b
4 changed files with 114 additions and 17 deletions

View File

@@ -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,21 @@ static int seriesFilter(
}
}
}
if( idxNum & 0x3000 ){ /* value<X or value<=X */
if( idxNum & 0x3000 ){ /* value<X (0x2000) or value<=X (0x1000) */
if( sqlite3_value_numeric_type(argv[iArg])==SQLITE_FLOAT ){
double r = sqlite3_value_double(argv[iArg++]);
if( r>(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 ){
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) ){
if( iMax==SMALLEST_INT64 ) goto series_no_rows;
iMax--;
}
}
}else{
iMax = sqlite3_value_int64(argv[iArg++]);

View File

@@ -1,5 +1,5 @@
C Avoid\sa\spossible\sbuffer\soverrun\sin\s32-bit\sbuilds\sof\sfts5\sthat\scould\soccur\swhen\sprocessing\scorrupt\srecords.
D 2026-06-15T13:53:44.449
C Improvements\sto\shandling\sof\sinequality\sconstraints\son\sgenerate_series().value\nagainst\svery\slarge\sfloating-point\svalues.
D 2026-06-15T16:27:51.638
F .fossil-settings/binary-glob 61195414528fb3ea9693577e1980230d78a1f8b0a54c78cf1b9b24d0a409ed6a x
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
@@ -393,7 +393,7 @@ F ext/misc/randomjson.c ef835fc64289e76ac4873b85fe12f9463a036168d7683cf2b773e36e
F ext/misc/regexp.c 9dada9e9aa91f0cc23e35429e5d1111f110cc201b4c8dcc49aa6d2fc4b2a865d
F ext/misc/remember.c add730f0f7e7436cd15ea3fd6a90fd83c3f706ab44169f7f048438b7d6baa69c
F ext/misc/rot13.c 51ac5f51e9d5fd811db58a9c23c628ad5f333c173f1fc53c8491a3603d38556c
F ext/misc/series.c 496f43bac9bad2ee2cea63fb5212036f30ad3003b4cd317d5c2d6f3ad7c7d264
F ext/misc/series.c 8612317330587e4cfeb0ae7ffe2f06fe86e66f94a0f5bbb80d8fb46f89e9f0ad
F ext/misc/sha1.c 8bf60344c11a525384c2efd1ae77f160b06be336db679effaadf292d4b41451c
F ext/misc/shathree.c fd22d70620f86a0467acfdd3acd8435d5cb54eb1e2d9ff36ae44e389826993df
F ext/misc/showauth.c 732578f0fe4ce42d577e1c86dc89dd14a006ab52
@@ -1702,7 +1702,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 23d1f92fbbbaaef4cb3a1ee15fd5b44e70bde1f3ee1a6b9df9ce43b05cf0b630
F test/table.test e87294bf1c80bfd7792142b84ab32ea5beb4f3f71e535d7fb263a6b2068377bf
F test/tableapi.test e37c33e6be2276e3a96bb54b00eea7f321277115d10e5b30fdb52a112b432750
F test/tableopts.test dba698ba97251017b7c80d738c198d39ab747930
@@ -2200,9 +2200,9 @@ F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee
F tool/warnings.sh a554d13f6e5cf3760f041b87939e3d616ec6961859c3245e8ef701d1eafc2ca2
F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
F tool/winmain.c 00c8fb88e365c9017db14c73d3c78af62194d9644feaf60e220ab0f411f3604c
P 4f21004f9b5fc9766183a3c4ac44cfeb6cd3e5583fef9176a26fecc2910f8c08
Q +0fa3345fe4464804f6846c2598774b9e700df39570e81e020de21e06e2ff044d
R 968262791a0642646e8d1b40184b0170
P 3a4667ce36a1548fffff8bbf946d84d6bbd21e7abb216d1f37717de74ce7e2a7
Q +5aab8c2cde63f9db6b2346c86512efd6297937cad4e1306759b0f448815ad2e0
R 97871d62c58c25e8ed8e158b93df8153
U drh
Z 90ac465d898d9ed6a45b55072bc914b9
Z 6696b5506583a506b25fcd22dfffc70d
# Remove this line to create a well-formed Fossil manifest.

View File

@@ -1 +1 @@
3a4667ce36a1548fffff8bbf946d84d6bbd21e7abb216d1f37717de74ce7e2a7
e10ff7cd09e962c207f897c38b83a813a3214fd4ac11e6a71ac577f21ba09fba

View File

@@ -716,6 +716,90 @@ 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;
} {}
# NB: Large floating point values can not convert to integers exactly.
# This affects subsequent results.
#
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}
do_execsql_test 1510 {
SELECT value FROM generate_series(-9223372036854775808,1)
WHERE value>=-9223372036854775000.0
LIMIT 3;
} {-9223372036854774784 -9223372036854774783 -9223372036854774782}
do_execsql_test 1511 {
SELECT value FROM generate_series(-9223372036854775808,1)
WHERE value>-9223372036854775000.0
LIMIT 3;
} {-9223372036854774783 -9223372036854774782 -9223372036854774781}
do_execsql_test 1520 {
SELECT value FROM generate_series(9223372036854774784)
WHERE value<=9223372036854775000.0
LIMIT 3;
} {9223372036854774784}
do_execsql_test 1521 {
SELECT value FROM generate_series(9223372036854774784)
WHERE value<9223372036854775000.0
LIMIT 3;
} {}
do_execsql_test 1522 {
SELECT value FROM generate_series(9223372036854775805,9223372036854775807)
WHERE value<=9223372036854775807.0
LIMIT 3;
} {9223372036854775805 9223372036854775806 9223372036854775807}
do_execsql_test 1522ck {
SELECT value FROM generate_series(9223372036854775805,9223372036854775807)
WHERE +value<=9223372036854775807.0
LIMIT 3;
} {9223372036854775805 9223372036854775806 9223372036854775807}
do_execsql_test 1523 {
SELECT value FROM generate_series(9223372036854775805,9223372036854775807)
WHERE value<9223372036854775807.0
LIMIT 3;
} {9223372036854775805 9223372036854775806 9223372036854775807}
do_execsql_test 1523ck {
SELECT value FROM generate_series(9223372036854775805,9223372036854775807)
WHERE +value<9223372036854775807.0
LIMIT 3;
} {9223372036854775805 9223372036854775806 9223372036854775807}
# Free up memory allocations
intarray_addr