Same fix as r45172 for classes/iconimage:
[AROS-Contrib.git] / sqlite3 / test / bind.test
blobc8349a9890029cfcbf92fbb0a9129b2aed817521
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.31 2005/03/20 23:18:58 drh 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   db close
39   set DB [sqlite3 db test.db]
40   execsql {CREATE TABLE t1(a,b,c);}
41   set VM [sqlite3_prepare $DB {INSERT INTO t1 VALUES(:1,?,:abc)} -1 TAIL]
42   set TAIL
43 } {}
44 do_test bind-1.1.1 {
45   sqlite3_bind_parameter_count $VM
46 } 3
47 do_test bind-1.1.2 {
48   sqlite3_bind_parameter_name $VM 1
49 } {:1}
50 do_test bind-1.1.3 {
51   sqlite3_bind_parameter_name $VM 2
52 } {}
53 do_test bind-1.1.4 {
54   sqlite3_bind_parameter_name $VM 3
55 } {:abc}
56 do_test bind-1.2 {
57   sqlite_step $VM N VALUES COLNAMES
58 } {SQLITE_DONE}
59 do_test bind-1.3 {
60   execsql {SELECT rowid, * FROM t1}
61 } {1 {} {} {}}
62 do_test bind-1.4 {
63   sqlite3_reset $VM
64   sqlite_bind $VM 1 {test value 1} normal
65   sqlite_step $VM N VALUES COLNAMES
66 } SQLITE_DONE
67 do_test bind-1.5 {
68   execsql {SELECT rowid, * FROM t1}
69 } {1 {} {} {} 2 {test value 1} {} {}}
70 do_test bind-1.6 {
71   sqlite3_reset $VM
72   sqlite_bind $VM 3 {'test value 2'} normal
73   sqlite_step $VM N VALUES COLNAMES
74 } SQLITE_DONE
75 do_test bind-1.7 {
76   execsql {SELECT rowid, * FROM t1}
77 } {1 {} {} {} 2 {test value 1} {} {} 3 {test value 1} {} {'test value 2'}}
78 do_test bind-1.8 {
79   sqlite3_reset $VM
80   set sqlite_static_bind_value 123
81   sqlite_bind $VM 1 {} static
82   sqlite_bind $VM 2 {abcdefg} normal
83   sqlite_bind $VM 3 {} null
84   execsql {DELETE FROM t1}
85   sqlite_step $VM N VALUES COLNAMES
86   execsql {SELECT rowid, * FROM t1}
87 } {1 123 abcdefg {}}
88 do_test bind-1.9 {
89   sqlite3_reset $VM
90   sqlite_bind $VM 1 {456} normal
91   sqlite_step $VM N VALUES COLNAMES
92   execsql {SELECT rowid, * FROM t1}
93 } {1 123 abcdefg {} 2 456 abcdefg {}}
95 do_test bind-1.99 {
96   sqlite3_finalize $VM
97 } SQLITE_OK
99 # Prepare the statement in different ways depending on whether or not
100 # the $var processing is compiled into the library.
102 ifcapable {tclvar} {
103   do_test bind-2.1 {
104     execsql {
105       DELETE FROM t1;
106     }
107     set VM [sqlite3_prepare $DB {INSERT INTO t1 VALUES($one,$::two,${x{y}z})}\
108             -1 TX]
109     set TX
110   } {}
111   set v1 {$one}
112   set v2 {$::two}
113   set v3 {${x{y}z}}
115 ifcapable {!tclvar} {
116   do_test bind-2.1 {
117     execsql {
118       DELETE FROM t1;
119     }
120     set VM [sqlite3_prepare $DB {INSERT INTO t1 VALUES(:one,:two,:_)} -1 TX]
121     set TX
122   } {}
123   set v1 {:one}
124   set v2 {:two}
125   set v3 {:_}
128 do_test bind-2.1.1 {
129   sqlite3_bind_parameter_count $VM
130 } 3
131 do_test bind-2.1.2 {
132   sqlite3_bind_parameter_name $VM 1
133 } $v1
134 do_test bind-2.1.3 {
135   sqlite3_bind_parameter_name $VM 2
136 } $v2
137 do_test bind-2.1.4 {
138   sqlite3_bind_parameter_name $VM 3
139 } $v3
140 do_test bind-2.1.5 {
141   sqlite3_bind_parameter_index $VM $v1
142 } 1
143 do_test bind-2.1.6 {
144   sqlite3_bind_parameter_index $VM $v2
145 } 2
146 do_test bind-2.1.7 {
147   sqlite3_bind_parameter_index $VM $v3
148 } 3
149 do_test bind-2.1.8 {
150   sqlite3_bind_parameter_index $VM {:hi}
151 } 0
153 # 32 bit Integers
154 do_test bind-2.2 {
155   sqlite3_bind_int $VM 1 123
156   sqlite3_bind_int $VM 2 456
157   sqlite3_bind_int $VM 3 789
158   sqlite_step $VM N VALUES COLNAMES
159   sqlite3_reset $VM
160   execsql {SELECT rowid, * FROM t1}
161 } {1 123 456 789}
162 do_test bind-2.3 {
163   sqlite3_bind_int $VM 2 -2000000000
164   sqlite3_bind_int $VM 3 2000000000
165   sqlite_step $VM N VALUES COLNAMES
166   sqlite3_reset $VM
167   execsql {SELECT rowid, * FROM t1}
168 } {1 123 456 789 2 123 -2000000000 2000000000}
169 do_test bind-2.4 {
170   execsql {SELECT typeof(a), typeof(b), typeof(c) FROM t1}
171 } {integer integer integer integer integer integer}
172 do_test bind-2.5 {
173   execsql {
174     DELETE FROM t1;
175   }
176 } {}
178 # 64 bit Integers
179 do_test bind-3.1 {
180   sqlite3_bind_int64 $VM 1 32
181   sqlite3_bind_int64 $VM 2 -2000000000000
182   sqlite3_bind_int64 $VM 3 2000000000000
183   sqlite_step $VM N VALUES COLNAMES
184   sqlite3_reset $VM
185   execsql {SELECT rowid, * FROM t1}
186 } {1 32 -2000000000000 2000000000000}
187 do_test bind-3.2 {
188   execsql {SELECT typeof(a), typeof(b), typeof(c) FROM t1}
189 } {integer integer integer}
190 do_test bind-3.3 {
191   execsql {
192     DELETE FROM t1;
193   }
194 } {}
196 # Doubles
197 do_test bind-4.1 {
198   sqlite3_bind_double $VM 1 1234.1234
199   sqlite3_bind_double $VM 2 0.00001
200   sqlite3_bind_double $VM 3 123456789
201   sqlite_step $VM N VALUES COLNAMES
202   sqlite3_reset $VM
203   set x [execsql {SELECT rowid, * FROM t1}]
204   regsub {1e-005} $x {1e-05} y
205   set y
206 } {1 1234.1234 1e-05 123456789.0}
207 do_test bind-4.2 {
208   execsql {SELECT typeof(a), typeof(b), typeof(c) FROM t1}
209 } {real real real}
210 do_test bind-4.3 {
211   execsql {
212     DELETE FROM t1;
213   }
214 } {}
216 # NULL
217 do_test bind-5.1 {
218   sqlite3_bind_null $VM 1
219   sqlite3_bind_null $VM 2
220   sqlite3_bind_null $VM 3 
221   sqlite_step $VM N VALUES COLNAMES
222   sqlite3_reset $VM
223   execsql {SELECT rowid, * FROM t1}
224 } {1 {} {} {}}
225 do_test bind-5.2 {
226   execsql {SELECT typeof(a), typeof(b), typeof(c) FROM t1}
227 } {null null null}
228 do_test bind-5.3 {
229   execsql {
230     DELETE FROM t1;
231   }
232 } {}
234 # UTF-8 text
235 do_test bind-6.1 {
236   sqlite3_bind_text $VM 1 hellothere 5
237   sqlite3_bind_text $VM 2 ".." 1
238   sqlite3_bind_text $VM 3 world -1
239   sqlite_step $VM N VALUES COLNAMES
240   sqlite3_reset $VM
241   execsql {SELECT rowid, * FROM t1}
242 } {1 hello . world}
243 do_test bind-6.2 {
244   execsql {SELECT typeof(a), typeof(b), typeof(c) FROM t1}
245 } {text text text}
246 do_test bind-6.3 {
247   execsql {
248     DELETE FROM t1;
249   }
250 } {}
252 # UTF-16 text
253 ifcapable {utf16} {
254   do_test bind-7.1 {
255     sqlite3_bind_text16 $VM 1 [encoding convertto unicode hellothere] 10
256     sqlite3_bind_text16 $VM 2 [encoding convertto unicode ""] 0
257     sqlite3_bind_text16 $VM 3 [encoding convertto unicode world] 10
258     sqlite_step $VM N VALUES COLNAMES
259     sqlite3_reset $VM
260     execsql {SELECT rowid, * FROM t1}
261   } {1 hello {} world}
262   do_test bind-7.2 {
263     execsql {SELECT typeof(a), typeof(b), typeof(c) FROM t1}
264   } {text text text}
266 do_test bind-7.3 {
267   execsql {
268     DELETE FROM t1;
269   }
270 } {}
272 # Test that the 'out of range' error works.
273 do_test bind-8.1 {
274   catch { sqlite3_bind_null $VM 0 }
275 } {1}
276 do_test bind-8.2 {
277   sqlite3_errmsg $DB
278 } {bind or column index out of range}
279 ifcapable {utf16} {
280   do_test bind-8.3 {
281     encoding convertfrom unicode [sqlite3_errmsg16 $DB]
282   } {bind or column index out of range}
284 do_test bind-8.4 {
285   sqlite3_bind_null $VM 1 
286   sqlite3_errmsg $DB
287 } {not an error}
288 do_test bind-8.5 {
289   catch { sqlite3_bind_null $VM 4 }
290 } {1}
291 do_test bind-8.6 {
292   sqlite3_errmsg $DB
293 } {bind or column index out of range}
294 ifcapable {utf16} {
295   do_test bind-8.7 {
296     encoding convertfrom unicode [sqlite3_errmsg16 $DB]
297   } {bind or column index out of range}
300 do_test bind-8.8 {
301   catch { sqlite3_bind_blob $VM 0 "abc" 3 }
302 } {1}
303 do_test bind-8.9 {
304   catch { sqlite3_bind_blob $VM 4 "abc" 3 }
305 } {1}
306 do_test bind-8.10 {
307   catch { sqlite3_bind_text $VM 0 "abc" 3 }
308 } {1}
309 ifcapable {utf16} {
310   do_test bind-8.11 {
311     catch { sqlite3_bind_text16 $VM 4 "abc" 2 }
312   } {1}
314 do_test bind-8.12 {
315   catch { sqlite3_bind_int $VM 0 5 }
316 } {1}
317 do_test bind-8.13 {
318   catch { sqlite3_bind_int $VM 4 5 }
319 } {1}
320 do_test bind-8.14 {
321   catch { sqlite3_bind_double $VM 0 5.0 }
322 } {1}
323 do_test bind-8.15 {
324   catch { sqlite3_bind_double $VM 4 6.0 }
325 } {1}
327 do_test bind-8.99 {
328   sqlite3_finalize $VM
329 } SQLITE_OK
331 do_test bind-9.1 {
332   execsql {
333     CREATE TABLE t2(a,b,c,d,e,f);
334   }
335   set rc [catch {
336     sqlite3_prepare $DB {
337       INSERT INTO t2(a) VALUES(?0)
338     } -1 TAIL
339   } msg]
340   lappend rc $msg
341 } {1 {(1) variable number must be between ?1 and ?999}}
342 do_test bind-9.2 {
343   set rc [catch {
344     sqlite3_prepare $DB {
345       INSERT INTO t2(a) VALUES(?1000)
346     } -1 TAIL
347   } msg]
348   lappend rc $msg
349 } {1 {(1) variable number must be between ?1 and ?999}}
350 do_test bind-9.3 {
351   set VM [
352     sqlite3_prepare $DB {
353       INSERT INTO t2(a,b) VALUES(?1,?999)
354     } -1 TAIL
355   ]
356   sqlite3_bind_parameter_count $VM
357 } {999}
358 catch {sqlite3_finalize $VM}
359 do_test bind-9.4 {
360   set VM [
361     sqlite3_prepare $DB {
362       INSERT INTO t2(a,b,c,d) VALUES(?1,?999,?,?)
363     } -1 TAIL
364   ]
365   sqlite3_bind_parameter_count $VM
366 } {1001}
367 do_test bind-9.5 {
368   sqlite3_bind_int $VM 1 1
369   sqlite3_bind_int $VM 999 999
370   sqlite3_bind_int $VM 1000 1000
371   sqlite3_bind_int $VM 1001 1001
372   sqlite3_step $VM
373 } SQLITE_DONE
374 do_test bind-9.6 {
375   sqlite3_finalize $VM
376 } SQLITE_OK
377 do_test bind-9.7 {
378   execsql {SELECT * FROM t2}
379 } {1 999 1000 1001 {} {}}
381 ifcapable {tclvar} {
382   do_test bind-10.1 {
383     set VM [
384       sqlite3_prepare $DB {
385         INSERT INTO t2(a,b,c,d,e,f) VALUES(:abc,$abc,:abc,$ab,$abc,:abc)
386       } -1 TAIL
387     ]
388     sqlite3_bind_parameter_count $VM
389   } 3
390   set v1 {$abc}
391   set v2 {$ab}
393 ifcapable {!tclvar} {
394   do_test bind-10.1 {
395     set VM [
396       sqlite3_prepare $DB {
397         INSERT INTO t2(a,b,c,d,e,f) VALUES(:abc,:xyz,:abc,:xy,:xyz,:abc)
398       } -1 TAIL
399     ]
400     sqlite3_bind_parameter_count $VM
401   } 3
402   set v1 {:xyz}
403   set v2 {:xy}
405 do_test bind-10.2 {
406   sqlite3_bind_parameter_index $VM :abc
407 } 1
408 do_test bind-10.3 {
409   sqlite3_bind_parameter_index $VM $v1
410 } 2
411 do_test bind-10.4 {
412   sqlite3_bind_parameter_index $VM $v2
413 } 3
414 do_test bind-10.5 {
415   sqlite3_bind_parameter_name $VM 1
416 } :abc
417 do_test bind-10.6 {
418   sqlite3_bind_parameter_name $VM 2
419 } $v1
420 do_test bind-10.7 {
421   sqlite3_bind_parameter_name $VM 3
422 } $v2
423 do_test bind-10.7.1 {
424   sqlite3_bind_parameter_name 0 1   ;# Ignore if VM is NULL
425 } {}
426 do_test bind-10.7.2 {
427   sqlite3_bind_parameter_name $VM 0 ;# Ignore if index too small
428 } {}
429 do_test bind-10.7.3 {
430   sqlite3_bind_parameter_name $VM 4 ;# Ignore if index is too big
431 } {}
432 do_test bind-10.8 {
433   sqlite3_bind_int $VM 1 1
434   sqlite3_bind_int $VM 2 2
435   sqlite3_bind_int $VM 3 3
436   sqlite3_step $VM
437 } SQLITE_DONE
438 do_test bind-10.8.1 {
439   # Binding attempts after program start should fail
440   set rc [catch {
441     sqlite3_bind_int $VM 1 1
442   } msg]
443   lappend rc $msg
444 } {1 {}}
445 do_test bind-10.9 {
446   sqlite3_finalize $VM
447 } SQLITE_OK
448 do_test bind-10.10 {
449   execsql {SELECT * FROM t2}
450 } {1 999 1000 1001 {} {} 1 2 1 3 2 1}
452 # Ticket #918
454 do_test bind-10.11 {
455   catch {sqlite3_finalize $VM}
456   set VM [
457     sqlite3_prepare $DB {
458       INSERT INTO t2(a,b,c,d,e,f) VALUES(:abc,?,?4,:pqr,:abc,?4)
459     } -1 TAIL
460   ]
461   sqlite3_bind_parameter_count $VM
462 } 5
463 do_test bind-10.11.1 {
464   sqlite3_bind_parameter_index 0 :xyz  ;# ignore NULL VM arguments
465 } 0
466 do_test bind-10.12 {
467   sqlite3_bind_parameter_index $VM :xyz
468 } 0
469 do_test bind-10.13 {
470   sqlite3_bind_parameter_index $VM {}
471 } 0
472 do_test bind-10.14 {
473   sqlite3_bind_parameter_index $VM :pqr
474 } 5
475 do_test bind-10.15 {
476   sqlite3_bind_parameter_index $VM ?4
477 } 4
478 do_test bind-10.16 {
479   sqlite3_bind_parameter_name $VM 1
480 } :abc
481 do_test bind-10.17 {
482   sqlite3_bind_parameter_name $VM 2
483 } {}
484 do_test bind-10.18 {
485   sqlite3_bind_parameter_name $VM 3
486 } {}
487 do_test bind-10.19 {
488   sqlite3_bind_parameter_name $VM 4
489 } {?4}
490 do_test bind-10.20 {
491   sqlite3_bind_parameter_name $VM 5
492 } :pqr
493 catch {sqlite3_finalize $VM}
495 # Make sure we catch an unterminated "(" in a Tcl-style variable name
497 ifcapable tclvar {
498   do_test bind-11.1 {
499     catchsql {SELECT * FROM sqlite_master WHERE name=$abc(123 and sql NOT NULL;}
500   } {1 {unrecognized token: "$abc(123"}}
503 finish_test