]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Simplification to the logic that decides whether or not an index
authordrh <>
Wed, 18 Mar 2026 12:36:01 +0000 (12:36 +0000)
committerdrh <>
Wed, 18 Mar 2026 12:36:01 +0000 (12:36 +0000)
field matches when floating point values are close but not exact.

FossilOrigin-Name: 3897017c0e871c676d44786a6f11205fd4b7a947d9d1359109037a123eda6b9b

manifest
manifest.uuid
src/vdbeaux.c

index d843a1033270073621700f6ee9a23aa578268b52..e2719d3139ad94ff72ff9d479e181501838c528f 100644 (file)
--- 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.
index 0a9281a51b81f847d3a8a4615feec6717742a4b9..e61503c7770945d577941f20a808b111c8bb2959 100644 (file)
@@ -1 +1 @@
-aa211fa1d49b6734913e957f9e4b9825709a1493d275f7dfaf9123dc8c7232dc
+3897017c0e871c676d44786a6f11205fd4b7a947d9d1359109037a123eda6b9b
index 8e6588a3d3e40f71f8f7f47247d3a9c995a801f5..8c0d256fe1461676e8c2ed719cbff5d1dcc14d66 100644 (file)
@@ -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( ((i1<i2) ? (i2 - i1) : (i1 - i2))<=BTREE_ULPDISTORTION ){
+    u64 m1, m2;
+    memcpy(&m1,&pMem1->u.r,8);
+    memcpy(&m2,&pMem2->u.r,8);
+    if( (m1<m2 ? m2-m1 : m1-m2) <= BTREE_ULPDISTORTION ){
       return 1;
     }
   }