diff options
author | mistachkin <mistachkin@noemail.net> | 2013-03-12 09:07:25 +0000 |
---|---|---|
committer | mistachkin <mistachkin@noemail.net> | 2013-03-12 09:07:25 +0000 |
commit | ee1c64ed25e9f4823327f18bb7e36d4d796606d5 (patch) | |
tree | 026369052c4d58a87e36df18aabb59a1ed3b5932 /src/func.c | |
parent | 32be00a55be775db820bd91de7d85b99386b5aea (diff) | |
download | sqlite-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.c | 29 |
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]); |