@@ -135,11 +135,11 @@
135 135 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** [sqlite3_libversion_number()], [sqlite3_sourceid()],
136 136 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** [sqlite_version()] and [sqlite_source_id()].
137 137 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
138 138 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define SQLITE_VERSION "3.8.2"
139 139 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define SQLITE_VERSION_NUMBER 3008002
140 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define SQLITE_SOURCE_ID "2013-11-11 16:55:52 924d63b283a3d059838114c95d42c6feaf913529"
140 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define SQLITE_SOURCE_ID "2013-11-12 15:33:40 0f924c6ef6cf2ac5a61aafa8dd8e3309b3970499"
141 141 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
142 142 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
143 143 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** CAPI3REF: Run-Time Library Version Numbers
144 144 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** KEYWORDS: sqlite3_version, sqlite3_sourceid
145 145 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
@@ -5321,14 +5321,26 @@
5321 5321 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
5322 5322 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** ^The orderByConsumed means that output from [xFilter]/[xNext] will occur in
5323 5323 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** the correct order to satisfy the ORDER BY clause so that no separate
5324 5324 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** sorting step is required.
5325 5325 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
5326 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** ^The estimatedCost value is an estimate of the cost of doing the
5327 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** particular lookup. A full scan of a table with N entries should have
5328 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** a cost of N. A binary search of a table of N entries should have a
5329 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** cost of approximately log(N).
5326 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** ^The estimatedCost value is an estimate of the cost of a particular
5327 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** strategy. A cost of N indicates that the cost of the strategy is similar
5328 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** to a linear scan of an SQLite table with N rows. A cost of log(N)
5329 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** indicates that the expense of the operation is similar to that of a
5330 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** binary search on a unique indexed field of an SQLite table with N rows.
5331 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
5332 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** ^The estimatedRows value is an estimate of the number of rows that
5333 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** will be returned by the strategy.
5334 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
5335 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** IMPORTANT: The estimatedRows field was added to the sqlite3_index_info
5336 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** structure for SQLite version 3.8.2. If a virtual table extension is
5337 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** used with an SQLite version earlier than 3.8.2, the results of attempting
5338 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** to read or write the estimatedRows field are undefined (but are likely
5339 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** to included crashing the application). The estimatedRows field should
5340 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** therefore only be used if [sqlite3_libversion_number()] returns a
5341 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** value greater than or equal to 3008002.
5330 5342 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
5331 5343 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
struct sqlite3_index_info {
5332 5344 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Inputs */
5333 5345 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nConstraint; /* Number of entries in aConstraint */
5334 5346 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
struct sqlite3_index_constraint {
@@ -5349,11 +5361,13 @@
5349 5361 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
} *aConstraintUsage;
5350 5362 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int idxNum; /* Number used to identify the index */
5351 5363 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *idxStr; /* String, possibly obtained from sqlite3_malloc */
5352 5364 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int needToFreeIdxStr; /* Free idxStr using sqlite3_free() if true */
5353 5365 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int orderByConsumed; /* True if output is already ordered */
5354 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- double estimatedCost; /* Estimated cost of using this index */
5366 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ double estimatedCost; /* Estimated cost of using this index */
5367 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Fields below are only available in SQLite 3.8.2 and later */
5368 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_int64 estimatedRows; /* Estimated number of rows returned */
5355 5369 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
};
5356 5370 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
5357 5371 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
5358 5372 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** CAPI3REF: Virtual Table Constraint Operator Codes
5359 5373 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
@@ -104060,15 +104074,16 @@
104060 104074 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
104061 104075 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Search for the index that has the lowest scan cost.
104062 104076 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
104063 104077 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** (2011-04-15) Do not do a full scan of an unordered index.
104064 104078 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
104065 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** (2013-10-03) Do not count the entires in a partial index.
104079 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** (2013-10-03) Do not count the entries in a partial index.
104066 104080 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
104067 104081 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** In practice the KeyInfo structure will not be used. It is only
104068 104082 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** passed to keep OP_OpenRead happy.
104069 104083 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
104084 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !HasRowid(pTab) ) pBest = sqlite3PrimaryKeyIndex(pTab);
104070 104085 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){
104071 104086 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pIdx->bUnordered==0
104072 104087 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
&& pIdx->szIdxRow<pTab->szTabRow
104073 104088 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
&& pIdx->pPartIdxWhere==0
104074 104089 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
&& (!pBest || pIdx->szIdxRow<pBest->szIdxRow)
@@ -107998,11 +108013,12 @@
107998 108013 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
LogEst rSetup; /* One-time setup cost (ex: create transient index) */
107999 108014 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
LogEst rRun; /* Cost of running each loop */
108000 108015 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
LogEst nOut; /* Estimated number of output rows */
108001 108016 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
union {
108002 108017 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
struct { /* Information for internal btree tables */
108003 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int nEq; /* Number of equality constraints */
108018 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u16 nEq; /* Number of equality constraints */
108019 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u16 nSkip; /* Number of initial index columns skipped */
108004 108020 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Index *pIndex; /* Index used, or NULL */
108005 108021 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
} btree;
108006 108022 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
struct { /* Information for virtual tables */
108007 108023 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int idxNum; /* Index number */
108008 108024 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
u8 needFree; /* True if sqlite3_free(idxStr) is needed */
@@ -109859,10 +109875,11 @@
109859 109875 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
109860 109876 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3DebugPrintf(" idxNum=%d\n", p->idxNum);
109861 109877 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3DebugPrintf(" idxStr=%s\n", p->idxStr);
109862 109878 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3DebugPrintf(" orderByConsumed=%d\n", p->orderByConsumed);
109863 109879 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3DebugPrintf(" estimatedCost=%g\n", p->estimatedCost);
109880 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3DebugPrintf(" estimatedRows=%lld\n", p->estimatedRows);
109864 109881 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
109865 109882 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#else
109866 109883 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define TRACE_IDX_INPUTS(A)
109867 109884 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define TRACE_IDX_OUTPUTS(A)
109868 109885 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
@@ -111825,11 +111842,16 @@
111825 111842 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( strncmp(zName, "sqlite_autoindex_", 17)==0 ){
111826 111843 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int i = sqlite3Strlen30(zName) - 1;
111827 111844 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
while( zName[i]!='_' ) i--;
111828 111845 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
zName += i;
111829 111846 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
111830 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3DebugPrintf(".%-16s %2d", zName, p->u.btree.nEq);
111847 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( p->u.btree.nSkip ){
111848 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3DebugPrintf(".%-15s %d+%d", zName,
111849 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->u.btree.nSkip, p->u.btree.nEq);
111850 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
111851 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3DebugPrintf(".%-16s %2d", zName, p->u.btree.nEq);
111852 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
111831 111853 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
111832 111854 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3DebugPrintf("%20s","");
111833 111855 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
111834 111856 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
111835 111857 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *z;
@@ -112668,10 +112690,11 @@
112668 112690 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pIdxInfo->idxStr = 0;
112669 112691 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pIdxInfo->idxNum = 0;
112670 112692 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pIdxInfo->needToFreeIdxStr = 0;
112671 112693 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pIdxInfo->orderByConsumed = 0;
112672 112694 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pIdxInfo->estimatedCost = SQLITE_BIG_DBL / (double)2;
112695 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pIdxInfo->estimatedRows = 25;
112673 112696 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = vtabBestIndex(pParse, pTab, pIdxInfo);
112674 112697 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rc ) goto whereLoopAddVtab_exit;
112675 112698 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pIdxCons = *(struct sqlite3_index_constraint**)&pIdxInfo->aConstraint;
112676 112699 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pNew->prereq = 0;
112677 112700 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
mxTerm = -1;
@@ -112727,12 +112750,11 @@
112727 112750 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pNew->u.vtab.idxStr = pIdxInfo->idxStr;
112728 112751 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pNew->u.vtab.isOrdered = (u8)((pIdxInfo->nOrderBy!=0)
112729 112752 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
&& pIdxInfo->orderByConsumed);
112730 112753 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pNew->rSetup = 0;
112731 112754 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pNew->rRun = sqlite3LogEstFromDouble(pIdxInfo->estimatedCost);
112732 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* TUNING: Every virtual table query returns 25 rows */
112733 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pNew->nOut = 46; assert( 46==sqlite3LogEst(25) );
112755 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pNew->nOut = sqlite3LogEst(pIdxInfo->estimatedRows);
112734 112756 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
whereLoopInsert(pBuilder, pNew);
112735 112757 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pNew->u.vtab.needFree ){
112736 112758 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_free(pNew->u.vtab.idxStr);
112737 112759 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pNew->u.vtab.needFree = 0;
112738 112760 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
@@ -141028,10 +141050,20 @@
141028 141050 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** ever contain very many entries, so a fixed number of buckets is
141029 141051 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** used.
141030 141052 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
141031 141053 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define HASHSIZE 128
141032 141054 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
141055 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* The xBestIndex method of this virtual table requires an estimate of
141056 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the number of rows in the virtual table to calculate the costs of
141057 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** various strategies. If possible, this estimate is loaded from the
141058 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** sqlite_stat1 table (with RTREE_MIN_ROWEST as a hard-coded minimum).
141059 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Otherwise, if no sqlite_stat1 entry is available, use
141060 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** RTREE_DEFAULT_ROWEST.
141061 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
141062 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define RTREE_DEFAULT_ROWEST 1048576
141063 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define RTREE_MIN_ROWEST 100
141064 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
141033 141065 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
141034 141066 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** An rtree virtual-table object.
141035 141067 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
141036 141068 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
struct Rtree {
141037 141069 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_vtab base;
@@ -141042,10 +141074,11 @@
141042 141074 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int iDepth; /* Current depth of the r-tree structure */
141043 141075 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *zDb; /* Name of database containing r-tree table */
141044 141076 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *zName; /* Name of r-tree table */
141045 141077 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
RtreeNode *aHash[HASHSIZE]; /* Hash table of in-memory nodes. */
141046 141078 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nBusy; /* Current number of users of this structure */
141079 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ i64 nRowEst; /* Estimated number of rows in this table */
141047 141080 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
141048 141081 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* List of nodes removed during a CondenseTree operation. List is
141049 141082 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** linked together via the pointer normally used for hash chains -
141050 141083 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** RtreeNode.pNext. RtreeNode.iNode stores the depth of the sub-tree
141051 141084 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** headed by the node (leaf nodes have RtreeNode.iNode==0).
@@ -142233,10 +142266,23 @@
142233 142266 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
142234 142267 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
142235 142268 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rtreeRelease(pRtree);
142236 142269 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return rc;
142237 142270 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
142271 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
142272 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
142273 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Set the pIdxInfo->estimatedRows variable to nRow. Unless this
142274 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** extension is currently being used by a version of SQLite too old to
142275 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** support estimatedRows. In that case this function is a no-op.
142276 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
142277 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static void setEstimatedRows(sqlite3_index_info *pIdxInfo, i64 nRow){
142278 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #if SQLITE_VERSION_NUMBER>=3008002
142279 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( sqlite3_libversion_number()>=3008002 ){
142280 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pIdxInfo->estimatedRows = nRow;
142281 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
142282 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif
142283 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
142238 142284 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
142239 142285 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
142240 142286 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Rtree virtual table module xBestIndex method. There are three
142241 142287 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** table scan strategies to choose from (in order from most to
142242 142288 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** least desirable):
@@ -142269,17 +142315,18 @@
142269 142315 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** The second of each pair of bytes identifies the coordinate column
142270 142316 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** to which the constraint applies. The leftmost coordinate column
142271 142317 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** is 'a', the second from the left 'b' etc.
142272 142318 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
142273 142319 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static int rtreeBestIndex(sqlite3_vtab *tab, sqlite3_index_info *pIdxInfo){
142320 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Rtree *pRtree = (Rtree*)tab;
142274 142321 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int rc = SQLITE_OK;
142275 142322 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int ii;
142323 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ i64 nRow; /* Estimated rows returned by this scan */
142276 142324 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
142277 142325 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int iIdx = 0;
142278 142326 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char zIdxStr[RTREE_MAX_DIMENSIONS*8+1];
142279 142327 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
memset(zIdxStr, 0, sizeof(zIdxStr));
142280 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- UNUSED_PARAMETER(tab);
142281 142328 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
142282 142329 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( pIdxInfo->idxStr==0 );
142283 142330 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for(ii=0; ii<pIdxInfo->nConstraint && iIdx<(int)(sizeof(zIdxStr)-1); ii++){
142284 142331 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
struct sqlite3_index_constraint *p = &pIdxInfo->aConstraint[ii];
142285 142332 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@@ -142295,13 +142342,15 @@
142295 142342 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pIdxInfo->aConstraintUsage[jj].omit = 1;
142296 142343 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
142297 142344 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* This strategy involves a two rowid lookups on an B-Tree structures
142298 142345 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** and then a linear search of an R-Tree node. This should be
142299 142346 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** considered almost as quick as a direct rowid lookup (for which
142300 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** sqlite uses an internal cost of 0.0).
142347 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** sqlite uses an internal cost of 0.0). It is expected to return
142348 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** a single row.
142301 142349 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
142302 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pIdxInfo->estimatedCost = 10.0;
142350 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pIdxInfo->estimatedCost = 30.0;
142351 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ setEstimatedRows(pIdxInfo, 1);
142303 142352 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return SQLITE_OK;
142304 142353 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
142305 142354 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
142306 142355 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( p->usable && (p->iColumn>0 || p->op==SQLITE_INDEX_CONSTRAINT_MATCH) ){
142307 142356 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
u8 op;
@@ -142326,12 +142375,15 @@
142326 142375 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pIdxInfo->idxNum = 2;
142327 142376 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pIdxInfo->needToFreeIdxStr = 1;
142328 142377 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( iIdx>0 && 0==(pIdxInfo->idxStr = sqlite3_mprintf("%s", zIdxStr)) ){
142329 142378 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return SQLITE_NOMEM;
142330 142379 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
142331 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( iIdx>=0 );
142332 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pIdxInfo->estimatedCost = (2000000.0 / (double)(iIdx + 1));
142380 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
142381 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nRow = pRtree->nRowEst / (iIdx + 1);
142382 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pIdxInfo->estimatedCost = (double)6.0 * (double)nRow;
142383 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ setEstimatedRows(pIdxInfo, nRow);
142384 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
142333 142385 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return rc;
142334 142386 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
142335 142387 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
142336 142388 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
142337 142389 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Return the N-dimensional volumn of the cell stored in *p.
@@ -143801,10 +143853,41 @@
143801 143853 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = sqlite3_exec(pRtree->db, zSql, 0, 0, 0);
143802 143854 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_free(zSql);
143803 143855 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
143804 143856 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return rc;
143805 143857 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
143858 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
143859 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
143860 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** This function populates the pRtree->nRowEst variable with an estimate
143861 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** of the number of rows in the virtual table. If possible, this is based
143862 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** on sqlite_stat1 data. Otherwise, use RTREE_DEFAULT_ROWEST.
143863 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
143864 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int rtreeQueryStat1(sqlite3 *db, Rtree *pRtree){
143865 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *zSql = "SELECT stat FROM sqlite_stat1 WHERE tbl= ? || '_rowid'";
143866 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_stmt *p;
143867 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int rc;
143868 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ i64 nRow = 0;
143869 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
143870 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = sqlite3_prepare_v2(db, zSql, -1, &p, 0);
143871 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc==SQLITE_OK ){
143872 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_bind_text(p, 1, pRtree->zName, -1, SQLITE_STATIC);
143873 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( sqlite3_step(p)==SQLITE_ROW ) nRow = sqlite3_column_int64(p, 0);
143874 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = sqlite3_finalize(p);
143875 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else if( rc!=SQLITE_NOMEM ){
143876 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = SQLITE_OK;
143877 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
143878 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
143879 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc==SQLITE_OK ){
143880 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( nRow==0 ){
143881 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pRtree->nRowEst = RTREE_DEFAULT_ROWEST;
143882 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
143883 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pRtree->nRowEst = MAX(nRow, RTREE_MIN_ROWEST);
143884 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
143885 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
143886 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
143887 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return rc;
143888 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
143806 143889 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
143807 143890 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static sqlite3_module rtreeModule = {
143808 143891 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
0, /* iVersion */
143809 143892 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rtreeCreate, /* xCreate - create a table */
143810 143893 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rtreeConnect, /* xConnect - connect to an existing table */
@@ -143887,10 +143970,11 @@
143887 143970 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
appStmt[5] = &pRtree->pDeleteRowid;
143888 143971 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
appStmt[6] = &pRtree->pReadParent;
143889 143972 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
appStmt[7] = &pRtree->pWriteParent;
143890 143973 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
appStmt[8] = &pRtree->pDeleteParent;
143891 143974 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
143975 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = rtreeQueryStat1(db, pRtree);
143892 143976 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for(i=0; i<N_STATEMENT && rc==SQLITE_OK; i++){
143893 143977 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *zSql = sqlite3_mprintf(azSql[i], zDb, zPrefix);
143894 143978 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( zSql ){
143895 143979 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = sqlite3_prepare_v2(db, zSql, -1, appStmt[i], 0);
143896 143980 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
143897 143981 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!