On May 2, 2006, at 4:41 PM, Dennis Cote wrote:
Aidan Reel wrote:
if you prepare the following statement
'insert into Table (id, id1) values( ?3, :id ); '
and then use sqlite_bind_parameter on the prepared statement you
will receive the number 4.
I appreciate where that answer is coming from, it takes the
largest unnamed argument and adds the number of named arguments.
I also appreciate that 3 is not got a very good number given it
is the first one.
My question is, how do you find out the number of parameters in a
statement that isn't prone to this.
Aidan,
I'm not sure I understand your question, but if you are trying to
find the total number of parameters then you can use
sqlite3_bind_parameter_count(). If you are trying to find out which
of those parameters are actually referenced by an SQL statement,
This is what I am after, what placeholders are actually in the
statement, sqlite3_bind_parameter_count() returns 4 as its answer, I
need to see 2.
I used regular expressions to pull out the number of ?, :aaa and ?nnn
in a Statement .
Thanks for the following it gives me a step into looking at the vm
which I would like to do, given some free time. :-)
the only thing I can think of is to examine the output of the
explain command.
For your example insert statement you get:
SQLite version 3.3.5
Enter ".help" for instructions
sqlite> create table t (a,b);
sqlite> .explain on
sqlite> explain insert into t(a,b) values (?3, :id);
addr opcode p1 p2 p3
---- -------------- ---------- ---------- ----------
0 Goto 0 11
1 Integer 0 0
2 OpenWrite 0 2
3 SetNumColumns 0 2
4 NewRowid 0 0
5 Variable 3 0 ?3
6 Variable 4 0 :id
7 MakeRecord 2 0 bb
8 Insert 0 3 t
9 Close 0 0
10 Halt 0 0
11 Transaction 0 1
12 VerifyCookie 0 1
13 Goto 0 1
14 Noop 0 0
sqlite>
Now you can count the unique variable numbers in the p1 column
where the opcode is Variable. Unfortunately I don't think you can
use SQL to do this directly since SQLite doesn't allow the explain
keyword to be used as a subselect. It would be nice if this worked,
but it doesn't.
select count(distinct p1)
from (explain insert into t(a,b) values(?3, :id))
where opcode = 'Variable';
You will have to do the same thing in your calling code.
HTH
Dennis Cote