1
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
3
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
4
<title>Virtual Table Indexing Information</title>
5
<style type="text/css">
8
font-family: Verdana, sans-serif;
13
a:visited { color: #734559 }
15
.logo { position:absolute; margin:3px; }
31
.toolbar a { color: white; text-decoration: none; padding: 6px 12px; }
32
.toolbar a:visited { color: white; }
33
.toolbar a:hover { color: #044a64; background: white; }
35
.content { margin: 5%; }
36
.content dt { font-weight:bold; }
37
.content dd { margin-bottom: 25px; margin-left:20%; }
38
.content ul { padding:0px; padding-left: 15px; margin:0px; }
41
.se { background: url(../images/se.gif) 100% 100% no-repeat #044a64}
42
.sw { background: url(../images/sw.gif) 0% 100% no-repeat }
43
.ne { background: url(../images/ne.gif) 100% 0% no-repeat }
44
.nw { background: url(../images/nw.gif) 0% 0% no-repeat }
46
/* Things for "fancyformat" documents start here. */
47
.fancy img+p {font-style:italic}
48
.fancy .codeblock i { color: darkblue; }
49
.fancy h1,.fancy h2,.fancy h3,.fancy h4 {font-weight:normal;color:#044a64}
50
.fancy h2 { margin-left: 10px }
51
.fancy h3 { margin-left: 20px }
52
.fancy h4 { margin-left: 30px }
53
.fancy th {white-space:nowrap;text-align:left;border-bottom:solid 1px #444}
54
.fancy th, .fancy td {padding: 0.2em 1ex; vertical-align:top}
55
.fancy #toc a { color: darkblue ; text-decoration: none }
56
.fancy .todo { color: #AA3333 ; font-style : italic }
57
.fancy .todo:before { content: 'TODO:' }
58
.fancy p.todo { border: solid #AA3333 1px; padding: 1ex }
59
.fancy img { display:block; }
60
.fancy :link:hover, .fancy :visited:hover { background: wheat }
61
.fancy p,.fancy ul,.fancy ol { margin: 1em 5ex }
62
.fancy li p { margin: 1em 0 }
63
/* End of "fancyformat" specific rules. */
69
<div><!-- container div to satisfy validator -->
71
<a href="../index.html">
72
<img class="logo" src="../images/sqlite370_banner.gif" alt="SQLite Logo"
74
<div><!-- IE hack to prevent disappearing logo--></div>
75
<div class="tagline">Small. Fast. Reliable.<br>Choose any three.</div>
77
<table width=100% style="clear:both"><tr><td>
78
<div class="se"><div class="sw"><div class="ne"><div class="nw">
79
<table width=100% style="padding:0;margin:0;cell-spacing:0"><tr>
82
<a href="../about.html">About</a>
83
<a href="../sitemap.html">Sitemap</a>
84
<a href="../docs.html">Documentation</a>
85
<a href="../download.html">Download</a>
86
<a href="../copyright.html">License</a>
87
<a href="../news.html">News</a>
88
<a href="../support.html">Support</a>
91
gMsg = "Search SQLite Docs..."
92
function entersearch() {
93
var q = document.getElementById("q");
94
if( q.value == gMsg ) { q.value = "" }
95
q.style.color = "black"
96
q.style.fontStyle = "normal"
98
function leavesearch() {
99
var q = document.getElementById("q");
100
if( q.value == "" ) {
102
q.style.color = "#044a64"
103
q.style.fontStyle = "italic"
108
<div style="padding:0 1em 0px 0;white-space:nowrap">
109
<form name=f method="GET" action="http://www.sqlite.org/search">
110
<input id=q name=q type=text
111
onfocus="entersearch()" onblur="leavesearch()" style="width:24ex;padding:1px 1ex; border:solid white 1px; font-size:0.9em ; font-style:italic;color:#044a64;" value="Search SQLite Docs...">
112
<input type=submit value="Go" style="border:solid white 1px;background-color:#044a64;color:white;font-size:0.9em;padding:0 1ex">
116
</div></div></div></div>
118
<div class=startsearch></div>
120
<a href="intro.html"><h2>SQLite C Interface</h2></a><h2>Virtual Table Indexing Information</h2><blockquote><pre>struct sqlite3_index_info {
122
int nConstraint; /* Number of entries in aConstraint */
123
struct sqlite3_index_constraint {
124
int iColumn; /* Column on left-hand side of constraint */
125
unsigned char op; /* Constraint operator */
126
unsigned char usable; /* True if this constraint is usable */
127
int iTermOffset; /* Used internally - xBestIndex should ignore */
128
} *aConstraint; /* Table of WHERE clause constraints */
129
int nOrderBy; /* Number of terms in the ORDER BY clause */
130
struct sqlite3_index_orderby {
131
int iColumn; /* Column number */
132
unsigned char desc; /* True for DESC. False for ASC. */
133
} *aOrderBy; /* The ORDER BY clause */
135
struct sqlite3_index_constraint_usage {
136
int argvIndex; /* if >0, constraint is part of argv to xFilter */
137
unsigned char omit; /* Do not code a test for this constraint */
139
int idxNum; /* Number used to identify the index */
140
char *idxStr; /* String, possibly obtained from sqlite3_malloc */
141
int needToFreeIdxStr; /* Free idxStr using sqlite3_free() if true */
142
int orderByConsumed; /* True if output is already ordered */
143
double estimatedCost; /* Estimated cost of using this index */
145
</pre></blockquote><p>
146
The sqlite3_index_info structure and its substructures is used as part
147
of the <a href="../vtab.html">virtual table</a> interface to
148
pass information into and receive the reply from the <a href="../vtab.html#xbestindex">xBestIndex</a>
149
method of a <a href="../c3ref/module.html">virtual table module</a>. The fields under **Inputs** are the
150
inputs to xBestIndex and are read-only. xBestIndex inserts its
151
results into the **Outputs** fields.</p>
153
<p>The aConstraint[] array records WHERE clause constraints of the form:</p>
155
<p><blockquote>column OP expr</blockquote></p>
157
<p>where OP is =, <, <=, >, or >=. The particular operator is
158
stored in aConstraint[].op using one of the
159
<a href="../c3ref/c_index_constraint_eq.html">SQLITE_INDEX_CONSTRAINT_ values</a>.
160
The index of the column is stored in
161
aConstraint[].iColumn. aConstraint[].usable is TRUE if the
162
expr on the right-hand side can be evaluated (and thus the constraint
163
is usable) and false if it cannot.</p>
165
<p>The optimizer automatically inverts terms of the form "expr OP column"
166
and makes other simplifications to the WHERE clause in an attempt to
167
get as many WHERE clause terms into the form shown above as possible.
168
The aConstraint[] array only reports WHERE clause terms that are
169
relevant to the particular virtual table being queried.</p>
171
<p>Information about the ORDER BY clause is stored in aOrderBy[].
172
Each term of aOrderBy records a column of the ORDER BY clause.</p>
174
<p>The <a href="../vtab.html#xbestindex">xBestIndex</a> method must fill aConstraintUsage[] with information
175
about what parameters to pass to xFilter. If argvIndex>0 then
176
the right-hand side of the corresponding aConstraint[] is evaluated
177
and becomes the argvIndex-th entry in argv. If aConstraintUsage[].omit
178
is true, then the constraint is assumed to be fully handled by the
179
virtual table and is not checked again by SQLite.</p>
181
<p>The idxNum and idxPtr values are recorded and passed into the
182
<a href="../vtab.html#xfilter">xFilter</a> method.
183
<a href="../c3ref/free.html">sqlite3_free()</a> is used to free idxPtr if and only if
184
needToFreeIdxPtr is true.</p>
186
<p>The orderByConsumed means that output from <a href="../vtab.html#xfilter">xFilter</a>/<a href="../vtab.html#xnext">xNext</a> will occur in
187
the correct order to satisfy the ORDER BY clause so that no separate
188
sorting step is required.</p>
190
<p>The estimatedCost value is an estimate of the cost of doing the
191
particular lookup. A full scan of a table with N entries should have
192
a cost of N. A binary search of a table of N entries should have a
193
cost of approximately log(N).
194
</p><p>See also lists of
195
<a href="objlist.html">Objects</a>,
196
<a href="constlist.html">Constants</a>, and
197
<a href="funclist.html">Functions</a>.</p>