234 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
			
		
		
	
	
			234 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
| <!DOCTYPE html>
 | |
| <html><head>
 | |
| <meta name="viewport" content="width=device-width, initial-scale=1.0">
 | |
| <meta http-equiv="content-type" content="text/html; charset=UTF-8">
 | |
| <link href="../sqlite.css" rel="stylesheet">
 | |
| <title>Virtual Table Indexing Information</title>
 | |
| <!-- path=../ -->
 | |
| </head>
 | |
| <body>
 | |
| <div class=nosearch>
 | |
| <a href="../index.html">
 | |
| <img class="logo" src="../images/sqlite370_banner.gif" alt="SQLite" border="0">
 | |
| </a>
 | |
| <div><!-- IE hack to prevent disappearing logo --></div>
 | |
| <div class="tagline desktoponly">
 | |
| Small. Fast. Reliable.<br>Choose any three.
 | |
| </div>
 | |
| <div class="menu mainmenu">
 | |
| <ul>
 | |
| <li><a href="../index.html">Home</a>
 | |
| <li class='mobileonly'><a href="javascript:void(0)" onclick='toggle_div("submenu")'>Menu</a>
 | |
| <li class='wideonly'><a href='../about.html'>About</a>
 | |
| <li class='desktoponly'><a href="../docs.html">Documentation</a>
 | |
| <li class='desktoponly'><a href="../download.html">Download</a>
 | |
| <li class='wideonly'><a href='../copyright.html'>License</a>
 | |
| <li class='desktoponly'><a href="../support.html">Support</a>
 | |
| <li class='desktoponly'><a href="../prosupport.html">Purchase</a>
 | |
| <li class='search' id='search_menubutton'>
 | |
| <a href="javascript:void(0)" onclick='toggle_search()'>Search</a>
 | |
| </ul>
 | |
| </div>
 | |
| <div class="menu submenu" id="submenu">
 | |
| <ul>
 | |
| <li><a href='../about.html'>About</a>
 | |
| <li><a href='../docs.html'>Documentation</a>
 | |
| <li><a href='../download.html'>Download</a>
 | |
| <li><a href='../support.html'>Support</a>
 | |
| <li><a href='../prosupport.html'>Purchase</a>
 | |
| </ul>
 | |
| </div>
 | |
| <div class="searchmenu" id="searchmenu">
 | |
| <form method="GET" action="../search">
 | |
| <select name="s" id="searchtype">
 | |
| <option value="d">Search Documentation</option>
 | |
| <option value="c">Search Changelog</option>
 | |
| </select>
 | |
| <input type="text" name="q" id="searchbox" value="">
 | |
| <input type="submit" value="Go">
 | |
| </form>
 | |
| </div>
 | |
| </div>
 | |
| <script>
 | |
| function toggle_div(nm) {
 | |
| var w = document.getElementById(nm);
 | |
| if( w.style.display=="block" ){
 | |
| w.style.display = "none";
 | |
| }else{
 | |
| w.style.display = "block";
 | |
| }
 | |
| }
 | |
| function toggle_search() {
 | |
| var w = document.getElementById("searchmenu");
 | |
| if( w.style.display=="block" ){
 | |
| w.style.display = "none";
 | |
| } else {
 | |
| w.style.display = "block";
 | |
| setTimeout(function(){
 | |
| document.getElementById("searchbox").focus()
 | |
| }, 30);
 | |
| }
 | |
| }
 | |
| function div_off(nm){document.getElementById(nm).style.display="none";}
 | |
| window.onbeforeunload = function(e){div_off("submenu");}
 | |
| /* Disable the Search feature if we are not operating from CGI, since */
 | |
| /* Search is accomplished using CGI and will not work without it. */
 | |
| if( !location.origin || !location.origin.match || !location.origin.match(/http/) ){
 | |
| document.getElementById("search_menubutton").style.display = "none";
 | |
| }
 | |
| /* Used by the Hide/Show button beside syntax diagrams, to toggle the */
 | |
| function hideorshow(btn,obj){
 | |
| var x = document.getElementById(obj);
 | |
| var b = document.getElementById(btn);
 | |
| if( x.style.display!='none' ){
 | |
| x.style.display = 'none';
 | |
| b.innerHTML='show';
 | |
| }else{
 | |
| x.style.display = '';
 | |
| b.innerHTML='hide';
 | |
| }
 | |
| return false;
 | |
| }
 | |
| </script>
 | |
| </div>
 | |
| <!-- keywords: sqlite3_index_info -->
 | |
| <div class=nosearch>
 | |
| <a href="intro.html"><h2>SQLite C Interface</h2></a>
 | |
| <h2>Virtual Table Indexing Information</h2>
 | |
| </div>
 | |
| <blockquote><pre>
 | |
| struct sqlite3_index_info {
 | |
|   /* Inputs */
 | |
|   int nConstraint;           /* Number of entries in aConstraint */
 | |
|   struct sqlite3_index_constraint {
 | |
|      int iColumn;              /* Column constrained.  -1 for ROWID */
 | |
|      unsigned char op;         /* Constraint operator */
 | |
|      unsigned char usable;     /* True if this constraint is usable */
 | |
|      int iTermOffset;          /* Used internally - xBestIndex should ignore */
 | |
|   } *aConstraint;            /* Table of WHERE clause constraints */
 | |
|   int nOrderBy;              /* Number of terms in the ORDER BY clause */
 | |
|   struct sqlite3_index_orderby {
 | |
|      int iColumn;              /* Column number */
 | |
|      unsigned char desc;       /* True for DESC.  False for ASC. */
 | |
|   } *aOrderBy;               /* The ORDER BY clause */
 | |
|   /* Outputs */
 | |
|   struct sqlite3_index_constraint_usage {
 | |
|     int argvIndex;           /* if >0, constraint is part of argv to xFilter */
 | |
|     unsigned char omit;      /* Do not code a test for this constraint */
 | |
|   } *aConstraintUsage;
 | |
|   int idxNum;                /* Number used to identify the index */
 | |
|   char *idxStr;              /* String, possibly obtained from sqlite3_malloc */
 | |
|   int needToFreeIdxStr;      /* Free idxStr using sqlite3_free() if true */
 | |
|   int orderByConsumed;       /* True if output is already ordered */
 | |
|   double estimatedCost;           /* Estimated cost of using this index */
 | |
|   /* Fields below are only available in SQLite 3.8.2 and later */
 | |
|   sqlite3_int64 estimatedRows;    /* Estimated number of rows returned */
 | |
|   /* Fields below are only available in SQLite 3.9.0 and later */
 | |
|   int idxFlags;              /* Mask of SQLITE_INDEX_SCAN_* flags */
 | |
|   /* Fields below are only available in SQLite 3.10.0 and later */
 | |
|   sqlite3_uint64 colUsed;    /* Input: Mask of columns used by statement */
 | |
| };
 | |
| </pre></blockquote>
 | |
| <p>
 | |
| The sqlite3_index_info structure and its substructures is used as part
 | |
| of the <a href="../vtab.html">virtual table</a> interface to
 | |
| pass information into and receive the reply from the <a href="../vtab.html#xbestindex">xBestIndex</a>
 | |
| method of a <a href="../c3ref/module.html">virtual table module</a>.  The fields under **Inputs** are the
 | |
| inputs to xBestIndex and are read-only.  xBestIndex inserts its
 | |
| results into the **Outputs** fields.</p>
 | |
| 
 | |
| <p>The aConstraint[] array records WHERE clause constraints of the form:</p>
 | |
| 
 | |
| <p><blockquote>column OP expr</blockquote></p>
 | |
| 
 | |
| <p>where OP is =, <, <=, >, or >=.  The particular operator is
 | |
| stored in aConstraint[].op using one of the
 | |
| <a href="../c3ref/c_index_constraint_eq.html">SQLITE_INDEX_CONSTRAINT_ values</a>.
 | |
| The index of the column is stored in
 | |
| aConstraint[].iColumn.  aConstraint[].usable is TRUE if the
 | |
| expr on the right-hand side can be evaluated (and thus the constraint
 | |
| is usable) and false if it cannot.</p>
 | |
| 
 | |
| <p>The optimizer automatically inverts terms of the form "expr OP column"
 | |
| and makes other simplifications to the WHERE clause in an attempt to
 | |
| get as many WHERE clause terms into the form shown above as possible.
 | |
| The aConstraint[] array only reports WHERE clause terms that are
 | |
| relevant to the particular virtual table being queried.</p>
 | |
| 
 | |
| <p>Information about the ORDER BY clause is stored in aOrderBy[].
 | |
| Each term of aOrderBy records a column of the ORDER BY clause.</p>
 | |
| 
 | |
| <p>The colUsed field indicates which columns of the virtual table may be
 | |
| required by the current scan. Virtual table columns are numbered from
 | |
| zero in the order in which they appear within the CREATE TABLE statement
 | |
| passed to sqlite3_declare_vtab(). For the first 63 columns (columns 0-62),
 | |
| the corresponding bit is set within the colUsed mask if the column may be
 | |
| required by SQLite. If the table has at least 64 columns and any column
 | |
| to the right of the first 63 is required, then bit 63 of colUsed is also
 | |
| set. In other words, column iCol may be required if the expression
 | |
| (colUsed & ((sqlite3_uint64)1 << (iCol>=63 ? 63 : iCol))) evaluates to
 | |
| non-zero.</p>
 | |
| 
 | |
| <p>The <a href="../vtab.html#xbestindex">xBestIndex</a> method must fill aConstraintUsage[] with information
 | |
| about what parameters to pass to xFilter.  If argvIndex>0 then
 | |
| the right-hand side of the corresponding aConstraint[] is evaluated
 | |
| and becomes the argvIndex-th entry in argv.  If aConstraintUsage[].omit
 | |
| is true, then the constraint is assumed to be fully handled by the
 | |
| virtual table and might not be checked again by the byte code. The
 | |
| aConstraintUsage[].omit flag is an optimization hint. When the omit flag
 | |
| is left in its default setting of false, the constraint will always be
 | |
| checked separately in byte code.  If the omit flag is change to true, then
 | |
| the constraint may or may not be checked in byte code.  In other words,
 | |
| when the omit flag is true there is no guarantee that the constraint will
 | |
| not be checked again using byte code.</p>
 | |
| 
 | |
| <p>The idxNum and idxPtr values are recorded and passed into the
 | |
| <a href="../vtab.html#xfilter">xFilter</a> method.
 | |
| <a href="../c3ref/free.html">sqlite3_free()</a> is used to free idxPtr if and only if
 | |
| needToFreeIdxPtr is true.</p>
 | |
| 
 | |
| <p>The orderByConsumed means that output from <a href="../vtab.html#xfilter">xFilter</a>/<a href="../vtab.html#xnext">xNext</a> will occur in
 | |
| the correct order to satisfy the ORDER BY clause so that no separate
 | |
| sorting step is required.</p>
 | |
| 
 | |
| <p>The estimatedCost value is an estimate of the cost of a particular
 | |
| strategy. A cost of N indicates that the cost of the strategy is similar
 | |
| to a linear scan of an SQLite table with N rows. A cost of log(N)
 | |
| indicates that the expense of the operation is similar to that of a
 | |
| binary search on a unique indexed field of an SQLite table with N rows.</p>
 | |
| 
 | |
| <p>The estimatedRows value is an estimate of the number of rows that
 | |
| will be returned by the strategy.</p>
 | |
| 
 | |
| <p>The xBestIndex method may optionally populate the idxFlags field with a
 | |
| mask of SQLITE_INDEX_SCAN_* flags. Currently there is only one such flag -
 | |
| SQLITE_INDEX_SCAN_UNIQUE. If the xBestIndex method sets this flag, SQLite
 | |
| assumes that the strategy may visit at most one row.</p>
 | |
| 
 | |
| <p>Additionally, if xBestIndex sets the SQLITE_INDEX_SCAN_UNIQUE flag, then
 | |
| SQLite also assumes that if a call to the xUpdate() method is made as
 | |
| part of the same statement to delete or update a virtual table row and the
 | |
| implementation returns SQLITE_CONSTRAINT, then there is no need to rollback
 | |
| any database changes. In other words, if the xUpdate() returns
 | |
| SQLITE_CONSTRAINT, the database contents must be exactly as they were
 | |
| before xUpdate was called. By contrast, if SQLITE_INDEX_SCAN_UNIQUE is not
 | |
| set and xUpdate returns SQLITE_CONSTRAINT, any database changes made by
 | |
| the xUpdate method are automatically rolled back by SQLite.</p>
 | |
| 
 | |
| <p>IMPORTANT: The estimatedRows field was added to the sqlite3_index_info
 | |
| structure for SQLite <a href="../releaselog/3_8_2.html">version 3.8.2</a> (2013-12-06).
 | |
| If a virtual table extension is
 | |
| used with an SQLite version earlier than 3.8.2, the results of attempting
 | |
| to read or write the estimatedRows field are undefined (but are likely
 | |
| to include crashing the application). The estimatedRows field should
 | |
| therefore only be used if <a href="../c3ref/libversion.html">sqlite3_libversion_number()</a> returns a
 | |
| value greater than or equal to 3008002. Similarly, the idxFlags field
 | |
| was added for <a href="../releaselog/3_9_0.html">version 3.9.0</a> (2015-10-14).
 | |
| It may therefore only be used if
 | |
| sqlite3_libversion_number() returns a value greater than or equal to
 | |
| 3009000.
 | |
| </p><p>See also lists of
 | |
|   <a href="objlist.html">Objects</a>,
 | |
|   <a href="constlist.html">Constants</a>, and
 | |
|   <a href="funclist.html">Functions</a>.</p>
 |