]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
When translating arguments of aggregate functions into references to
authordrh <>
Mon, 3 Apr 2023 23:55:20 +0000 (23:55 +0000)
committerdrh <>
Mon, 3 Apr 2023 23:55:20 +0000 (23:55 +0000)
expression indexes, make sure to only translate them for the current
aggregate when there are nested aggregates.

FossilOrigin-Name: 7ea98aba78d10b26e1c8f67978a88a92aa2378dc50df9b5954bdd796affe4f9b

manifest
manifest.uuid
src/expr.c
src/select.c
test/indexexpr2.test

index d2a62b05453419e1988fe2c4b934bc02100ab5ab..a004e5ea87520d672f44e280a6ec0f2f2955db28 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C When\schanging\sa\sCOLLATE\sexpression\snode\sinto\sTK_AGG_COLUMN\sbecause\sthe\snodes\nvalue\sis\scontained\sin\san\sindexed\sexpression,\sbe\ssure\sto\sclear\sthe\nEP_Collate\sproperty\sfrom\sthe\sexpression\snode.
-D 2023-04-03T18:00:53.041
+C When\stranslating\sarguments\sof\saggregate\sfunctions\sinto\sreferences\sto\nexpression\sindexes,\smake\ssure\sto\sonly\stranslate\sthem\sfor\sthe\scurrent\naggregate\swhen\sthere\sare\snested\saggregates.
+D 2023-04-03T23:55:20.492
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
 F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -571,7 +571,7 @@ F src/date.c f21815ca7172ce073db3163ac54c8d9f2841077165c1a6123b4d1c376a0c7ec7
 F src/dbpage.c d47549716549311f79dc39fe5c8fb19390a6eb2c960f8e37c89a9c4de0c1052e
 F src/dbstat.c ec92074baa61d883de58c945162d9e666c13cd7cf3a23bc38b4d1c4d0b2c2bef
 F src/delete.c a9c6d3f51c0a31e9b831e0a0580a98d702904b42d216fee530940e40dec34873
-F src/expr.c 9cd6b02315babb5ab5703118e14851fc9418989553608fedf60c5e8cfd68783a
+F src/expr.c 3a58dfd2cdaba2c0a0201274704d8f7a4ff0afd73b7ddcae52d4dfc9310c4a4d
 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007
 F src/fkey.c 722f20779f5342a787922deded3628d8c74b5249cab04098cf17ee2f2aaff002
 F src/func.c d187be57a886ddf4e6b7ef584a494361899be3df5eee6d4a747b68ff4aff4122
@@ -621,7 +621,7 @@ F src/printf.c ff4b05e38bf928ff1b80d3dda4f977b10fe39ecbfe69c018224c7e5594fb2455
 F src/random.c 606b00941a1d7dd09c381d3279a058d771f406c5213c9932bbd93d5587be4b9c
 F src/resolve.c 6a0253379cc15b3f80321362a61f487a8ef7cd2487fe62e1eb2317b3f871c61f
 F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92
-F src/select.c 6eef5a940ed368fe20d50980e377aba74a27e53cfabf440f299682f22b860002
+F src/select.c 9456359bcc0f600c3ded373280d8b308c7866b031fbeb78e60cac19cf86cf1b1
 F src/shell.c.in a608a209c3f61f9debce155b5c7d56c9a785d52eb62b6831be449e2a5b976221
 F src/sqlite.h.in 662a2fa083d093896b92560c871dea6d86792b49dc4bf7b4e8dbeca8e7171488
 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8
@@ -1191,7 +1191,7 @@ F test/index8.test caa097735c91dbc23d8a402f5e63a2a03c83840ba3928733ed7f9a03f8a91
 F test/index9.test 2ac891806a4136ef3e91280477e23114e67575207dc331e6797fa0ed9379f997
 F test/indexedby.test f21eca4f7a6ffe14c8500a7ad6cd53166666c99e5ccd311842a28bc94a195fe0
 F test/indexexpr1.test b2a15637dcbae7fd8d7e2fc51f74ac4feaf5510130ee2089a5ec5bd1ef7270e1
-F test/indexexpr2.test f5732485abfe8edb5006a4e599914afd8ff7ff7b88d9b88e1731cb063495ba36
+F test/indexexpr2.test 1c382e81ef996d8ae8b834a74f2a9013dddf59214c32201d7c8a656d739f999a
 F test/indexfault.test 98d78a8ff1f5335628b62f886a1cb7c7dac1ef6d48fa39c51ec871c87dce9811
 F test/init.test 15c823093fdabbf7b531fe22cf037134d09587a7
 F test/insert.test 4e3f0de67aac3c5be1f4aaedbcea11638f1b5cdc9a3115be14d19aa9db7623c6
@@ -2046,9 +2046,9 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
 F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
 F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P 0f9e65b6c1e7f2f7a0358163c0ec3ce5fe8ed8814202b03ec167cf2f617f82f3
-Q +cf6454ce26983b9c3ae924c44a802f3f760eaaae9547b40aee9e14e7b0c47cab
-R 3e0455db1fb6c7b726f4ff0b6b77f029
+P af0f55cfcba0f53ee5641f20c5ef171f23f5eaea32d28e3a70899a2e2bf60dd6
+Q +898bfa1afd8260eaaf2aa6db94e74d99ebf4e8a6dc02cf21d20cd981393609a5
+R b89250f8abb10783ff3d136b478876d4
 U drh
-Z 2da229468cb727a0242f6d218dae6f55
+Z 41cbf1e999caa9f167de7a77e4c74922
 # Remove this line to create a well-formed Fossil manifest.
index 5a98e3c846ae4c43da5a6d1aed708249615fc6dd..f7348518571af5d76b76c051f6756cf81934941c 100644 (file)
@@ -1 +1 @@
-af0f55cfcba0f53ee5641f20c5ef171f23f5eaea32d28e3a70899a2e2bf60dd6
\ No newline at end of file
+7ea98aba78d10b26e1c8f67978a88a92aa2378dc50df9b5954bdd796affe4f9b
\ No newline at end of file
index 5512602252a259f521d23f27d89d7e12871b264b..037bd39499a9d320b129a916ce9fff52c361c710 100644 (file)
@@ -6288,7 +6288,7 @@ static int agginfoPersistExprCb(Walker *pWalker, Expr *pExpr){
     sqlite3 *db = pParse->db;
     assert( iAgg>=0 );
     if( pExpr->op!=TK_AGG_FUNCTION ){
-      if( iAgg<pAggInfo->nColumn
+      if( ALWAYS(iAgg<pAggInfo->nColumn)
        && pAggInfo->aCol[iAgg].pCExpr==pExpr
       ){
         pExpr = sqlite3ExprDup(db, pExpr, 0);
@@ -6441,6 +6441,7 @@ static int analyzeAggregate(Walker *pWalker, Expr *pExpr){
     default: {
       IndexedExpr *pIEpr;
       Expr tmp;
+      int i;
       assert( pParse->iSelfTab==0 );
       if( (pNC->ncFlags & NC_InAggFunc)==0 ) break;
       if( pParse->pIdxEpr==0 ) break;
@@ -6451,7 +6452,11 @@ static int analyzeAggregate(Walker *pWalker, Expr *pExpr){
       }
       if( pIEpr==0 ) break;
       if( NEVER(!ExprUseYTab(pExpr)) ) break;
-      if( pExpr->pAggInfo!=0 ) break; /* Already resolved by outer context */
+      for(i=0; i<pSrcList->nSrc; i++){
+         if( pSrcList->a[0].iCursor==pIEpr->iDataCur ) break;
+      }
+      if( i>=pSrcList->nSrc ) break;
+      if( NEVER(pExpr->pAggInfo!=0) ) break; /* Resolved by outer context */
       if( pParse->nErr ){ return WRC_Abort; }
 
       /* If we reach this point, it means that expression pExpr can be
index 883d54ecf1d759461e176d845c964d4521b9ca8a..5c8601a4d1a9d748b37311902d94af114dfac797 100644 (file)
@@ -6423,7 +6423,7 @@ static int aggregateIdxEprRefToColCallback(Walker *pWalker, Expr *pExpr){
   if( pExpr->op==TK_AGG_FUNCTION ) return WRC_Continue;
   if( pExpr->op==TK_IF_NULL_ROW ) return WRC_Continue;
   pAggInfo = pExpr->pAggInfo;
-  if( pExpr->iAgg>=pAggInfo->nColumn ) return WRC_Continue;
+  if( NEVER(pExpr->iAgg>=pAggInfo->nColumn) ) return WRC_Continue;
   assert( pExpr->iAgg>=0 );
   pCol = &pAggInfo->aCol[pExpr->iAgg];
   pExpr->op = TK_AGG_COLUMN;
index a934d0c84dd5ad12dce4a0276117197fc07e37aa..4c21421e8e7d0708207269c3cea5af73363407e0 100644 (file)
@@ -410,4 +410,19 @@ do_execsql_test 10.1 {
    GROUP BY SUBSTR(0,0);
 } 4
 
+# 2023-04-03 https://sqlite.org/forum/forumpost/409ebc7368
+# When a generated column appears in both an outer and an inner loop
+# (that is to say, the same table is used in both loops) and the
+# generated column is indexed and it is used inside an aggregate function,
+# make sure that the terms resolve to the correct aggregate.
+#
+do_execsql_test 11.0 {
+  CREATE TABLE t3 (a INT, b AS (-a));
+  CREATE INDEX t3x ON t3(b, a);
+  INSERT INTO t3(a) VALUES(44);
+  SELECT * FROM t3 AS a0
+   WHERE (SELECT sum(-a0.a=b) FROM t3 GROUP BY b)
+   GROUP BY b;
+} {44 -44}
+
 finish_test