adds recent updates to CHANGELOG.md
[sqlcipher.git] / test / func2.test
blob08ad857509bc1c00354ceb44de2ae2e016317fec
1 # 2009 November 11
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 file is testing built-in functions.
15 set testdir [file dirname $argv0]
16 source $testdir/tester.tcl
18 # Test plan:
20 #   func2-1.*: substr implementation (ascii)
21 #   func2-2.*: substr implementation (utf8)
22 #   func2-3.*: substr implementation (blob)
25 proc bin_to_hex {blob} {
26   set bytes {}
27   binary scan $blob \c* bytes
28   set bytes2 [list]
29   foreach b $bytes {lappend bytes2 [format %02X [expr $b & 0xFF]]}
30   join $bytes2 {}
33 #----------------------------------------------------------------------------
34 # Test cases func2-1.*: substr implementation (ascii)
37 do_test func2-1.1 {
38   execsql {SELECT 'Supercalifragilisticexpialidocious'}
39 } {Supercalifragilisticexpialidocious}
41 # substr(x,y), substr(x,y,z)
42 do_test func2-1.2.1 {
43   catchsql {SELECT SUBSTR()}
44 } {1 {wrong number of arguments to function SUBSTR()}}
45 do_test func2-1.2.2 {
46   catchsql {SELECT SUBSTR('Supercalifragilisticexpialidocious')}
47 } {1 {wrong number of arguments to function SUBSTR()}}
48 do_test func2-1.2.3 {
49   catchsql {SELECT SUBSTR('Supercalifragilisticexpialidocious', 1,1,1)}
50 } {1 {wrong number of arguments to function SUBSTR()}}
52 # p1 is 1-indexed
53 do_test func2-1.3 {
54   execsql {SELECT SUBSTR('Supercalifragilisticexpialidocious', 0)}
55 } {Supercalifragilisticexpialidocious}
56 do_test func2-1.4 {
57   execsql {SELECT SUBSTR('Supercalifragilisticexpialidocious', 1)}
58 } {Supercalifragilisticexpialidocious}
59 do_test func2-1.5 {
60   execsql {SELECT SUBSTR('Supercalifragilisticexpialidocious', 2)}
61 } {upercalifragilisticexpialidocious}
62 do_test func2-1.6 {
63   execsql {SELECT SUBSTR('Supercalifragilisticexpialidocious', 30)}
64 } {cious}
65 do_test func2-1.7 {
66   execsql {SELECT SUBSTR('Supercalifragilisticexpialidocious', 34)}
67 } {s}
68 do_test func2-1.8 {
69   execsql {SELECT SUBSTR('Supercalifragilisticexpialidocious', 35)}
70 } {{}}
71 do_test func2-1.9 {
72   execsql {SELECT SUBSTR('Supercalifragilisticexpialidocious', 36)}
73 } {{}}
75 # if p1<0, start from right
76 do_test func2-1.10 {
77   execsql {SELECT SUBSTR('Supercalifragilisticexpialidocious', -0)}
78 } {Supercalifragilisticexpialidocious}
79 do_test func2-1.11 {
80   execsql {SELECT SUBSTR('Supercalifragilisticexpialidocious', -1)}
81 } {s}
82 do_test func2-1.12 {
83   execsql {SELECT SUBSTR('Supercalifragilisticexpialidocious', -2)}
84 } {us}
85 do_test func2-1.13 {
86   execsql {SELECT SUBSTR('Supercalifragilisticexpialidocious', -30)}
87 } {rcalifragilisticexpialidocious}
88 do_test func2-1.14 {
89   execsql {SELECT SUBSTR('Supercalifragilisticexpialidocious', -34)}
90 } {Supercalifragilisticexpialidocious}
91 do_test func2-1.15 {
92   execsql {SELECT SUBSTR('Supercalifragilisticexpialidocious', -35)}
93 } {Supercalifragilisticexpialidocious}
94 do_test func2-1.16 {
95   execsql {SELECT SUBSTR('Supercalifragilisticexpialidocious', -36)}
96 } {Supercalifragilisticexpialidocious}
98 # p1 is 1-indexed, p2 length to return
99 do_test func2-1.17.1 {
100   execsql {SELECT SUBSTR('Supercalifragilisticexpialidocious', 0, 1)}
101 } {{}}
102 do_test func2-1.17.2 {
103   execsql {SELECT SUBSTR('Supercalifragilisticexpialidocious', 0, 2)}
104 } {S}
105 do_test func2-1.18 {
106   execsql {SELECT SUBSTR('Supercalifragilisticexpialidocious', 1, 1)}
107 } {S}
108 do_test func2-1.19.0 {
109   execsql {SELECT SUBSTR('Supercalifragilisticexpialidocious', 2, 0)}
110 } {{}}
111 do_test func2-1.19.1 {
112   execsql {SELECT SUBSTR('Supercalifragilisticexpialidocious', 2, 1)}
113 } {u}
114 do_test func2-1.19.2 {
115   execsql {SELECT SUBSTR('Supercalifragilisticexpialidocious', 2, 2)}
116 } {up}
117 do_test func2-1.20 {
118   execsql {SELECT SUBSTR('Supercalifragilisticexpialidocious', 30, 1)}
119 } {c}
120 do_test func2-1.21 {
121   execsql {SELECT SUBSTR('Supercalifragilisticexpialidocious', 34, 1)}
122 } {s}
123 do_test func2-1.22 {
124   execsql {SELECT SUBSTR('Supercalifragilisticexpialidocious', 35, 1)}
125 } {{}}
126 do_test func2-1.23 {
127   execsql {SELECT SUBSTR('Supercalifragilisticexpialidocious', 36, 1)}
128 } {{}}
130 # if p1<0, start from right, p2 length to return
131 do_test func2-1.24 {
132   execsql {SELECT SUBSTR('Supercalifragilisticexpialidocious', -0, 1)}
133 } {{}}
134 do_test func2-1.25.0 {
135   execsql {SELECT SUBSTR('Supercalifragilisticexpialidocious', -1, 0)}
136 } {{}}
137 do_test func2-1.25.1 {
138   execsql {SELECT SUBSTR('Supercalifragilisticexpialidocious', -1, 1)}
139 } {s}
140 do_test func2-1.25.2 {
141   execsql {SELECT SUBSTR('Supercalifragilisticexpialidocious', -1, 2)}
142 } {s}
143 do_test func2-1.26 {
144   execsql {SELECT SUBSTR('Supercalifragilisticexpialidocious', -2, 1)}
145 } {u}
146 do_test func2-1.27 {
147   execsql {SELECT SUBSTR('Supercalifragilisticexpialidocious', -30, 1)}
148 } {r}
149 do_test func2-1.28.0 {
150   execsql {SELECT SUBSTR('Supercalifragilisticexpialidocious', -34, 0)}
151 } {{}}
152 do_test func2-1.28.1 {
153   execsql {SELECT SUBSTR('Supercalifragilisticexpialidocious', -34, 1)}
154 } {S}
155 do_test func2-1.28.2 {
156   execsql {SELECT SUBSTR('Supercalifragilisticexpialidocious', -34, 2)}
157 } {Su}
158 do_test func2-1.29.1 {
159   execsql {SELECT SUBSTR('Supercalifragilisticexpialidocious', -35, 1)}
160 } {{}}
161 do_test func2-1.29.2 {
162   execsql {SELECT SUBSTR('Supercalifragilisticexpialidocious', -35, 2)}
163 } {S}
164 do_test func2-1.30.0 {
165   execsql {SELECT SUBSTR('Supercalifragilisticexpialidocious', -36, 0)}
166 } {{}}
167 do_test func2-1.30.1 {
168   execsql {SELECT SUBSTR('Supercalifragilisticexpialidocious', -36, 1)}
169 } {{}}
170 do_test func2-1.30.2 {
171   execsql {SELECT SUBSTR('Supercalifragilisticexpialidocious', -36, 2)}
172 } {{}}
173 do_test func2-1.30.3 {
174   execsql {SELECT SUBSTR('Supercalifragilisticexpialidocious', -36, 3)}
175 } {S}
177 # p1 is 1-indexed, p2 length to return, p2<0 return p2 chars before p1
178 do_test func2-1.31.0 {
179   execsql {SELECT SUBSTR('Supercalifragilisticexpialidocious', 0, 0)}
180 } {{}}
181 do_test func2-1.31.1 {
182   execsql {SELECT SUBSTR('Supercalifragilisticexpialidocious', 0, -1)}
183 } {{}}
184 do_test func2-1.31.2 {
185   execsql {SELECT SUBSTR('Supercalifragilisticexpialidocious', 0, -2)}
186 } {{}}
187 do_test func2-1.32.0 {
188   execsql {SELECT SUBSTR('Supercalifragilisticexpialidocious', 1, 0)}
189 } {{}}
190 do_test func2-1.32.1 {
191   execsql {SELECT SUBSTR('Supercalifragilisticexpialidocious', 1, -1)}
192 } {{}}
193 do_test func2-1.33.0 {
194   execsql {SELECT SUBSTR('Supercalifragilisticexpialidocious', 2, 0)}
195 } {{}}
196 do_test func2-1.33.1 {
197   execsql {SELECT SUBSTR('Supercalifragilisticexpialidocious', 2, -1)}
198 } {S}
199 do_test func2-1.33.2 {
200   execsql {SELECT SUBSTR('Supercalifragilisticexpialidocious', 2, -2)}
201 } {S}
202 do_test func2-1.34.0 {
203   execsql {SELECT SUBSTR('Supercalifragilisticexpialidocious', 3, 0)}
204 } {{}}
205 do_test func2-1.34.1 {
206   execsql {SELECT SUBSTR('Supercalifragilisticexpialidocious', 3, -1)}
207 } {u}
208 do_test func2-1.34.2 {
209   execsql {SELECT SUBSTR('Supercalifragilisticexpialidocious', 3, -2)}
210 } {Su}
211 do_test func2-1.35.1 {
212   execsql {SELECT SUBSTR('Supercalifragilisticexpialidocious', 30, -1)}
213 } {o}
214 do_test func2-1.35.2 {
215   execsql {SELECT SUBSTR('Supercalifragilisticexpialidocious', 30, -2)}
216 } {do}
217 do_test func2-1.36 {
218   execsql {SELECT SUBSTR('Supercalifragilisticexpialidocious', 34, -1)}
219 } {u}
220 do_test func2-1.37 {
221   execsql {SELECT SUBSTR('Supercalifragilisticexpialidocious', 35, -1)}
222 } {s}
223 do_test func2-1.38.0 {
224   execsql {SELECT SUBSTR('Supercalifragilisticexpialidocious', 36, 0)}
225 } {{}}
226 do_test func2-1.38.1 {
227   execsql {SELECT SUBSTR('Supercalifragilisticexpialidocious', 36, -1)}
228 } {{}}
229 do_test func2-1.38.2 {
230   execsql {SELECT SUBSTR('Supercalifragilisticexpialidocious', 36, -2)}
231 } {s}
234 #----------------------------------------------------------------------------
235 # Test cases func2-2.*: substr implementation (utf8)
238 # Only do the following tests if TCL has UTF-8 capabilities
240 if {"\u1234"!="u1234"} {
242 do_test func2-2.1.1 {
243   execsql "SELECT 'hi\u1234ho'"
244 } "hi\u1234ho"
246 # substr(x,y), substr(x,y,z)
247 do_test func2-2.1.2 {
248   catchsql "SELECT SUBSTR()"
249 } {1 {wrong number of arguments to function SUBSTR()}}
250 do_test func2-2.1.3 {
251   catchsql "SELECT SUBSTR('hi\u1234ho')"
252 } {1 {wrong number of arguments to function SUBSTR()}}
253 do_test func2-2.1.4 {
254   catchsql "SELECT SUBSTR('hi\u1234ho', 1,1,1)"
255 } {1 {wrong number of arguments to function SUBSTR()}}
257 do_test func2-2.2.0 {
258   execsql "SELECT SUBSTR('hi\u1234ho', 0, 0)"
259 } {{}}
260 do_test func2-2.2.1 {
261   execsql "SELECT SUBSTR('hi\u1234ho', 0, 1)"
262 } {{}}
263 do_test func2-2.2.2 {
264   execsql "SELECT SUBSTR('hi\u1234ho', 0, 2)"
265 } "h"
266 do_test func2-2.2.3 {
267   execsql "SELECT SUBSTR('hi\u1234ho', 0, 3)"
268 } "hi"
269 do_test func2-2.2.4 {
270   execsql "SELECT SUBSTR('hi\u1234ho', 0, 4)"
271 } "hi\u1234"
272 do_test func2-2.2.5 {
273   execsql "SELECT SUBSTR('hi\u1234ho', 0, 5)"
274 } "hi\u1234h"
275 do_test func2-2.2.6 {
276   execsql "SELECT SUBSTR('hi\u1234ho', 0, 6)"
277 } "hi\u1234ho"
279 do_test func2-2.3.0 {
280   execsql "SELECT SUBSTR('hi\u1234ho', 1, 0)"
281 } {{}}
282 do_test func2-2.3.1 {
283   execsql "SELECT SUBSTR('hi\u1234ho', 1, 1)"
284 } "h"
285 do_test func2-2.3.2 {
286   execsql "SELECT SUBSTR('hi\u1234ho', 1, 2)"
287 } "hi"
288 do_test func2-2.3.3 {
289   execsql "SELECT SUBSTR('hi\u1234ho', 1, 3)"
290 } "hi\u1234"
291 do_test func2-2.3.4 {
292   execsql "SELECT SUBSTR('hi\u1234ho', 1, 4)"
293 } "hi\u1234h"
294 do_test func2-2.3.5 {
295   execsql "SELECT SUBSTR('hi\u1234ho', 1, 5)"
296 } "hi\u1234ho"
297 do_test func2-2.3.6 {
298   execsql "SELECT SUBSTR('hi\u1234ho', 1, 6)"
299 } "hi\u1234ho"
301 do_test func2-2.4.0 {
302   execsql "SELECT SUBSTR('hi\u1234ho', 3, 0)"
303 } {{}}
304 do_test func2-2.4.1 {
305   execsql "SELECT SUBSTR('hi\u1234ho', 3, 1)"
306 } "\u1234"
307 do_test func2-2.4.2 {
308   execsql "SELECT SUBSTR('hi\u1234ho', 3, 2)"
309 } "\u1234h"
311 do_test func2-2.5.0 {
312   execsql "SELECT SUBSTR('\u1234', 0, 0)"
313 } {{}}
314 do_test func2-2.5.1 {
315   execsql "SELECT SUBSTR('\u1234', 0, 1)"
316 } {{}}
317 do_test func2-2.5.2 {
318   execsql "SELECT SUBSTR('\u1234', 0, 2)"
319 } "\u1234"
320 do_test func2-2.5.3 {
321   execsql "SELECT SUBSTR('\u1234', 0, 3)"
322 } "\u1234"
324 do_test func2-2.6.0 {
325   execsql "SELECT SUBSTR('\u1234', 1, 0)"
326 } {{}}
327 do_test func2-2.6.1 {
328   execsql "SELECT SUBSTR('\u1234', 1, 1)"
329 } "\u1234"
330 do_test func2-2.6.2 {
331   execsql "SELECT SUBSTR('\u1234', 1, 2)"
332 } "\u1234"
333 do_test func2-2.6.3 {
334   execsql "SELECT SUBSTR('\u1234', 1, 3)"
335 } "\u1234"
337 do_test func2-2.7.0 {
338   execsql "SELECT SUBSTR('\u1234', 2, 0)"
339 } {{}}
340 do_test func2-2.7.1 {
341   execsql "SELECT SUBSTR('\u1234', 2, 1)"
342 } {{}}
343 do_test func2-2.7.2 {
344   execsql "SELECT SUBSTR('\u1234', 2, 2)"
345 } {{}}
347 do_test func2-2.8.0 {
348   execsql "SELECT SUBSTR('\u1234', -1, 0)"
349 } {{}}
350 do_test func2-2.8.1 {
351   execsql "SELECT SUBSTR('\u1234', -1, 1)"
352 } "\u1234"
353 do_test func2-2.8.2 {
354   execsql "SELECT SUBSTR('\u1234', -1, 2)"
355 } "\u1234"
356 do_test func2-2.8.3 {
357   execsql "SELECT SUBSTR('\u1234', -1, 3)"
358 } "\u1234"
360 } ;# End \u1234!=u1234
362 #----------------------------------------------------------------------------
363 # Test cases func2-3.*: substr implementation (blob)
366 ifcapable {!bloblit} {
367   finish_test
368   return
371 do_test func2-3.1.1 {
372   set blob [execsql "SELECT x'1234'"]
373   bin_to_hex [lindex $blob 0]
374 } "1234"
376 # substr(x,y), substr(x,y,z)
377 do_test func2-3.1.2 {
378   catchsql {SELECT SUBSTR()}
379 } {1 {wrong number of arguments to function SUBSTR()}}
380 do_test func2-3.1.3 {
381   catchsql {SELECT SUBSTR(x'1234')}
382 } {1 {wrong number of arguments to function SUBSTR()}}
383 do_test func2-3.1.4 {
384   catchsql {SELECT SUBSTR(x'1234', 1,1,1)}
385 } {1 {wrong number of arguments to function SUBSTR()}}
387 do_test func2-3.2.0 {
388   set blob [execsql "SELECT SUBSTR(x'1234', 0, 0)"]
389   bin_to_hex [lindex $blob 0]
390 } {}
391 do_test func2-3.2.1 {
392   set blob [execsql "SELECT SUBSTR(x'1234', 0, 1)"]
393   bin_to_hex [lindex $blob 0]
394 } {}
395 do_test func2-3.2.2 {
396   set blob [execsql "SELECT SUBSTR(x'1234', 0, 2)"]
397   bin_to_hex [lindex $blob 0]
398 } "12"
399 do_test func2-3.2.3 {
400   set blob [execsql "SELECT SUBSTR(x'1234', 0, 3)"]
401   bin_to_hex [lindex $blob 0]
402 } "1234"
404 do_test func2-3.3.0 {
405   set blob [execsql "SELECT SUBSTR(x'1234', 1, 0)"]
406   bin_to_hex [lindex $blob 0]
407 } {}
408 do_test func2-3.3.1 {
409   set blob [execsql "SELECT SUBSTR(x'1234', 1, 1)"]
410   bin_to_hex [lindex $blob 0]
411 } "12"
412 do_test func2-3.3.2 {
413   set blob [execsql "SELECT SUBSTR(x'1234', 1, 2)"]
414   bin_to_hex [lindex $blob 0]
415 } "1234"
416 do_test func2-3.3.3 {
417   set blob [execsql "SELECT SUBSTR(x'1234', 1, 3)"]
418   bin_to_hex [lindex $blob 0]
419 } "1234"
421 do_test func2-3.4.0 {
422   set blob [execsql "SELECT SUBSTR(x'1234', -1, 0)"]
423   bin_to_hex [lindex $blob 0]
424 } {}
425 do_test func2-3.4.1 {
426   set blob [execsql "SELECT SUBSTR(x'1234', -1, 1)"]
427   bin_to_hex [lindex $blob 0]
428 } "34"
429 do_test func2-3.4.2 {
430   set blob [execsql "SELECT SUBSTR(x'1234', -1, 2)"]
431   bin_to_hex [lindex $blob 0]
432 } "34"
433 do_test func2-3.4.3 {
434   set blob [execsql "SELECT SUBSTR(x'1234', -1, 3)"]
435   bin_to_hex [lindex $blob 0]
436 } "34"
438 do_test func2-3.5.0 {
439   set blob [execsql "SELECT SUBSTR(x'1234', -2, 0)"]
440   bin_to_hex [lindex $blob 0]
441 } {}
442 do_test func2-3.5.1 {
443   set blob [execsql "SELECT SUBSTR(x'1234', -2, 1)"]
444   bin_to_hex [lindex $blob 0]
445 } "12"
446 do_test func2-3.5.2 {
447   set blob [execsql "SELECT SUBSTR(x'1234', -2, 2)"]
448   bin_to_hex [lindex $blob 0]
449 } "1234"
450 do_test func2-3.5.3 {
451   set blob [execsql "SELECT SUBSTR(x'1234', -2, 3)"]
452   bin_to_hex [lindex $blob 0]
453 } "1234"
455 do_test func2-3.6.0 {
456   set blob [execsql "SELECT SUBSTR(x'1234', -1, 0)"]
457   bin_to_hex [lindex $blob 0]
458 } {}
459 do_test func2-3.6.1 {
460   set blob [execsql "SELECT SUBSTR(x'1234', -1, -1)"]
461   bin_to_hex [lindex $blob 0]
462 } "12"
463 do_test func2-3.6.2 {
464   set blob [execsql "SELECT SUBSTR(x'1234', -1, -2)"]
465   bin_to_hex [lindex $blob 0]
466 } "12"
467 do_test func2-3.6.3 {
468   set blob [execsql "SELECT SUBSTR(x'1234', -1, -3)"]
469   bin_to_hex [lindex $blob 0]
470 } "12"
472 do_test func2-3.7.0 {
473   set blob [execsql "SELECT SUBSTR(x'1234', -2, 0)"]
474   bin_to_hex [lindex $blob 0]
475 } {}
476 do_test func2-3.7.1 {
477   set blob [execsql "SELECT SUBSTR(x'1234', -2, -1)"]
478   bin_to_hex [lindex $blob 0]
479 } {}
480 do_test func2-3.7.2 {
481   set blob [execsql "SELECT SUBSTR(x'1234', -2, -2)"]
482   bin_to_hex [lindex $blob 0]
483 } {}
485 do_test func2-3.8.0 {
486   set blob [execsql "SELECT SUBSTR(x'1234', 1, 0)"]
487   bin_to_hex [lindex $blob 0]
488 } {}
489 do_test func2-3.8.1 {
490   set blob [execsql "SELECT SUBSTR(x'1234', 1, -1)"]
491   bin_to_hex [lindex $blob 0]
492 } {}
493 do_test func2-3.8.2 {
494   set blob [execsql "SELECT SUBSTR(x'1234', 1, -2)"]
495   bin_to_hex [lindex $blob 0]
496 } {}
498 do_test func2-3.9.0 {
499   set blob [execsql "SELECT SUBSTR(x'1234', 2, 0)"]
500   bin_to_hex [lindex $blob 0]
501 } {}
502 do_test func2-3.9.1 {
503   set blob [execsql "SELECT SUBSTR(x'1234', 2, -1)"]
504   bin_to_hex [lindex $blob 0]
505 } "12"
506 do_test func2-3.9.2 {
507   set blob [execsql "SELECT SUBSTR(x'1234', 2, -2)"]
508   bin_to_hex [lindex $blob 0]
509 } "12"
511 finish_test