diff options
author | drh <> | 2025-07-03 00:17:27 +0000 |
---|---|---|
committer | drh <> | 2025-07-03 00:17:27 +0000 |
commit | debc8f7bb7b62fb865251e140510d853b138b88b (patch) | |
tree | 2097fe599de536915979fd49bc06208ae90c74e2 /src | |
parent | aa54d7a0ca03a4df516f25e66ff3c4801be07a7b (diff) | |
download | sqlite-debc8f7bb7b62fb865251e140510d853b138b88b.tar.gz sqlite-debc8f7bb7b62fb865251e140510d853b138b88b.zip |
Minor tweaks to the exists-to-join optimization.
FossilOrigin-Name: 9cb600ad576c68647ed943a0773019312c5f01c9c1ca9ff0bf1214b03a531b48
Diffstat (limited to 'src')
-rw-r--r-- | src/resolve.c | 8 | ||||
-rw-r--r-- | src/select.c | 2 | ||||
-rw-r--r-- | src/shell.c.in | 1 |
3 files changed, 8 insertions, 3 deletions
diff --git a/src/resolve.c b/src/resolve.c index 562ca5e00..bbd1021e0 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 fd99dc91f..9c79f6c67 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 33dd30697..5cda6a1a1 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; |