aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authordrh <drh@noemail.net>2017-04-13 19:48:29 +0000
committerdrh <drh@noemail.net>2017-04-13 19:48:29 +0000
commitc04ea80f64ea05beec16cbaf2dbb98a105bf96b6 (patch)
treeef4afe25d5bbe80699cc2e0fe68123ae21be8e7b /src
parenta74f5c29235c5fd297fb1ecd84de1fa1d42cdde8 (diff)
downloadsqlite-c04ea80f64ea05beec16cbaf2dbb98a105bf96b6.tar.gz
sqlite-c04ea80f64ea05beec16cbaf2dbb98a105bf96b6.zip
Simplification of the skip-ahead-distinct logic. There is still an issue
with handling COLLATE. FossilOrigin-Name: 57c5173b6376a76013b0611ce9770100bd8c04e80402e35d821d8614709f4795
Diffstat (limited to 'src')
-rw-r--r--src/where.c31
1 files changed, 15 insertions, 16 deletions
diff --git a/src/where.c b/src/where.c
index a846e2e82..dbb8111d1 100644
--- a/src/where.c
+++ b/src/where.c
@@ -3437,7 +3437,7 @@ static int whereLoopAddAll(WhereLoopBuilder *pBuilder){
}
/*
-** Examine a WherePath (with the addition of the extra WhereLoop of the 5th
+** Examine a WherePath (with the addition of the extra WhereLoop of the 6th
** parameters) to see if it outputs rows in the requested ORDER BY
** (or GROUP BY) without requiring a separate sort operation. Return N:
**
@@ -4849,6 +4849,7 @@ void sqlite3WhereEnd(WhereInfo *pWInfo){
pLoop = pLevel->pWLoop;
if( pLevel->op!=OP_Noop ){
#ifndef SQLITE_DISABLE_SKIPAHEAD_DISTINCT
+ int addrSeek = 0;
int n = -1;
int j, k, op;
int r1 = pParse->nMem+1;
@@ -4897,25 +4898,23 @@ void sqlite3WhereEnd(WhereInfo *pWInfo){
}
pParse->nMem += n;
op = pLevel->op==OP_Prev ? OP_SeekLT : OP_SeekGT;
- k = sqlite3VdbeAddOp4Int(v, op, pLevel->iIdxCur, 0, r1, n);
+ addrSeek = sqlite3VdbeAddOp4Int(v, op, pLevel->iIdxCur, 0, r1, n);
VdbeCoverageIf(v, op==OP_SeekLT);
VdbeCoverageIf(v, op==OP_SeekGT);
sqlite3VdbeAddOp2(v, OP_Goto, 1, pLevel->p2);
- sqlite3VdbeResolveLabel(v, pLevel->addrCont);
- sqlite3VdbeAddOp3(v, pLevel->op, pLevel->p1, pLevel->p2, pLevel->p3);
- sqlite3VdbeJumpHere(v, k);
- }else
-#endif /* SQLITE_DISABLE_SKIPAHEAD_DISTINCT */
- {
- /* The common case: Advance to the next row */
- sqlite3VdbeResolveLabel(v, pLevel->addrCont);
- sqlite3VdbeAddOp3(v, pLevel->op, pLevel->p1, pLevel->p2, pLevel->p3);
- sqlite3VdbeChangeP5(v, pLevel->p5);
- VdbeCoverage(v);
- VdbeCoverageIf(v, pLevel->op==OP_Next);
- VdbeCoverageIf(v, pLevel->op==OP_Prev);
- VdbeCoverageIf(v, pLevel->op==OP_VNext);
}
+#endif /* SQLITE_DISABLE_SKIPAHEAD_DISTINCT */
+ /* The common case: Advance to the next row */
+ sqlite3VdbeResolveLabel(v, pLevel->addrCont);
+ sqlite3VdbeAddOp3(v, pLevel->op, pLevel->p1, pLevel->p2, pLevel->p3);
+ sqlite3VdbeChangeP5(v, pLevel->p5);
+ VdbeCoverage(v);
+ VdbeCoverageIf(v, pLevel->op==OP_Next);
+ VdbeCoverageIf(v, pLevel->op==OP_Prev);
+ VdbeCoverageIf(v, pLevel->op==OP_VNext);
+#ifndef SQLITE_DISABLE_SKIPAHEAD_DISTINCT
+ if( addrSeek ) sqlite3VdbeJumpHere(v, addrSeek);
+#endif
}else{
sqlite3VdbeResolveLabel(v, pLevel->addrCont);
}