From: drh Date: Fri, 10 May 2019 12:06:47 +0000 (+0000) Subject: Fix the round() SQL function so that it handles infinities correctly. X-Git-Tag: version-3.29.0~115 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=05d7bfd0bbc884da273bc6cf9862236b80390974;p=thirdparty%2Fsqlite.git Fix the round() SQL function so that it handles infinities correctly. FossilOrigin-Name: db9acef14d49212108c8082cc15a9b9b4a56b8afe4fe1104ddf62783739c1fbe --- diff --git a/manifest b/manifest index dbc56151c5..3d96d7b08e 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sanother\ssmall\sbuffer\soverread\sin\ssqlite_dbdata\striggered\sby\sa\scorrupt\sdatabase\spage. -D 2019-05-09T18:37:37.967 +C Fix\sthe\sround()\sSQL\sfunction\sso\sthat\sit\shandles\sinfinities\scorrectly. +D 2019-05-10T12:06:47.844 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -476,7 +476,7 @@ F src/delete.c d08c9e01a2664afd12edcfa3a9c6578517e8ff8735f35509582693adbe0edeaf F src/expr.c 55e71df830d43bfedd2910e45b097c445a493978b21a0544a54011db1d2fa933 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 0e14d4bef8eac2d87bbd517e492d9084c65008d117823f8922c5e7b2b599bd33 -F src/func.c 8c075dd8ba770bf48a4297c6ab6a520842d0d7711a7b6d9065246d50507597da +F src/func.c 08d6d07d138735dd79f12a2b0c623d1dc9270d0eea61b8be584625391ef84475 F src/global.c 0dea3065ea72a65ae941559b6686aad6516d4913e76fa4f79a95ff7787f624ec F src/hash.c 8d7dda241d0ebdafb6ffdeda3149a412d7df75102cecfc1021c98d6219823b19 F src/hash.h 9d56a9079d523b648774c1784b74b89bd93fac7b365210157482e4319a468f38 @@ -981,7 +981,7 @@ F test/fts4rename.test 6015a355ec3a11a51eb5b88802b3b2c1788786c54b77b17f3e077b7c9 F test/fts4umlaut.test fcaca4471de7e78c9d1f7e8976e3e8704d7d8ad979d57a739d00f3f757380429 F test/fts4unicode.test ceca76422abc251818cb25dabe33d3c3970da5f7c90e1540f190824e6b3a7c95 F test/full.test 6b3c8fb43c6beab6b95438c1675374b95fab245d -F test/func.test 150270b6e2e0281697c116e5ca0e46b41ace8d34b1c92461d88fdd9968c9b03c +F test/func.test e4313baba80bf933e58eb89a7c617bec0f0c348c862b096ec4387f36e05ad0a6 F test/func2.test 772d66227e4e6684b86053302e2d74a2500e1e0f F test/func3.test d202a7606d23f90988a664e88e268aed1087c11c F test/func4.test 6beacdfcb0e18c358e6c2dcacf1b65d1fa80955f @@ -1825,7 +1825,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 8d2a062eb8a3e6fdc6a61b571c8da0070382bf208c53e797151eac8679c975a1 -R 2de2a3768dbf383fc97e924a35530746 -U dan -Z 9056fece1b5cad0dc370fe823762d792 +P 1dfc95b8673b0e8c9ef5040c2fa0fbe9846e430d104e9b83f3f1f3ad63446380 +R 1f6028dc117986e4cb94c6a37ac54229 +U drh +Z e3e8a7ace76308cd59f6bff482696fb7 diff --git a/manifest.uuid b/manifest.uuid index 72b414a6e0..9134298226 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -1dfc95b8673b0e8c9ef5040c2fa0fbe9846e430d104e9b83f3f1f3ad63446380 \ No newline at end of file +db9acef14d49212108c8082cc15a9b9b4a56b8afe4fe1104ddf62783739c1fbe \ No newline at end of file diff --git a/src/func.c b/src/func.c index b0a3169213..313a14018b 100644 --- a/src/func.c +++ b/src/func.c @@ -16,6 +16,7 @@ #include "sqliteInt.h" #include #include +#include #include "vdbeInt.h" /* @@ -396,7 +397,10 @@ static void roundFunc(sqlite3_context *context, int argc, sqlite3_value **argv){ sqlite3_result_error_nomem(context); return; } - sqlite3AtoF(zBuf, &r, sqlite3Strlen30(zBuf), SQLITE_UTF8); + if( !sqlite3AtoF(zBuf, &r, sqlite3Strlen30(zBuf), SQLITE_UTF8) ){ + assert( sqlite3_strglob("*Inf", zBuf)==0 ); + r = zBuf[0]=='-' ? -HUGE_VAL : +HUGE_VAL; + } sqlite3_free(zBuf); } sqlite3_result_double(context, r); diff --git a/test/func.test b/test/func.test index ab719388af..579bad8e44 100644 --- a/test/func.test +++ b/test/func.test @@ -315,6 +315,9 @@ ifcapable floatingpoint { do_test func-4.38 { execsql {SELECT round(9999999999999.556,2);} } {9999999999999.56} + do_execsql_test func-4.39 { + SELECT round(1e500), round(-1e500); + } {Inf -Inf} } # Test the upper() and lower() functions