Dennis Cote <[EMAIL PROTECTED]> wrote:
> Ok, I think I'm starting to follow this now. SQLite will scan the index 
> definitions in the sqlite3_vtab, and find the index on the PATTERN 
> column.

Well, not exactly.  But you have the right idea.

> Then it will call the xOpenCursor function to get the index 
> cursor returned  through the second argument. Then it will call the 
> xSeek function, passing back this cursor and the search string as the 
> third argument (but I'm still not sure what the second and third 
> arguments do).

int (*xSeek)(sqlite3_vtab_cursor*, int nArg, sqlite3_value **apArg,
             int *pResult);

nArg is the number of significant terms in the index that are
being used.  This is always 1 unless you are dealing with a
multi-column index.  There are no multi-column indices in the
proposed full-text search implementation so this is always 1.
The nArg parameter is there because I am trying to make the
virtual table interface as generic as possible.

pResult returns -1, 0, or +1 depending on whether or not the
seek ended up on a record that was less than, equal to, or
greater than the search key.  This provides full generality
of the virtual-table mechanism.  In the full-text search
implementation, the result would be 0 if there are 1 or more
matches and +1 if no documents match.


> 
> The xSeek implementation will parse the search string and do the actual 
> lookup in the real full text index. It will then update the cursor to 
> "point" to the first record. 
> 
> Then Sqlite will repeated call xNext to get a pointer to the next 
> matching record.
> 
> You say the sqlite3_vtab_cursor structure is opaque, but it seems to me 
> that the virrtual table implementation functions will need no know about 
> its internals to update it.

The sqlite3_vtab_cursor structure will be opaque to the
SQLite core.  Each virtual table object implementation
will define its own sqlite3_vtab_cursor structure that
is appropriate for whatever it is trying to accomplish.
(Actually, each implementation will define a structure 
with a different name and just cast pointers to and from
sqlite3_vtab_cursor pointers on input and output.)

> 
> For each record that is located SQLite will call the xColumn function 
> one or more times to get the data for the selected columns (so that it 
> can be returned from the SQL query). I don't see a general 
> sqlite3_value* argument to this function for the returned value, but I'm 
> not sure what the sqlite3_context argument is for.

The xColumn() implementation will use sqlite3_result_XXX()
calls to return the value of the column, just like user-defined
functions do.  sqlite3_result_XXX() requires the sqlite3_context 
pointer.

--
D. Richard Hipp   <[EMAIL PROTECTED]>

Reply via email to