Clark Christensen wrote:
What's not clear is whether the limitation is with SQLite, DBI, or DBD-SQLite,
or whether later revisions of any has enabled placeholders at that level.
Does sqlite3_prepare/step work with placeholders in the HAVING expression?
Clark,
The syntax description for the SELECT statement (at
http://www.sqlite.org/lang_select.html) says that the HAVING clause
takes an expression. This is the same thing used for a WHERE clause.
Furthermore, it looks like the parser handles both in the same way. So
it would be unlikely that SQLite would treat it differently.
The following explain output shows that SQLite does accept a variable in
the HAVING clause.
SQLite version 3.3.2
Enter ".help" for instructions
sqlite> create table t(a,b);
sqlite> .explain on
sqlite> explain select a from t group by b having count(*) > ?;
addr opcode p1 p2 p3
---- -------------- ---------- ----------
---------------------------------
0 OpenVirtual 1 3 keyinfo(1,BINARY)
1 MemInt 0 3
2 MemInt 0 2
3 Goto 0 18
4 MemInt 1 3
5 Return 0 0
6 IfMemPos 2 8
7 Return 0 0
8 AggFinal 1 0 count(0)
9 MemLoad 1 0
10 Variable 1 0
11 Le 354 7
12 MemLoad 0 0
13 Callback 1 0
14 Return 0 0
15 MemNull 0 0
16 MemNull 1 0
17 Return 0 0
18 Gosub 0 15
19 Goto 0 47
20 Integer 0 0
21 OpenRead 0 2
22 SetNumColumns 0 2
23 Rewind 0 30
24 Column 0 1
25 Sequence 1 0
26 Column 0 0
27 MakeRecord 3 0
28 IdxInsert 1 0
29 Next 0 24
30 Close 0 0
31 Sort 1 46
32 Column 1 0
33 MemStore 5 0
34 MemLoad 4 0
35 Eq 512 40 collseq(BINARY)
36 MemMove 4 5
37 Gosub 0 6
38 IfMemPos 3 46
39 Gosub 0 15
40 AggStep 1 0 count(0)
41 Column 1 2
42 MemStore 0 1
43 MemInt 1 2
44 Next 1 32
45 Gosub 0 6
46 Halt 0 0
47 Transaction 0 0
48 VerifyCookie 0 1
49 Goto 0 20
50 Noop 0 0
sqlite>
Line 10 is where it load the variable to check the count before making a
callback to return a result row.
Look like the problem is in the Perl wrapper.
HTH
Dennis Cote