mirror of
https://github.com/sqlite/sqlite.git
synced 2025-08-08 14:02:16 +03:00
Make handling of LIMIT clauses in correlated sub-queries on virtual tables more efficient.
FossilOrigin-Name: 7214cb2a5b35190a06a1040cd4c54f325d347f8d8e36a07fd76c0a421e266522
This commit is contained in:
@@ -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. */
|
||||
|
Reference in New Issue
Block a user