From: drh <> Date: Thu, 3 Jul 2025 00:17:27 +0000 (+0000) Subject: Minor tweaks to the exists-to-join optimization. X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=debc8f7bb7b62fb865251e140510d853b138b88b;p=thirdparty%2Fsqlite.git Minor tweaks to the exists-to-join optimization. FossilOrigin-Name: 9cb600ad576c68647ed943a0773019312c5f01c9c1ca9ff0bf1214b03a531b48 --- diff --git a/manifest b/manifest index 8caec32f55..7774b2396b 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Merge\sin\sthe\sexists-to-join\soptimization\sthat\shas\sbeen\smodified\nto\srelax\sthe\srequirement\sof\shaving\san\sindexed\sjoin\sconstraint. -D 2025-07-02T20:46:02.299 +C Minor\stweaks\sto\sthe\sexists-to-join\soptimization. +D 2025-07-03T00:17:27.518 F .fossil-settings/binary-glob 61195414528fb3ea9693577e1980230d78a1f8b0a54c78cf1b9b24d0a409ed6a x F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea @@ -783,10 +783,10 @@ F src/pragma.c 30b535d0a66348df844ee36f890617b4cf45e9a22dcbc47ec3ca92909c50aaf1 F src/prepare.c 1832be043fce7d489959aae6f994c452d023914714c4d5457beaed51c0f3d126 F src/printf.c 71b6d3a0093bf23f473e25480ca0024e8962681506c75f4ffd3d343a3f0ab113 F src/random.c 606b00941a1d7dd09c381d3279a058d771f406c5213c9932bbd93d5587be4b9c -F src/resolve.c 9583e6eb8066400d377db9b130ebf46d461b59fccf1d018a5010d55b9bea217c +F src/resolve.c 5b14cad58bc21341fbaea76d7e781187559627a461745ece00c2655ba7c083ec F src/rowset.c 8432130e6c344b3401a8874c3cb49fefe6873fec593294de077afea2dce5ec97 -F src/select.c 30d7e450179a123c2a4dd9000592da196f5a6766688773cb11b921294afa11bf -F src/shell.c.in 4f14a1f5196b6006abc8e73cc8fd6c1a62cf940396f8ba909d6711f35f074bb6 +F src/select.c d956136defc62a9b11d61b18c5c3559231055c0ea32f6b11d13c740a7467aeb0 +F src/shell.c.in 73c0eeb7c265d59b99219d5aa055f412f07842088d8036b6d259927d85dd1bbf F src/sqlite.h.in 5c54f2461a1ea529bab8499148a2b238e2d4bb571d59e8ea5322d0c190abb693 F src/sqlite3.rc 015537e6ac1eec6c7050e17b616c2ffe6f70fca241835a84a4f0d5937383c479 F src/sqlite3ext.h 0bfd049bb2088cc44c2ad54f2079d1c6e43091a4e1ce8868779b75f6c1484f1e @@ -2211,8 +2211,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 1ad0169b022b280bcaaf94a7fa231591be96b514230ab5c98fbf15cd7df842dd F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P ff593a16d61cc5c588d1737deb822abb90b1759475a4cabfcf608978b1191487 9084a4c8726a2c7ba1c381886e29c7b86121d531282be0d63d5988d84f6f448d -R f60eba1acfa64dc97c08e5ab9333e9b4 +P 1c1aef2b7feae29066d0330699ab634ef41f5b60cdcd479a60cb1a5409553138 +R 690f317201b055306be94336494e9b81 U drh -Z 4c3d6c95c910f93bc2abb148fe548800 +Z 608e6ffa5985c7c132d45ebfd75d87f4 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 70909c9c3e..7b5464b41b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -1c1aef2b7feae29066d0330699ab634ef41f5b60cdcd479a60cb1a5409553138 +9cb600ad576c68647ed943a0773019312c5f01c9c1ca9ff0bf1214b03a531b48 diff --git a/src/resolve.c b/src/resolve.c index 562ca5e008..bbd1021e0b 100644 --- a/src/resolve.c +++ b/src/resolve.c @@ -1358,11 +1358,16 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ return WRC_Prune; } #ifndef SQLITE_OMIT_SUBQUERY + case TK_EXISTS: + assert( ExprUseXSelect(pExpr) ); + pParse->bHasExists = 1; + /* no break */ deliberate_fall_through case TK_SELECT: - case TK_EXISTS: testcase( pExpr->op==TK_EXISTS ); #endif case TK_IN: { testcase( pExpr->op==TK_IN ); + testcase( pExpr->op==TK_EXISTS ); + testcase( pExpr->op==TK_SELECT ); if( ExprUseXSelect(pExpr) ){ int nRef = pNC->nRef; testcase( pNC->ncFlags & NC_IsCheck ); @@ -1379,7 +1384,6 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ if( nRef!=pNC->nRef ){ ExprSetProperty(pExpr, EP_VarSelect); pExpr->x.pSelect->selFlags |= SF_Correlated; - if( pExpr->op==TK_EXISTS ) pParse->bHasExists = 1; } pNC->ncFlags |= NC_Subquery; } diff --git a/src/select.c b/src/select.c index fd99dc91fe..9c79f6c67c 100644 --- a/src/select.c +++ b/src/select.c @@ -7437,7 +7437,7 @@ static SQLITE_NOINLINE void existsToJoin( else if( pWhere->op==TK_EXISTS ){ Select *pSub = pWhere->x.pSelect; if( pSub->pSrc->nSrc==1 - && (pSub->selFlags & (SF_Aggregate|SF_Correlated))==SF_Correlated + && (pSub->selFlags & SF_Aggregate)==0 && pSub->pWhere ){ memset(pWhere, 0, sizeof(*pWhere)); diff --git a/src/shell.c.in b/src/shell.c.in index 33dd30697d..5cda6a1a1b 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -11710,6 +11710,7 @@ static int do_meta_command(char *zLine, ShellState *p){ { 0x08000000, 1, "OnePass" }, { 0x10000000, 1, "OrderBySubq" }, { 0x20000000, 1, "StarQuery" }, + { 0x40000000, 1, "ExistsToJoin" }, { 0xffffffff, 0, "All" }, }; unsigned int curOpt;