]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Fix the round() SQL function so that it handles infinities correctly.
authordrh <drh@noemail.net>
Fri, 10 May 2019 12:06:47 +0000 (12:06 +0000)
committerdrh <drh@noemail.net>
Fri, 10 May 2019 12:06:47 +0000 (12:06 +0000)
FossilOrigin-Name: db9acef14d49212108c8082cc15a9b9b4a56b8afe4fe1104ddf62783739c1fbe

manifest
manifest.uuid
src/func.c
test/func.test

index dbc56151c5acaa80e549aa203644a387ace6b569..3d96d7b08e424a96cb01cb00fdfa8cd935b6a19e 100644 (file)
--- 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
index 72b414a6e058fda9778c4b07ac1d915d74609105..9134298226fc035d248df10f4ece70bb07a51639 100644 (file)
@@ -1 +1 @@
-1dfc95b8673b0e8c9ef5040c2fa0fbe9846e430d104e9b83f3f1f3ad63446380
\ No newline at end of file
+db9acef14d49212108c8082cc15a9b9b4a56b8afe4fe1104ddf62783739c1fbe
\ No newline at end of file
index b0a316921397050b7dd8abdb8b271336be4137aa..313a14018b2103619836b9dac89c0f8a12efb869 100644 (file)
@@ -16,6 +16,7 @@
 #include "sqliteInt.h"
 #include <stdlib.h>
 #include <assert.h>
+#include <math.h>
 #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);
index ab719388af8617d8536eccc709a75c27a8948bce..579bad8e44f9cbc6483d082bcd0c60af61580df4 100644 (file)
@@ -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