]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Simplifications to the implementation of the sum() SQL function.
authordrh <drh@noemail.net>
Sat, 7 Jul 2018 20:55:16 +0000 (20:55 +0000)
committerdrh <drh@noemail.net>
Sat, 7 Jul 2018 20:55:16 +0000 (20:55 +0000)
FossilOrigin-Name: a8b13002378fc4ef0b41c367b44b67bf2b28b6624303c087a3c6d657b5bfe32e

manifest
manifest.uuid
src/func.c

index 7758afc8401916a0e961c87ab689d2bb688aedce..8189768335918712cc65953692237418ed2a1858 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Fix\sanother\sproblem\swith\sreusing\sLSM\scursors\sfor\srange\sscans.
-D 2018-07-07T20:26:30.030
+C Simplifications\sto\sthe\simplementation\sof\sthe\ssum()\sSQL\sfunction.
+D 2018-07-07T20:55:16.666
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
 F Makefile.in 0a3a6c81e6fcb969ff9106e882f0a08547014ba463cb6beca4c4efaecc924ee6
@@ -450,7 +450,7 @@ F src/delete.c 4c8c7604277a2041647f96b78f4b9a47858e9217e4fb333d35e7b5ab32c5b57f
 F src/expr.c 7e257eeffe9553c10a6ac0a1f0177bf740c4da834e7d6e2cbb7d3ebaa3d7f3e1
 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007
 F src/fkey.c b1da9ef8dc834603bb0d28972378a7ce65897847f9a1e89ab800bbdf24c788ee
-F src/func.c e3174d1f10dbaef9478a243d4a4d51135a9092d73ceaeafac3663aeff60737c4
+F src/func.c e94214037dbc9d258ece54434fe120b419880550239c80dcd101afe7b2a51131
 F src/global.c 9bf034fd560bdd514715170ed8460bb7f823cec113f0569ef3f18a20c7ccd128
 F src/hash.c a12580e143f10301ed5166ea4964ae2853d3905a511d4e0c44497245c7ce1f7a
 F src/hash.h ab34c5c54a9e9de2e790b24349ba5aab3dbb4fd4
@@ -1745,7 +1745,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
 F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
 F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P 4b8cfe7bfe5f049eb4607fd480429fcd2060e691891d8bffc9917f13fa373988
-R 30589e318928e413de309a69449a613b
-U dan
-Z 36c3a96195f8670c51ccae820f038ab1
+P ae3fc7652f27ba0a86f4c26f64c2e148d9496a5edb7f54dc9980edd91c326e4f
+R 7fefa3b6e3f1ad000f6b20afb58dadef
+U drh
+Z a5540dd7ff49b20c02f142203cdf3720
index dccd51a6522adb88feef51d0b8ce6718326f2bd8..3934e737f3d140a7553a6bbfaef6464a190dc31d 100644 (file)
@@ -1 +1 @@
-ae3fc7652f27ba0a86f4c26f64c2e148d9496a5edb7f54dc9980edd91c326e4f
\ No newline at end of file
+a8b13002378fc4ef0b41c367b44b67bf2b28b6624303c087a3c6d657b5bfe32e
\ No newline at end of file
index 3e780ce60f8e38d554e7007291b89d57c1fb5294..61575745ad484a12a43da08fa297768668bf7cb5 100644 (file)
@@ -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;
     }
   }
 }