Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | Add the SQLITE_SkipAhead optimization setting |
---|---|
Downloads: | Tarball | ZIP archive |
Timelines: | family | ancestors | descendants | both | skip-ahead-distinct |
Files: | files | file ages | folders |
SHA1: |
87703b7661f8ec0e11b3f99d7fb13277 |
User & Date: | drh 2016-04-15 22:03:01.993 |
Context
2016-04-21
| ||
15:44 | Merge the latest changes from trunk. (Closed-Leaf check-in: 8183fa6829 user: drh tags: skip-ahead-distinct) | |
2016-04-15
| ||
22:03 | Add the SQLITE_SkipAhead optimization setting (check-in: 87703b7661 user: drh tags: skip-ahead-distinct) | |
16:27 | Skip-ahead is now just an optimization. If it gets confused, it falls back to an incremental scan with redundancy elimination. (check-in: 6fac0b9212 user: drh tags: skip-ahead-distinct) | |
Changes
Changes to src/sqliteInt.h.
︙ | ︙ | |||
1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 | #define SQLITE_DistinctOpt 0x0020 /* DISTINCT using indexes */ #define SQLITE_CoverIdxScan 0x0040 /* Covering index scans */ #define SQLITE_OrderByIdxJoin 0x0080 /* ORDER BY of joins via index */ #define SQLITE_SubqCoroutine 0x0100 /* Evaluate subqueries as coroutines */ #define SQLITE_Transitive 0x0200 /* Transitive constraints */ #define SQLITE_OmitNoopJoin 0x0400 /* Omit unused tables in joins */ #define SQLITE_Stat34 0x0800 /* Use STAT3 or STAT4 data */ #define SQLITE_CursorHints 0x2000 /* Add OP_CursorHint opcodes */ #define SQLITE_AllOpts 0xffff /* All optimizations */ /* ** Macros for testing whether or not optimizations are enabled or disabled. */ #ifndef SQLITE_OMIT_BUILTIN_TEST | > | 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 | #define SQLITE_DistinctOpt 0x0020 /* DISTINCT using indexes */ #define SQLITE_CoverIdxScan 0x0040 /* Covering index scans */ #define SQLITE_OrderByIdxJoin 0x0080 /* ORDER BY of joins via index */ #define SQLITE_SubqCoroutine 0x0100 /* Evaluate subqueries as coroutines */ #define SQLITE_Transitive 0x0200 /* Transitive constraints */ #define SQLITE_OmitNoopJoin 0x0400 /* Omit unused tables in joins */ #define SQLITE_Stat34 0x0800 /* Use STAT3 or STAT4 data */ #define SQLITE_SkipAhead 0x1000 /* Skip ahead on DISTINCT */ #define SQLITE_CursorHints 0x2000 /* Add OP_CursorHint opcodes */ #define SQLITE_AllOpts 0xffff /* All optimizations */ /* ** Macros for testing whether or not optimizations are enabled or disabled. */ #ifndef SQLITE_OMIT_BUILTIN_TEST |
︙ | ︙ |
Changes to src/where.c.
︙ | ︙ | |||
4583 4584 4585 4586 4587 4588 4589 4590 4591 4592 4593 4594 4595 4596 | if( pLevel->op!=OP_Noop ){ #ifndef SQLITE_DISABLE_SKIPAHEAD_DISTINCT int n = -1; int j, k, op; int r1 = pParse->nMem+1; if( pWInfo->eDistinct==WHERE_DISTINCT_ORDERED && (pLoop->wsFlags & WHERE_INDEXED)!=0 ){ /* This is the Skip-ahead optimization. When doing a DISTINCT query ** that has WHERE_DISTINCT_ORDERED, use OP_SkipGT/OP_SkipLT to skip ** over all duplicate entries, rather than visiting all duplicates ** using OP_Next/OP_Prev. */ ExprList *pX = pWInfo->pDistinctSet; Index *pIdx = pLoop->u.btree.pIndex; | > | 4583 4584 4585 4586 4587 4588 4589 4590 4591 4592 4593 4594 4595 4596 4597 | if( pLevel->op!=OP_Noop ){ #ifndef SQLITE_DISABLE_SKIPAHEAD_DISTINCT int n = -1; int j, k, op; int r1 = pParse->nMem+1; if( pWInfo->eDistinct==WHERE_DISTINCT_ORDERED && (pLoop->wsFlags & WHERE_INDEXED)!=0 && OptimizationEnabled(db, SQLITE_SkipAhead) ){ /* This is the Skip-ahead optimization. When doing a DISTINCT query ** that has WHERE_DISTINCT_ORDERED, use OP_SkipGT/OP_SkipLT to skip ** over all duplicate entries, rather than visiting all duplicates ** using OP_Next/OP_Prev. */ ExprList *pX = pWInfo->pDistinctSet; Index *pIdx = pLoop->u.btree.pIndex; |
︙ | ︙ |