aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authordrh <>2025-07-03 00:17:27 +0000
committerdrh <>2025-07-03 00:17:27 +0000
commitdebc8f7bb7b62fb865251e140510d853b138b88b (patch)
tree2097fe599de536915979fd49bc06208ae90c74e2 /src
parentaa54d7a0ca03a4df516f25e66ff3c4801be07a7b (diff)
downloadsqlite-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.c8
-rw-r--r--src/select.c2
-rw-r--r--src/shell.c.in1
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;