]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Fix a weird corner case in aggregate function processing that results from the
authordrh <>
Tue, 28 Mar 2023 16:02:28 +0000 (16:02 +0000)
committerdrh <>
Tue, 28 Mar 2023 16:02:28 +0000 (16:02 +0000)
recent addition of support for index expressions on aggregate queries.
[forum:/forumpost/bad532820c|Forum post bad532820c].

FossilOrigin-Name: c34fd9fe1b76e0a5943f014f46141cbe55d41bb1e6980adf9bcb6785a03e7883

manifest
manifest.uuid
src/expr.c
test/window1.test

index 5e3af5f06b39b44d81d4e738d9de8d35f5053720..d5fb3e57d7501cf71bda759ea12656d4b8f5e5f7 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Fix\smultiple\sproblems\swith\sRETURNING\son\sa\sDML\sstatement\sagainst\sa\sview,\nall\sinspired\sby\s[forum:/forumpost/dc3b92cfa0|forum\spost\sdc3b92cfa0].\n(1)\sDo\snot\sallow\sa\sRETURNING\sclause\sto\strick\sthe\scode\sgenerator\sinto\sthinking\nthat\sthe\sview\sbeing\supdated\shas\san\sINSTEAD\sOF\strigger.\n(2)\sGenerate\sall\sresult\scolumns\sfor\sa\sview\sin\sa\sDML\sstatement.\n(3)\sThe\sautomatic\scovering\sindex\sfor\sa\sview\sshould\scover\sall\sresult\scolumns\nof\sthe\sview.
-D 2023-03-28T11:18:04.328
+C Fix\sa\sweird\scorner\scase\sin\saggregate\sfunction\sprocessing\sthat\sresults\sfrom\sthe\nrecent\saddition\sof\ssupport\sfor\sindex\sexpressions\son\saggregate\squeries.\n[forum:/forumpost/bad532820c|Forum\spost\sbad532820c].
+D 2023-03-28T16:02:28.157
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
 F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -575,7 +575,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 4cc4595f1c589b76f33f884f9c6b5f85ea80d205f1fc5ef9fb3617bf03920f0b
+F src/expr.c 98ba98271bbe55661d8630cc60083344b2c1713553e46b69afd7ff9f85a30e29
 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007
 F src/fkey.c 722f20779f5342a787922deded3628d8c74b5249cab04098cf17ee2f2aaff002
 F src/func.c d187be57a886ddf4e6b7ef584a494361899be3df5eee6d4a747b68ff4aff4122
@@ -1901,7 +1901,7 @@ F test/win32heap.test 10fd891266bd00af68671e702317726375e5407561d859be1aa04696f2
 F test/win32lock.test e0924eb8daac02bf80e9da88930747bd44dd9b230b7759fed927b1655b467c9c
 F test/win32longpath.test 4baffc3acb2e5188a5e3a895b2b543ed09e62f7c72d713c1feebf76222fe9976
 F test/win32nolock.test ac4f08811a562e45a5755e661f45ca85892bdbbc
-F test/window1.test 71e51e4d5ed34c2c7427fcfb74056713560aa7f0e8ed49728b858893716fe772
+F test/window1.test 67aaef6e01e8d8fb3f89aa440e8c8045dbfd3c6f21628a6d7bad2b786c310d9b
 F test/window2.tcl 492c125fa550cda1dd3555768a2303b3effbeceee215293adf8871efc25f1476
 F test/window2.test e466a88bd626d66edc3d352d7d7e1d5531e0079b549ba44efb029d1fbff9fd3c
 F test/window3.tcl acea6e86a4324a210fd608d06741010ca83ded9fde438341cb978c49928faf03
@@ -2051,8 +2051,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
 F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
 F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P 4fc1904b8e18c7d41fa65490ced125f1df4f0c22c13de957b24615ed09b3ecb7
-R 5282f7ad32e4fd95877ad9bd0db98c3f
+P c8bedef0d61731c29ae34de1594222d15b578f9e2cddbbd5b74fb3059644fe0f
+R 68fb0cae877919b0f69109342d216ada
 U drh
-Z ebe32d8b36560ad06c065336765ee10b
+Z f12fcdd961dcea42a705ad864ed7007e
 # Remove this line to create a well-formed Fossil manifest.
index 4451ccdc1301921c93037ca6faf53973f5fa98a5..a6c7d49117ae59d895e109bb0165e280f00f065c 100644 (file)
@@ -1 +1 @@
-c8bedef0d61731c29ae34de1594222d15b578f9e2cddbbd5b74fb3059644fe0f
\ No newline at end of file
+c34fd9fe1b76e0a5943f014f46141cbe55d41bb1e6980adf9bcb6785a03e7883
\ No newline at end of file
index 564dfc7fbbff3a0b9108a46ee7116e58b36bf8ef..80bfbadc33742ea11df6f800a9bdfdda0cd0bbc9 100644 (file)
@@ -6286,9 +6286,11 @@ static int agginfoPersistExprCb(Walker *pWalker, Expr *pExpr){
     int iAgg = pExpr->iAgg;
     Parse *pParse = pWalker->pParse;
     sqlite3 *db = pParse->db;
+    assert( iAgg>=0 );
     if( pExpr->op!=TK_AGG_FUNCTION ){
-      assert( iAgg>=0 && iAgg<pAggInfo->nColumn );
-      if( pAggInfo->aCol[iAgg].pCExpr==pExpr ){
+      if( iAgg<pAggInfo->nColumn
+       && pAggInfo->aCol[iAgg].pCExpr==pExpr
+      ){
         pExpr = sqlite3ExprDup(db, pExpr, 0);
         if( pExpr ){
           pAggInfo->aCol[iAgg].pCExpr = pExpr;
@@ -6297,8 +6299,9 @@ static int agginfoPersistExprCb(Walker *pWalker, Expr *pExpr){
       }
     }else{
       assert( pExpr->op==TK_AGG_FUNCTION );
-      assert( iAgg>=0 && iAgg<pAggInfo->nFunc );
-      if( pAggInfo->aFunc[iAgg].pFExpr==pExpr ){
+      if( ALWAYS(iAgg<pAggInfo->nFunc)
+       && pAggInfo->aFunc[iAgg].pFExpr==pExpr
+      ){
         pExpr = sqlite3ExprDup(db, pExpr, 0);
         if( pExpr ){
           pAggInfo->aFunc[iAgg].pFExpr = pExpr;
index b906a761a6d31172c4873f2673d55d7e9f8466f8..59a933c4f6286f96eb42c86d2272477f11892b12 100644 (file)
@@ -2276,5 +2276,44 @@ do_catchsql_test 73.7 {
   UPDATE t2 SET c=nth_value(15,2) OVER() FROM (SELECT * FROM t1) WHERE b=4 RETURNING *;
 } {1 {cannot modify t2 because it is a view}}
 
+# 2023-03-28 https://sqlite.org/forum/forumpost/bad532820c
+#
+reset_db
+do_execsql_test 74.0 {
+  CREATE TABLE t1 (a INT, b INT);
+  CREATE TABLE t2 (c INT, d INT);
+  CREATE INDEX idx ON t1(abs(a));
+  INSERT INTO t1 VALUES(1,2),(3,4);
+  INSERT INTO t2 VALUES(5,6),(7,8);
+}
+do_execsql_test 74.1 {
+  SELECT (
+    SELECT count( a ) FROM t2 LIMIT 1
+  )
+  FROM t1;
+} {2}  ;# Verified using PG 14.2
+do_execsql_test 74.2 {
+  SELECT (
+    SELECT count( a+c ) FROM t2 LIMIT 1
+  )
+  FROM t1;
+} {2 2}  ;# verified on PG 14.2.  Crashes PG 9.6!
+do_execsql_test 74.3 {
+  SELECT (
+    SELECT count( ( SELECT(sum(0) OVER(ORDER BY c, abs(a))) ) )
+      FROM t2 GROUP BY c LIMIT 1
+  ) 
+  FROM t1;
+} {1 1}  ;# verified on PG 14.2
+do_execsql_test 74.4 {
+  /* Original test case reported in https://sqlite.org/forum/forumpost/bad532820c
+  CREATE TABLE v0 (c1);
+  CREATE INDEX i ON v0 (c1, c1=1);
+  SELECT 0 FROM v0 AS a1
+   WHERE (SELECT count((SELECT(sum(0) OVER(PARTITION BY(c1), (a1.c1=1) ))))
+            FROM v0
+           GROUP BY hex(0))
+     AND a1.c1=0;
+} {}
 
 finish_test