mirror of
https://github.com/sqlite/sqlite.git
synced 2025-11-16 23:02:26 +03:00
Experimental change to have sqlite3_vtab_distinct() return 3 to indicate that results should sorted and duplicates may be removed.
FossilOrigin-Name: 11f4508895c0a46d8623ca2f4f37b4f1b54b6d9022765f6124a9d42132f7d633
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -3771,7 +3773,9 @@ int sqlite3_vtab_distinct(sqlite3_index_info *pIdxInfo){
|
||||
HiddenIndexInfo *pHidden = (HiddenIndexInfo*)&pIdxInfo[1];
|
||||
assert( pHidden->eDistinct==0
|
||||
|| pHidden->eDistinct==1
|
||||
|| pHidden->eDistinct==2 );
|
||||
|| pHidden->eDistinct==2
|
||||
|| pHidden->eDistinct==3
|
||||
);
|
||||
return pHidden->eDistinct;
|
||||
}
|
||||
|
||||
@@ -4230,7 +4234,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 +4503,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 +4904,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