diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/func.c | 7 | ||||
-rw-r--r-- | src/util.c | 10 |
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 */ |