]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
The sqlite3Atoi64() function runs a little faster here, but probably sqlite3Atoi64-opt
authordrh <>
Mon, 16 Feb 2026 20:41:13 +0000 (20:41 +0000)
committerdrh <>
Mon, 16 Feb 2026 20:41:13 +0000 (20:41 +0000)
not enough to justify the extra complication.

FossilOrigin-Name: ae5616ca9791c47538e41b1148e215f2e38fb5f71a821c828c0cb150bcda123e

manifest
manifest.tags
manifest.uuid
src/expr.c
src/json.c
src/util.c

index 25e473f434faf83713dff1890c4cba049d585949..59ac2baa12c38d66398bbe6b669a87a58aebe0a8 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Fix\sa\sbad\sassert()\sin\sthe\sprevious\scheck-in.
-D 2026-02-16T17:22:17.815
+C The\ssqlite3Atoi64()\sfunction\sruns\sa\slittle\sfaster\shere,\sbut\sprobably\nnot\senough\sto\sjustify\sthe\sextra\scomplication.
+D 2026-02-16T20:41:13.621
 F .fossil-settings/binary-glob 61195414528fb3ea9693577e1980230d78a1f8b0a54c78cf1b9b24d0a409ed6a x
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
@@ -689,7 +689,7 @@ F src/date.c e1a6c5ac4753016198d664d633b8541fa4ad4ccde2beb12548fa99e746f38cec
 F src/dbpage.c c9ea81c11727f27e02874611e92773e68e2a90a875ef2404b084564c235fd91f
 F src/dbstat.c 73362c0df0f40ad5523a6f5501224959d0976757b511299bf892313e79d14f5c
 F src/delete.c 901499bed747c3b4b2be45be1abe912ba50a3f6a40ba88cc006ccf279f2d0e97
-F src/expr.c 8c3b23cb35f43c2d0570c1058b9a269e561e769e09c81ba192992c95022c1939
+F src/expr.c 0dd9277188687bec031cdefd046a8e228a40d04363a58b98b4c4ad07f2123128
 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007
 F src/fkey.c fb0f74c57d19a2d3f113f3476826919d68feda7ff334abfdb479a9a6353b9fcd
 F src/func.c 785f62a6e00636c9b185ccee0cde17be711458227340137d57492ed3226d4253
@@ -699,7 +699,7 @@ F src/hash.h 46b92795a95bfefb210f52f0c316e9d7cdbcdd7e7fcfb0d8be796d3a5767cddf
 F src/hwtime.h 21c2cf1f736e7b97502c3674d0c386db3f06870d6f10d0cf8174e2a4b8cb726e
 F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71
 F src/insert.c dfd311b0ac2d4f6359e62013db67799757f4d2cc56cca5c10f4888acfbbfa3fd
-F src/json.c 8b6341a419150b28530cc21e3951b2238c35cdc312f11b2ca29017fe4b1dedc0
+F src/json.c 42e8f844962d68eb6cba986019144a1efba74755de20c31eafbbd1df07cf7cb4
 F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa
 F src/loadext.c 56a542244fbefc739a2ef57fac007c16b2aefdb4377f584e9547db2ce3e071f9
 F src/main.c e95aa130478fc98a49181ddf094baab45f319286411129253618efe0008f0dc4
@@ -803,7 +803,7 @@ F src/trigger.c a40440614bdf523090cc07223f4878f7e3c892bcd1a13afe18f90190daa5945d
 F src/update.c 3e5e7ff66fa19ebe4d1b113d480639a24cc1175adbefabbd1a948a07f28e37cf
 F src/upsert.c 215328c3f91623c520ec8672c44323553f12caeb4f01b1090ebdca99fdf7b4f1
 F src/utf.c 7267c3fb9e2467020507601af3354c2446c61f444387e094c779dccd5ca62165
-F src/util.c 16c7fcce87e43c612dd579c87d11a085ce5243565b7c324806f4a506c5e696a4
+F src/util.c c39bc8ed35d7f1bd8dc10c94602c8c1f5414e1e3db92551c2de5514224730630
 F src/vacuum.c d3d35d8ae893d419ade5fa196d761a83bddcbb62137a1a157ae751ef38b26e82
 F src/vdbe.c 5328c99dd256ee8132383565a86e253543a85daccfd7477c52f20bac6b385a7f
 F src/vdbe.h 966d0677a540b7ea6549b7c4e1312fc0d830fce3a235a58c801f2cc31cf5ecf9
@@ -2194,8 +2194,11 @@ F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee
 F tool/warnings.sh d924598cf2f55a4ecbc2aeb055c10bd5f48114793e7ba25f9585435da29e7e98
 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
 F tool/winmain.c 00c8fb88e365c9017db14c73d3c78af62194d9644feaf60e220ab0f411f3604c
-P 67c7c72e9bdf04c920d77006538a202c923fa74b47c81dc3014c2929dac7277d
-R 94ab950169198f260c23800402fd70a5
+P a4540582b5b704af13b570b3dc609dbacada719302372a038cf74eee3688d5e7
+R dea9895025e5c820f10a810aec817079
+T *branch * sqlite3Atoi64-opt
+T *sym-sqlite3Atoi64-opt *
+T -sym-numeric-conversion-perf *
 U drh
-Z c0318b1fd81a3ec64d379bf447b9b4ea
+Z f6214b931c00d682a03935018bd3afaf
 # Remove this line to create a well-formed Fossil manifest.
index db708de0549f3ecc3ec1464b0dc34605406868be..ea8ec7441b70fdf8946c8c15ee0961d70935fbb5 100644 (file)
@@ -1,2 +1,2 @@
-branch numeric-conversion-perf
-tag numeric-conversion-perf
+branch sqlite3Atoi64-opt
+tag sqlite3Atoi64-opt
index fe029aa3b9b66c77b9e399ccdcfad1ea0119d090..4feb8a00c5edb4cd66e68477e24168c8571e19fc 100644 (file)
@@ -1 +1 @@
-a4540582b5b704af13b570b3dc609dbacada719302372a038cf74eee3688d5e7
+ae5616ca9791c47538e41b1148e215f2e38fb5f71a821c828c0cb150bcda123e
index d486e48e37ac917daf64398021cf4caec2ad16ed..a51236dd749f7cf97a6ff45de1c6aaa5e45f162a 100644 (file)
@@ -1340,7 +1340,7 @@ void sqlite3ExprAssignVarNumber(Parse *pParse, Expr *pExpr, u32 n){
         i = z[1]-'0';  /* The common case of ?N for a single digit N */
         bOk = 1;
       }else{
-        bOk = 0==sqlite3Atoi64(&z[1], &i, n-1, SQLITE_UTF8);
+        bOk = 0==sqlite3Atoi64(&z[1], &i, -1, SQLITE_UTF8);
       }
       testcase( i==0 );
       testcase( i==1 );
index 795d3ed7313da3fd9e7ecbdba4b3b746115f1bce..9eda3c446308fbd7b9dcee21896f11af8d81367a 100644 (file)
@@ -5261,7 +5261,7 @@ static int jsonEachColumn(
           break;
         }else if( p->path.zBuf[j]=='[' ){
           i64 x;
-          sqlite3Atoi64(&p->path.zBuf[j+1], &x, n-1, SQLITE_UTF8);
+          sqlite3Atoi64(&p->path.zBuf[j+1], &x, -1, SQLITE_UTF8);
           sqlite3_result_int64(ctx, x);
         }else if( p->path.zBuf[j+1]=='"' ){
           sqlite3_result_text(ctx, &p->path.zBuf[j+2], n-3, SQLITE_TRANSIENT);
index bd60ec92e9f36171d77788facf238a573f8852aa..fe3c90377c31f26a8bb8a9158ea2e1abbc986438 100644 (file)
@@ -834,7 +834,7 @@ atofz_return:
     return 0;
   }
 #else
-  return !sqlite3Atoi64(z, pResult, strlen(z), SQLITE_UTF8);
+  return !sqlite3Atoi64(z, pResult, -1, SQLITE_UTF8);
 #endif /* SQLITE_OMIT_FLOATING_POINT */
 }
 #if defined(_MSC_VER)
@@ -918,8 +918,11 @@ static int compare2pow63(const char *zNum, int incr){
 **     3    Special case of 9223372036854775808
 **
 ** length is the number of bytes in the string (bytes, not characters).
-** The string is not necessarily zero-terminated.  The encoding is
+** The string is not necessarily zero-terminated. The encoding is
 ** given by enc.
+**
+** As a special case, if length is negative, then the string is
+** zero-terminated and must be UTF8.
 */
 int sqlite3Atoi64(const char *zNum, i64 *pNum, int length, u8 enc){
   int incr;
@@ -930,32 +933,53 @@ int sqlite3Atoi64(const char *zNum, i64 *pNum, int length, u8 enc){
   int nonNum = 0;  /* True if input contains UTF16 with high byte non-zero */
   int rc;          /* Baseline return code */
   const char *zStart;
-  const char *zEnd = zNum + length;
-  assert( enc==SQLITE_UTF8 || enc==SQLITE_UTF16LE || enc==SQLITE_UTF16BE );
-  if( enc==SQLITE_UTF8 ){
+  const char *zEnd;
+  if( length<0 ){
+    /* Fast special case for zero-terminated UTF8 */
+    assert( enc==SQLITE_UTF8 );
     incr = 1;
-  }else{
-    incr = 2;
-    length &= ~1;
-    assert( SQLITE_UTF16LE==2 && SQLITE_UTF16BE==3 );
-    for(i=3-enc; i<length && zNum[i]==0; i+=2){}
-    nonNum = i<length;
-    zEnd = &zNum[i^1];
-    zNum += (enc&1);
-  }
-  while( zNum<zEnd && sqlite3Isspace(*zNum) ) zNum+=incr;
-  if( zNum<zEnd ){
+    while( sqlite3Isspace(*zNum) ) zNum++;
     if( *zNum=='-' ){
       neg = 1;
-      zNum+=incr;
+      zNum++;
     }else if( *zNum=='+' ){
-      zNum+=incr;
+      zNum++;
+    }
+    zStart = zNum;
+    while( zNum[0]=='0' ){ zNum++; } /* Skip leading zeros. */
+    for(i=0; (c=zNum[i])>='0' && c<='9'; i++){
+      u = u*10 + c - '0';
+    }
+    zEnd = &zNum[i];
+    if( zEnd[0] ) zEnd++;
+  }else{
+    assert( enc==SQLITE_UTF8 || enc==SQLITE_UTF16LE || enc==SQLITE_UTF16BE );
+    zEnd = zNum + length;
+    if( enc==SQLITE_UTF8 ){
+      incr = 1;
+    }else{
+      incr = 2;
+      length &= ~1;
+      assert( SQLITE_UTF16LE==2 && SQLITE_UTF16BE==3 );
+      for(i=3-enc; i<length && zNum[i]==0; i+=2){}
+      nonNum = i<length;
+      zEnd = &zNum[i^1];
+      zNum += (enc&1);
+    }
+    while( zNum<zEnd && sqlite3Isspace(*zNum) ) zNum+=incr;
+    if( zNum<zEnd ){
+      if( *zNum=='-' ){
+        neg = 1;
+        zNum+=incr;
+      }else if( *zNum=='+' ){
+        zNum+=incr;
+      }
+    }
+    zStart = zNum;
+    while( zNum<zEnd && zNum[0]=='0' ){ zNum+=incr; } /* Skip leading zeros. */
+    for(i=0; &zNum[i]<zEnd && (c=zNum[i])>='0' && c<='9'; i+=incr){
+      u = u*10 + c - '0';
     }
-  }
-  zStart = zNum;
-  while( zNum<zEnd && zNum[0]=='0' ){ zNum+=incr; } /* Skip leading zeros. */
-  for(i=0; &zNum[i]<zEnd && (c=zNum[i])>='0' && c<='9'; i+=incr){
-    u = u*10 + c - '0';
   }
   testcase( i==18*incr );
   testcase( i==19*incr );
@@ -1042,9 +1066,7 @@ int sqlite3DecOrHexToI64(const char *z, i64 *pOut){
   }else
 #endif /* SQLITE_OMIT_HEX_INTEGER */
   {
-    int n = (int)(0x3fffffff&strspn(z,"+- \n\t0123456789"));
-    if( z[n] ) n++;
-    return sqlite3Atoi64(z, pOut, n, SQLITE_UTF8);
+    return sqlite3Atoi64(z, pOut, -1, SQLITE_UTF8);
   }
 }