1
0
mirror of https://github.com/sqlite/sqlite.git synced 2025-07-30 19:03:16 +03:00

SUM returns NULL when it has no inputs. Ticket #1413. (CVS 2678)

FossilOrigin-Name: 6281859425d39c11d82875301fefafad1f08416d
This commit is contained in:
drh
2005-09-08 20:37:43 +00:00
parent 3f219f46fc
commit c2bd913a40
8 changed files with 52 additions and 36 deletions

View File

@ -1,5 +1,5 @@
C A\sSUM()\sof\sall\sNULLs\sreturns\sNULL.\s\sA\sSUM()\sof\snothing\sreturn\s0.\nA\sSUM()\sof\sa\smixture\sof\sNULLs\sand\snumbers\sreturns\sthe\ssum\sof\sthe\nnumbers.\s\sTicket\s#1413.\s(CVS\s2677)
D 2005-09-08T19:45:58
C SUM\sreturns\sNULL\swhen\sit\shas\sno\sinputs.\s\sTicket\s#1413.\s(CVS\s2678)
D 2005-09-08T20:37:43
F Makefile.in 12784cdce5ffc8dfb707300c34e4f1eb3b8a14f1
F Makefile.linux-gcc 06be33b2a9ad4f005a5f42b22c4a19dab3cbb5c7
F README 9c4e2d6706bdcc3efdd773ce752a8cdab4f90028
@ -41,7 +41,7 @@ F src/date.c 7444b0900a28da77e57e3337a636873cff0ae940
F src/delete.c 16a0e19460b14d219f39ff5c7a9eef808aa1969c
F src/experimental.c 50c1e3b34f752f4ac10c36f287db095c2b61766d
F src/expr.c 38f1e135aa80dfc62e253c1e22dd6e194efd2d61
F src/func.c ebf56befdbecb6570f3fbf42e6e414baf5e2049a
F src/func.c f63d417248808ff2632a3b576536abffcc21d858
F src/hash.c 2b1b13f7400e179631c83a1be0c664608c8f021f
F src/hash.h 1b0c445e1c89ff2aaad9b4605ba61375af001e84
F src/insert.c 484c73bc1309f283a31baa0e114f3ee980536397
@ -145,7 +145,7 @@ F test/enc2.test 76c13b8c00beaf95b15c152e95dab51292eb1f0d
F test/enc3.test f6a5f0b7b7f3a88f030d3143729b87cd5c86d837
F test/expr.test 71b8cba7fe5c228147c93e530e098144565aaa46
F test/fkey1.test 153004438d51e6769fb1ce165f6313972d6263ce
F test/func.test e1f9489e76a1add3ffeecd02038edca130ba759b
F test/func.test 431f8e07a30aadf2a2a0c8c32f918a497bc4331d
F test/hook.test f8605cde4c77b2c6a4a73723bf6c507796a64dda
F test/in.test cead6165aebbe0d451bb2263a307173acfeb6240
F test/index.test 51e01a0928b4b61228917ddd8c6c0e2466547f6f
@ -199,9 +199,9 @@ F test/safety.test 907b64fee719554a3622853812af3886fddbbb4f
F test/schema.test 21cbe7dac652f6d7eb058f3dec369bdbf46bbde6
F test/select1.test 480233d4f5a81d7d59a55e40d05084d97e57ecdf
F test/select2.test f3c2678c3a9f3cf08ec4988a3845bda64be6d9e3
F test/select3.test 551e25e97baf4ed3ec1d3d99776f936517938e60
F test/select3.test 576df1a5cc5e01dadae9176384e2d506315afdcf
F test/select4.test c239f516aa31f42f2ef7c6d7cd01105f08f934ca
F test/select5.test 2dcd382d1d416bf984cd3030ca9f386488a51ab1
F test/select5.test cf5c42137d915b5e866c99d018be67dad9ebed75
F test/select6.test 21b72c56e7cbcefd063fdf9bc6c89342aedabccf
F test/select7.test 1bf795b948c133a15a2a5e99d3270e652ec58ce6
F test/sort.test 0c33a8ae1c238377ad197387c3872175f40d3843
@ -219,7 +219,7 @@ F test/threadtest2.c 97a830d53c24c42290501fdfba4a6e5bdd34748b
F test/trace.test 9fd28695c463b90c2d32c387a432e01eb26e8ccf
F test/trans.test 10506dc30305cfb8c4098359f7f6f64786f69c5e
F test/trigger1.test 152aed5a1fa90709fe171f2ca501a6b7f7901479
F test/trigger2.test f85ee0db543c6303a23f7037cd48534dbb2d1796
F test/trigger2.test dea71f4b05e22896e72527278bc8ef71b7475bf2
F test/trigger3.test 9102fd3933db294dc654b5aee9edfe9e94f2b9e2
F test/trigger4.test 9615207f3746b1f3965113007869e45a895d2497
F test/trigger5.test 619391a3e9fc194081d22cefd830d811e7badf83
@ -286,7 +286,7 @@ F www/fullscanb.gif f7c94cb227f060511f8909e10f570157263e9a25
F www/index-ex1-x-b.gif f9b1d85c3fa2435cf38b15970c7e3aa1edae23a3
F www/index.tcl 853525c11fb519dac801bcbbe0488c447e526e7b
F www/indirect1b1.gif adfca361d2df59e34f9c5cac52a670c2bfc303a1
F www/lang.tcl 422b21b899f6d84dd3fdd2d4b204061b6912efd2
F www/lang.tcl 7fd48a2d1866a58bca4d43808aed991616bf198d
F www/lockingv3.tcl f59b19d6c8920a931f096699d6faaf61c05db55f
F www/mingw.tcl d96b451568c5d28545fefe0c80bee3431c73f69c
F www/nulls.tcl ec35193f92485b87b90a994a01d0171b58823fcf
@ -306,7 +306,7 @@ F www/tclsqlite.tcl 3df553505b6efcad08f91e9b975deb2e6c9bb955
F www/vdbe.tcl 87a31ace769f20d3627a64fa1fade7fed47b90d0
F www/version3.tcl a99cf5f6d8bd4d5537584a2b342f0fb9fa601d8b
F www/whentouse.tcl 97e2b5cd296f7d8057e11f44427dea8a4c2db513
P 48f6a331efea419fe948cd366f9c60ae41edddfd
R 37364513cd59bb3038c4f5a7cd9fbfba
P 2e6230edfd651b40481ebad8aa01a22ac92ce80c
R a88a293bb05baabbecb6ecb073a9f526
U drh
Z 7b39a84184f0dd170c44b611c8879606
Z d9f9df11ed266877677e4103d7412fad

View File

@ -1 +1 @@
2e6230edfd651b40481ebad8aa01a22ac92ce80c
6281859425d39c11d82875301fefafad1f08416d

View File

@ -16,7 +16,7 @@
** sqliteRegisterBuildinFunctions() found at the bottom of the file.
** All other code has file scope.
**
** $Id: func.c,v 1.109 2005/09/08 19:45:58 drh Exp $
** $Id: func.c,v 1.110 2005/09/08 20:37:43 drh Exp $
*/
#include "sqliteInt.h"
#include <ctype.h>
@ -842,13 +842,13 @@ static void sumStep(sqlite3_context *context, int argc, sqlite3_value **argv){
static void sumFinalize(sqlite3_context *context){
SumCtx *p;
p = sqlite3_aggregate_context(context, 0);
if( p==0 ){
sqlite3_result_int(context, 0);
}else if( p->seenFloat ){
if( p && p->cnt>0 ){
if( p->seenFloat ){
sqlite3_result_double(context, p->sum);
}else if( p->cnt>0 ){
}else{
sqlite3_result_int64(context, (i64)p->sum);
}
}
}
static void avgFinalize(sqlite3_context *context){
SumCtx *p;

View File

@ -11,7 +11,7 @@
# This file implements regression tests for SQLite library. The
# focus of this file is testing built-in functions.
#
# $Id: func.test,v 1.39 2005/09/08 19:45:58 drh Exp $
# $Id: func.test,v 1.40 2005/09/08 20:37:44 drh Exp $
set testdir [file dirname $argv0]
source $testdir/tester.tcl
@ -513,14 +513,14 @@ do_test func-18.2 {
}
} {9902.0}
# The sum of nothing is 0. But the sum of all NULLs is NULL.
# The sum of nothing is NULL. But the sum of all NULLs is NULL.
#
do_test func-18.3 {
execsql {
DELETE FROM t5;
SELECT sum(x) FROM t5;
}
} {0}
} {{}}
do_test func-18.4 {
execsql {
INSERT INTO t5 VALUES(NULL);

View File

@ -12,7 +12,7 @@
# focus of this file is testing aggregate functions and the
# GROUP BY and HAVING clauses of SELECT statements.
#
# $Id: select3.test,v 1.15 2005/09/08 12:57:28 drh Exp $
# $Id: select3.test,v 1.16 2005/09/08 20:37:44 drh Exp $
set testdir [file dirname $argv0]
source $testdir/tester.tcl
@ -233,7 +233,7 @@ do_test select3-7.2 {
execsql {
SELECT a, sum(b) FROM t2 WHERE b=5;
}
} {{} 0}
} {{} {}}
finish_test

View File

@ -12,7 +12,7 @@
# focus of this file is testing aggregate functions and the
# GROUP BY and HAVING clauses of SELECT statements.
#
# $Id: select5.test,v 1.12 2005/09/08 10:37:01 drh Exp $
# $Id: select5.test,v 1.13 2005/09/08 20:37:44 drh Exp $
set testdir [file dirname $argv0]
source $testdir/tester.tcl
@ -118,7 +118,7 @@ do_test select5-4.5 {
execsql {
SELECT sum(x) FROM t1 WHERE x>100
}
} {0}
} {{}}
# Some tests for queries with a GROUP BY clause but no aggregate functions.
#

View File

@ -93,7 +93,8 @@ ifcapable subquery {
BEGIN
INSERT INTO rlog VALUES ( (SELECT coalesce(max(idx),0) + 1 FROM rlog),
old.a, old.b,
(SELECT sum(a) FROM tbl), (SELECT sum(b) FROM tbl),
(SELECT coalesce(sum(a),0) FROM tbl),
(SELECT coalesce(sum(b),0) FROM tbl),
new.a, new.b);
END;
@ -101,7 +102,8 @@ ifcapable subquery {
BEGIN
INSERT INTO rlog VALUES ( (SELECT coalesce(max(idx),0) + 1 FROM rlog),
old.a, old.b,
(SELECT sum(a) FROM tbl), (SELECT sum(b) FROM tbl),
(SELECT coalesce(sum(a),0) FROM tbl),
(SELECT coalesce(sum(b),0) FROM tbl),
new.a, new.b);
END;
@ -110,7 +112,8 @@ ifcapable subquery {
BEGIN
INSERT INTO clog VALUES ( (SELECT coalesce(max(idx),0) + 1 FROM clog),
old.a, old.b,
(SELECT sum(a) FROM tbl), (SELECT sum(b) FROM tbl),
(SELECT coalesce(sum(a),0) FROM tbl),
(SELECT coalesce(sum(b),0) FROM tbl),
new.a, new.b);
END;
}
@ -140,7 +143,8 @@ ifcapable subquery {
BEGIN
INSERT INTO rlog VALUES ( (SELECT coalesce(max(idx),0) + 1 FROM rlog),
old.a, old.b,
(SELECT sum(a) FROM tbl), (SELECT sum(b) FROM tbl),
(SELECT coalesce(sum(a),0) FROM tbl),
(SELECT coalesce(sum(b),0) FROM tbl),
0, 0);
END;
@ -148,7 +152,8 @@ ifcapable subquery {
BEGIN
INSERT INTO rlog VALUES ( (SELECT coalesce(max(idx),0) + 1 FROM rlog),
old.a, old.b,
(SELECT sum(a) FROM tbl), (SELECT sum(b) FROM tbl),
(SELECT coalesce(sum(a),0) FROM tbl),
(SELECT coalesce(sum(b),0) FROM tbl),
0, 0);
END;
}
@ -172,7 +177,8 @@ ifcapable subquery {
BEGIN
INSERT INTO rlog VALUES ( (SELECT coalesce(max(idx),0) + 1 FROM rlog),
0, 0,
(SELECT sum(a) FROM tbl), (SELECT sum(b) FROM tbl),
(SELECT coalesce(sum(a),0) FROM tbl),
(SELECT coalesce(sum(b),0) FROM tbl),
new.a, new.b);
END;
@ -180,7 +186,8 @@ ifcapable subquery {
BEGIN
INSERT INTO rlog VALUES ( (SELECT coalesce(max(idx),0) + 1 FROM rlog),
0, 0,
(SELECT sum(a) FROM tbl), (SELECT sum(b) FROM tbl),
(SELECT coalesce(sum(a),0) FROM tbl),
(SELECT coalesce(sum(b),0) FROM tbl),
new.a, new.b);
END;
}

View File

@ -1,7 +1,7 @@
#
# Run this Tcl script to generate the lang-*.html files.
#
set rcsid {$Id: lang.tcl,v 1.98 2005/08/28 17:00:26 drh Exp $}
set rcsid {$Id: lang.tcl,v 1.99 2005/09/08 20:37:44 drh Exp $}
source common.tcl
if {[llength $argv]>0} {
@ -1360,7 +1360,8 @@ API.</p>
<table border=0 cellpadding=10>
<tr>
<td valign="top" align="right" width=120>avg(<i>X</i>)</td>
<td valign="top">Return the average value of all <i>X</i> within a group.</td>
<td valign="top">Return the average value of all non-NULL <i>X</i> within a
group. Non-numeric values are interpreted as 0.</td>
</tr>
<tr>
@ -1385,7 +1386,15 @@ if all values in the group are NULL.</td>
<tr>
<td valign="top" align="right">sum(<i>X</i>)</td>
<td valign="top">Return the numeric sum of all values in the group.</td>
<td valign="top">Return the numeric sum of all numeric values in the group.
If there are no input rows or all values are NULL, then NULL is returned.
NULL is not a helpful result in that case (the correct answer should be
zero) but it is what the SQL standard requires and how
most other SQL database engines operate so SQLite does it that way
in order to be compatible.
You will probably want to use
"<b>coalesce(sum(</b>X<b>),0)</b>" instead of just "<b>sum(</b>X<b>)</b>"
to work around this design problem in the SQL language.</td>
</tr>
</table>
}