> -----Original Message-----
> From: Ran [mailto:[EMAIL PROTECTED] 
> Sent: Tuesday, May 23, 2006 6:38 AM
> To: sqlite-users
> Subject: [sqlite] "SQL logic error or missing database"
>
[snip]
> Here is the script:
[snip]
>   rc = sqlite3_prepare(db1,                // Database handle
>                        "create table bla(a int,b int)",
>                        -1,                 // Length of the statement
>                        &pStmt1,       // OUT: Statement handle
>                        0);                 // OUT: Pointer to 
> unused portion
>                                            // of the statement
> 
>   rc = sqlite3_step(pStmt1);
[snip]
>     rc = sqlite3_prepare(db2,                // Database handle
>                          "create table foo(c int,d int)",
>                          -1,                 // Length of the 
> statement
>                          &pStmt2,            // OUT: Statement handle
>                          0);                 // OUT: Pointer to unused
> portion
>                                              // of the statement
> 
>     rc = sqlite3_step(pStmt2);
[snip]
>   // delete from table bla using the first connection.
>   sqlite3_exec(db1, "begin", 0, 0, 0);
>   rc = sqlite3_prepare(db1,                // Database handle
>                        "delete from bla",
>                        -1,                 // Length of the statement
>                        &pStmt3,       // OUT: Statement handle
>                        0);                 // OUT: Pointer to 
> unused portion
>                                            // of the statement
> 
>   rc = sqlite3_step(pStmt3);
[snip]


I strongly suspect the bug is related to you not checking the return code
from sqlite3_prepare().  I believe during the course of execution one of
those prepares is returning a SQLITE_SCHEMA error, at which point you need
to retry the statement.  Something like this works:

// Try 3 times to prepare the statement
int n = 0;
while (n < 3) {
  rc = sqlite3_prepare(db1,
                       "delete from bla",
                       -1,
                        &pStmt3,
                        0);
  if (rc != SQLITE_SCHEMA) break;
  n ++;
}

if (rc) {
  // blah blah
  exit(1);
}
//


Robert


Reply via email to