Dennis Cote wrote:

Noel Frankinet wrote:

Lawrence Chitty wrote:

You may be able to do this using the 'explain' statement

for example, I have a view called 'myview'. Wrapping this into an sql select statement and proceeding this with explain e.g.

> explain select null from myview

gives a result set with the following:-

addr    opcode    p1    p2    p3
0    ColumnName    0    0    null
1    ColumnName    1    0    TEXT
2    Integer    0    0    <NULL>
3    OpenRead    1    228    mytable1
4    VerifyCookie    0    3016    <NULL>
5    Integer    0    0    <NULL>
6    OpenRead    2    17    mytable2
7    Rewind    1    13    <NULL>
8    Rewind    2    12    <NULL>
9    String    0    0    <NULL>
10    Callback    1    0    <NULL>
11    Next    2    9    <NULL>
12    Next    1    8    <NULL>
13    Close    1    0    <NULL>
14    Close    2    0    <NULL>
15    NullCallback    1    0    <NULL>
16    Halt    0    0    <NULL>

All you need to do now is search through the result set for any opcode that is OpenRead, and the table name is in the p3 (last) column. As you can see, myview consists of mytable1 and mytable2

Thank you that's what I was looking for.

Noel and Lawrence,

You should note that this will only work if your sqlite library is compiled without NDEBUG defined (i.e. only in a debug build). In debug builds, the table names in the explain output are generated by taking the root page number that is actually stored in the compiled VM and looking up the corresponding table name in the sqlite_master table. Production builds (which are substantially faster) don't do this, they simply display the root page number.

You can of course do the lookup in the sqlite_master table yourself, but I don't know if there is a good way to tell if you are using a debug or production build. You can't simply check if the table name is numeric because someone could create a table with a numeric name. Some of the pragmas, like parser_trace, don't work in production builds, but don't generate any errors either.

If anyone knows how to tell if the sqlite library was built with NDEBUG defined, this could be made to work well enough.

From what you explain above, would the following approach work to see if NDEBUG defined.

> explain select null from sqlite_master.
Now look for the OpenRead and see if p3 is a number (NDEBUG not defined) or 'sqlite_master' (NDEBUG defined). This is one table we always know is always going to be present.

I only use the Windoze prebuilt tclsqlite.dll, which would appear to have NDEBUG defined, so I can't really check this out any further.

Regards

Lawrence

Reply via email to