mirror of
https://github.com/sqlite/sqlite.git
synced 2025-11-16 23:02:26 +03:00
Add a 4th output code (value 3) from the sqlite3_vtab_distinct() interface
that indicates that SQLite wants distinct results that are sorted. FossilOrigin-Name: 135d8b97b01f9b5204f486f828c274c2d779c17723e79171ca61f738746adf8e
This commit is contained in:
18
src/where.c
18
src/where.c
@@ -1212,8 +1212,10 @@ static sqlite3_index_info *allocateIndexInfo(
|
||||
}
|
||||
if( i==n ){
|
||||
nOrderBy = n;
|
||||
if( (pWInfo->wctrlFlags & (WHERE_GROUPBY|WHERE_DISTINCTBY)) ){
|
||||
eDistinct = 1 + ((pWInfo->wctrlFlags & WHERE_DISTINCTBY)!=0);
|
||||
if( (pWInfo->wctrlFlags & WHERE_DISTINCTBY) ){
|
||||
eDistinct = 2 + ((pWInfo->wctrlFlags & WHERE_SORTBYGROUP)!=0);
|
||||
}else if( pWInfo->wctrlFlags & WHERE_GROUPBY ){
|
||||
eDistinct = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -3769,9 +3771,7 @@ int sqlite3_vtab_rhs_value(
|
||||
*/
|
||||
int sqlite3_vtab_distinct(sqlite3_index_info *pIdxInfo){
|
||||
HiddenIndexInfo *pHidden = (HiddenIndexInfo*)&pIdxInfo[1];
|
||||
assert( pHidden->eDistinct==0
|
||||
|| pHidden->eDistinct==1
|
||||
|| pHidden->eDistinct==2 );
|
||||
assert( pHidden->eDistinct>=0 && pHidden->eDistinct<=3 );
|
||||
return pHidden->eDistinct;
|
||||
}
|
||||
|
||||
@@ -4230,7 +4230,9 @@ static i8 wherePathSatisfiesOrderBy(
|
||||
pLoop = pLast;
|
||||
}
|
||||
if( pLoop->wsFlags & WHERE_VIRTUALTABLE ){
|
||||
if( pLoop->u.vtab.isOrdered && (wctrlFlags & WHERE_DISTINCTBY)==0 ){
|
||||
if( pLoop->u.vtab.isOrdered
|
||||
&& ((wctrlFlags&(WHERE_DISTINCTBY|WHERE_SORTBYGROUP))!=WHERE_DISTINCTBY)
|
||||
){
|
||||
obSat = obDone;
|
||||
}
|
||||
break;
|
||||
@@ -4497,7 +4499,7 @@ static i8 wherePathSatisfiesOrderBy(
|
||||
** SELECT * FROM t1 GROUP BY y,x ORDER BY y,x; -- IsSorted()==0
|
||||
*/
|
||||
int sqlite3WhereIsSorted(WhereInfo *pWInfo){
|
||||
assert( pWInfo->wctrlFlags & WHERE_GROUPBY );
|
||||
assert( pWInfo->wctrlFlags & (WHERE_GROUPBY|WHERE_DISTINCTBY) );
|
||||
assert( pWInfo->wctrlFlags & WHERE_SORTBYGROUP );
|
||||
return pWInfo->sorted;
|
||||
}
|
||||
@@ -4898,12 +4900,12 @@ static int wherePathSolver(WhereInfo *pWInfo, LogEst nRowEst){
|
||||
}
|
||||
pWInfo->bOrderedInnerLoop = 0;
|
||||
if( pWInfo->pOrderBy ){
|
||||
pWInfo->nOBSat = pFrom->isOrdered;
|
||||
if( pWInfo->wctrlFlags & WHERE_DISTINCTBY ){
|
||||
if( pFrom->isOrdered==pWInfo->pOrderBy->nExpr ){
|
||||
pWInfo->eDistinct = WHERE_DISTINCT_ORDERED;
|
||||
}
|
||||
}else{
|
||||
pWInfo->nOBSat = pFrom->isOrdered;
|
||||
pWInfo->revMask = pFrom->revLoop;
|
||||
if( pWInfo->nOBSat<=0 ){
|
||||
pWInfo->nOBSat = 0;
|
||||
|
||||
Reference in New Issue
Block a user