Re: [sqlite] How to interleave calls to sqlite3_prepare_v2 and sqlite3_step?

2007-02-28 Thread Dan Kennedy
On Thu, 2007-03-01 at 05:35 +0100, daan wrote:
> I'm compiling a SQL statement (consisting of multiple statements separated
> by semicolons) using sqlite3_prepare_v2 into a series of sqlite3_stmt
> pointers, later to be executed with sqlite3_step().
> 
> A statement such as:
> 
>   DROP TABLE IF EXISTS test;
>   CREATE TABLE test (id INTEGER, name TEXT);
> 
> is compiled into two sqlite3_stmt pointers that are subsequently fed
> through sqlite3_step(): this works fine. That is, the first time I run the
> program (and the database didn't exist upon program start). When I run the
> program the 2nd time (and the database indeed exists upon program start)
> the prepare_v2 bails out with ERROR and error 'table test already exists'.
> 
> When the statement above is fed through sqlite3_exec() the error does not
> occur. When I had a look at the sqlite3_exec code it struck me that it
> interleaves the calls to prepare/step/reset in a different way:
> 
>   prepare/step/reset prepare/step/reset
> 
> whereas I am trying to
> 
>   prepare/prepare step/step reset/reset
> 
> When I change my code to a similar interleaving scheme as sqlite3_exec I
> dont have any problems.
> 
> My question is: is it indeed required to interleave the calls to
> sqlite3_prepare_v2 and sqlite3_step in a similar way as sqlite3_exec does,
> or should it be possible to fully precompile a series of statements which
> then later can be executed?

When you compile a statement, it is compiled against the current
database schema. In the second run it tried to compile 
"CREATE TABLE test" against a schema that already contained the table
"test". Hence the error message.

Precompiling a series of statements to be executed later will be fine,
provided you are not modifying the database schema.

Dan.



-
To unsubscribe, send email to [EMAIL PROTECTED]
-



[sqlite] How to interleave calls to sqlite3_prepare_v2 and sqlite3_step?

2007-02-28 Thread daan

I'm compiling a SQL statement (consisting of multiple statements separated
by semicolons) using sqlite3_prepare_v2 into a series of sqlite3_stmt
pointers, later to be executed with sqlite3_step().

A statement such as:

 DROP TABLE IF EXISTS test;
 CREATE TABLE test (id INTEGER, name TEXT);

is compiled into two sqlite3_stmt pointers that are subsequently fed
through sqlite3_step(): this works fine. That is, the first time I run the
program (and the database didn't exist upon program start). When I run the
program the 2nd time (and the database indeed exists upon program start)
the prepare_v2 bails out with ERROR and error 'table test already exists'.

When the statement above is fed through sqlite3_exec() the error does not
occur. When I had a look at the sqlite3_exec code it struck me that it
interleaves the calls to prepare/step/reset in a different way:

 prepare/step/reset prepare/step/reset

whereas I am trying to

 prepare/prepare step/step reset/reset

When I change my code to a similar interleaving scheme as sqlite3_exec I
dont have any problems.

My question is: is it indeed required to interleave the calls to
sqlite3_prepare_v2 and sqlite3_step in a similar way as sqlite3_exec does,
or should it be possible to fully precompile a series of statements which
then later can be executed?

-
To unsubscribe, send email to [EMAIL PROTECTED]
-