Experimental change to add a per-connection option that raises an error if
a bare column appears in an aggregate query. FossilOrigin-Name: f587891134158fa4c48b3a31b6e1b9d7688823953a8b434752199160f3a95ffd
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
C Remove\sSQLITE_EXTENSION_INIT\smacros\sfrom\sdbdata.c.
|
||||
D 2023-06-08T20:49:25.974
|
||||
C Experimental\schange\sto\sadd\sa\sper-connection\soption\sthat\sraises\san\serror\sif\na\sbare\scolumn\sappears\sin\san\saggregate\squery.
|
||||
D 2023-06-09T13:08:36.651
|
||||
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
|
||||
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
|
||||
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
|
||||
@@ -586,7 +586,7 @@ F src/date.c 6e9549239d08957ffeff481bb131d071c969833b230d1dbfb836cf9dab1501b8
|
||||
F src/dbpage.c f3eea5f7ec47e09ee7da40f42b25092ecbe961fc59566b8e5f705f34335b2387
|
||||
F src/dbstat.c ec92074baa61d883de58c945162d9e666c13cd7cf3a23bc38b4d1c4d0b2c2bef
|
||||
F src/delete.c 1b00589aa4f2c50beba39f9da5166fc2161234580ea8c0d087b6d5c2c7a17c21
|
||||
F src/expr.c b7dabf7f5ab42ed0b70437e9725aea25700eaff8a268cc42d682b1d67bb797f8
|
||||
F src/expr.c bdaff0996d8651ee158d1ff20cc0750b967d390c32db7b752333ee795f7873f8
|
||||
F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007
|
||||
F src/fkey.c 03c134cc8bffe54835f742ddea0b72ebfc8f6b32773d175c71b8afeea6cb5c83
|
||||
F src/func.c 6303e1ccb80dbd0d9b52f902a01d3b105981486fdfd66f9e1ddfd74aaf3032fc
|
||||
@@ -599,7 +599,7 @@ F src/insert.c a38bbb944a4f2771d70140db9c5d57e36c37e28d5a366497b4f93272a6d2567e
|
||||
F src/json.c 14c474fb1249a46eb44e878e2361f36abfe686b134039b0d1883d93d61505b4a
|
||||
F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa
|
||||
F src/loadext.c 176d6b2cb18a6ad73b133db17f6fc351c4d9a2d510deebdb76c22bde9cfd1465
|
||||
F src/main.c 5fd4b65d61ae6155f36756ed508a39b38b49355b031188961e8d923f43f4bc49
|
||||
F src/main.c 4c04e6c772ce42663e9f2f73fe053f4a38fefcdd0e98511ade49fb7ed3065a33
|
||||
F src/malloc.c 47b82c5daad557d9b963e3873e99c22570fb470719082c6658bf64e3012f7d23
|
||||
F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645
|
||||
F src/mem1.c 3bb59158c38e05f6270e761a9f435bf19827a264c13d1631c58b84bdc96d73b2
|
||||
@@ -636,17 +636,17 @@ F src/printf.c b9320cdbeca0b336c3f139fd36dd121e4167dd62b35fbe9ccaa9bab44c0af38d
|
||||
F src/random.c 606b00941a1d7dd09c381d3279a058d771f406c5213c9932bbd93d5587be4b9c
|
||||
F src/resolve.c c1457b920aeb33ed106bf478fad31b7473a8950a755ea898980c428928f3a514
|
||||
F src/rowset.c 8432130e6c344b3401a8874c3cb49fefe6873fec593294de077afea2dce5ec97
|
||||
F src/select.c 1ddfe4450101c3d4890ecb2d6b97ab80b78764d5a3e7022b171721df1620c419
|
||||
F src/shell.c.in 0c420738cf95292c394c2451281f76f2638c9234943805375974a20d2a5be8c3
|
||||
F src/sqlite.h.in 3076d78836b6dac53b3ab0875fc8fd15bca8077aad4d33c85336e05af6aef8c7
|
||||
F src/select.c dc7daf795c53421ba9f78e8345b8a7501b078479d95b3fe91f5e523a48ca57bb
|
||||
F src/shell.c.in 359a1436b4cd24f30d98dc1bd751333e1ec670a6e752ba047545739187ad2910
|
||||
F src/sqlite.h.in 54623b116932859b1bc56b5f74ffa0c77ac9c3657cd2d5797590874afe2dbb08
|
||||
F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8
|
||||
F src/sqlite3ext.h da473ce2b3d0ae407a6300c4a164589b9a6bfdbec9462688a8593ff16f3bb6e4
|
||||
F src/sqliteInt.h 924ddd5bd9dad8a499005c2c02a492c67dbe784feafbd78fdd70d712cf839499
|
||||
F src/sqliteInt.h 435d393dd67d9c50a8abe6b0c814c3882679d95d7f6a1f9495555635987ede0e
|
||||
F src/sqliteLimit.h 33b1c9baba578d34efe7dfdb43193b366111cdf41476b1e82699e14c11ee1fb6
|
||||
F src/status.c 160c445d7d28c984a0eae38c144f6419311ed3eace59b44ac6dafc20db4af749
|
||||
F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1
|
||||
F src/tclsqlite.c 9952874a1f1bb9fa6406b334cadf748c273cd2f2d4501152022a95dd37dc7958
|
||||
F src/test1.c 8ae514d6a0d030f7953a99ff5dca6419cb7a5ad1a1c392d1fdf0f069e6ca792b
|
||||
F src/test1.c 54c127625d25c004a59b5f671a9dfd6c436661c461b0ececaabb4b0979260469
|
||||
F src/test2.c 827446e259a3b7ab949da1542953edda7b5117982576d3e6f1c24a0dd20a5cef
|
||||
F src/test3.c e5178558c41ff53236ae0271e9acb3d6885a94981d2eb939536ee6474598840e
|
||||
F src/test4.c 4533b76419e7feb41b40582554663ed3cd77aaa54e135cf76b3205098cd6e664
|
||||
@@ -1435,18 +1435,18 @@ F test/schemafault.test 1936bceca55ac82c5efbcc9fc91a1933e45c8d1e1d106b9a7e56c972
|
||||
F test/securedel.test 2f70b2449186a1921bd01ec9da407fbfa98c3a7a5521854c300c194b2ff09384
|
||||
F test/securedel2.test 2d54c28e46eb1fd6902089958b20b1b056c6f1c5
|
||||
F test/seekscan1.test 31af16e3bb3203d153aea320939c5da97ec44705c2710d153c06a01397d45b09
|
||||
F test/select1.test 692e84cfa29c405854c69e8a4027183d64c22952866a123fabbce741a379e889
|
||||
F test/select1.test 1f3f154481c8ad4dc6f8192720fd86bf667f3ce1b636c3f4987f1d3c3cc459c5
|
||||
F test/select2.test 352480e0e9c66eda9c3044e412abdf5be0215b56
|
||||
F test/select3.test 8d04b66df7475275a65f7e4a786d6a724c30bd9929f8ae5bd59c8d3d6e75e6cd
|
||||
F test/select4.test f0684d3da3bccacbe2a1ebadf6fb49d9df6f53acb4c6ebc228a88d0d6054cc7b
|
||||
F test/select5.test 8afc5e5dcdebc2be54472e73ebd9cd1adef1225fd15d37a1c62f969159f390ae
|
||||
F test/select6.test 9b2fb4ffedf52e1b5703cfcae1212e7a4a063f014c0458d78d29aca3db766d1f
|
||||
F test/select7.test f659f231489349e8c5734e610803d7654207318f
|
||||
F test/select8.test 8c8f5ae43894c891efc5755ed905467d1d67ad5d
|
||||
F test/select3.test 398ba6069fd6e9e90b24723cf2287e352280c1dce3a54db29420ea518d7e2c49
|
||||
F test/select4.test b5b57fb83dd0891cebc6b4d7e1159deac6a075816a473805694a2d52dc859d11
|
||||
F test/select5.test b75d12932232b35791ba6c0b1298f60c3b008e6e8bf9a9123c5244845836dbd7
|
||||
F test/select6.test b3ec3ae543922683567afebeb4199d4694eba642110275a21bb363524b5e47bd
|
||||
F test/select7.test ee6369be33d5eb857fb1dd32f71d4bcbbc6550cdcf6d154290cd20142e7fca20
|
||||
F test/select8.test 705dbdc6c9cde7e62dfa92f506e95895d75f1a88d42942ab493c1aacb9eb88f9
|
||||
F test/select9.test f7586b207ce2304ab80dc93d3146469a28fd4403621dd3a82d06644563d3c812
|
||||
F test/selectA.test 6aef8b2136a4ac7a3e2e4161d2b8ca7bc6ebe2779de084f9bb66ca9e2323a937
|
||||
F test/selectB.test 954e4e49cf1f896d61794e440669e03a27ceea25
|
||||
F test/selectC.test 38c530b0cc5728b793c3c11f52b52c70290d39822224acd39011c89c1853bd31
|
||||
F test/selectC.test 294b7566a3eda0b4226e90de384a4ff32252df9551ebf4edafd08d02aaddecc9
|
||||
F test/selectD.test 6d1909b49970bf92f45ce657505befcef5fc7cbc13544e18103a316d32189bfb
|
||||
F test/selectE.test a8730ca330fcf40ace158f134f4fe0eb00c7edbf
|
||||
F test/selectF.test 21c94e6438f76537b72532fa9fd4710cdd455fc3
|
||||
@@ -2040,8 +2040,11 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
|
||||
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
|
||||
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
|
||||
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
|
||||
P 157b5d25e0c99eabfa3c32cb867fe7e3c05031c12354f734d2cd8a4062b9439c
|
||||
R fd6d21412985b1945f5582d66d783118
|
||||
U dan
|
||||
Z bb3a1dd8e6d17e8c766f86f2b38d20ee
|
||||
P 106ec745766ac59131f975d5ab5487c8a24b9c3be1766411c018b42c6ae4672a
|
||||
R d727d1de40f238a882594204f8ca1f35
|
||||
T *branch * newbie-safe-aggregates
|
||||
T *sym-newbie-safe-aggregates *
|
||||
T -sym-trunk *
|
||||
U drh
|
||||
Z a5115ea6cc9f8846539ef3c6d5cf6027
|
||||
# Remove this line to create a well-formed Fossil manifest.
|
||||
|
||||
+1
-1
@@ -1 +1 @@
|
||||
106ec745766ac59131f975d5ab5487c8a24b9c3be1766411c018b42c6ae4672a
|
||||
f587891134158fa4c48b3a31b6e1b9d7688823953a8b434752199160f3a95ffd
|
||||
+28
@@ -6493,6 +6493,11 @@ static void findOrCreateAggInfoColumn(
|
||||
}
|
||||
}
|
||||
if( pCol->iSorterColumn<0 ){
|
||||
if( pAggInfo->nAccumulator<0 ){
|
||||
assert( pParse->db->flags & SQLITE_StrictAgg );
|
||||
sqlite3ErrorMsg(pParse, "bare column in aggregate query");
|
||||
sqlite3RecordErrorOffsetOfExpr(pParse->db, pExpr);
|
||||
}
|
||||
pCol->iSorterColumn = pAggInfo->nSortingColumn++;
|
||||
}
|
||||
fix_up_expr:
|
||||
@@ -6519,10 +6524,33 @@ static int analyzeAggregate(Walker *pWalker, Expr *pExpr){
|
||||
|
||||
assert( pNC->ncFlags & NC_UAggInfo );
|
||||
assert( pAggInfo->iFirstReg==0 );
|
||||
|
||||
|
||||
switch( pExpr->op ){
|
||||
default: {
|
||||
IndexedExpr *pIEpr;
|
||||
Expr tmp;
|
||||
|
||||
/* If this expression node matches an entry in the GROUP BY clause
|
||||
** then disable bare-column error reporting for all subexpressions
|
||||
** within this expression. */
|
||||
if( pAggInfo->nAccumulator<0 && pAggInfo->pGroupBy!=0 ){
|
||||
int j, n;
|
||||
ExprList *pGB = pAggInfo->pGroupBy;
|
||||
struct ExprList_item *pTerm = pGB->a;
|
||||
n = pGB->nExpr;
|
||||
for(j=0; j<n; j++, pTerm++){
|
||||
if( sqlite3ExprCompare(0, pTerm->pExpr, pExpr, 0)==0 ){
|
||||
pAggInfo->nAccumulator = 0;
|
||||
sqlite3WalkExpr(pWalker, pExpr);
|
||||
pAggInfo->nAccumulator = -1;
|
||||
return WRC_Prune;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Check to see if the current expression can be satisfied using
|
||||
** and index on an expression. */
|
||||
assert( pParse->iSelfTab==0 );
|
||||
if( (pNC->ncFlags & NC_InAggFunc)==0 ) break;
|
||||
if( pParse->pIdxEpr==0 ) break;
|
||||
|
||||
@@ -960,6 +960,7 @@ int sqlite3_db_config(sqlite3 *db, int op, ...){
|
||||
{ SQLITE_DBCONFIG_TRUSTED_SCHEMA, SQLITE_TrustedSchema },
|
||||
{ SQLITE_DBCONFIG_STMT_SCANSTATUS, SQLITE_StmtScanStatus },
|
||||
{ SQLITE_DBCONFIG_REVERSE_SCANORDER, SQLITE_ReverseOrder },
|
||||
{ SQLITE_DBCONFIG_STRICT_AGGREGATE, SQLITE_StrictAgg },
|
||||
};
|
||||
unsigned int i;
|
||||
rc = SQLITE_ERROR; /* IMP: R-42790-23372 */
|
||||
|
||||
@@ -7872,6 +7872,13 @@ int sqlite3Select(
|
||||
VVA_ONLY( sNC.ncFlags = NC_UAggInfo; )
|
||||
pAggInfo->nSortingColumn = pGroupBy ? pGroupBy->nExpr : 0;
|
||||
pAggInfo->pGroupBy = pGroupBy;
|
||||
if( db->flags & SQLITE_StrictAgg ){
|
||||
/* nAccumulator<0 indicates that bare columns on a table to be
|
||||
** aggregated should be considered an error. nAccumulator will
|
||||
** become non-negative before we start processing the arguments of
|
||||
** aggregate queries further below. */
|
||||
pAggInfo->nAccumulator = -1;
|
||||
}
|
||||
sqlite3ExprAnalyzeAggList(&sNC, pEList);
|
||||
sqlite3ExprAnalyzeAggList(&sNC, sSort.pOrderBy);
|
||||
if( pHaving ){
|
||||
|
||||
@@ -8281,6 +8281,7 @@ static int do_meta_command(char *zLine, ShellState *p){
|
||||
{ "reset_database", SQLITE_DBCONFIG_RESET_DATABASE },
|
||||
{ "reverse_scanorder", SQLITE_DBCONFIG_REVERSE_SCANORDER },
|
||||
{ "stmt_scanstatus", SQLITE_DBCONFIG_STMT_SCANSTATUS },
|
||||
{ "strict_aggregate", SQLITE_DBCONFIG_STRICT_AGGREGATE },
|
||||
{ "trigger_eqp", SQLITE_DBCONFIG_TRIGGER_EQP },
|
||||
{ "trusted_schema", SQLITE_DBCONFIG_TRUSTED_SCHEMA },
|
||||
{ "writable_schema", SQLITE_DBCONFIG_WRITABLE_SCHEMA },
|
||||
|
||||
+2
-1
@@ -2510,7 +2510,8 @@ struct sqlite3_mem_methods {
|
||||
#define SQLITE_DBCONFIG_TRUSTED_SCHEMA 1017 /* int int* */
|
||||
#define SQLITE_DBCONFIG_STMT_SCANSTATUS 1018 /* int int* */
|
||||
#define SQLITE_DBCONFIG_REVERSE_SCANORDER 1019 /* int int* */
|
||||
#define SQLITE_DBCONFIG_MAX 1019 /* Largest DBCONFIG */
|
||||
#define SQLITE_DBCONFIG_STRICT_AGGREGATE 1020 /* int int* */
|
||||
#define SQLITE_DBCONFIG_MAX 1020 /* Largest DBCONFIG */
|
||||
|
||||
/*
|
||||
** CAPI3REF: Enable Or Disable Extended Result Codes
|
||||
|
||||
+3
-2
@@ -1761,8 +1761,7 @@ struct sqlite3 {
|
||||
#define SQLITE_ShortColNames 0x00000040 /* Show short columns names */
|
||||
#define SQLITE_TrustedSchema 0x00000080 /* Allow unsafe functions and
|
||||
** vtabs in the schema definition */
|
||||
#define SQLITE_NullCallback 0x00000100 /* Invoke the callback once if the */
|
||||
/* result set is empty */
|
||||
#define SQLITE_StrictAgg 0x00000100 /* No bare columns in agg queries */
|
||||
#define SQLITE_IgnoreChecks 0x00000200 /* Do not enforce check constraints */
|
||||
#define SQLITE_StmtScanStatus 0x00000400 /* Enable stmt_scanstats() counters */
|
||||
#define SQLITE_NoCkptOnClose 0x00000800 /* No checkpoint on close()/DETACH */
|
||||
@@ -1791,6 +1790,8 @@ struct sqlite3 {
|
||||
/* the count using a callback. */
|
||||
#define SQLITE_CorruptRdOnly HI(0x00002) /* Prohibit writes due to error */
|
||||
#define SQLITE_ReadUncommit HI(0x00004) /* READ UNCOMMITTED in shared-cache */
|
||||
#define SQLITE_NullCallback HI(0x00008) /* Invoke the callback once if the */
|
||||
/* result set is empty */
|
||||
|
||||
/* Flags used only if debugging */
|
||||
#ifdef SQLITE_DEBUG
|
||||
|
||||
+11
-1
@@ -8336,6 +8336,7 @@ static int SQLITE_TCLAPI test_sqlite3_db_config(
|
||||
{ "DQS_DDL", SQLITE_DBCONFIG_DQS_DDL },
|
||||
{ "LEGACY_FILE_FORMAT", SQLITE_DBCONFIG_LEGACY_FILE_FORMAT },
|
||||
{ "STMT_SCANSTATUS", SQLITE_DBCONFIG_STMT_SCANSTATUS },
|
||||
{ "STRICT_AGGREGATE", SQLITE_DBCONFIG_STRICT_AGGREGATE },
|
||||
};
|
||||
int i;
|
||||
int v = 0;
|
||||
@@ -8360,7 +8361,16 @@ static int SQLITE_TCLAPI test_sqlite3_db_config(
|
||||
return TCL_ERROR;
|
||||
}
|
||||
if( objc==4 ){
|
||||
if( Tcl_GetIntFromObj(interp, objv[3], &v) ) return TCL_ERROR;
|
||||
if( Tcl_GetIntFromObj(interp, objv[3], &v) ){
|
||||
const char *zVal = Tcl_GetString(objv[3]);
|
||||
if( strcmp(zVal,"on")==0 || strcmp(zVal,"true")==0 ){
|
||||
v = 1;
|
||||
}else if( strcmp(zVal,"off")==0 || strcmp(zVal,"false")==0 ){
|
||||
v = 0;
|
||||
}else{
|
||||
return TCL_ERROR;
|
||||
}
|
||||
}
|
||||
}else{
|
||||
v = -1;
|
||||
}
|
||||
|
||||
@@ -403,10 +403,16 @@ do_test select1-4.13 {
|
||||
|
||||
# ORDER BY ignored on an aggregate query
|
||||
#
|
||||
sqlite3_db_config db STRICT_AGGREGATE off
|
||||
do_test select1-5.1 {
|
||||
set v [catch {execsql {SELECT max(f1) FROM test1 ORDER BY f2}} msg]
|
||||
lappend v $msg
|
||||
} {0 33}
|
||||
sqlite3_db_config db STRICT_AGGREGATE on
|
||||
do_test select1-5.2 {
|
||||
set v [catch {execsql {SELECT max(f1) FROM test1 ORDER BY f2}} msg]
|
||||
lappend v $msg
|
||||
} {1 {bare column in aggregate query}}
|
||||
|
||||
execsql {CREATE TABLE test2(t1 text, t2 text)}
|
||||
execsql {INSERT INTO test2 VALUES('abc','xyz')}
|
||||
@@ -1197,6 +1203,7 @@ do_execsql_test select1-20.10 {
|
||||
WHERE ((SELECT t1.a FROM t1 AS x GROUP BY b) AND b=0)
|
||||
OR a = 10;
|
||||
} {10 Y}
|
||||
sqlite3_db_config db STRICT_AGGREGATE off
|
||||
do_execsql_test select1-20.20 {
|
||||
SELECT ifnull(a, max((SELECT 123))), count(a) FROM t1 ;
|
||||
} {10 1}
|
||||
|
||||
+32
-14
@@ -12,7 +12,6 @@
|
||||
# focus of this file is testing aggregate functions and the
|
||||
# GROUP BY and HAVING clauses of SELECT statements.
|
||||
#
|
||||
# $Id: select3.test,v 1.23 2008/01/16 18:20:42 danielk1977 Exp $
|
||||
|
||||
set testdir [file dirname $argv0]
|
||||
source $testdir/tester.tcl
|
||||
@@ -121,6 +120,7 @@ do_test select3-2.14 {
|
||||
#
|
||||
# Update: As of 3.39.0, you can.
|
||||
#
|
||||
sqlite3_db_config db STRICT_AGGREGATE off
|
||||
do_execsql_test select3-3.1 {
|
||||
SELECT log, count(*) FROM t1 HAVING log>=4
|
||||
} {}
|
||||
@@ -318,17 +318,34 @@ reset_db
|
||||
do_execsql_test select3-9.100 {
|
||||
CREATE TABLE t0(c0 REAL, c1 REAL GENERATED ALWAYS AS (c0));
|
||||
INSERT INTO t0(c0) VALUES (1);
|
||||
}
|
||||
sqlite3_db_config db STRICT_AGGREGATE on
|
||||
do_catchsql_test select3-9.110 {
|
||||
SELECT * FROM t0 GROUP BY c0;
|
||||
} {1.0 1.0}
|
||||
} {1 {bare column in aggregate query}}
|
||||
sqlite3_db_config db STRICT_AGGREGATE off
|
||||
do_catchsql_test select3-9.120 {
|
||||
SELECT * FROM t0 GROUP BY c0;
|
||||
} {0 {1.0 1.0}}
|
||||
|
||||
reset_db
|
||||
do_execsql_test select3.10.100 {
|
||||
do_execsql_test select3-10.100 {
|
||||
CREATE TABLE t1(a, b);
|
||||
CREATE TABLE t2(c, d);
|
||||
}
|
||||
sqlite3_db_config db STRICT_AGGREGATE on
|
||||
do_catchsql_test select3-10.110 {
|
||||
SELECT max(t1.a),
|
||||
(SELECT 'xyz' FROM (SELECT * FROM t2 WHERE 0) WHERE t1.b=1)
|
||||
FROM t1;
|
||||
} {{} {}}
|
||||
} {1 {bare column in aggregate query}}
|
||||
sqlite3_db_config db STRICT_AGGREGATE off
|
||||
db null NULL
|
||||
do_catchsql_test select3-10.120 {
|
||||
SELECT max(t1.a),
|
||||
(SELECT 'xyz' FROM (SELECT * FROM t2 WHERE 0) WHERE t1.b=1)
|
||||
FROM t1;
|
||||
} {0 {NULL NULL}}
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
# dbsqlfuzz crash-8e17857db2c5a9294c975123ac807156a6559f13.txt
|
||||
@@ -354,6 +371,7 @@ foreach {tn sql} {
|
||||
}
|
||||
} {
|
||||
reset_db
|
||||
sqlite3_db_config db STRICT_AGGREGATE off
|
||||
do_execsql_test select3-11.$tn.1 $sql
|
||||
do_execsql_test select3.11.$tn.2 {
|
||||
SELECT max(a), val FROM t1 LEFT JOIN (
|
||||
@@ -375,14 +393,15 @@ foreach {tn sql} {
|
||||
}
|
||||
|
||||
reset_db
|
||||
do_execsql_test 12.0 {
|
||||
sqlite3_db_config db STRICT_AGGREGATE off
|
||||
do_execsql_test select3-12.0 {
|
||||
CREATE TABLE t1(a);
|
||||
CREATE TABLE t2(x);
|
||||
}
|
||||
do_execsql_test 12.1 {
|
||||
do_execsql_test select3-12.1 {
|
||||
SELECT count(x), m FROM t1 LEFT JOIN (SELECT x, 59 AS m FROM t2) GROUP BY a;
|
||||
}
|
||||
do_execsql_test 12.2 {
|
||||
do_execsql_test select3-12.2 {
|
||||
INSERT INTO t1 VALUES(1), (1), (2), (3);
|
||||
SELECT count(x), m FROM t1 LEFT JOIN (SELECT x, 59 AS m FROM t2) GROUP BY a;
|
||||
} {
|
||||
@@ -390,7 +409,7 @@ do_execsql_test 12.2 {
|
||||
0 {}
|
||||
0 {}
|
||||
}
|
||||
do_execsql_test 12.3 {
|
||||
do_execsql_test select3-12.3 {
|
||||
INSERT INTO t2 VALUES(45);
|
||||
SELECT count(x), m FROM t1 LEFT JOIN (SELECT x, 59 AS m FROM t2) GROUP BY a;
|
||||
} {
|
||||
@@ -398,7 +417,7 @@ do_execsql_test 12.3 {
|
||||
1 59
|
||||
1 59
|
||||
}
|
||||
do_execsql_test 12.4 {
|
||||
do_execsql_test select3-12.4 {
|
||||
INSERT INTO t2 VALUES(210);
|
||||
SELECT count(x), m FROM t1 LEFT JOIN (SELECT x, 59 AS m FROM t2) GROUP BY a;
|
||||
} {
|
||||
@@ -406,7 +425,7 @@ do_execsql_test 12.4 {
|
||||
2 59
|
||||
2 59
|
||||
}
|
||||
do_execsql_test 12.5 {
|
||||
do_execsql_test select3-12.5 {
|
||||
INSERT INTO t2 VALUES(NULL);
|
||||
SELECT count(x), m FROM t1 LEFT JOIN (SELECT x, 59 AS m FROM t2) GROUP BY a;
|
||||
} {
|
||||
@@ -414,19 +433,19 @@ do_execsql_test 12.5 {
|
||||
2 59
|
||||
2 59
|
||||
}
|
||||
do_execsql_test 12.6 {
|
||||
do_execsql_test select3-12.6 {
|
||||
DELETE FROM t2;
|
||||
DELETE FROM t1;
|
||||
INSERT INTO t1 VALUES('value');
|
||||
INSERT INTO t2 VALUES('hello');
|
||||
} {}
|
||||
do_execsql_test 12.7 {
|
||||
do_execsql_test select3-12.7 {
|
||||
SELECT group_concat(x), m FROM t1
|
||||
LEFT JOIN (SELECT x, 59 AS m FROM t2) GROUP BY a;
|
||||
} {
|
||||
hello 59
|
||||
}
|
||||
do_execsql_test 12.8 {
|
||||
do_execsql_test select3-12.8 {
|
||||
SELECT group_concat(x), m, n FROM t1
|
||||
LEFT JOIN (SELECT x, 59 AS m, 60 AS n FROM t2) GROUP BY a;
|
||||
} {
|
||||
@@ -434,4 +453,3 @@ do_execsql_test 12.8 {
|
||||
}
|
||||
|
||||
finish_test
|
||||
|
||||
|
||||
@@ -690,11 +690,13 @@ do_test select4-10.8 {
|
||||
SELECT DISTINCT log FROM t1 ORDER BY log LIMIT 0 OFFSET 3
|
||||
}
|
||||
} {}
|
||||
sqlite3_db_config db STRICT_AGGREGATE off
|
||||
do_test select4-10.9 {
|
||||
execsql {
|
||||
SELECT DISTINCT max(n), log FROM t1 ORDER BY +log; -- LIMIT 2 OFFSET 1
|
||||
}
|
||||
} {31 5}
|
||||
sqlite3_db_config db STRICT_AGGREGATE on
|
||||
|
||||
# Make sure compound SELECTs with wildly different numbers of columns
|
||||
# do not cause assertion faults due to register allocation issues.
|
||||
|
||||
@@ -149,11 +149,18 @@ do_test select5-5.4 {
|
||||
SELECT a, b FROM t2 GROUP BY a, b;
|
||||
}
|
||||
} {1 2 1 4 6 4}
|
||||
sqlite3_db_config db STRICT_AGGREGATE off
|
||||
do_test select5-5.5 {
|
||||
execsql {
|
||||
SELECT a, b FROM t2 GROUP BY a;
|
||||
}
|
||||
} {1 2 6 4}
|
||||
sqlite3_db_config db STRICT_AGGREGATE on
|
||||
do_test select5-5.6 {
|
||||
catchsql {
|
||||
SELECT a, b FROM t2 GROUP BY a;
|
||||
}
|
||||
} {1 {bare column in aggregate query}}
|
||||
|
||||
# Test rendering of columns for the GROUP BY clause.
|
||||
#
|
||||
@@ -256,6 +263,13 @@ do_execsql_test select5-9.1 {
|
||||
CREATE TABLE t1(a INT, b INT);
|
||||
INSERT INTO t1(a,b) VALUES(1,null),(null,null),(1,null);
|
||||
CREATE UNIQUE INDEX t1b ON t1(abs(b));
|
||||
}
|
||||
sqlite3_db_config db STRICT_AGGREGATE on
|
||||
do_catchsql_test select5-9.2 {
|
||||
SELECT quote(a), quote(b), '|' FROM t1 GROUP BY a, abs(b);
|
||||
} {1 {bare column in aggregate query}}
|
||||
sqlite3_db_config db STRICT_AGGREGATE off
|
||||
do_execsql_test select5-9.3 {
|
||||
SELECT quote(a), quote(b), '|' FROM t1 GROUP BY a, abs(b);
|
||||
} {NULL NULL | 1 NULL |}
|
||||
|
||||
|
||||
@@ -267,6 +267,7 @@ do_test select6-4.3 {
|
||||
SELECT DISTINCT y FROM (SELECT y FROM t1) WHERE y<5 ORDER BY y
|
||||
}
|
||||
} {1 2 3 4}
|
||||
sqlite3_db_config db STRICT_AGGREGATE off
|
||||
do_test select6-4.4 {
|
||||
execsql {
|
||||
SELECT avg(y) FROM (SELECT DISTINCT y FROM t1) WHERE y<5 ORDER BY y
|
||||
@@ -277,6 +278,13 @@ do_test select6-4.5 {
|
||||
SELECT avg(y) FROM (SELECT DISTINCT y FROM t1 WHERE y<5) ORDER BY y
|
||||
}
|
||||
} {2.5}
|
||||
sqlite3_db_config db STRICT_AGGREGATE on
|
||||
do_catchsql_test select6-4.6 {
|
||||
SELECT avg(y) FROM (SELECT DISTINCT y FROM t1) WHERE y<5 ORDER BY y
|
||||
} {1 {bare column in aggregate query}}
|
||||
do_catchsql_test select6-4.7 {
|
||||
SELECT avg(y) FROM (SELECT DISTINCT y FROM t1 WHERE y<5) ORDER BY y
|
||||
} {1 {bare column in aggregate query}}
|
||||
|
||||
do_test select6-5.1 {
|
||||
execsql {
|
||||
|
||||
+11
-3
@@ -61,16 +61,24 @@ do_test select7-2.1 {
|
||||
# an aggregate query, whether it contains aggregates or not.
|
||||
#
|
||||
ifcapable subquery {
|
||||
# do_test select7-3.1 {
|
||||
# do_test select7-3.1.0 {
|
||||
# catchsql {
|
||||
# SELECT * FROM (SELECT * FROM sqlite_master) GROUP BY name
|
||||
# }
|
||||
# } {1 {GROUP BY may only be used on aggregate queries}}
|
||||
do_test select7-3.1 {
|
||||
sqlite3_db_config db STRICT_AGGREGATE on
|
||||
do_test select7-3.1.1 {
|
||||
catchsql {
|
||||
SELECT * FROM (SELECT * FROM sqlite_master) GROUP BY name
|
||||
}
|
||||
} [list 1 {bare column in aggregate query}]
|
||||
sqlite3_db_config db STRICT_AGGREGATE off
|
||||
do_test select7-3.1.2 {
|
||||
catchsql {
|
||||
SELECT * FROM (SELECT * FROM sqlite_master) GROUP BY name
|
||||
}
|
||||
} [list 0 [execsql {SELECT * FROM sqlite_master ORDER BY name}]]
|
||||
sqlite3_db_config db STRICT_AGGREGATE on
|
||||
}
|
||||
|
||||
# Ticket #2018 - Make sure names are resolved correctly on all
|
||||
@@ -194,7 +202,7 @@ do_test select7-7.7 {
|
||||
execsql {
|
||||
CREATE TABLE t5(a TEXT, b INT);
|
||||
INSERT INTO t5 VALUES(123, 456);
|
||||
SELECT typeof(a), a FROM t5 GROUP BY a HAVING a<b;
|
||||
SELECT typeof(a), a FROM t5 GROUP BY a, b HAVING a<b;
|
||||
}
|
||||
} {text 123}
|
||||
|
||||
|
||||
+15
-1
@@ -19,7 +19,7 @@ set testdir [file dirname $argv0]
|
||||
source $testdir/tester.tcl
|
||||
|
||||
execsql {
|
||||
CREATE TABLE songs(songid, artist, timesplayed);
|
||||
CREATE TABLE songs(songid INT, artist TEXT, timesplayed INT);
|
||||
INSERT INTO songs VALUES(1,'one',1);
|
||||
INSERT INTO songs VALUES(2,'one',2);
|
||||
INSERT INTO songs VALUES(3,'two',3);
|
||||
@@ -27,6 +27,20 @@ execsql {
|
||||
INSERT INTO songs VALUES(5,'one',7);
|
||||
INSERT INTO songs VALUES(6,'two',11);
|
||||
}
|
||||
sqlite3_db_config db STRICT_AGGREGATE on
|
||||
do_catchsql_test select8-0.9.1 {
|
||||
SELECT DISTINCT artist, sum(timesplayed) AS total
|
||||
FROM songs
|
||||
GROUP BY lower(artist);
|
||||
} {1 {bare column in aggregate query}}
|
||||
do_catchsql_test select8-0.9.2 {
|
||||
SELECT DISTINCT lower(artist), sum(timesplayed) AS total
|
||||
FROM songs
|
||||
GROUP BY lower(artist)
|
||||
ORDER BY lower(artist);
|
||||
} {0 {one 10 three 5 two 14}}
|
||||
|
||||
sqlite3_db_config db STRICT_AGGREGATE off
|
||||
set result [execsql {
|
||||
SELECT DISTINCT artist,sum(timesplayed) AS total
|
||||
FROM songs
|
||||
|
||||
@@ -205,6 +205,7 @@ do_test selectC-3.2 {
|
||||
SELECT a, max(b || a) FROM t2 WHERE (b||b||b)!='value' GROUP BY a;
|
||||
}
|
||||
} {abc xxxabc def yyydef}
|
||||
sqlite3_db_config db STRICT_AGGREGATE off
|
||||
do_test selectC-3.3 {
|
||||
execsql {
|
||||
SELECT b, max(a || b) FROM t2 WHERE (b||b||b)!='value' GROUP BY a;
|
||||
|
||||
Reference in New Issue
Block a user