Earlier today I posted a question about SQLite compiled into my application generating a "database disk image is corrupted" on a particular query, but the command-line application does not (even using the same database file). I haven't seen that message posted yet, but I have some additional information that may help in understanding the problem.

The query that's running is essentially this: (table names obfuscated since this is from an unannounced product)

    SELECT foo.rowid FROM foo WHERE foo.x == ?;

When run from the command-line application (either version 3.1.3 or 3.2.8), this query runs without error.

sqlite> SELECT foo.rowid FROM foo WHERE foo.x == 25;
61    // expected result

sqlite> explain SELECT foo.rowid FROM foo WHERE foo.x == ?;
0|Goto|0|20|
1|Integer|0|0|
2|OpenRead|1|117|keyinfo(1,BINARY)
3|SetNumColumns|1|2|
4|Variable|1|0|
5|NotNull|-1|8|
6|Pop|1|0|
7|Goto|0|18|
8|MakeRecord|1|0|o
9|MemStore|0|0|
10|MoveGe|1|18|
11|MemLoad|0|0|
12|IdxGE|1|18|+
13|RowKey|1|0|
14|IdxIsNull|1|17|
15|IdxRowid|1|0|
16|Callback|1|0|
17|Next|1|11|
18|Close|1|0|
19|Halt|0|0|
20|Transaction|0|0|
21|VerifyCookie|0|181|
22|Goto|0|1|
23|Noop|0|0|


When run from inside our application (using version 3.2.7 -- sorry, haven't upgraded yet), however, we get different VDBE instructions:

2005-12-22 15:30:33.478 Got error: database disk image is malformed
 Statement: SELECT foo.rowid FROM foo WHERE foo.x == ?;

addr | opcode | p1 | p2 | p3 -------------------------------------------------------------------------- 0 | Goto | 0 | 20 | 1 | Integer | 0 | 0 | # (index for value x on table foo) 2 | OpenRead | 1 | 100 | keyinfo(1,BINARY) 3 | SetNumColumns | 1 | 2 | 4 | Variable | 1 | 0 | 5 | NotNull | -1 | 8 | 6 | Pop | 1 | 0 | 7 | Goto | 0 | 18 | 8 | MakeRecord | 1 | 0 | o 9 | MemStore | 0 | 0 | 10 | MoveGe | 1 | 18 | 11 | MemLoad | 0 | 0 | 12 | IdxGE | 1 | 18 | + 13 | RowKey | 1 | 0 | 14 | IdxIsNull | 1 | 17 | 15 | IdxRowid | 1 | 0 | 16 | Callback | 1 | 0 | 17 | Next | 1 | 11 | 18 | Close | 1 | 0 | 19 | Halt | 0 | 0 | 20 | Transaction | 0 | 0 | 21 | VerifyCookie | 0 | 199 | 22 | Goto | 0 | 1 | 23 | Noop | 0 | 0 |

For the record, our application and the SQLite command-line application have been pointed to exactly the same database file. No other changes have been made to the file, so they should be expected to behave identically. But they don't. At address 2, the P2 parameter (which should be the root page # for the index of field "x" on table "foo") is 100 in the embedded case and 117 in the command-line case. When I inspect the sqlite_master table, it is obvious that 117 is the correct answer. Page 100 is the root page of an unrelated table (not an index).

Has anyone seen anything like this before, and if so, can you help us understand what would cause SQLite to generate this incorrect VDBE?

-Eric

--
Eric Scouten | [EMAIL PROTECTED] | Photography: www.ericscouten.com

Reply via email to