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

Reply via email to