Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | Avoid overflowing the 48-bit mantissa of a floating point number when summing large integers in the SUM() function. Ticket #1664. (CVS 3061) |
---|---|
Downloads: | Tarball | ZIP archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA1: |
a9169e879de5d5e4192d1681bc3e119f |
User & Date: | drh 2006-02-09 13:38:20.000 |
Context
2006-02-09
| ||
13:43 | Add the sqlite3_table_column_meta() API. (CVS 3062) (check-in: 1ac72f68c0 user: danielk1977 tags: trunk) | |
13:38 | Avoid overflowing the 48-bit mantissa of a floating point number when summing large integers in the SUM() function. Ticket #1664. (CVS 3061) (check-in: a9169e879d user: drh tags: trunk) | |
02:56 | Correctly handle COLLATE clauses in tables being modified by an ALTER TABLE ADD COLUMN command. Ticket #1665. (CVS 3060) (check-in: baef2f66be user: drh tags: trunk) | |
Changes
Changes to src/func.c.
︙ | ︙ | |||
12 13 14 15 16 17 18 | ** This file contains the C functions that implement various SQL ** functions of SQLite. ** ** There is only one exported symbol in this file - the function ** sqliteRegisterBuildinFunctions() found at the bottom of the file. ** All other code has file scope. ** | | | 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | ** This file contains the C functions that implement various SQL ** functions of SQLite. ** ** There is only one exported symbol in this file - the function ** sqliteRegisterBuildinFunctions() found at the bottom of the file. ** All other code has file scope. ** ** $Id: func.c,v 1.118 2006/02/09 13:38:20 drh Exp $ */ #include "sqliteInt.h" #include <ctype.h> /* #include <math.h> */ #include <stdlib.h> #include <assert.h> #include "vdbeInt.h" |
︙ | ︙ | |||
813 814 815 816 817 818 819 | /* ** An instance of the following structure holds the context of a ** sum() or avg() aggregate computation. */ typedef struct SumCtx SumCtx; struct SumCtx { | | | | 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 | /* ** An instance of the following structure holds the context of a ** sum() or avg() aggregate computation. */ typedef struct SumCtx SumCtx; struct SumCtx { LONGDOUBLE_TYPE sum; /* Sum of terms */ u32 cnt; /* Number of elements summed */ u8 seenFloat; /* True if there has been any floating point value */ }; /* ** Routines used to compute the sum, average, and total. ** ** The SUM() function follows the (broken) SQL standard which means |
︙ | ︙ | |||
882 883 884 885 886 887 888 | /* ** The following structure keeps track of state information for the ** count() aggregate function. */ typedef struct CountCtx CountCtx; struct CountCtx { | | | | 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 | /* ** The following structure keeps track of state information for the ** count() aggregate function. */ typedef struct CountCtx CountCtx; struct CountCtx { i64 n; }; /* ** Routines to implement the count() aggregate function. */ static void countStep(sqlite3_context *context, int argc, sqlite3_value **argv){ CountCtx *p; p = sqlite3_aggregate_context(context, sizeof(*p)); if( (argc==0 || SQLITE_NULL!=sqlite3_value_type(argv[0])) && p ){ p->n++; } } static void countFinalize(sqlite3_context *context){ CountCtx *p; p = sqlite3_aggregate_context(context, 0); sqlite3_result_int64(context, p ? p->n : 0); } /* ** Routines to implement min() and max() aggregate functions. */ static void minmaxStep(sqlite3_context *context, int argc, sqlite3_value **argv){ Mem *pArg = (Mem *)argv[0]; |
︙ | ︙ |
Changes to test/func.test.
1 2 3 4 5 6 7 8 9 10 11 12 13 | # 2001 September 15 # # The author disclaims copyright to this source code. In place of # a legal notice, here is a blessing: # # May you do good and not evil. # May you find forgiveness for yourself and forgive others. # May you share freely, never taking more than you give. # #*********************************************************************** # This file implements regression tests for SQLite library. The # focus of this file is testing built-in functions. # | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | # 2001 September 15 # # The author disclaims copyright to this source code. In place of # a legal notice, here is a blessing: # # May you do good and not evil. # May you find forgiveness for yourself and forgive others. # May you share freely, never taking more than you give. # #*********************************************************************** # This file implements regression tests for SQLite library. The # focus of this file is testing built-in functions. # # $Id: func.test,v 1.45 2006/02/09 13:38:21 drh Exp $ set testdir [file dirname $argv0] source $testdir/tester.tcl # Create a table to work with. # do_test func-0.0 { |
︙ | ︙ | |||
533 534 535 536 537 538 539 540 541 | } {{}} do_test func-18.6 { execsql { INSERT INTO t5 VALUES(123); SELECT sum(x) FROM t5 } } {123} finish_test | > > > > > > > > > > > | 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 | } {{}} do_test func-18.6 { execsql { INSERT INTO t5 VALUES(123); SELECT sum(x) FROM t5 } } {123} # Ticket #1664: 64-bit overflow in sum() # do_test func-18.10 { execsql { CREATE TABLE t6(x INTEGER); INSERT INTO t6 VALUES(1); INSERT INTO t6 VALUES(1<<62); SELECT sum(x) - ((1<<62)+1) from t6; } } 0 finish_test |