]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Proposed new API routine: sqlite3_atof(). atof
authordrh <>
Sun, 22 Mar 2026 20:52:23 +0000 (20:52 +0000)
committerdrh <>
Sun, 22 Mar 2026 20:52:23 +0000 (20:52 +0000)
FossilOrigin-Name: db370f0f628895279a1c1db79ba7428cb4e31b56cafc191859c2f1a5a924435b

manifest
manifest.tags
manifest.uuid
src/expr.c
src/loadext.c
src/resolve.c
src/sqlite.h.in
src/sqlite3ext.h
src/util.c

index de21b8562d3794e13be3f2a7852df6e0d153cc06..143ce7f79c5fedd0803e1bfee96ada734774915d 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Performance\senhancements\sand\simproved\sdocumentation\sfor\ssqlite3AtoF().
-D 2026-03-22T18:26:43.583
+C Proposed\snew\sAPI\sroutine:\ssqlite3_atof().
+D 2026-03-22T20:52:23.836
 F .fossil-settings/binary-glob 61195414528fb3ea9693577e1980230d78a1f8b0a54c78cf1b9b24d0a409ed6a x
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
@@ -684,7 +684,7 @@ F src/date.c 61e92f1f7e2e88e1cd91e91dc69eb2b2854e7877254470f9fabd776bfac922b8
 F src/dbpage.c c9ea81c11727f27e02874611e92773e68e2a90a875ef2404b084564c235fd91f
 F src/dbstat.c 73362c0df0f40ad5523a6f5501224959d0976757b511299bf892313e79d14f5c
 F src/delete.c 1f2268d6fe3c78fc1bf794ba65d7026498b78e2342ffaf85825dedae546e6fde
-F src/expr.c 51e9c77ff5d9a21439e611fe6571a3cd50387e526e13c5614fd407e5b8571930
+F src/expr.c b135746c5aaa80ec13225bfe3e5e46ad74377a7cea46630c1dab6b0409729fab
 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007
 F src/fkey.c 931f74cec1dc8038a0217ef340c91ce147dd1bbed08dc40c47ee0ec6edfffb08
 F src/func.c 6e7de3551ae0f8205006e5109f025223246edd20186d54d90746dee7c1c5c093
@@ -696,7 +696,7 @@ F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71
 F src/insert.c dfd311b0ac2d4f6359e62013db67799757f4d2cc56cca5c10f4888acfbbfa3fd
 F src/json.c 7401618493219bb605408be48d2ea5ed5c9055f1c3b733268331eb0174048746
 F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa
-F src/loadext.c 56a542244fbefc739a2ef57fac007c16b2aefdb4377f584e9547db2ce3e071f9
+F src/loadext.c 187929338d21f43cbdea359a3c1ec61294f39b7f9032e824c1dbb79f9994c838
 F src/main.c 31a13302193fbd51279c7e69cdfa0320d0de7629f9151e0964c1d320e8bdd7a4
 F src/malloc.c 422f7e0498e1c9ef967f06283b6f2c0b16db6b905d8e06f6dbc8baaa3e4e6c5a
 F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645
@@ -731,13 +731,13 @@ F src/pragma.c 789ef67117b74b5be0a2db6681f7f0c55e6913791b9da309aefd280de2c8a74d
 F src/prepare.c f6a6e28a281bd1d1da12f47d370a81af46159b40f73bf7fa0b276b664f9c8b7d
 F src/printf.c 9cff219dba73b1aa9a8113e83e962f03f7bea8b6eb51cefb25bc468d5a69fb2d
 F src/random.c 606b00941a1d7dd09c381d3279a058d771f406c5213c9932bbd93d5587be4b9c
-F src/resolve.c 928ff887f2a7c64275182060d94d06fdddbe32226c569781cf7e7edc6f58d7fd
+F src/resolve.c f0834917f2b1719d545a0d7eaad693283788f68ecd99871a81c7ff3b12b26209
 F src/rowset.c 8432130e6c344b3401a8874c3cb49fefe6873fec593294de077afea2dce5ec97
 F src/select.c ffe199f025a0dd74670d2a77232bdea364a4d7b36f32c64a6572d39ba6a11576
 F src/shell.c.in 4a9217005b76017bc90a08f87c45ea273d796273e0b0a3e4c621a5051a4ae95d
-F src/sqlite.h.in 4d657846d68a58b028f0c4c331b9d3b4a79306f25c3b0d04fb56060343f73d85
+F src/sqlite.h.in ad873c7d97fdc13538f2b75f57a706b118df7026e49fe0f350e82c38c7892d11
 F src/sqlite3.rc 015537e6ac1eec6c7050e17b616c2ffe6f70fca241835a84a4f0d5937383c479
-F src/sqlite3ext.h 1b7a0ee438bb5c2896d0609c537e917d8057b3340f6ad004d2de44f03e3d3cca
+F src/sqlite3ext.h 5d48df11327acaabc45690a1957f0f4643e07afd9f77c5f2326115239fe5a3bc
 F src/sqliteInt.h 9716721fb57e32938a1d30a84560ce7633c63860a2209e188c87afad15d4b464
 F src/sqliteLimit.h 904a3f520362c7065c18165aaabd504fb13cc1b76cb411f38bd41ac219e4af1e
 F src/status.c 7565d63a79aa2f326339a24a0461a60096d0bd2bce711fefb50b5c89335f3592
@@ -798,7 +798,7 @@ F src/trigger.c 4bf3bfb3851d165e4404a9f9e69357345f3f7103378c07e07139fdd8aeb7bd20
 F src/update.c 3e5e7ff66fa19ebe4d1b113d480639a24cc1175adbefabbd1a948a07f28e37cf
 F src/upsert.c 215328c3f91623c520ec8672c44323553f12caeb4f01b1090ebdca99fdf7b4f1
 F src/utf.c 7267c3fb9e2467020507601af3354c2446c61f444387e094c779dccd5ca62165
-F src/util.c b7ec2de13f540ca184173f44845888f5b727f92b9d7255ca7309bec7ed0bf184
+F src/util.c 32e5aed34f20508356a297f4a28762ecd1db0c81bfcbe5aa9d9ebcc6a52b6a85
 F src/vacuum.c d3d35d8ae893d419ade5fa196d761a83bddcbb62137a1a157ae751ef38b26e82
 F src/vdbe.c dbafc6f5762f9ae90d9dc9ed065a31743a8ceafbdbfb1a0a3a228921fb3cc36a
 F src/vdbe.h 70e862ac8a11b590f8c1eaac17a0078429d42bc4ea3f757a9af0f451dd966a71
@@ -2195,9 +2195,11 @@ F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee
 F tool/warnings.sh a554d13f6e5cf3760f041b87939e3d616ec6961859c3245e8ef701d1eafc2ca2
 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
 F tool/winmain.c 00c8fb88e365c9017db14c73d3c78af62194d9644feaf60e220ab0f411f3604c
-P cf19982241afb17e3db4148b8257f6737141935a291c340ab085c42ed946af1a 8c3a1b450d6d5778004b9fb0e92b4f3f90d3e06ff87276370d01a45b7d607d23
-R 0c1564cd8bd4be660fcfe28f92df6384
-T +closed 8c3a1b450d6d5778004b9fb0e92b4f3f90d3e06ff87276370d01a45b7d607d23
+P 62f011509600ab8cda28888ebd32e5faa4e865702755bc32dee7a12bf2f4425d
+R ecbe134231e80d18c47a828b4727e394
+T *branch * atof
+T *sym-atof *
+T -sym-trunk *
 U drh
-Z b4555b45ae9c64e1a51c2bbe166e5f7a
+Z f810f3325e6bad43a83315df84a7d9cd
 # Remove this line to create a well-formed Fossil manifest.
index bec971799ff1b8ee641c166c7aeb22d12c785393..b44325bad0dcbe4300f88c939aa391aa00ae95fa 100644 (file)
@@ -1,2 +1,2 @@
-branch trunk
-tag trunk
+branch atof
+tag atof
index 24ecc01be417a20bbd2ac95bb9708ea838bb7324..824372d70987d25749ff7ef7cab25eba20b293c3 100644 (file)
@@ -1 +1 @@
-62f011509600ab8cda28888ebd32e5faa4e865702755bc32dee7a12bf2f4425d
+db370f0f628895279a1c1db79ba7428cb4e31b56cafc191859c2f1a5a924435b
index 9bac0ba7a58169ce118a550200775c5360121a00..f2a19dc3e818ae61de0410d21beec9d5abef6825 100644 (file)
@@ -4302,8 +4302,7 @@ sqlite3ExprCodeIN_oom_error:
 */
 static void codeReal(Vdbe *v, const char *z, int negateFlag, int iMem){
   if( ALWAYS(z!=0) ){
-    double value;
-    sqlite3AtoF(z, &value);
+    double value = sqlite3_atof(z);
     assert( !sqlite3IsNaN(value) ); /* The new AtoF never returns NaN */
     if( negateFlag ) value = -value;
     sqlite3VdbeAddOp4Dup8(v, OP_Real, 0, iMem, 0, (u8*)&value, P4_REAL);
index 55325edd77afefac59ecd413062e909db3ff7d61..14821bad5b5d15162d9868bf224711a8298368b9 100644 (file)
@@ -528,11 +528,12 @@ static const sqlite3_api_routines sqlite3Apis = {
   sqlite3_str_free,
 #ifdef SQLITE_ENABLE_CARRAY
   sqlite3_carray_bind,
-  sqlite3_carray_bind_v2
+  sqlite3_carray_bind_v2,
 #else
   0,
-  0
+  0,
 #endif
+  sqlite3_atof
 };
 
 /* True if x is the directory separator character
index 5b6d6c9c5aa05adf68288bd80d937b3982654d79..2920b779458f3d15c322d60736e53571933c7762 100644 (file)
@@ -936,7 +936,7 @@ static int exprProbability(Expr *p){
   double r = -1.0;
   if( p->op!=TK_FLOAT ) return -1;
   assert( !ExprHasProperty(p, EP_IntValue) );
-  sqlite3AtoF(p->u.zToken, &r);
+  r = sqlite3_atof(p->u.zToken);
   assert( r>=0.0 );
   if( r>1.0 ) return -1;
   return (int)(r*134217728.0);
index f1d0f73a1b067573f50847b1815e07b9ac485e75..2630b53605ff03f9a4578048173169fafd37acfa 100644 (file)
@@ -10925,6 +10925,28 @@ int sqlite3_preupdate_blobwrite(sqlite3 *);
 */
 int sqlite3_system_errno(sqlite3*);
 
+/*
+** CAPI3REF: Text-to-float conversion
+**
+** The sqlite3_atof(X) interface returns a "double" derived from the
+** text representation of a floating point value in X.
+** This interface provides applications with access to the
+** same text&rarr;float conversion routine used by SQLite for SQL parsing
+** and type coercion.  The sqlite3_atof(X) routine works like the standard
+** C-library atof(X) routine with the following exceptions:
+**
+** <ul>
+** <li> Parsing of the input X is strict. If anything about X
+**      is not well-formed, 0.0 is returned.
+** <li> Special values such like "INF", "INFINITY", and "NAN" are not
+**      recognized.
+** <li> Hexadecimal floating point literals are not recognized.
+** <li> The current locale is ignored. The radix character is always ".".
+** <li> The sqlite3_atof() interface does not set errno.
+** </ul>
+*/
+double sqlite3_atof(const char*);
+
 /*
 ** CAPI3REF: Database Snapshot
 ** KEYWORDS: {snapshot} {sqlite3_snapshot}
index cad1a2a0016041b2c400bf0f350a88489c6dcd16..f11588fab56388c633b0f8208369c99651d44c9a 100644 (file)
@@ -376,6 +376,8 @@ struct sqlite3_api_routines {
   void (*str_free)(sqlite3_str*);
   int (*carray_bind)(sqlite3_stmt*,int,void*,int,int,void(*)(void*));
   int (*carray_bind_v2)(sqlite3_stmt*,int,void*,int,int,void(*)(void*),void*);
+  /* Version 3.53.0 and later */
+  double (*atof)(const char*);
 };
 
 /*
@@ -719,6 +721,8 @@ typedef int (*sqlite3_loadext_entry)(
 #define sqlite3_str_free               sqlite3_api->str_free
 #define sqlite3_carray_bind            sqlite3_api->carray_bind
 #define sqlite3_carray_bind_v2         sqlite3_api->carray_bind_v2
+/* Version 3.53.0 and later */
+#define sqlite3_atof                   sqlite3_api->atof
 #endif /* !defined(SQLITE_CORE) && !defined(SQLITE_OMIT_LOAD_EXTENSION) */
 
 #if !defined(SQLITE_CORE) && !defined(SQLITE_OMIT_LOAD_EXTENSION)
index 69a7fbe1bb937b237fade7b0857cacdf564ea9a6..ae6932ed6d3fa2aad1c13f78296810f222e85a28 100644 (file)
@@ -963,9 +963,14 @@ int sqlite3AtoF(const char *zIn, double *pResult){
   return !sqlite3Atoi64(z, pResult, strlen(z), SQLITE_UTF8);
 #endif /* SQLITE_OMIT_FLOATING_POINT */
 }
-#if defined(_MSC_VER)
-#pragma warning(default : 4756)
-#endif
+
+/*
+** Access to sqlite3AtoF()
+*/
+double sqlite3_atof(const char *z){
+  double r;
+  return sqlite3AtoF(z,&r)>0 ? r : 0.0;
+}
 
 /*
 ** Digit pairs used to convert a U64 or I64 into text, two digits