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
17set testdir [file dirname $argv0]
18source $testdir/tester.tcl
19
20proc 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
37do_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} {}
43do_test bind-1.1.1 {
44  sqlite3_bind_parameter_count $VM
45} 3
46do_test bind-1.1.2 {
47  sqlite3_bind_parameter_name $VM 1
48} {:1}
49do_test bind-1.1.3 {
50  sqlite3_bind_parameter_name $VM 2
51} {}
52do_test bind-1.1.4 {
53  sqlite3_bind_parameter_name $VM 3
54} {:abc}
55do_test bind-1.2 {
56  sqlite_step $VM N VALUES COLNAMES
57} {SQLITE_DONE}
58do_test bind-1.3 {
59  execsql {SELECT rowid, * FROM t1}
60} {1 {} {} {}}
61do_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
66do_test bind-1.5 {
67  execsql {SELECT rowid, * FROM t1}
68} {1 {} {} {} 2 {test value 1} {} {}}
69do_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
74do_test bind-1.7 {
75  execsql {SELECT rowid, * FROM t1}
76} {1 {} {} {} 2 {test value 1} {} {} 3 {test value 1} {} {'test value 2'}}
77do_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 {}}
87do_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
94do_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}}
100do_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
107do_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#
114ifcapable {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}
127ifcapable {!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
140do_test bind-2.1.1 {
141  sqlite3_bind_parameter_count $VM
142} 3
143do_test bind-2.1.2 {
144  sqlite3_bind_parameter_name $VM 1
145} $v1
146do_test bind-2.1.3 {
147  sqlite3_bind_parameter_name $VM 2
148} $v2
149do_test bind-2.1.4 {
150  sqlite3_bind_parameter_name $VM 3
151} $v3
152do_test bind-2.1.5 {
153  sqlite3_bind_parameter_index $VM $v1
154} 1
155do_test bind-2.1.6 {
156  sqlite3_bind_parameter_index $VM $v2
157} 2
158do_test bind-2.1.7 {
159  sqlite3_bind_parameter_index $VM $v3
160} 3
161do_test bind-2.1.8 {
162  sqlite3_bind_parameter_index $VM {:hi}
163} 0
164
165# 32 bit Integers
166do_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}
174do_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}
181do_test bind-2.4 {
182  execsql {SELECT typeof(a), typeof(b), typeof(c) FROM t1}
183} {integer integer integer integer integer integer}
184do_test bind-2.5 {
185  execsql {
186    DELETE FROM t1;
187  }
188} {}
189
190# 64 bit Integers
191do_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}
199do_test bind-3.2 {
200  execsql {SELECT typeof(a), typeof(b), typeof(c) FROM t1}
201} {integer integer integer}
202do_test bind-3.3 {
203  execsql {
204    DELETE FROM t1;
205  }
206} {}
207
208# Doubles
209do_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}
219do_test bind-4.2 {
220  execsql {SELECT typeof(a), typeof(b), typeof(c) FROM t1}
221} {real real real}
222do_test bind-4.3 {
223  execsql {
224    DELETE FROM t1;
225  }
226} {}
227do_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}
237do_test bind-4.5 {
238  execsql {SELECT typeof(a), typeof(b), typeof(c) FROM t1}
239} {null real real}
240do_test bind-4.6 {
241  execsql {
242    DELETE FROM t1;
243  }
244} {}
245
246# NULL
247do_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 {} {} {}}
255do_test bind-5.2 {
256  execsql {SELECT typeof(a), typeof(b), typeof(c) FROM t1}
257} {null null null}
258do_test bind-5.3 {
259  execsql {
260    DELETE FROM t1;
261  }
262} {}
263
264# UTF-8 text
265do_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}
273do_test bind-6.2 {
274  execsql {SELECT typeof(a), typeof(b), typeof(c) FROM t1}
275} {text text text}
276do_test bind-6.3 {
277  execsql {
278    DELETE FROM t1;
279  }
280} {}
281
282# Make sure zeros in a string work.
283#
284do_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}
293set enc [db eval {PRAGMA encoding}]
294if {$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  } {}
310}
311do_test bind-6.6 {
312  execsql {SELECT typeof(a), typeof(b), typeof(c) FROM t1}
313} {text text text}
314do_test bind-6.7 {
315  execsql {
316    DELETE FROM t1;
317  }
318} {}
319
320# UTF-16 text
321ifcapable {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}
359do_test bind-7.99 {
360  execsql {DELETE FROM t1;}
361} {}
362
363# Test that the 'out of range' error works.
364do_test bind-8.1 {
365  catch { sqlite3_bind_null $VM 0 }
366} {1}
367do_test bind-8.2 {
368  sqlite3_errmsg $DB
369} {bind or column index out of range}
370ifcapable {utf16} {
371  do_test bind-8.3 {
372    encoding convertfrom unicode [sqlite3_errmsg16 $DB]
373  } {bind or column index out of range}
374}
375do_test bind-8.4 {
376  sqlite3_bind_null $VM 1 
377  sqlite3_errmsg $DB
378} {not an error}
379do_test bind-8.5 {
380  catch { sqlite3_bind_null $VM 4 }
381} {1}
382do_test bind-8.6 {
383  sqlite3_errmsg $DB
384} {bind or column index out of range}
385ifcapable {utf16} {
386  do_test bind-8.7 {
387    encoding convertfrom unicode [sqlite3_errmsg16 $DB]
388  } {bind or column index out of range}
389}
390
391do_test bind-8.8 {
392  catch { sqlite3_bind_blob $VM 0 "abc" 3 }
393} {1}
394do_test bind-8.9 {
395  catch { sqlite3_bind_blob $VM 4 "abc" 3 }
396} {1}
397do_test bind-8.10 {
398  catch { sqlite3_bind_text $VM 0 "abc" 3 }
399} {1}
400ifcapable {utf16} {
401  do_test bind-8.11 {
402    catch { sqlite3_bind_text16 $VM 4 "abc" 2 }
403  } {1}
404}
405do_test bind-8.12 {
406  catch { sqlite3_bind_int $VM 0 5 }
407} {1}
408do_test bind-8.13 {
409  catch { sqlite3_bind_int $VM 4 5 }
410} {1}
411do_test bind-8.14 {
412  catch { sqlite3_bind_double $VM 0 5.0 }
413} {1}
414do_test bind-8.15 {
415  catch { sqlite3_bind_double $VM 4 6.0 }
416} {1}
417
418do_test bind-8.99 {
419  sqlite3_finalize $VM
420} SQLITE_OK
421
422set iMaxVar $SQLITE_MAX_VARIABLE_NUMBER
423set zError "(1) variable number must be between ?1 and ?$iMaxVar"
424do_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]
435do_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]
441do_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
449catch {sqlite3_finalize $VM}
450do_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}]
458catch {sqlite3_finalize $VM}
459do_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
467do_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
474do_test bind-9.6 {
475  sqlite3_finalize $VM
476} SQLITE_OK
477do_test bind-9.7 {
478  execsql {SELECT * FROM t2}
479} {1 999 1000 1001 {} {}}
480
481ifcapable {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}
493ifcapable {!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}
505do_test bind-10.2 {
506  sqlite3_bind_parameter_index $VM :abc
507} 1
508do_test bind-10.3 {
509  sqlite3_bind_parameter_index $VM $v1
510} 2
511do_test bind-10.4 {
512  sqlite3_bind_parameter_index $VM $v2
513} 3
514do_test bind-10.5 {
515  sqlite3_bind_parameter_name $VM 1
516} :abc
517do_test bind-10.6 {
518  sqlite3_bind_parameter_name $VM 2
519} $v1
520do_test bind-10.7 {
521  sqlite3_bind_parameter_name $VM 3
522} $v2
523do_test bind-10.7.1 {
524  sqlite3_bind_parameter_name 0 1   ;# Ignore if VM is NULL
525} {}
526do_test bind-10.7.2 {
527  sqlite3_bind_parameter_name $VM 0 ;# Ignore if index too small
528} {}
529do_test bind-10.7.3 {
530  sqlite3_bind_parameter_name $VM 4 ;# Ignore if index is too big
531} {}
532do_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
538do_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 {}}
545do_test bind-10.9 {
546  sqlite3_finalize $VM
547} SQLITE_OK
548do_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#
554do_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
563do_test bind-10.11.1 {
564  sqlite3_bind_parameter_index 0 :xyz  ;# ignore NULL VM arguments
565} 0
566do_test bind-10.12 {
567  sqlite3_bind_parameter_index $VM :xyz
568} 0
569do_test bind-10.13 {
570  sqlite3_bind_parameter_index $VM {}
571} 0
572do_test bind-10.14 {
573  sqlite3_bind_parameter_index $VM :pqr
574} 5
575do_test bind-10.15 {
576  sqlite3_bind_parameter_index $VM ?4
577} 4
578do_test bind-10.16 {
579  sqlite3_bind_parameter_name $VM 1
580} :abc
581do_test bind-10.17 {
582  sqlite3_bind_parameter_name $VM 2
583} {}
584do_test bind-10.18 {
585  sqlite3_bind_parameter_name $VM 3
586} {}
587do_test bind-10.19 {
588  sqlite3_bind_parameter_name $VM 4
589} {?4}
590do_test bind-10.20 {
591  sqlite3_bind_parameter_name $VM 5
592} :pqr
593catch {sqlite3_finalize $VM}
594
595# Make sure we catch an unterminated "(" in a Tcl-style variable name
596#
597ifcapable 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
603if {[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#
630do_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}
636do_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}
645do_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}
651do_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}
658sqlite3_finalize $VM
659
660#--------------------------------------------------------------------
661# These tests attempt to reproduce bug #3463.
662#
663proc 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
673do_test bind-14.1 {
674  param_names db { SELECT @a, @b }
675} {@a @b}
676do_test bind-14.2 {
677  param_names db { SELECT NULL FROM (SELECT NULL) WHERE @a = @b }
678} {@a @b}
679do_test bind-14.3 {
680  param_names db { SELECT @a FROM (SELECT NULL) WHERE 1 = @b }
681} {@a @b}
682do_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#
689do_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}
706do_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}
723do_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}
740do_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
758finish_test
759