From: drh <> Date: Tue, 23 May 2023 17:43:24 +0000 (+0000) Subject: Avoid performing aggregate processing more than once for a single expression. X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=1409791d965d9b7c833638740d002da79d2e7846;p=thirdparty%2Fsqlite.git Avoid performing aggregate processing more than once for a single expression. FossilOrigin-Name: 1bc549716c8a96a6db579d48027fde7388e1fdad22e39f223984cdb1321fe6b2 --- diff --git a/manifest b/manifest index f8bd3be40e..538a966139 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C When\sconverting\san\saggregate\sexpression\sto\sAGG_COLUMN,\sbe\ssure\sto\sremove\nthe\sEP_Unlikely\sflag\sif\sit\sis\spresent. -D 2023-05-23T15:22:25.893 +C Avoid\sperforming\saggregate\sprocessing\smore\sthan\sonce\sfor\sa\ssingle\sexpression. +D 2023-05-23T17:43:24.866 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -586,7 +586,7 @@ F src/date.c aca9e0c08b400b21238b609aea7c09585396cd770985cf8f475560f69222dad3 F src/dbpage.c f3eea5f7ec47e09ee7da40f42b25092ecbe961fc59566b8e5f705f34335b2387 F src/dbstat.c ec92074baa61d883de58c945162d9e666c13cd7cf3a23bc38b4d1c4d0b2c2bef F src/delete.c cf07b5585823e3fd4d89e6ff49f6e705bf25b62366e69a5c9f1b23482e005aa3 -F src/expr.c 6d9805e35595304bf996c509d00fe4e9f316479e9d78bc93d3aa3dbfbcbf43de +F src/expr.c f2c4280c6e5c495fedfd448966c5cdb103cb382bcebee52a141633290c975100 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 03c134cc8bffe54835f742ddea0b72ebfc8f6b32773d175c71b8afeea6cb5c83 F src/func.c 03e6b501f3056d0ba398bda17df938b2b566aa0b3ca7e1942a3cd1925d04ec36 @@ -1800,7 +1800,7 @@ F test/upfrom1.tcl 8859d9d437f03b44174c4524a7a734a391fd4526fcff65be08285dafc9dc9 F test/upfrom1.test 8cb06689e99cd707d884faa16da0e8eb26ff658bb01c47ddf72fadade666e6e1 F test/upfrom2.test 66f3ebf721b3cebd922faee5c386bf244f816d416b57c000753ff51af62328a1 F test/upfrom3.test 6130f24ebf97f5ea865e5d2a14a2d543fe5428a62e87cc60f62d875e45c1f5f0 -F test/upfrom4.test 1cd82e9423e02b1f63d069e8665c6c3932ec424fd0043d033cc0ba99abf33236 +F test/upfrom4.test 78f742a6577c91a7a55c64edb8811004e7c6aa99b8d57b2320f70a918c357807 F test/upfromfault.test 3a10075a0043f0c4fad6614b2c371f88a8ba5a4acab68b907438413865d6a8d6 F test/upsert1.test b0ae2f58680c5205b4bc1cdeed3c3d444057c506f6c44494fa3eac60731d68a2 F test/upsert2.test 720e94d09f7362a282bc69b3c6b83d51daeaaf0440eb4920a08b86518b8c7496 @@ -2070,9 +2070,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 58be212d56d7601e270eb11c77c8371db7507a0a19d4febf1d6c0cd87c0b1016 -Q +48e65f18b2ebbe786e84e208f2c6c68de6067ba86912fea5a120fd41d0af2184 -R f8324fc1c3fcdd275515625c63a3c22f +P 20c8a9247be2f0c1606e2c79910f28593898054b99adf505b32ac6352ce8e89e +Q +367b4cc549a14222d54530538e692e9d1a365002c1b8c4ef80ddc0523bfdb3a2 +R e5a3226f593cead24f58753549e8abc5 U drh -Z 62a0520fbc54cb1aaf9c7a227e350b92 +Z 6fefd44d1f8475a6792c7b09a8a2af85 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 887a43f8b3..6637e69e85 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -20c8a9247be2f0c1606e2c79910f28593898054b99adf505b32ac6352ce8e89e \ No newline at end of file +1bc549716c8a96a6db579d48027fde7388e1fdad22e39f223984cdb1321fe6b2 \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index c6bc847ab6..45fa646337 100644 --- a/src/expr.c +++ b/src/expr.c @@ -6413,6 +6413,7 @@ static void findOrCreateAggInfoColumn( assert( pAggInfo->iFirstReg==0 ); pCol = pAggInfo->aCol; for(k=0; knColumn; k++, pCol++){ + if( pCol->pCExpr==pExpr ) return; if( pCol->iTable==pExpr->iTable && pCol->iColumn==pExpr->iColumn && pExpr->op!=TK_IF_NULL_ROW diff --git a/test/upfrom4.test b/test/upfrom4.test index b20e9638aa..2228236280 100644 --- a/test/upfrom4.test +++ b/test/upfrom4.test @@ -127,4 +127,30 @@ do_execsql_test 400 { 1000 - - - } +# Forum post https://sqlite.org/forum/forumpost/36ff78b2a3 +# +ifcapable update_delete_limit { + reset_db + do_execsql_test 500 { + CREATE TABLE t1(abc INT, def INT); + INSERT INTO t1 VALUES(0,0); + INSERT INTO t1 VALUES(0,0); + INSERT INTO t1 VALUES(0,0); + CREATE TABLE dual(dummy TEXT); + INSERT INTO dual(dummy) VALUES('X'); + } {} + + do_execsql_test 510 { + UPDATE t1 + SET (abc, def)=(SELECT x, 123) + FROM dual LEFT JOIN (SELECT 789 AS 'x' FROM dual) AS d2 + LIMIT 2 + } + + do_execsql_test 520 { + SELECT * FROM t1 + } {789 123 789 123 0 0} +} + + finish_test