bump version number and changelog
[sqlcipher.git] / test / bind.test
blob8cafaab2bcaafbf0a8571ad233567a735696409b
1 # 2003 September 6
3 # The author disclaims copyright to this source code.  In place of
4 # a legal notice, here is a blessing:
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.
10 #***********************************************************************
11 # This file implements regression tests for SQLite library.  The
12 # focus of this script testing the sqlite_bind API.
14 # $Id: bind.test,v 1.48 2009/07/22 07:27:57 danielk1977 Exp $
17 set testdir [file dirname $argv0]
18 source $testdir/tester.tcl
20 proc sqlite_step {stmt N VALS COLS} {
21   upvar VALS vals
22   upvar COLS cols
23   set vals [list]
24   set cols [list]
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   }
34   return $rc
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 {}}
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}}
107 do_test bind-1.99 {
108   sqlite3_finalize $VM
109 } SQLITE_OK
111 # Prepare the statement in different ways depending on whether or not
112 # the $var processing is compiled into the library.
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-)}
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 {:_}
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
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 } {}
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 } {}
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 } {}
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 } {}
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 } {}
282 # Make sure zeros in a string work.
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 680065006C006C006F00000074006800650072006500 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 00680065006C006C006F000000740068006500720065 00680065006C006C006F}
306 } else {
307   do_test bind-6.5 {
308     set "Unknown database encoding: $::enc"
309   } {}
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 } {}
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}
359 do_test bind-7.99 {
360   execsql {DELETE FROM t1;}
361 } {}
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 } {column index out of range}
370 ifcapable {utf16} {
371   do_test bind-8.3 {
372     encoding convertfrom unicode [sqlite3_errmsg16 $DB]
373   } {column index out of range}
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 } {column index out of range}
385 ifcapable {utf16} {
386   do_test bind-8.7 {
387     encoding convertfrom unicode [sqlite3_errmsg16 $DB]
388   } {column index out of range}
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}
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}
418 do_test bind-8.99 {
419   sqlite3_finalize $VM
420 } SQLITE_OK
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 {} {}}
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}
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}
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}
552 # Ticket #918
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}
595 # Make sure we catch an unterminated "(" in a Tcl-style variable name
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"}}
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'}
628 # Test the operation of sqlite3_clear_bindings
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
660 #--------------------------------------------------------------------
661 # These tests attempt to reproduce bug #3463.
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
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}
686 #--------------------------------------------------------------------------
687 # Tests of the OP_Variable opcode where P3>1
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}
758 finish_test