aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/func.c7
-rw-r--r--src/util.c10
2 files changed, 14 insertions, 3 deletions
diff --git a/src/func.c b/src/func.c
index c505c37d6..75a07e63f 100644
--- a/src/func.c
+++ b/src/func.c
@@ -1740,8 +1740,13 @@ static void sumFinalize(sqlite3_context *context){
if( p->approx ){
sqlite3_result_double(context, p->rSum[0]+p->rSum[1]);
}else{
- i64 v = (i64)p->rSum[0] + (i64)p->rSum[1];
+ double r = p->rSum[0] + p->rSum[1];
+ i64 v;
double y[2], z[2];
+ v = sqlite3RealToI64(p->rSum[0]);
+ if( sqlite3AddInt64(&v, sqlite3RealToI64(p->rSum[1])) ){
+ v = 0;
+ }
sqlite3DDFromInt(v, y);
sqlite3DDSub(y[0], y[1], p->rSum[0], p->rSum[1], z);
if( z[0] + z[1] != 0.0 ){
diff --git a/src/util.c b/src/util.c
index 256ec7c5c..ab8560839 100644
--- a/src/util.c
+++ b/src/util.c
@@ -1761,8 +1761,14 @@ int sqlite3VListNameToNum(VList *pIn, const char *zName, int nName){
/* Compute z = (i64)x */
void sqlite3DDFromInt(i64 x, double *z){
- z[0] = (double)x;
- z[1] = (double)(x - (i64)z[0]);
+ if( x > -4503599627370496L && x < 4503599627370496 ){
+ z[0] = (double)x;
+ z[1] = 0.0;
+ }else{
+ i64 y = x % 2048;
+ z[0] = (double)(x - y);
+ z[1] = (double)(x - (i64)z[0]);
+ }
}
/* Compute z = x + y */