RE: [sqlite] Binding a column name?

2005-07-11 Thread Brown, Dave
Wait - what if AUTOVACUUM is set on the database, and I'm the only one doing
inserts/deletes? Will I still need to sqlite3_prepare() my statements again
if auto-vacuum is on?

-Dave 

-Original Message-
From: D. Richard Hipp [mailto:[EMAIL PROTECTED] 
Sent: Sunday, July 10, 2005 4:12 AM
To: sqlite-users@sqlite.org
Subject: RE: [sqlite] Binding a column name?

On Sun, 2005-07-10 at 00:23 -0700, Brown, Dave wrote:
 That is what I do. But that also means I have to call sqlite_prepare() 
 each time, instead of just once. I was originally hoping I could 
 prepare() once and just bind.
 

If another thread or process VACUUMs the database or creates a new table or
makes any other structure changes to the database file, all of your prepared
statements will be invalided and you will have to rerun sqlite3_prepare().
Since you generally have no control over when another process might VACUUM
the database, you should always be prepared to rerun sqlite3_prepare() if
necessary.  This is true even if you are only running your SQL statement
once and then finalizing it because another process might VACUUM and
invalidate your statement in the very brief window of time between your
calls to sqlite3_prepare() and sqlite3_step().

Your best bet it to use a wrapper class of some sort that automates the task
of rerunning sqlite3_prepare() when necessary.

--
D. Richard Hipp [EMAIL PROTECTED]



RE: [sqlite] Binding a column name?

2005-07-11 Thread Tim McDaniel


 -Original Message-
 From: D. Richard Hipp [mailto:[EMAIL PROTECTED] 
 Sent: Sunday, July 10, 2005 6:01 PM
 To: sqlite-users@sqlite.org
 Subject: RE: [sqlite] Binding a column name?
 
 On Sun, 2005-07-10 at 15:34 -0700, Tim McDaniel wrote:
   
   If another thread or process VACUUMs the database or 
 creates a new 
   table or makes any other structure changes to the 
 database file, all 
   of your prepared statements will be invalided and you 
 will have to 
   rerun sqlite3_prepare().
   Since you generally have no control over when another 
 process might 
   VACUUM the database, you should always be prepared to rerun 
   sqlite3_prepare() if necessary.  This is true even if you 
 are only 
   running your SQL statement once and then finalizing it because 
   another process might VACUUM and invalidate your statement in the 
   very brief window of time between your calls to sqlite3_prepare() 
   and sqlite3_step().
   
   Your best bet it to use a wrapper class of some sort that 
 automates 
   the task of rerunning sqlite3_prepare() when necessary.
   
  
  Does sqlite store the SQL text passed into sqlite3_prepare?
  If not, then I assume this means that any time we use 
 sqlite3_prepare, 
  we should cache the SQL text in the wrapper in case we need to 
  re-prepare it.
 
 Yes.  The wrapper needs to keep the SQL text because SQLite does not.
 
  Along the same line, I suppose we have to cache all the bound 
  parameters, since they will have to re-bound as well.
 
 You can do that.  Or you can keep the old prepared statement 
 around until after the new one is ready, then use the
 sqlite3_transfer_bindings() API to transfer all your bindings 
 from the old to the new, then finalize the old.
 
  
  Is it possible to get the SQLITE_SCHEMA error after the first 
  sqlite3_step call, while iterating throw the rows?
  
 
 No.  SQLITE_SCHEMA will always appear immediately or not at all.
 --

Is there any advantage to using sqlite3_expired() vs just
sqlite3_step(), since you have to check for SQLITE_SCHEMA anyway?


RE: [sqlite] Binding a column name?

2005-07-11 Thread D. Richard Hipp
On Mon, 2005-07-11 at 10:32 -0700, Brown, Dave wrote:
 Wait - what if AUTOVACUUM is set on the database, and I'm the only one doing
 inserts/deletes? Will I still need to sqlite3_prepare() my statements again
 if auto-vacuum is on?
 

AUTOVACUUM does *not* invalidate prepared statements - ever.
-- 
D. Richard Hipp [EMAIL PROTECTED]



RE: [sqlite] Binding a column name?

2005-07-10 Thread Dan Kennedy

 Actually I doubt it can - since without the column name it can't create the
 prepared statement byte code, right?

Right. It can't be done.


 
 Is it possible for a bind variable to be a column name? I'd like to make a
 query which is:
 
 select column_name from MyTable;
 
 and I'd like the column_name to be a bind variable. This doesn't work using
 the straight sqlite3_bind_text() call on the statement select ? from
 MyTable;, which treats the column name as text and not part of the compiled
 statement.
 
 -Dave
 
 





Sell on Yahoo! Auctions – no fees. Bid on great items.  
http://auctions.yahoo.com/


Re: [sqlite] Binding a column name?

2005-07-10 Thread Eugene Wee

Hi,

Why not construct the SQL statement dynamically in the C/C++ code? That way your 
statement(s) would have variable column names before compilation.


Eugene Wee

Brown, Dave wrote:

Actually I doubt it can - since without the column name it can't create the
prepared statement byte code, right?

-Dave 


-Original Message-
From: Brown, Dave [mailto:[EMAIL PROTECTED] 
Sent: Saturday, July 09, 2005 8:46 PM

To: sqlite-users@sqlite.org
Subject: [sqlite] Binding a column name?


Is it possible for a bind variable to be a column name? I'd like to make a
query which is:

select column_name from MyTable;

and I'd like the column_name to be a bind variable. This doesn't work using
the straight sqlite3_bind_text() call on the statement select ? from
MyTable;, which treats the column name as text and not part of the compiled
statement.

-Dave







RE: [sqlite] Binding a column name?

2005-07-10 Thread Brown, Dave
That is what I do. But that also means I have to call sqlite_prepare() each
time, instead of just once. I was originally hoping I could prepare() once
and just bind.

-Dave 

-Original Message-
From: Eugene Wee [mailto:[EMAIL PROTECTED] 
Sent: Sunday, July 10, 2005 12:18 AM
To: sqlite-users@sqlite.org
Subject: Re: [sqlite] Binding a column name?

Hi,

Why not construct the SQL statement dynamically in the C/C++ code? That way
your
statement(s) would have variable column names before compilation.

Eugene Wee

Brown, Dave wrote:
 Actually I doubt it can - since without the column name it can't 
 create the prepared statement byte code, right?
 
 -Dave
 
 -Original Message-
 From: Brown, Dave [mailto:[EMAIL PROTECTED]
 Sent: Saturday, July 09, 2005 8:46 PM
 To: sqlite-users@sqlite.org
 Subject: [sqlite] Binding a column name?
 
 
 Is it possible for a bind variable to be a column name? I'd like to 
 make a query which is:
 
 select column_name from MyTable;
 
 and I'd like the column_name to be a bind variable. This doesn't work 
 using the straight sqlite3_bind_text() call on the statement select ? 
 from MyTable;, which treats the column name as text and not part of 
 the compiled statement.
 
 -Dave
 
 




RE: [sqlite] Binding a column name?

2005-07-10 Thread D. Richard Hipp
On Sun, 2005-07-10 at 00:23 -0700, Brown, Dave wrote:
 That is what I do. But that also means I have to call sqlite_prepare() each
 time, instead of just once. I was originally hoping I could prepare() once
 and just bind.
 

If another thread or process VACUUMs the database or creates a
new table or makes any other structure changes to the database
file, all of your prepared statements will be invalided and you
will have to rerun sqlite3_prepare().  Since you generally have
no control over when another process might VACUUM the database,
you should always be prepared to rerun sqlite3_prepare() if
necessary.  This is true even if you are only running your SQL
statement once and then finalizing it because another process
might VACUUM and invalidate your statement in the very brief
window of time between your calls to sqlite3_prepare() and
sqlite3_step().

Your best bet it to use a wrapper class of some sort that
automates the task of rerunning sqlite3_prepare() when necessary.

-- 
D. Richard Hipp [EMAIL PROTECTED]



RE: [sqlite] Binding a column name?

2005-07-10 Thread Brown, Dave
Yes, actually I'm doing that already. Thanks!

-Dave 

-Original Message-
From: D. Richard Hipp [mailto:[EMAIL PROTECTED] 
Sent: Sunday, July 10, 2005 4:12 AM
To: sqlite-users@sqlite.org
Subject: RE: [sqlite] Binding a column name?

On Sun, 2005-07-10 at 00:23 -0700, Brown, Dave wrote:
 That is what I do. But that also means I have to call sqlite_prepare() 
 each time, instead of just once. I was originally hoping I could 
 prepare() once and just bind.
 

If another thread or process VACUUMs the database or creates a new table or
makes any other structure changes to the database file, all of your prepared
statements will be invalided and you will have to rerun sqlite3_prepare().
Since you generally have no control over when another process might VACUUM
the database, you should always be prepared to rerun sqlite3_prepare() if
necessary.  This is true even if you are only running your SQL statement
once and then finalizing it because another process might VACUUM and
invalidate your statement in the very brief window of time between your
calls to sqlite3_prepare() and sqlite3_step().

Your best bet it to use a wrapper class of some sort that automates the task
of rerunning sqlite3_prepare() when necessary.

--
D. Richard Hipp [EMAIL PROTECTED]



RE: [sqlite] Binding a column name?

2005-07-10 Thread Tim McDaniel
 -Original Message-
 From: D. Richard Hipp [mailto:[EMAIL PROTECTED] 
 Sent: Sunday, July 10, 2005 6:12 AM
 To: sqlite-users@sqlite.org
 Subject: RE: [sqlite] Binding a column name?
 
 On Sun, 2005-07-10 at 00:23 -0700, Brown, Dave wrote:
  That is what I do. But that also means I have to call 
 sqlite_prepare() 
  each time, instead of just once. I was originally hoping I could 
  prepare() once and just bind.
  
 
 If another thread or process VACUUMs the database or creates 
 a new table or makes any other structure changes to the 
 database file, all of your prepared statements will be 
 invalided and you will have to rerun sqlite3_prepare().  
 Since you generally have no control over when another process 
 might VACUUM the database, you should always be prepared to 
 rerun sqlite3_prepare() if necessary.  This is true even if 
 you are only running your SQL statement once and then 
 finalizing it because another process might VACUUM and 
 invalidate your statement in the very brief window of time 
 between your calls to sqlite3_prepare() and sqlite3_step().
 
 Your best bet it to use a wrapper class of some sort that 
 automates the task of rerunning sqlite3_prepare() when necessary.
 

Does sqlite store the SQL text passed into sqlite3_prepare?
If not, then I assume this means that any time we use sqlite3_prepare,
we should cache the SQL text in the wrapper in case we need to
re-prepare it.
Along the same line, I suppose we have to cache all the bound
parameters, since they will have to re-bound as well.

Is it possible to get the SQLITE_SCHEMA error after the first
sqlite3_step call, while iterating throw the rows?

Tim


RE: [sqlite] Binding a column name?

2005-07-10 Thread D. Richard Hipp
On Sun, 2005-07-10 at 15:34 -0700, Tim McDaniel wrote:
  
  If another thread or process VACUUMs the database or creates 
  a new table or makes any other structure changes to the 
  database file, all of your prepared statements will be 
  invalided and you will have to rerun sqlite3_prepare().  
  Since you generally have no control over when another process 
  might VACUUM the database, you should always be prepared to 
  rerun sqlite3_prepare() if necessary.  This is true even if 
  you are only running your SQL statement once and then 
  finalizing it because another process might VACUUM and 
  invalidate your statement in the very brief window of time 
  between your calls to sqlite3_prepare() and sqlite3_step().
  
  Your best bet it to use a wrapper class of some sort that 
  automates the task of rerunning sqlite3_prepare() when necessary.
  
 
 Does sqlite store the SQL text passed into sqlite3_prepare?
 If not, then I assume this means that any time we use sqlite3_prepare,
 we should cache the SQL text in the wrapper in case we need to
 re-prepare it.

Yes.  The wrapper needs to keep the SQL text because SQLite
does not.

 Along the same line, I suppose we have to cache all the bound
 parameters, since they will have to re-bound as well.

You can do that.  Or you can keep the old prepared statement
around until after the new one is ready, then use the 
sqlite3_transfer_bindings() API to transfer all your bindings
from the old to the new, then finalize the old.

 
 Is it possible to get the SQLITE_SCHEMA error after the first
 sqlite3_step call, while iterating throw the rows?
 

No.  SQLITE_SCHEMA will always appear immediately or not
at all.
-- 
D. Richard Hipp [EMAIL PROTECTED]



RE: [sqlite] Binding a column name?

2005-07-09 Thread Brown, Dave
Actually I doubt it can - since without the column name it can't create the
prepared statement byte code, right?

-Dave 

-Original Message-
From: Brown, Dave [mailto:[EMAIL PROTECTED] 
Sent: Saturday, July 09, 2005 8:46 PM
To: sqlite-users@sqlite.org
Subject: [sqlite] Binding a column name?


Is it possible for a bind variable to be a column name? I'd like to make a
query which is:

select column_name from MyTable;

and I'd like the column_name to be a bind variable. This doesn't work using
the straight sqlite3_bind_text() call on the statement select ? from
MyTable;, which treats the column name as text and not part of the compiled
statement.

-Dave