I ran gdb to find out more, and here's how sqlite3_declare_vtab()
exits:

102133    if( !db->pVtabCtx || !(pTab = db->pVtabCtx->pTab) ){
(gdb) n
102134      sqlite3Error(db, SQLITE_MISUSE, 0);
(gdb) print db->pVtabCtx
$1 = (VtabCtx *) 0x0

To explain further what I'm doing: My virtual table basically takes a
number of tables as arguments and creates a new table like a natural
join of the input tables, except that where a natural join would
create NULL values, the virtual table will create interpolated
values.  The module does a number of other things as well, but I don't
think that's relevant here.  So I can do:

create virtual table v1 using interpolate(tab1, tab2, tab3);

But then this will fail:

create virtual table v2 using interpolate(v1, tab4);

When I run in gdb, I see that pVtabCtx is nonzero in xCreate for v2
until it runs sqlite3_prepare_v2() with a statement which selects from
v1 (causing xCreate to be called for v1).  After sqlite3_prepare_v2()
returns, pVtabCtx is 0.

Is this a bug, or is it intentional (possibly for a good reason)?

My xCreate function needs to run queries on the input tables to find
the column names needed for the vtab declaration.

-Steinar

Steinar Midtskogen <stei...@latinitas.org> writes:

> Hello,
>
> In certain cases when I try to create a virtual table,
> sqlite3_declare_vtab() returns SQLITE_MISUSE.  Nothing appears to be
> wrong with the string I pass to the sqlite3_declare_vtab().  That is,
> if I execute the "create table" statement in that string, a regular
> table will be created - no error.
>
> Is there a way to get more hints why sqlite3_declare_vtab() fails?
>
> The only thing special when it fails is that xCreate, before the call
> to sqlite3_declare_vtab, has (successfully) run and finished
> statements (prepare/step/finalize) which involve a virtual table using
> the very same module.  Is it forbidden to nest virtual tables this
> way?  That is, having xCreate trigger a call to itself (using
> different arguments).  I'm pretty sure that I don't use non-const
> static variables which could mess up things.  Perhaps sqlite3 does?
>
> -- 
> Steinar
> _______________________________________________
> sqlite-users mailing list
> sqlite-users@sqlite.org
> http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users
_______________________________________________
sqlite-users mailing list
sqlite-users@sqlite.org
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to