diff options
author | dan <Dan Kennedy> | 2025-07-03 14:28:47 +0000 |
---|---|---|
committer | dan <Dan Kennedy> | 2025-07-03 14:28:47 +0000 |
commit | c525e6e81793b6b133fcadfd32d49b6b63bb80ab (patch) | |
tree | a76a303db4f6ecc3e9fe4d07029e29d746c7f846 /src | |
parent | 1ff6f19d8b8199f49cd67171ae03873766d12c3f (diff) | |
download | sqlite-c525e6e81793b6b133fcadfd32d49b6b63bb80ab.tar.gz sqlite-c525e6e81793b6b133fcadfd32d49b6b63bb80ab.zip |
Make handling of LIMIT clauses in correlated sub-queries on virtual tables more efficient.
FossilOrigin-Name: 7214cb2a5b35190a06a1040cd4c54f325d347f8d8e36a07fd76c0a421e266522
Diffstat (limited to 'src')
-rw-r--r-- | src/whereexpr.c | 20 |
1 files changed, 17 insertions, 3 deletions
diff --git a/src/whereexpr.c b/src/whereexpr.c index 53c8508e5..fc7a30a42 100644 --- a/src/whereexpr.c +++ b/src/whereexpr.c @@ -1652,7 +1652,7 @@ static void whereAddLimitExpr( ** ** 1. The SELECT statement has a LIMIT clause, and ** 2. The SELECT statement is not an aggregate or DISTINCT query, and -** 3. The SELECT statement has exactly one object in its from clause, and +** 3. The SELECT statement has exactly one object in its FROM clause, and ** that object is a virtual table, and ** 4. There are no terms in the WHERE clause that will not be passed ** to the virtual table xBestIndex method. @@ -1689,8 +1689,22 @@ void SQLITE_NOINLINE sqlite3WhereAddLimit(WhereClause *pWC, Select *p){ ** (leftCursor==iCsr) test below. */ continue; } - if( pWC->a[ii].leftCursor!=iCsr ) return; - if( pWC->a[ii].prereqRight!=0 ) return; + if( pWC->a[ii].leftCursor==iCsr && pWC->a[ii].prereqRight==0 ) continue; + + /* If this term has a parent with exactly one child, and the parent will + ** be passed through to xBestIndex, then this term can be ignored. */ + if( pWC->a[ii].iParent>=0 ){ + WhereTerm *pParent = &pWC->a[ pWC->a[ii].iParent ]; + if( pParent->leftCursor==iCsr + && pParent->prereqRight==0 + && ALWAYS(pParent->nChild==1) + ){ + continue; + } + } + + /* This term will not be passed through. Do not add a LIMIT clause. */ + return; } /* Check condition (5). Return early if it is not met. */ |