From: drh <> Date: Mon, 16 Feb 2026 20:41:13 +0000 (+0000) Subject: The sqlite3Atoi64() function runs a little faster here, but probably X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=7e21205a931ab1e32b1553fde645f823c45e8ea8;p=thirdparty%2Fsqlite.git The sqlite3Atoi64() function runs a little faster here, but probably not enough to justify the extra complication. FossilOrigin-Name: ae5616ca9791c47538e41b1148e215f2e38fb5f71a821c828c0cb150bcda123e --- diff --git a/manifest b/manifest index 25e473f434..59ac2baa12 100644 --- 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. diff --git a/manifest.tags b/manifest.tags index db708de054..ea8ec7441b 100644 --- a/manifest.tags +++ b/manifest.tags @@ -1,2 +1,2 @@ -branch numeric-conversion-perf -tag numeric-conversion-perf +branch sqlite3Atoi64-opt +tag sqlite3Atoi64-opt diff --git a/manifest.uuid b/manifest.uuid index fe029aa3b9..4feb8a00c5 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -a4540582b5b704af13b570b3dc609dbacada719302372a038cf74eee3688d5e7 +ae5616ca9791c47538e41b1148e215f2e38fb5f71a821c828c0cb150bcda123e diff --git a/src/expr.c b/src/expr.c index d486e48e37..a51236dd74 100644 --- a/src/expr.c +++ b/src/expr.c @@ -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 ); diff --git a/src/json.c b/src/json.c index 795d3ed731..9eda3c4463 100644 --- a/src/json.c +++ b/src/json.c @@ -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); diff --git a/src/util.c b/src/util.c index bd60ec92e9..fe3c90377c 100644 --- a/src/util.c +++ b/src/util.c @@ -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='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='0' && c<='9'; i+=incr){ + u = u*10 + c - '0'; } - } - zStart = zNum; - while( zNum='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); } }