> -----Original Message-----
> From: Ran [mailto:[EMAIL PROTECTED] 
> Sent: Tuesday, May 23, 2006 8:37 AM
> To: sqlite-users@sqlite.org
> Subject: Re: [sqlite] "SQL logic error or missing database"
> 
> On 5/23/06, Jay Sprenkle <[EMAIL PROTECTED]> wrote:
> > hmmm...
> > it gives a schema changed because 'delete * from x' 
> actually drops the
> table
> > but I'm not sure why it gave an error since the prepare was 
> done after 
> > the other change was committed...
> > ...
> 
> Thanks for your efforts!
> 
> I am afraid that the delete is not connected to the problem. 
> Also the prepare/step is not. Even the reset/finalize are not 
> connected to it. The script below gives the problem, while 
> all the create statements are run by sqlite3_exec (so no 
> reset/finalize are used there at all). The problem happens 
> only when stepping the select. See the updated script below:

I pasted your code into my Windows environment and ran it.  It completed
successfully with no errors.

> // compile with: gcc -g bug.cpp -lsqlite3 -o bug #include 
> <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sqlite3.h>
> 
> int main(int argc, char** argv) {
>   int rc;
>   sqlite3* db1;
>   sqlite3* db2;
>   sqlite3_stmt *pStmt3;
> 
>   unlink("bug.db"); // for the test, we make sure we have a 
> new database.
> 
>   // create first connection to the database: db1.
>   rc = sqlite3_open("bug.db", &db1);
>   if (rc) {
>     printf("Cannot open database: %s\n", sqlite3_errmsg(db1));
>     exit(1);
>   }
>   printf("Opened the database.\n");
> 
>   // create table bla using the first connection db1, inside 
> a transaction.
>   sqlite3_exec(db1, "begin", 0, 0, 0);
>   rc = sqlite3_exec(db1, "create table bla(c int,d int)", 0, 0, 0);
>   if (rc != SQLITE_OK) { // if we failed, we show it.
>     printf("Failed to exec statement: %s\n", sqlite3_errmsg(db1));
>   }
>   sqlite3_exec(db1, "commit", 0, 0, 0); // here we commit the 
> transaction.
> 
>   // here we, optionally, create another connection to the 
> same database,
>   // and then create other table in a transaction.
>   if (argc > 1) {
>     rc = sqlite3_open("bug.db", &db2); // create the second 
> connection.
>     if (rc) {
>       printf("Cannot open database again: %s\n", sqlite3_errmsg(db2));
>       exit(1);
>     }
>     else {
>       printf("Opened the database.\n");
>     }
> 
>     // create table foo
>     sqlite3_exec(db2, "begin", 0, 0, 0); // start the transaction.
>     rc = sqlite3_exec(db2, "create table foo(c int,d int)", 0, 0, 0);
>     if (rc != SQLITE_OK) { // if we failed, we show it.
>       printf("Failed to exec statement: %s\n", sqlite3_errmsg(db2));
>     }
>     sqlite3_exec(db2, "commit", 0, 0, 0);
>   }
> 
>   // select from table bla using the first connection.
>   sqlite3_exec(db1, "begin", 0, 0, 0);
>   rc = sqlite3_prepare(db1,                // Database handle
>                        "select * from bla",
>                        -1,                 // Length of the statement
>                        &pStmt3,            // OUT: Statement handle
>                        0);                 // OUT: Pointer to 
> unused portion
> 
>                                            // of the statement
>   if (rc != SQLITE_OK) {
>     printf("Failed to prepare statement: %s\n", sqlite3_errmsg(db1));
>   }
>   rc = sqlite3_step(pStmt3);
>   if (rc != SQLITE_DONE) { // if we failed, we log it.
>     printf("Failed to step statement: %s\n", sqlite3_errmsg(db1));
>   }
>   else {
>     printf("deleted all from bla successfully\n");
>   }
>   rc = sqlite3_reset(pStmt3);
>   sqlite3_exec(db1, "commit", 0, 0, 0);
>   rc = sqlite3_finalize(pStmt3);
> }
> 


Reply via email to