Oh, now I see, thanks for the explanation. By "next version of lsqlite3" do you mean next major version or next patch release (0.9.2 presumably)? Looking forward to seeing that change.
In the meantime I just stopped relying on stmt:finalize() return code in Lua and instead always use stmt:step() return code. On Wed, Aug 21, 2013 at 7:33 PM, Doug Currie <doug.cur...@gmail.com> wrote: > > I'm unable to reproduce the problem using C. Maybe it is in lsqlite3. > > Yes, lsqlite3 still uses the old sqlite3_prepare() API to maintain > compatibility with some legacy systems. It is long past time that it should > have changed to use sqlite3_prepare_v2(). > > Running Richard's example with sqlite3_prepare_v2 changed to > sqlite3_prepare gives this output: > > first step returns 101 > second step returns 1 > error message = SQL logic error or missing database > finalize returns 19 > > This doesn't match the output of lsqlite3 because the wrapper tries to be > helpful, and when the second step fails, it calls sqlite_reset to get the > error code. The equivalent C code is: > > > #include <stdio.h> > #include "sqlite3.h" > int main(int argc, char **argv){ > sqlite3 *db; > sqlite3_stmt *pStmt; > int rc; > sqlite3_open(":memory:", &db); > sqlite3_exec(db, "create table t(x unique);", 0, 0, 0); > > //sqlite3_prepare_v2(db, "insert into t(x) values(?)", -1, &pStmt, 0); > sqlite3_prepare(db, "insert into t(x) values(?)", -1, &pStmt, 0); > > sqlite3_bind_int(pStmt, 1, 123); > rc = sqlite3_step(pStmt); > printf("first step returns %d\n", rc); > sqlite3_reset(pStmt); > rc = sqlite3_step(pStmt); > printf("second step returns %d\n", rc); > printf("error message = %s\n", sqlite3_errmsg(db)); > > > if (rc == SQLITE_ERROR) > { > rc = sqlite3_reset(pStmt); > printf("second step's reset returns %d\n", rc); > printf("error message = %s\n", sqlite3_errmsg(db)); > } > > rc = sqlite3_finalize(pStmt); > printf("finalize returns %d\n", rc); > sqlite3_close(db); > return 0; > } > > > > That prints > > first step returns 101 > second step returns 1 > error message = SQL logic error or missing database > second step's reset returns 19 > error message = column x is not unique > finalize returns 0 > > which matches the output from the Lua script. > > The next version of lsqlite3 will use the recommended sqlite3_prepare_v2() > API. > > e > > _______________________________________________ > sqlite-users mailing list > sqlite-users@sqlite.org > http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users > -- Dmitry Pashkevich _______________________________________________ sqlite-users mailing list sqlite-users@sqlite.org http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users