aboutsummaryrefslogtreecommitdiff
path: root/src/func.c
diff options
context:
space:
mode:
authormistachkin <mistachkin@noemail.net>2013-03-12 09:07:25 +0000
committermistachkin <mistachkin@noemail.net>2013-03-12 09:07:25 +0000
commitee1c64ed25e9f4823327f18bb7e36d4d796606d5 (patch)
tree026369052c4d58a87e36df18aabb59a1ed3b5932 /src/func.c
parent32be00a55be775db820bd91de7d85b99386b5aea (diff)
downloadsqlite-ee1c64ed25e9f4823327f18bb7e36d4d796606d5.tar.gz
sqlite-ee1c64ed25e9f4823327f18bb7e36d4d796606d5.zip
Increase strictness of the new experimental functions and add more tests.
FossilOrigin-Name: 05c4463ec5f36dde50f6eb116624dc40142f2c8c
Diffstat (limited to 'src/func.c')
-rw-r--r--src/func.c29
1 files changed, 27 insertions, 2 deletions
diff --git a/src/func.c b/src/func.c
index c642e022f..82eba542c 100644
--- a/src/func.c
+++ b/src/func.c
@@ -19,6 +19,9 @@
#include "sqliteInt.h"
#include <stdlib.h>
#include <assert.h>
+#ifndef SQLITE_OMIT_FLOATING_POINT
+# include <math.h>
+#endif
#include "vdbeInt.h"
/*
@@ -986,6 +989,19 @@ static void tointegerFunc(
UNUSED_PARAMETER(argc);
switch( sqlite3_value_type(argv[0]) ){
case SQLITE_FLOAT:
+#ifndef SQLITE_OMIT_FLOATING_POINT
+ {
+ double rVal = sqlite3_value_double(argv[0]);
+ double rIntVal = 0.0;
+ if( !sqlite3IsNaN(rVal) && modf(rVal, &rIntVal)==0.0 &&
+ rIntVal>=SMALLEST_INT64 && rIntVal<=LARGEST_INT64 ){
+ sqlite3_result_int64(context, (i64)rIntVal);
+ return;
+ }
+ sqlite3_result_null(context);
+ break;
+ }
+#endif
case SQLITE_INTEGER: {
sqlite3_result_int64(context, sqlite3_value_int64(argv[0]));
break;
@@ -1038,11 +1054,20 @@ static void todoubleFunc(
assert( argc==1 );
UNUSED_PARAMETER(argc);
switch( sqlite3_value_type(argv[0]) ){
- case SQLITE_FLOAT:
- case SQLITE_INTEGER: {
+ case SQLITE_FLOAT: {
sqlite3_result_double(context, sqlite3_value_double(argv[0]));
break;
}
+ case SQLITE_INTEGER: {
+ i64 iVal = sqlite3_value_int64(argv[0]);
+ double rVal = (double)iVal;
+ if( iVal==rVal ){
+ sqlite3_result_double(context, rVal);
+ return;
+ }
+ sqlite3_result_null(context);
+ break;
+ }
case SQLITE_BLOB:
case SQLITE_TEXT: {
const unsigned char *zStr = sqlite3_value_text(argv[0]);