OLD | NEW |
| (Empty) |
1 # 2003 September 6 | |
2 # | |
3 # The author disclaims copyright to this source code. In place of | |
4 # a legal notice, here is a blessing: | |
5 # | |
6 # May you do good and not evil. | |
7 # May you find forgiveness for yourself and forgive others. | |
8 # May you share freely, never taking more than you give. | |
9 # | |
10 #*********************************************************************** | |
11 # This file implements regression tests for SQLite library. The | |
12 # focus of this script testing the sqlite_bind API. | |
13 # | |
14 # $Id: bind.test,v 1.48 2009/07/22 07:27:57 danielk1977 Exp $ | |
15 # | |
16 | |
17 set testdir [file dirname $argv0] | |
18 source $testdir/tester.tcl | |
19 | |
20 proc sqlite_step {stmt N VALS COLS} { | |
21 upvar VALS vals | |
22 upvar COLS cols | |
23 set vals [list] | |
24 set cols [list] | |
25 | |
26 set rc [sqlite3_step $stmt] | |
27 for {set i 0} {$i < [sqlite3_column_count $stmt]} {incr i} { | |
28 lappend cols [sqlite3_column_name $stmt $i] | |
29 } | |
30 for {set i 0} {$i < [sqlite3_data_count $stmt]} {incr i} { | |
31 lappend vals [sqlite3_column_text $stmt $i] | |
32 } | |
33 | |
34 return $rc | |
35 } | |
36 | |
37 do_test bind-1.1 { | |
38 set DB [sqlite3_connection_pointer db] | |
39 execsql {CREATE TABLE t1(a,b,c);} | |
40 set VM [sqlite3_prepare $DB {INSERT INTO t1 VALUES(:1,?,:abc)} -1 TAIL] | |
41 set TAIL | |
42 } {} | |
43 do_test bind-1.1.1 { | |
44 sqlite3_bind_parameter_count $VM | |
45 } 3 | |
46 do_test bind-1.1.2 { | |
47 sqlite3_bind_parameter_name $VM 1 | |
48 } {:1} | |
49 do_test bind-1.1.3 { | |
50 sqlite3_bind_parameter_name $VM 2 | |
51 } {} | |
52 do_test bind-1.1.4 { | |
53 sqlite3_bind_parameter_name $VM 3 | |
54 } {:abc} | |
55 do_test bind-1.2 { | |
56 sqlite_step $VM N VALUES COLNAMES | |
57 } {SQLITE_DONE} | |
58 do_test bind-1.3 { | |
59 execsql {SELECT rowid, * FROM t1} | |
60 } {1 {} {} {}} | |
61 do_test bind-1.4 { | |
62 sqlite3_reset $VM | |
63 sqlite_bind $VM 1 {test value 1} normal | |
64 sqlite_step $VM N VALUES COLNAMES | |
65 } SQLITE_DONE | |
66 do_test bind-1.5 { | |
67 execsql {SELECT rowid, * FROM t1} | |
68 } {1 {} {} {} 2 {test value 1} {} {}} | |
69 do_test bind-1.6 { | |
70 sqlite3_reset $VM | |
71 sqlite_bind $VM 3 {'test value 2'} normal | |
72 sqlite_step $VM N VALUES COLNAMES | |
73 } SQLITE_DONE | |
74 do_test bind-1.7 { | |
75 execsql {SELECT rowid, * FROM t1} | |
76 } {1 {} {} {} 2 {test value 1} {} {} 3 {test value 1} {} {'test value 2'}} | |
77 do_test bind-1.8 { | |
78 sqlite3_reset $VM | |
79 set sqlite_static_bind_value 123 | |
80 sqlite_bind $VM 1 {} static | |
81 sqlite_bind $VM 2 {abcdefg} normal | |
82 sqlite_bind $VM 3 {} null | |
83 execsql {DELETE FROM t1} | |
84 sqlite_step $VM N VALUES COLNAMES | |
85 execsql {SELECT rowid, * FROM t1} | |
86 } {1 123 abcdefg {}} | |
87 do_test bind-1.9 { | |
88 sqlite3_reset $VM | |
89 sqlite_bind $VM 1 {456} normal | |
90 sqlite_step $VM N VALUES COLNAMES | |
91 execsql {SELECT rowid, * FROM t1} | |
92 } {1 123 abcdefg {} 2 456 abcdefg {}} | |
93 | |
94 do_test bind-1.10 { | |
95 set rc [catch { | |
96 sqlite3_prepare db {INSERT INTO t1 VALUES($abc:123,?,:abc)} -1 TAIL | |
97 } msg] | |
98 lappend rc $msg | |
99 } {1 {(1) near ":123": syntax error}} | |
100 do_test bind-1.11 { | |
101 set rc [catch { | |
102 sqlite3_prepare db {INSERT INTO t1 VALUES(@abc:xyz,?,:abc)} -1 TAIL | |
103 } msg] | |
104 lappend rc $msg | |
105 } {1 {(1) near ":xyz": syntax error}} | |
106 | |
107 do_test bind-1.99 { | |
108 sqlite3_finalize $VM | |
109 } SQLITE_OK | |
110 | |
111 # Prepare the statement in different ways depending on whether or not | |
112 # the $var processing is compiled into the library. | |
113 # | |
114 ifcapable {tclvar} { | |
115 do_test bind-2.1 { | |
116 execsql { | |
117 DELETE FROM t1; | |
118 } | |
119 set VM [sqlite3_prepare $DB {INSERT INTO t1 VALUES($one,$::two,$x(-z-))}\ | |
120 -1 TX] | |
121 set TX | |
122 } {} | |
123 set v1 {$one} | |
124 set v2 {$::two} | |
125 set v3 {$x(-z-)} | |
126 } | |
127 ifcapable {!tclvar} { | |
128 do_test bind-2.1 { | |
129 execsql { | |
130 DELETE FROM t1; | |
131 } | |
132 set VM [sqlite3_prepare $DB {INSERT INTO t1 VALUES(:one,:two,:_)} -1 TX] | |
133 set TX | |
134 } {} | |
135 set v1 {:one} | |
136 set v2 {:two} | |
137 set v3 {:_} | |
138 } | |
139 | |
140 do_test bind-2.1.1 { | |
141 sqlite3_bind_parameter_count $VM | |
142 } 3 | |
143 do_test bind-2.1.2 { | |
144 sqlite3_bind_parameter_name $VM 1 | |
145 } $v1 | |
146 do_test bind-2.1.3 { | |
147 sqlite3_bind_parameter_name $VM 2 | |
148 } $v2 | |
149 do_test bind-2.1.4 { | |
150 sqlite3_bind_parameter_name $VM 3 | |
151 } $v3 | |
152 do_test bind-2.1.5 { | |
153 sqlite3_bind_parameter_index $VM $v1 | |
154 } 1 | |
155 do_test bind-2.1.6 { | |
156 sqlite3_bind_parameter_index $VM $v2 | |
157 } 2 | |
158 do_test bind-2.1.7 { | |
159 sqlite3_bind_parameter_index $VM $v3 | |
160 } 3 | |
161 do_test bind-2.1.8 { | |
162 sqlite3_bind_parameter_index $VM {:hi} | |
163 } 0 | |
164 | |
165 # 32 bit Integers | |
166 do_test bind-2.2 { | |
167 sqlite3_bind_int $VM 1 123 | |
168 sqlite3_bind_int $VM 2 456 | |
169 sqlite3_bind_int $VM 3 789 | |
170 sqlite_step $VM N VALUES COLNAMES | |
171 sqlite3_reset $VM | |
172 execsql {SELECT rowid, * FROM t1} | |
173 } {1 123 456 789} | |
174 do_test bind-2.3 { | |
175 sqlite3_bind_int $VM 2 -2000000000 | |
176 sqlite3_bind_int $VM 3 2000000000 | |
177 sqlite_step $VM N VALUES COLNAMES | |
178 sqlite3_reset $VM | |
179 execsql {SELECT rowid, * FROM t1} | |
180 } {1 123 456 789 2 123 -2000000000 2000000000} | |
181 do_test bind-2.4 { | |
182 execsql {SELECT typeof(a), typeof(b), typeof(c) FROM t1} | |
183 } {integer integer integer integer integer integer} | |
184 do_test bind-2.5 { | |
185 execsql { | |
186 DELETE FROM t1; | |
187 } | |
188 } {} | |
189 | |
190 # 64 bit Integers | |
191 do_test bind-3.1 { | |
192 sqlite3_bind_int64 $VM 1 32 | |
193 sqlite3_bind_int64 $VM 2 -2000000000000 | |
194 sqlite3_bind_int64 $VM 3 2000000000000 | |
195 sqlite_step $VM N VALUES COLNAMES | |
196 sqlite3_reset $VM | |
197 execsql {SELECT rowid, * FROM t1} | |
198 } {1 32 -2000000000000 2000000000000} | |
199 do_test bind-3.2 { | |
200 execsql {SELECT typeof(a), typeof(b), typeof(c) FROM t1} | |
201 } {integer integer integer} | |
202 do_test bind-3.3 { | |
203 execsql { | |
204 DELETE FROM t1; | |
205 } | |
206 } {} | |
207 | |
208 # Doubles | |
209 do_test bind-4.1 { | |
210 sqlite3_bind_double $VM 1 1234.1234 | |
211 sqlite3_bind_double $VM 2 0.00001 | |
212 sqlite3_bind_double $VM 3 123456789 | |
213 sqlite_step $VM N VALUES COLNAMES | |
214 sqlite3_reset $VM | |
215 set x [execsql {SELECT rowid, * FROM t1}] | |
216 regsub {1e-005} $x {1e-05} y | |
217 set y | |
218 } {1 1234.1234 1e-05 123456789.0} | |
219 do_test bind-4.2 { | |
220 execsql {SELECT typeof(a), typeof(b), typeof(c) FROM t1} | |
221 } {real real real} | |
222 do_test bind-4.3 { | |
223 execsql { | |
224 DELETE FROM t1; | |
225 } | |
226 } {} | |
227 do_test bind-4.4 { | |
228 sqlite3_bind_double $VM 1 NaN | |
229 sqlite3_bind_double $VM 2 1e300 | |
230 sqlite3_bind_double $VM 3 -1e-300 | |
231 sqlite_step $VM N VALUES COLNAMES | |
232 sqlite3_reset $VM | |
233 set x [execsql {SELECT rowid, * FROM t1}] | |
234 regsub {1e-005} $x {1e-05} y | |
235 set y | |
236 } {1 {} 1e+300 -1e-300} | |
237 do_test bind-4.5 { | |
238 execsql {SELECT typeof(a), typeof(b), typeof(c) FROM t1} | |
239 } {null real real} | |
240 do_test bind-4.6 { | |
241 execsql { | |
242 DELETE FROM t1; | |
243 } | |
244 } {} | |
245 | |
246 # NULL | |
247 do_test bind-5.1 { | |
248 sqlite3_bind_null $VM 1 | |
249 sqlite3_bind_null $VM 2 | |
250 sqlite3_bind_null $VM 3 | |
251 sqlite_step $VM N VALUES COLNAMES | |
252 sqlite3_reset $VM | |
253 execsql {SELECT rowid, * FROM t1} | |
254 } {1 {} {} {}} | |
255 do_test bind-5.2 { | |
256 execsql {SELECT typeof(a), typeof(b), typeof(c) FROM t1} | |
257 } {null null null} | |
258 do_test bind-5.3 { | |
259 execsql { | |
260 DELETE FROM t1; | |
261 } | |
262 } {} | |
263 | |
264 # UTF-8 text | |
265 do_test bind-6.1 { | |
266 sqlite3_bind_text $VM 1 hellothere 5 | |
267 sqlite3_bind_text $VM 2 ".." 1 | |
268 sqlite3_bind_text $VM 3 world\000 -1 | |
269 sqlite_step $VM N VALUES COLNAMES | |
270 sqlite3_reset $VM | |
271 execsql {SELECT rowid, * FROM t1} | |
272 } {1 hello . world} | |
273 do_test bind-6.2 { | |
274 execsql {SELECT typeof(a), typeof(b), typeof(c) FROM t1} | |
275 } {text text text} | |
276 do_test bind-6.3 { | |
277 execsql { | |
278 DELETE FROM t1; | |
279 } | |
280 } {} | |
281 | |
282 # Make sure zeros in a string work. | |
283 # | |
284 do_test bind-6.4 { | |
285 db eval {DELETE FROM t1} | |
286 sqlite3_bind_text $VM 1 hello\000there\000 12 | |
287 sqlite3_bind_text $VM 2 hello\000there\000 11 | |
288 sqlite3_bind_text $VM 3 hello\000there\000 -1 | |
289 sqlite_step $VM N VALUES COLNAMES | |
290 sqlite3_reset $VM | |
291 execsql {SELECT * FROM t1} | |
292 } {hello hello hello} | |
293 set enc [db eval {PRAGMA encoding}] | |
294 if {$enc=="UTF-8" || $enc==""} { | |
295 do_test bind-6.5 { | |
296 execsql {SELECT hex(a), hex(b), hex(c) FROM t1} | |
297 } {68656C6C6F00746865726500 68656C6C6F007468657265 68656C6C6F} | |
298 } elseif {$enc=="UTF-16le"} { | |
299 do_test bind-6.5 { | |
300 execsql {SELECT hex(a), hex(b), hex(c) FROM t1} | |
301 } {680065006C006C006F000000740068006500720065000000 680065006C006C006F00000074
006800650072006500 680065006C006C006F00} | |
302 } elseif {$enc=="UTF-16be"} { | |
303 do_test bind-6.5 { | |
304 execsql {SELECT hex(a), hex(b), hex(c) FROM t1} | |
305 } {00680065006C006C006F0000007400680065007200650000 00680065006C006C006F000000
740068006500720065 00680065006C006C006F} | |
306 } else { | |
307 do_test bind-6.5 { | |
308 set "Unknown database encoding: $::enc" | |
309 } {} | |
310 } | |
311 do_test bind-6.6 { | |
312 execsql {SELECT typeof(a), typeof(b), typeof(c) FROM t1} | |
313 } {text text text} | |
314 do_test bind-6.7 { | |
315 execsql { | |
316 DELETE FROM t1; | |
317 } | |
318 } {} | |
319 | |
320 # UTF-16 text | |
321 ifcapable {utf16} { | |
322 do_test bind-7.1 { | |
323 sqlite3_bind_text16 $VM 1 [encoding convertto unicode hellothere] 10 | |
324 sqlite3_bind_text16 $VM 2 [encoding convertto unicode ""] 0 | |
325 sqlite3_bind_text16 $VM 3 [encoding convertto unicode world] 10 | |
326 sqlite_step $VM N VALUES COLNAMES | |
327 sqlite3_reset $VM | |
328 execsql {SELECT rowid, * FROM t1} | |
329 } {1 hello {} world} | |
330 do_test bind-7.2 { | |
331 execsql {SELECT typeof(a), typeof(b), typeof(c) FROM t1} | |
332 } {text text text} | |
333 do_test bind-7.3 { | |
334 db eval {DELETE FROM t1} | |
335 sqlite3_bind_text16 $VM 1 [encoding convertto unicode hi\000yall\000] 16 | |
336 sqlite3_bind_text16 $VM 2 [encoding convertto unicode hi\000yall\000] 14 | |
337 sqlite3_bind_text16 $VM 3 [encoding convertto unicode hi\000yall\000] -1 | |
338 sqlite_step $VM N VALUES COLNAMES | |
339 sqlite3_reset $VM | |
340 execsql {SELECT * FROM t1} | |
341 } {hi hi hi} | |
342 if {$enc=="UTF-8"} { | |
343 do_test bind-7.4 { | |
344 execsql {SELECT hex(a), hex(b), hex(c) FROM t1} | |
345 } {68690079616C6C00 68690079616C6C 6869} | |
346 } elseif {$enc=="UTF-16le"} { | |
347 do_test bind-7.4 { | |
348 execsql {SELECT hex(a), hex(b), hex(c) FROM t1} | |
349 } {680069000000790061006C006C000000 680069000000790061006C006C00 68006900} | |
350 } elseif {$enc=="UTF-16be"} { | |
351 do_test bind-7.4 { | |
352 execsql {SELECT hex(a), hex(b), hex(c) FROM t1} | |
353 } {00680069000000790061006C006C0000 00680069000000790061006C006C 00680069} | |
354 } | |
355 do_test bind-7.5 { | |
356 execsql {SELECT typeof(a), typeof(b), typeof(c) FROM t1} | |
357 } {text text text} | |
358 } | |
359 do_test bind-7.99 { | |
360 execsql {DELETE FROM t1;} | |
361 } {} | |
362 | |
363 # Test that the 'out of range' error works. | |
364 do_test bind-8.1 { | |
365 catch { sqlite3_bind_null $VM 0 } | |
366 } {1} | |
367 do_test bind-8.2 { | |
368 sqlite3_errmsg $DB | |
369 } {bind or column index out of range} | |
370 ifcapable {utf16} { | |
371 do_test bind-8.3 { | |
372 encoding convertfrom unicode [sqlite3_errmsg16 $DB] | |
373 } {bind or column index out of range} | |
374 } | |
375 do_test bind-8.4 { | |
376 sqlite3_bind_null $VM 1 | |
377 sqlite3_errmsg $DB | |
378 } {not an error} | |
379 do_test bind-8.5 { | |
380 catch { sqlite3_bind_null $VM 4 } | |
381 } {1} | |
382 do_test bind-8.6 { | |
383 sqlite3_errmsg $DB | |
384 } {bind or column index out of range} | |
385 ifcapable {utf16} { | |
386 do_test bind-8.7 { | |
387 encoding convertfrom unicode [sqlite3_errmsg16 $DB] | |
388 } {bind or column index out of range} | |
389 } | |
390 | |
391 do_test bind-8.8 { | |
392 catch { sqlite3_bind_blob $VM 0 "abc" 3 } | |
393 } {1} | |
394 do_test bind-8.9 { | |
395 catch { sqlite3_bind_blob $VM 4 "abc" 3 } | |
396 } {1} | |
397 do_test bind-8.10 { | |
398 catch { sqlite3_bind_text $VM 0 "abc" 3 } | |
399 } {1} | |
400 ifcapable {utf16} { | |
401 do_test bind-8.11 { | |
402 catch { sqlite3_bind_text16 $VM 4 "abc" 2 } | |
403 } {1} | |
404 } | |
405 do_test bind-8.12 { | |
406 catch { sqlite3_bind_int $VM 0 5 } | |
407 } {1} | |
408 do_test bind-8.13 { | |
409 catch { sqlite3_bind_int $VM 4 5 } | |
410 } {1} | |
411 do_test bind-8.14 { | |
412 catch { sqlite3_bind_double $VM 0 5.0 } | |
413 } {1} | |
414 do_test bind-8.15 { | |
415 catch { sqlite3_bind_double $VM 4 6.0 } | |
416 } {1} | |
417 | |
418 do_test bind-8.99 { | |
419 sqlite3_finalize $VM | |
420 } SQLITE_OK | |
421 | |
422 set iMaxVar $SQLITE_MAX_VARIABLE_NUMBER | |
423 set zError "(1) variable number must be between ?1 and ?$iMaxVar" | |
424 do_test bind-9.1 { | |
425 execsql { | |
426 CREATE TABLE t2(a,b,c,d,e,f); | |
427 } | |
428 set rc [catch { | |
429 sqlite3_prepare $DB { | |
430 INSERT INTO t2(a) VALUES(?0) | |
431 } -1 TAIL | |
432 } msg] | |
433 lappend rc $msg | |
434 } [list 1 $zError] | |
435 do_test bind-9.2 { | |
436 set rc [catch { | |
437 sqlite3_prepare $DB "INSERT INTO t2(a) VALUES(?[expr $iMaxVar+1])" -1 TAIL | |
438 } msg] | |
439 lappend rc $msg | |
440 } [list 1 $zError] | |
441 do_test bind-9.3.1 { | |
442 set VM [ | |
443 sqlite3_prepare $DB " | |
444 INSERT INTO t2(a,b) VALUES(?1,?$iMaxVar) | |
445 " -1 TAIL | |
446 ] | |
447 sqlite3_bind_parameter_count $VM | |
448 } $iMaxVar | |
449 catch {sqlite3_finalize $VM} | |
450 do_test bind-9.3.2 { | |
451 set VM [ | |
452 sqlite3_prepare $DB " | |
453 INSERT INTO t2(a,b) VALUES(?2,?[expr $iMaxVar - 1]) | |
454 " -1 TAIL | |
455 ] | |
456 sqlite3_bind_parameter_count $VM | |
457 } [expr {$iMaxVar - 1}] | |
458 catch {sqlite3_finalize $VM} | |
459 do_test bind-9.4 { | |
460 set VM [ | |
461 sqlite3_prepare $DB " | |
462 INSERT INTO t2(a,b,c,d) VALUES(?1,?[expr $iMaxVar - 2],?,?) | |
463 " -1 TAIL | |
464 ] | |
465 sqlite3_bind_parameter_count $VM | |
466 } $iMaxVar | |
467 do_test bind-9.5 { | |
468 sqlite3_bind_int $VM 1 1 | |
469 sqlite3_bind_int $VM [expr $iMaxVar - 2] 999 | |
470 sqlite3_bind_int $VM [expr $iMaxVar - 1] 1000 | |
471 sqlite3_bind_int $VM $iMaxVar 1001 | |
472 sqlite3_step $VM | |
473 } SQLITE_DONE | |
474 do_test bind-9.6 { | |
475 sqlite3_finalize $VM | |
476 } SQLITE_OK | |
477 do_test bind-9.7 { | |
478 execsql {SELECT * FROM t2} | |
479 } {1 999 1000 1001 {} {}} | |
480 | |
481 ifcapable {tclvar} { | |
482 do_test bind-10.1 { | |
483 set VM [ | |
484 sqlite3_prepare $DB { | |
485 INSERT INTO t2(a,b,c,d,e,f) VALUES(:abc,$abc,:abc,$ab,$abc,:abc) | |
486 } -1 TAIL | |
487 ] | |
488 sqlite3_bind_parameter_count $VM | |
489 } 3 | |
490 set v1 {$abc} | |
491 set v2 {$ab} | |
492 } | |
493 ifcapable {!tclvar} { | |
494 do_test bind-10.1 { | |
495 set VM [ | |
496 sqlite3_prepare $DB { | |
497 INSERT INTO t2(a,b,c,d,e,f) VALUES(:abc,:xyz,:abc,:xy,:xyz,:abc) | |
498 } -1 TAIL | |
499 ] | |
500 sqlite3_bind_parameter_count $VM | |
501 } 3 | |
502 set v1 {:xyz} | |
503 set v2 {:xy} | |
504 } | |
505 do_test bind-10.2 { | |
506 sqlite3_bind_parameter_index $VM :abc | |
507 } 1 | |
508 do_test bind-10.3 { | |
509 sqlite3_bind_parameter_index $VM $v1 | |
510 } 2 | |
511 do_test bind-10.4 { | |
512 sqlite3_bind_parameter_index $VM $v2 | |
513 } 3 | |
514 do_test bind-10.5 { | |
515 sqlite3_bind_parameter_name $VM 1 | |
516 } :abc | |
517 do_test bind-10.6 { | |
518 sqlite3_bind_parameter_name $VM 2 | |
519 } $v1 | |
520 do_test bind-10.7 { | |
521 sqlite3_bind_parameter_name $VM 3 | |
522 } $v2 | |
523 do_test bind-10.7.1 { | |
524 sqlite3_bind_parameter_name 0 1 ;# Ignore if VM is NULL | |
525 } {} | |
526 do_test bind-10.7.2 { | |
527 sqlite3_bind_parameter_name $VM 0 ;# Ignore if index too small | |
528 } {} | |
529 do_test bind-10.7.3 { | |
530 sqlite3_bind_parameter_name $VM 4 ;# Ignore if index is too big | |
531 } {} | |
532 do_test bind-10.8 { | |
533 sqlite3_bind_int $VM 1 1 | |
534 sqlite3_bind_int $VM 2 2 | |
535 sqlite3_bind_int $VM 3 3 | |
536 sqlite3_step $VM | |
537 } SQLITE_DONE | |
538 do_test bind-10.8.1 { | |
539 # Binding attempts after program start should fail | |
540 set rc [catch { | |
541 sqlite3_bind_int $VM 1 1 | |
542 } msg] | |
543 lappend rc $msg | |
544 } {1 {}} | |
545 do_test bind-10.9 { | |
546 sqlite3_finalize $VM | |
547 } SQLITE_OK | |
548 do_test bind-10.10 { | |
549 execsql {SELECT * FROM t2} | |
550 } {1 999 1000 1001 {} {} 1 2 1 3 2 1} | |
551 | |
552 # Ticket #918 | |
553 # | |
554 do_test bind-10.11 { | |
555 # catch {sqlite3_finalize $VM} | |
556 set VM [ | |
557 sqlite3_prepare $DB { | |
558 INSERT INTO t2(a,b,c,d,e,f) VALUES(:abc,?,?4,:pqr,:abc,?4) | |
559 } -1 TAIL | |
560 ] | |
561 sqlite3_bind_parameter_count $VM | |
562 } 5 | |
563 do_test bind-10.11.1 { | |
564 sqlite3_bind_parameter_index 0 :xyz ;# ignore NULL VM arguments | |
565 } 0 | |
566 do_test bind-10.12 { | |
567 sqlite3_bind_parameter_index $VM :xyz | |
568 } 0 | |
569 do_test bind-10.13 { | |
570 sqlite3_bind_parameter_index $VM {} | |
571 } 0 | |
572 do_test bind-10.14 { | |
573 sqlite3_bind_parameter_index $VM :pqr | |
574 } 5 | |
575 do_test bind-10.15 { | |
576 sqlite3_bind_parameter_index $VM ?4 | |
577 } 4 | |
578 do_test bind-10.16 { | |
579 sqlite3_bind_parameter_name $VM 1 | |
580 } :abc | |
581 do_test bind-10.17 { | |
582 sqlite3_bind_parameter_name $VM 2 | |
583 } {} | |
584 do_test bind-10.18 { | |
585 sqlite3_bind_parameter_name $VM 3 | |
586 } {} | |
587 do_test bind-10.19 { | |
588 sqlite3_bind_parameter_name $VM 4 | |
589 } {?4} | |
590 do_test bind-10.20 { | |
591 sqlite3_bind_parameter_name $VM 5 | |
592 } :pqr | |
593 catch {sqlite3_finalize $VM} | |
594 | |
595 # Make sure we catch an unterminated "(" in a Tcl-style variable name | |
596 # | |
597 ifcapable tclvar { | |
598 do_test bind-11.1 { | |
599 catchsql {SELECT * FROM sqlite_master WHERE name=$abc(123 and sql NOT NULL;} | |
600 } {1 {unrecognized token: "$abc(123"}} | |
601 } | |
602 | |
603 if {[execsql {pragma encoding}]=="UTF-8"} { | |
604 # Test the ability to bind text that contains embedded '\000' characters. | |
605 # Make sure we can recover the entire input string. | |
606 # | |
607 do_test bind-12.1 { | |
608 execsql { | |
609 CREATE TABLE t3(x BLOB); | |
610 } | |
611 set VM [sqlite3_prepare $DB {INSERT INTO t3 VALUES(?)} -1 TAIL] | |
612 sqlite_bind $VM 1 not-used blob10 | |
613 sqlite3_step $VM | |
614 sqlite3_finalize $VM | |
615 execsql { | |
616 SELECT typeof(x), length(x), quote(x), | |
617 length(cast(x AS BLOB)), quote(cast(x AS BLOB)) FROM t3 | |
618 } | |
619 } {text 3 'abc' 10 X'6162630078797A007071'} | |
620 do_test bind-12.2 { | |
621 sqlite3_create_function $DB | |
622 execsql { | |
623 SELECT quote(cast(x_coalesce(x) AS blob)) FROM t3 | |
624 } | |
625 } {X'6162630078797A007071'} | |
626 } | |
627 | |
628 # Test the operation of sqlite3_clear_bindings | |
629 # | |
630 do_test bind-13.1 { | |
631 set VM [sqlite3_prepare $DB {SELECT ?,?,?} -1 TAIL] | |
632 sqlite3_step $VM | |
633 list [sqlite3_column_type $VM 0] [sqlite3_column_type $VM 1] \ | |
634 [sqlite3_column_type $VM 2] | |
635 } {NULL NULL NULL} | |
636 do_test bind-13.2 { | |
637 sqlite3_reset $VM | |
638 sqlite3_bind_int $VM 1 1 | |
639 sqlite3_bind_int $VM 2 2 | |
640 sqlite3_bind_int $VM 3 3 | |
641 sqlite3_step $VM | |
642 list [sqlite3_column_type $VM 0] [sqlite3_column_type $VM 1] \ | |
643 [sqlite3_column_type $VM 2] | |
644 } {INTEGER INTEGER INTEGER} | |
645 do_test bind-13.3 { | |
646 sqlite3_reset $VM | |
647 sqlite3_step $VM | |
648 list [sqlite3_column_type $VM 0] [sqlite3_column_type $VM 1] \ | |
649 [sqlite3_column_type $VM 2] | |
650 } {INTEGER INTEGER INTEGER} | |
651 do_test bind-13.4 { | |
652 sqlite3_reset $VM | |
653 sqlite3_clear_bindings $VM | |
654 sqlite3_step $VM | |
655 list [sqlite3_column_type $VM 0] [sqlite3_column_type $VM 1] \ | |
656 [sqlite3_column_type $VM 2] | |
657 } {NULL NULL NULL} | |
658 sqlite3_finalize $VM | |
659 | |
660 #-------------------------------------------------------------------- | |
661 # These tests attempt to reproduce bug #3463. | |
662 # | |
663 proc param_names {db zSql} { | |
664 set ret [list] | |
665 set VM [sqlite3_prepare db $zSql -1 TAIL] | |
666 for {set ii 1} {$ii <= [sqlite3_bind_parameter_count $VM]} {incr ii} { | |
667 lappend ret [sqlite3_bind_parameter_name $VM $ii] | |
668 } | |
669 sqlite3_finalize $VM | |
670 set ret | |
671 } | |
672 | |
673 do_test bind-14.1 { | |
674 param_names db { SELECT @a, @b } | |
675 } {@a @b} | |
676 do_test bind-14.2 { | |
677 param_names db { SELECT NULL FROM (SELECT NULL) WHERE @a = @b } | |
678 } {@a @b} | |
679 do_test bind-14.3 { | |
680 param_names db { SELECT @a FROM (SELECT NULL) WHERE 1 = @b } | |
681 } {@a @b} | |
682 do_test bind-14.4 { | |
683 param_names db { SELECT @a, @b FROM (SELECT NULL) } | |
684 } {@a @b} | |
685 | |
686 #-------------------------------------------------------------------------- | |
687 # Tests of the OP_Variable opcode where P3>1 | |
688 # | |
689 do_test bind-15.1 { | |
690 db eval {CREATE TABLE t4(a,b,c,d,e,f,g,h);} | |
691 set VM [sqlite3_prepare db { | |
692 INSERT INTO t4(a,b,c,d,f,g,h,e) VALUES(?,?,?,?,?,?,?,?) | |
693 } -1 TAIL] | |
694 sqlite3_bind_int $VM 1 1 | |
695 sqlite3_bind_int $VM 2 2 | |
696 sqlite3_bind_int $VM 3 3 | |
697 sqlite3_bind_int $VM 4 4 | |
698 sqlite3_bind_int $VM 5 5 | |
699 sqlite3_bind_int $VM 6 6 | |
700 sqlite3_bind_int $VM 7 7 | |
701 sqlite3_bind_int $VM 8 8 | |
702 sqlite3_step $VM | |
703 sqlite3_finalize $VM | |
704 db eval {SELECT * FROM t4} | |
705 } {1 2 3 4 8 5 6 7} | |
706 do_test bind-15.2 { | |
707 db eval {DELETE FROM t4} | |
708 set VM [sqlite3_prepare db { | |
709 INSERT INTO t4(a,b,c,d,e,f,g,h) VALUES(?,?,?,?,?,?,?,?) | |
710 } -1 TAIL] | |
711 sqlite3_bind_int $VM 1 1 | |
712 sqlite3_bind_int $VM 2 2 | |
713 sqlite3_bind_int $VM 3 3 | |
714 sqlite3_bind_int $VM 4 4 | |
715 sqlite3_bind_int $VM 5 5 | |
716 sqlite3_bind_int $VM 6 6 | |
717 sqlite3_bind_int $VM 7 7 | |
718 sqlite3_bind_int $VM 8 8 | |
719 sqlite3_step $VM | |
720 sqlite3_finalize $VM | |
721 db eval {SELECT * FROM t4} | |
722 } {1 2 3 4 5 6 7 8} | |
723 do_test bind-15.3 { | |
724 db eval {DELETE FROM t4} | |
725 set VM [sqlite3_prepare db { | |
726 INSERT INTO t4(h,g,f,e,d,c,b,a) VALUES(?,?,?,?,?,?,?,?) | |
727 } -1 TAIL] | |
728 sqlite3_bind_int $VM 1 1 | |
729 sqlite3_bind_int $VM 2 2 | |
730 sqlite3_bind_int $VM 3 3 | |
731 sqlite3_bind_int $VM 4 4 | |
732 sqlite3_bind_int $VM 5 5 | |
733 sqlite3_bind_int $VM 6 6 | |
734 sqlite3_bind_int $VM 7 7 | |
735 sqlite3_bind_int $VM 8 8 | |
736 sqlite3_step $VM | |
737 sqlite3_finalize $VM | |
738 db eval {SELECT * FROM t4} | |
739 } {8 7 6 5 4 3 2 1} | |
740 do_test bind-15.4 { | |
741 db eval {DELETE FROM t4} | |
742 set VM [sqlite3_prepare db { | |
743 INSERT INTO t4(a,b,c,d,e,f,g,h) VALUES(?,?,?,?4,?,?6,?,?) | |
744 } -1 TAIL] | |
745 sqlite3_bind_int $VM 1 1 | |
746 sqlite3_bind_int $VM 2 2 | |
747 sqlite3_bind_int $VM 3 3 | |
748 sqlite3_bind_int $VM 4 4 | |
749 sqlite3_bind_int $VM 5 5 | |
750 sqlite3_bind_int $VM 6 6 | |
751 sqlite3_bind_int $VM 7 7 | |
752 sqlite3_bind_int $VM 8 8 | |
753 sqlite3_step $VM | |
754 sqlite3_finalize $VM | |
755 db eval {SELECT * FROM t4} | |
756 } {1 2 3 4 5 6 7 8} | |
757 | |
758 finish_test | |
OLD | NEW |