]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Candidate fix for the nested aggregate query problem of ticket
authordrh <drh@noemail.net>
Mon, 21 May 2012 20:13:39 +0000 (20:13 +0000)
committerdrh <drh@noemail.net>
Mon, 21 May 2012 20:13:39 +0000 (20:13 +0000)
[c2ad16f997ee9c8e].

FossilOrigin-Name: f3dd1fafd4718558de1f06139419a8c560d727f5

manifest
manifest.uuid
src/expr.c
src/select.c
src/sqliteInt.h
test/subquery.test

index dc23a0bee5905666202cf2f30f4be0c05d868f86..b44ad115e7593f77e48d541e1f7fb639abaaa229 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Convert\sthe\sNameContext\sobject\sfrom\susing\su8\sbooleans\sto\susing\sindividual\nbits\sin\sa\ssingle\su8\sas\sits\sbooleans.\s\sThis\schange\smight\sbecome\sa\sbasis\sfor\na\sfix\sfor\s[c2ad16f997ee9c].
-D 2012-05-21T19:11:25.681
+C Candidate\sfix\sfor\sthe\snested\saggregate\squery\sproblem\sof\sticket\n[c2ad16f997ee9c8e].
+D 2012-05-21T20:13:39.889
 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
 F Makefile.in 2f37e468503dbe79d35c9f6dffcf3fae1ae9ec20
 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
@@ -127,7 +127,7 @@ F src/complete.c dc1d136c0feee03c2f7550bafc0d29075e36deac
 F src/ctime.c a9c26822515f81ec21588cbb482ca6724be02e33
 F src/date.c 067a81c9942c497aafd2c260e13add8a7d0c7dd4
 F src/delete.c 4c20ea4f6213b3bc1c6a510586864b679946e05e
-F src/expr.c eefabaa4a3dc67309a754eb0eab1a163ff4c2bf3
+F src/expr.c e2d55b411e1d0726fa1c0ffc88b9a83013ba718d
 F src/fault.c 160a0c015b6c2629d3899ed2daf63d75754a32bb
 F src/fkey.c 657212460bf5cfd3ae607d12ea62092844c227b5
 F src/func.c c6b3c94320253a35bda43fb69cc292618e3285d6
@@ -173,11 +173,11 @@ F src/printf.c 7ffb4ebb8b341f67e049695ba031da717b3d2699
 F src/random.c cd4a67b3953b88019f8cd4ccd81394a8ddfaba50
 F src/resolve.c b3c70ab28cac60de33684c9aa9e5138dcf71d6dd
 F src/rowset.c f6a49f3e9579428024662f6e2931832511f831a1
-F src/select.c c5c2d1b6cf3e9ec9727e4eeba7e0b448ec48a626
+F src/select.c f6c4833c4d8e94714761d99013d74f381e084f1d
 F src/shell.c c16f72e34f611f060546709564c121a67cb2b31b
 F src/sqlite.h.in 4f4d4792f6fb00387c877af013cb09d955643f12
 F src/sqlite3ext.h 6904f4aadf976f95241311fbffb00823075d9477
-F src/sqliteInt.h 59a27074efe1b68a375d4210b324cf78a91850b1
+F src/sqliteInt.h 97ccae71ae0a4e924dcb9fab14eb4fc4839790da
 F src/sqliteLimit.h 164b0e6749d31e0daa1a4589a169d31c0dec7b3d
 F src/status.c 35939e7e03abf1b7577ce311f48f682c40de3208
 F src/table.c 2cd62736f845d82200acfa1287e33feb3c15d62e
@@ -712,7 +712,7 @@ F test/speed4p.test 0e51908951677de5a969b723e03a27a1c45db38b
 F test/sqllimits1.test b1aae27cc98eceb845e7f7adf918561256e31298
 F test/stat.test 08e8185b3fd5b010c90d7ad82b9dd4ea1cbf14b0
 F test/stmt.test 25d64e3dbf9a3ce89558667d7f39d966fe2a71b9
-F test/subquery.test c5e0d183f1ae6251453338a465b32ae11326e0fa
+F test/subquery.test d4aea23ac267463d4aa604bf937c3992347b20f7
 F test/subquery2.test edcad5c118f0531c2e21bf16a09bbb105252d4cd
 F test/subselect.test d24fd8757daf97dafd2e889c73ea4c4272dcf4e4
 F test/substr.test 18f57c4ca8a598805c4d64e304c418734d843c1a
@@ -997,10 +997,7 @@ F tool/tostr.awk e75472c2f98dd76e06b8c9c1367f4ab07e122d06
 F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f
 F tool/warnings-clang.sh a8a0a3babda96dfb1ff51adda3cbbf3dfb7266c2
 F tool/warnings.sh fbc018d67fd7395f440c28f33ef0f94420226381
-P 3869aef6348018f584137f36f6924193a790e52f
-R d536666e711097bf22b04b86f6cd78bb
-T *branch * nested-agg
-T *sym-nested-agg *
-T -sym-trunk *
+P 722260969306778029b738402f22e3c154dd77a1
+R 9cea2398dc784c95fabf6a16b4f454f9
 U drh
-Z 728d097c901f031eef175d490bde1189
+Z 2172aaf922e57d28da6d28e661889326
index 8ba5f0fb8e6374f69c59970107bad3395da8e133..79baf5c148211e3509bc7dece0a39f5f31320ab3 100644 (file)
@@ -1 +1 @@
-722260969306778029b738402f22e3c154dd77a1
\ No newline at end of file
+f3dd1fafd4718558de1f06139419a8c560d727f5
\ No newline at end of file
index 10d9f775d9c07933f94738771a6723cd8f591129..95c351586213091cd9d9efe28d0b30375e762661 100644 (file)
@@ -3965,7 +3965,9 @@ static int analyzeAggregate(Walker *pWalker, Expr *pExpr){
       return WRC_Prune;
     }
     case TK_AGG_FUNCTION: {
-      if( !sqlite3FunctionUsesOtherSrc(pExpr, pSrcList) ){
+      if( (pNC->ncFlags & NC_InAggFunc)==0
+       && !sqlite3FunctionUsesOtherSrc(pExpr, pSrcList)
+      ){
         /* Check to see if pExpr is a duplicate of another aggregate 
         ** function that is already in the pAggInfo structure
         */
@@ -4002,8 +4004,8 @@ static int analyzeAggregate(Walker *pWalker, Expr *pExpr){
         ExprSetIrreducible(pExpr);
         pExpr->iAgg = (i16)i;
         pExpr->pAggInfo = pAggInfo;
-        return WRC_Prune;
       }
+      return WRC_Prune;
     }
   }
   return WRC_Continue;
index 42df01937860c57fcd48ee0d1a4a6f2dcf36589a..d79a6112f72c12ef76373e3074f0b75ce9485b73 100644 (file)
@@ -4140,7 +4140,9 @@ int sqlite3Select(
     sAggInfo.nAccumulator = sAggInfo.nColumn;
     for(i=0; i<sAggInfo.nFunc; i++){
       assert( !ExprHasProperty(sAggInfo.aFunc[i].pExpr, EP_xIsSelect) );
+      sNC.ncFlags |= NC_InAggFunc;
       sqlite3ExprAnalyzeAggList(&sNC, sAggInfo.aFunc[i].pExpr->x.pList);
+      sNC.ncFlags &= ~NC_InAggFunc;
     }
     if( db->mallocFailed ) goto select_end;
 
index e56edcab7849e9117b572061bf4c82186c0eda31..953850eee4572b38304fff85a1dd983679d0a3ae 100644 (file)
@@ -2019,6 +2019,7 @@ struct NameContext {
 #define NC_AllowAgg  0x01    /* Aggregate functions are allowed here */
 #define NC_HasAgg    0x02    /* One or more aggregate functions seen */
 #define NC_IsCheck   0x04    /* True if resolving names in a CHECK constraint */
+#define NC_InAggFunc 0x08    /* True if analyzing arguments to an agg func */
 
 /*
 ** An instance of the following structure contains all information
index 0010e45ff83cb82aefebb58a7d76170a673dbefd..d9d2952fbcf9586800ca43147551bef0342e5823 100644 (file)
@@ -377,6 +377,44 @@ do_test subquery-3.4.3 {
   }
 } {106 4.5 0 1 107 4.0 1 0}
 
+do_test subquery-3.5.1 {
+  execsql {
+    CREATE TABLE t35a(x); INSERT INTO t35a VALUES(1),(2),(3);
+    CREATE TABLE t35b(y); INSERT INTO t35b VALUES(98), (99);
+    SELECT max((SELECT avg(y) FROM t35b)) FROM t35a;
+  }
+} {98.5}
+do_test subquery-3.5.2 {
+  execsql {
+    SELECT max((SELECT count(y) FROM t35b)) FROM t35a;
+  }
+} {2}
+do_test subquery-3.5.3 {
+  execsql {
+    SELECT max((SELECT count() FROM t35b)) FROM t35a;
+  }
+} {2}
+do_test subquery-3.5.4 {
+  catchsql {
+    SELECT max((SELECT count(x) FROM t35b)) FROM t35a;
+  }
+} {1 {misuse of aggregate: count()}}
+do_test subquery-3.5.5 {
+  catchsql {
+    SELECT max((SELECT count(x) FROM t35b)) FROM t35a;
+  }
+} {1 {misuse of aggregate: count()}}
+do_test subquery-3.5.6 {
+  catchsql {
+    SELECT max((SELECT a FROM (SELECT count(x) AS a FROM t35b))) FROM t35a;
+  }
+} {1 {misuse of aggregate: count()}}
+do_test subquery-3.5.7 {
+  execsql {
+    SELECT max((SELECT a FROM (SELECT count(y) AS a FROM t35b))) FROM t35a;
+  }
+} {2}
+
 
 #------------------------------------------------------------------
 # These tests - subquery-4.* - use the TCL statement cache to try