From: drh <> Date: Wed, 18 Mar 2026 12:36:01 +0000 (+0000) Subject: Simplification to the logic that decides whether or not an index X-Git-Tag: major-release~74^2~6 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=765ff2189a0df772f4eb05ed9fddaf9faf18bfb9;p=thirdparty%2Fsqlite.git Simplification to the logic that decides whether or not an index field matches when floating point values are close but not exact. FossilOrigin-Name: 3897017c0e871c676d44786a6f11205fd4b7a947d9d1359109037a123eda6b9b --- diff --git a/manifest b/manifest index d843a10332..e2719d3139 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sharmless\ssigned/unsigned\scompiler\swarnings. -D 2026-03-18T11:15:57.824 +C Simplification\sto\sthe\slogic\sthat\sdecides\swhether\sor\snot\san\sindex\nfield\smatches\swhen\sfloating\spoint\svalues\sare\sclose\sbut\snot\sexact. +D 2026-03-18T12:36:01.646 F .fossil-settings/binary-glob 61195414528fb3ea9693577e1980230d78a1f8b0a54c78cf1b9b24d0a409ed6a x F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea @@ -803,7 +803,7 @@ F src/vdbe.c ad2275c459f088076b8a99a63230cd9514bb21a4cff98ce73d90e9611c57cad2 F src/vdbe.h 70e862ac8a11b590f8c1eaac17a0078429d42bc4ea3f757a9af0f451dd966a71 F src/vdbeInt.h f7157f110f88f1d9d8338c292faf23a9129f6712563ade2b408537c95e17bdef F src/vdbeapi.c 6cdcbe5c7afa754c998e73d2d5d2805556268362914b952811bdfb9c78a37cf1 -F src/vdbeaux.c 6d5e722d0757be81229f3ceb3beae86cbc61c29578a36c3fac3e212c92b5ee58 +F src/vdbeaux.c d9856dfa383de2b0c9631c37453e2a628f91836092c21dc248f320f1ab1c30f5 F src/vdbeblob.c b3f0640db9642fbdc88bd6ebcc83d6009514cafc98f062f675f2c8d505d82692 F src/vdbemem.c 317ec5e870ddb16951b606c9fe8be22baef22ecbe46f58fdefc259662238afb7 F src/vdbesort.c b69220f4ea9ffea5fdef34d968c60305444eea909252a81933b54c296d9cca70 @@ -2194,8 +2194,8 @@ F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee F tool/warnings.sh d924598cf2f55a4ecbc2aeb055c10bd5f48114793e7ba25f9585435da29e7e98 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f F tool/winmain.c 00c8fb88e365c9017db14c73d3c78af62194d9644feaf60e220ab0f411f3604c -P 40c5966f7b784f181365c81fc559aee9463c374ee56677cf6e0aecaed39d2b28 -R 9f074cee19670ebd10ab4f9eba7bd14c +P aa211fa1d49b6734913e957f9e4b9825709a1493d275f7dfaf9123dc8c7232dc +R 4f3fe27634efc590d052577adbce04a9 U drh -Z 5dcbd0ace5a3e67098d52e40f8108817 +Z 447592fe10f2c2a8e9592d7fbe83953e # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 0a9281a51b..e61503c777 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -aa211fa1d49b6734913e957f9e4b9825709a1493d275f7dfaf9123dc8c7232dc +3897017c0e871c676d44786a6f11205fd4b7a947d9d1359109037a123eda6b9b diff --git a/src/vdbeaux.c b/src/vdbeaux.c index 8e6588a3d3..8c0d256fe1 100644 --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@ -5397,27 +5397,16 @@ void sqlite3VdbeSetVarmask(Vdbe *v, int iVar){ } } -/* -** Convert double value r to a 64-bit index such that real values separated -** by a single ULP are adjacent (separated by 1 integer value). -*/ -static i64 vdbeDoubleToIndex(double r){ - static const u64 signbit = ((u64)1 << 63); - u64 u; - assert( sizeof(u)==sizeof(r) ); - memcpy(&u, &r, sizeof(u)); - return (u & signbit) ? (i64)(signbit - u) : (i64)(signbit + u); -} - /* ** Helper function for vdbeIsMatchingIndexKey(). Return true if column ** iCol should be ignored when comparing a record with a record from ** an index on disk. The field should be ignored if: ** ** * the corresponding bit in mask is set, and -** * either bIntegrity is false, or -** * the two Mem values are both real values that differ by -** BTREE_ULPDISTORTION or fewer ULPs. +** * either: +** - bIntegrity is false, or +** - the two Mem values are both real values that differ by +** BTREE_ULPDISTORTION or fewer ULPs. */ static int vdbeSkipField( Bitmask mask, /* Mask of indexed expression fields */ @@ -5430,9 +5419,10 @@ static int vdbeSkipField( if( iCol>=BMS || (mask & MASKBIT(iCol))==0 ) return 0; if( bIntegrity==0 ) return 1; if( (pMem1->flags & MEM_Real) && (pMem2->flags & MEM_Real) ){ - i64 i1 = vdbeDoubleToIndex(pMem1->u.r); - i64 i2 = vdbeDoubleToIndex(pMem2->u.r); - if( ((i1u.r,8); + memcpy(&m2,&pMem2->u.r,8); + if( (m1