diff options
author | drh <drh@noemail.net> | 2018-07-07 20:55:16 +0000 |
---|---|---|
committer | drh <drh@noemail.net> | 2018-07-07 20:55:16 +0000 |
commit | a546ef219e2badb1e37d1c3f2db980faec14246c (patch) | |
tree | 5f974b024982eb70abc575aadd717e282bacaac4 /src | |
parent | 51a6b193373ef7455453b12d04f8054bc3edf4f9 (diff) | |
download | sqlite-a546ef219e2badb1e37d1c3f2db980faec14246c.tar.gz sqlite-a546ef219e2badb1e37d1c3f2db980faec14246c.zip |
Simplifications to the implementation of the sum() SQL function.
FossilOrigin-Name: a8b13002378fc4ef0b41c367b44b67bf2b28b6624303c087a3c6d657b5bfe32e
Diffstat (limited to 'src')
-rw-r--r-- | src/func.c | 11 |
1 files changed, 5 insertions, 6 deletions
diff --git a/src/func.c b/src/func.c index 3e780ce60..61575745a 100644 --- a/src/func.c +++ b/src/func.c @@ -1505,7 +1505,7 @@ static void sumStep(sqlite3_context *context, int argc, sqlite3_value **argv){ i64 v = sqlite3_value_int64(argv[0]); p->rSum += v; if( (p->approx|p->overflow)==0 && sqlite3AddInt64(&p->iSum, v) ){ - p->overflow = 1; + p->approx = p->overflow = 1; } }else{ p->rSum += sqlite3_value_double(argv[0]); @@ -1524,16 +1524,15 @@ static void sumInverse(sqlite3_context *context, int argc, sqlite3_value**argv){ /* p is always non-NULL because sumStep() will have been called first ** to initialize it */ if( ALWAYS(p) && type!=SQLITE_NULL ){ + assert( p->cnt>0 ); p->cnt--; - if( type==SQLITE_INTEGER ){ + assert( type==SQLITE_INTEGER || p->approx ); + if( type==SQLITE_INTEGER && p->approx==0 ){ i64 v = sqlite3_value_int64(argv[0]); p->rSum -= v; - if( (p->approx|p->overflow)==0 && sqlite3AddInt64(&p->iSum, -1*v) ){ - p->overflow = 1; - } + p->iSum -= v; }else{ p->rSum -= sqlite3_value_double(argv[0]); - p->approx = 1; } } } |