]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Persist AggInfo expressions before deleting them when omitting the LIMIT tkt-7c6d876f84e6e7e2
authordrh <drh@noemail.net>
Tue, 9 Jun 2020 13:17:47 +0000 (13:17 +0000)
committerdrh <drh@noemail.net>
Tue, 9 Jun 2020 13:17:47 +0000 (13:17 +0000)
clause in a subquery.  One possible fix for ticket [7c6d876f84e6e7e2].

FossilOrigin-Name: 04867cba97857eef3538c36b830c6a4e76c4a99c0aff7c8395a51baf5d39619c

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

index 5e72cbd1e93dae3858c509942fe1814672660a25..6c20b41ce533d99fc2106327a77791bf6397a74a 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Improved\stree-view\sdebugging\soutput\sfor\saggregate\sfunctions.
-D 2020-06-09T11:59:15.991
+C Persist\sAggInfo\sexpressions\sbefore\sdeleting\sthem\swhen\somitting\sthe\sLIMIT\nclause\sin\sa\ssubquery.\s\sOne\spossible\sfix\sfor\sticket\s[7c6d876f84e6e7e2].
+D 2020-06-09T13:17:47.962
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
 F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -485,7 +485,7 @@ F src/date.c b29b349d277e3d579dcc295b24c0a2caed83fd8f090a9f7cbe6070c0fd662384
 F src/dbpage.c 8a01e865bf8bc6d7b1844b4314443a6436c07c3efe1d488ed89e81719047833a
 F src/dbstat.c 793deaf88a0904f88285d93d6713c636d55ede0ffd9f08d10f4ea825531d367f
 F src/delete.c 88047c8e59878c920fce14582bc1dde4d81157d1ca5ffdf36c2907e6d41996c4
-F src/expr.c 217bee94b696a061fec28526c5d5ef3049536ace5c10a0a3ff7d15b0d3a9cd11
+F src/expr.c 151248f87c9d8ec2fd801eacde9f2a520bc02899fc378d7c58265055f2bc00b9
 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007
 F src/fkey.c 4b575423b0a5d4898b1a7868ce985cf1a8ad91c741c9abbb108ff02536d20f41
 F src/func.c 2333eb4277f55a5efdc12ef754e7d7ec9105d257b2fd00301d23ce1e8fa67dc0
@@ -629,7 +629,7 @@ F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2
 F test/affinity2.test ce1aafc86e110685b324e9a763eab4f2a73f737842ec3b687bd965867de90627
 F test/affinity3.test 6a101af2fc945ce2912f6fe54dd646018551710d
 F test/aggerror.test a867e273ef9e3d7919f03ef4f0e8c0d2767944f2
-F test/aggnested.test 12106f0748e8e9bfc1a8e6840e203e051eae06a26ed13fc9fd5db108a8d6db54
+F test/aggnested.test 2c967760a9a283a888868c38ced7e01e571bf1b59c8b356e6a6b1054c7ab9971
 F test/alias.test 4529fbc152f190268a15f9384a5651bbbabc9d87
 F test/all.test 2ecb8bbd52416642e41c9081182a8df05d42c75637afd4488aace78cc4b69e13
 F test/alter.test 25e109787dc5e631e117eb6e1c57f96a572bb51228db3b4f8b5f41d665e2ccaa
@@ -1867,7 +1867,10 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
 F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
 F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P d48af4d2cfff3d5f4ccc3db5d658e8b503255b577e6e62b5c2b4a4437875b895
-R 7f4e9a8ad02c966f79b46556c8deb165
+P b5711b4eead10ef4b0b61f2e2c54768d215a4105f6d47d2ea78991b6e53a6831
+R 295a2e11ceaec9daac549573df1e33be
+T *branch * tkt-7c6d876f84e6e7e2
+T *sym-tkt-7c6d876f84e6e7e2 *
+T -sym-trunk *
 U drh
-Z 7160527ec9944aa7c5f24e9bdb594d2d
+Z 351b75fa313328522161d62954da4e5a
index 8ee67f7f22167977d5d56c6c718fb2642e47b0a9..4826181b00485aa54321a79e30e1e2b46d15ba1a 100644 (file)
@@ -1 +1 @@
-b5711b4eead10ef4b0b61f2e2c54768d215a4105f6d47d2ea78991b6e53a6831
\ No newline at end of file
+04867cba97857eef3538c36b830c6a4e76c4a99c0aff7c8395a51baf5d39619c
\ No newline at end of file
index 6fbc8bb49c42a4cb508b83defe889dd6519af320..6b2dbe75860a9c07cab1a20c6184b8551a2fb1ef 100644 (file)
@@ -3090,12 +3090,15 @@ int sqlite3CodeSubselect(Parse *pParse, Expr *pExpr){
     /* The subquery already has a limit.  If the pre-existing limit is X
     ** then make the new limit X<>0 so that the new limit is either 1 or 0 */
     sqlite3 *db = pParse->db;
+    Walker w;
     pLimit = sqlite3Expr(db, TK_INTEGER, "0");
     if( pLimit ){
       pLimit->affExpr = SQLITE_AFF_NUMERIC;
       pLimit = sqlite3PExpr(pParse, TK_NE,
                             sqlite3ExprDup(db, pSel->pLimit->pLeft, 0), pLimit);
     }
+    sqlite3AggInfoPersistWalkerInit(&w, pParse);
+    sqlite3WalkExpr(&w,pSel->pLimit->pLeft);
     sqlite3ExprDelete(db, pSel->pLimit->pLeft);
     pSel->pLimit->pLeft = pLimit;
   }else{
index d712c840f10afafdbe6ee6666f24c488192bc74b..217d38d4d775582778e5d3d063b7305df3146e86 100644 (file)
@@ -259,7 +259,23 @@ do_execsql_test aggnested-4.4 {
   SELECT max((SELECT a FROM (SELECT count(*) AS a FROM ty) AS s)) FROM tx;
 } {3}
 
-
+# 2020-06-09 ticket 7c6d876f84e6e7e2
+#
+reset_db
+do_execsql_test aggnested-5.1 {
+  CREATE TABLE a(b);
+  INSERT INTO a(b) VALUES(5),(NULL),('springtime');
+  SELECT
+    (SELECT
+        (SELECT sum(b)
+          LIMIT (SELECT AVG( (SELECT 0 FROM a ORDER BY b) ))
+        )
+       FROM a GROUP BY b
+    )
+    FROM a
+  EXCEPT
+  SELECT b FROM a ORDER BY b;
+} {}
  
 
 finish_test