-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
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
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
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
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.
-branch numeric-conversion-perf
-tag numeric-conversion-perf
+branch sqlite3Atoi64-opt
+tag sqlite3Atoi64-opt
-a4540582b5b704af13b570b3dc609dbacada719302372a038cf74eee3688d5e7
+ae5616ca9791c47538e41b1148e215f2e38fb5f71a821c828c0cb150bcda123e
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 );
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);
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)
** 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;
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 );
}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);
}
}