Home | History | Annotate | Download | only in test
      1 # 2009 November 11
      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 file is testing built-in functions.
     13 #
     14 
     15 set testdir [file dirname $argv0]
     16 source $testdir/tester.tcl
     17 
     18 # Test plan:
     19 #
     20 #   func2-1.*: substr implementation (ascii)
     21 #   func2-2.*: substr implementation (utf8)
     22 #   func2-3.*: substr implementation (blob)
     23 #
     24 
     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 {}
     31 }
     32 
     33 #----------------------------------------------------------------------------
     34 # Test cases func2-1.*: substr implementation (ascii)
     35 #
     36 
     37 do_test func2-1.1 {
     38   execsql {SELECT 'Supercalifragilisticexpialidocious'}
     39 } {Supercalifragilisticexpialidocious}
     40 
     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()}}
     51 
     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 } {{}}
     74 
     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}
     97 
     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 } {{}}
    129 
    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}
    176 
    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}
    232 
    233 
    234 #----------------------------------------------------------------------------
    235 # Test cases func2-2.*: substr implementation (utf8)
    236 #
    237 
    238 # Only do the following tests if TCL has UTF-8 capabilities
    239 #
    240 if {"\u1234"!="u1234"} {
    241 
    242 do_test func2-2.1.1 {
    243   execsql "SELECT 'hi\u1234ho'"
    244 } "hi\u1234ho"
    245 
    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()}}
    256 
    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"
    278 
    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"
    300 
    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"
    310 
    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"
    323 
    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"
    336 
    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 } {{}}
    346 
    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"
    359 
    360 } ;# End \u1234!=u1234
    361 
    362 #----------------------------------------------------------------------------
    363 # Test cases func2-3.*: substr implementation (blob)
    364 #
    365 
    366 ifcapable {!bloblit} {
    367   finish_test
    368   return
    369 }
    370 
    371 do_test func2-3.1.1 {
    372   set blob [execsql "SELECT x'1234'"]
    373   bin_to_hex [lindex $blob 0]
    374 } "1234"
    375 
    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()}}
    386 
    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"
    403 
    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"
    420 
    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"
    437 
    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"
    454 
    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"
    471 
    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 } {}
    484 
    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 } {}
    497 
    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"
    510 
    511 finish_test
    512