Home | History | Annotate | Download | only in test
      1 # 2005 June 25
      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 the CAST operator.
     13 #
     14 # $Id: cast.test,v 1.10 2008/11/06 15:33:04 drh Exp $
     15 
     16 set testdir [file dirname $argv0]
     17 source $testdir/tester.tcl
     18 
     19 # Only run these tests if the build includes the CAST operator
     20 ifcapable !cast {
     21   finish_test
     22   return
     23 }
     24 
     25 # Tests for the CAST( AS blob), CAST( AS text) and CAST( AS numeric) built-ins
     26 #
     27 ifcapable bloblit {
     28   do_test cast-1.1 {
     29     execsql {SELECT x'616263'}
     30   } abc
     31   do_test cast-1.2 {
     32     execsql {SELECT typeof(x'616263')}
     33   } blob
     34   do_test cast-1.3 {
     35     execsql {SELECT CAST(x'616263' AS text)}
     36   } abc
     37   do_test cast-1.4 {
     38     execsql {SELECT typeof(CAST(x'616263' AS text))}
     39   } text
     40   do_test cast-1.5 {
     41     execsql {SELECT CAST(x'616263' AS numeric)}
     42   } 0
     43   do_test cast-1.6 {
     44     execsql {SELECT typeof(CAST(x'616263' AS numeric))}
     45   } integer
     46   do_test cast-1.7 {
     47     execsql {SELECT CAST(x'616263' AS blob)}
     48   } abc
     49   do_test cast-1.8 {
     50     execsql {SELECT typeof(CAST(x'616263' AS blob))}
     51   } blob
     52   do_test cast-1.9 {
     53     execsql {SELECT CAST(x'616263' AS integer)}
     54   } 0
     55   do_test cast-1.10 {
     56     execsql {SELECT typeof(CAST(x'616263' AS integer))}
     57   } integer
     58 }
     59 do_test cast-1.11 {
     60   execsql {SELECT null}
     61 } {{}}
     62 do_test cast-1.12 {
     63   execsql {SELECT typeof(NULL)}
     64 } null
     65 do_test cast-1.13 {
     66   execsql {SELECT CAST(NULL AS text)}
     67 } {{}}
     68 do_test cast-1.14 {
     69   execsql {SELECT typeof(CAST(NULL AS text))}
     70 } null
     71 do_test cast-1.15 {
     72   execsql {SELECT CAST(NULL AS numeric)}
     73 } {{}}
     74 do_test cast-1.16 {
     75   execsql {SELECT typeof(CAST(NULL AS numeric))}
     76 } null
     77 do_test cast-1.17 {
     78   execsql {SELECT CAST(NULL AS blob)}
     79 } {{}}
     80 do_test cast-1.18 {
     81   execsql {SELECT typeof(CAST(NULL AS blob))}
     82 } null
     83 do_test cast-1.19 {
     84   execsql {SELECT CAST(NULL AS integer)}
     85 } {{}}
     86 do_test cast-1.20 {
     87   execsql {SELECT typeof(CAST(NULL AS integer))}
     88 } null
     89 do_test cast-1.21 {
     90   execsql {SELECT 123}
     91 } {123}
     92 do_test cast-1.22 {
     93   execsql {SELECT typeof(123)}
     94 } integer
     95 do_test cast-1.23 {
     96   execsql {SELECT CAST(123 AS text)}
     97 } {123}
     98 do_test cast-1.24 {
     99   execsql {SELECT typeof(CAST(123 AS text))}
    100 } text
    101 do_test cast-1.25 {
    102   execsql {SELECT CAST(123 AS numeric)}
    103 } 123
    104 do_test cast-1.26 {
    105   execsql {SELECT typeof(CAST(123 AS numeric))}
    106 } integer
    107 do_test cast-1.27 {
    108   execsql {SELECT CAST(123 AS blob)}
    109 } {123}
    110 do_test cast-1.28 {
    111   execsql {SELECT typeof(CAST(123 AS blob))}
    112 } blob
    113 do_test cast-1.29 {
    114   execsql {SELECT CAST(123 AS integer)}
    115 } {123}
    116 do_test cast-1.30 {
    117   execsql {SELECT typeof(CAST(123 AS integer))}
    118 } integer
    119 do_test cast-1.31 {
    120   execsql {SELECT 123.456}
    121 } {123.456}
    122 do_test cast-1.32 {
    123   execsql {SELECT typeof(123.456)}
    124 } real
    125 do_test cast-1.33 {
    126   execsql {SELECT CAST(123.456 AS text)}
    127 } {123.456}
    128 do_test cast-1.34 {
    129   execsql {SELECT typeof(CAST(123.456 AS text))}
    130 } text
    131 do_test cast-1.35 {
    132   execsql {SELECT CAST(123.456 AS numeric)}
    133 } 123.456
    134 do_test cast-1.36 {
    135   execsql {SELECT typeof(CAST(123.456 AS numeric))}
    136 } real
    137 do_test cast-1.37 {
    138   execsql {SELECT CAST(123.456 AS blob)}
    139 } {123.456}
    140 do_test cast-1.38 {
    141   execsql {SELECT typeof(CAST(123.456 AS blob))}
    142 } blob
    143 do_test cast-1.39 {
    144   execsql {SELECT CAST(123.456 AS integer)}
    145 } {123}
    146 do_test cast-1.38 {
    147   execsql {SELECT typeof(CAST(123.456 AS integer))}
    148 } integer
    149 do_test cast-1.41 {
    150   execsql {SELECT '123abc'}
    151 } {123abc}
    152 do_test cast-1.42 {
    153   execsql {SELECT typeof('123abc')}
    154 } text
    155 do_test cast-1.43 {
    156   execsql {SELECT CAST('123abc' AS text)}
    157 } {123abc}
    158 do_test cast-1.44 {
    159   execsql {SELECT typeof(CAST('123abc' AS text))}
    160 } text
    161 do_test cast-1.45 {
    162   execsql {SELECT CAST('123abc' AS numeric)}
    163 } 123
    164 do_test cast-1.46 {
    165   execsql {SELECT typeof(CAST('123abc' AS numeric))}
    166 } integer
    167 do_test cast-1.47 {
    168   execsql {SELECT CAST('123abc' AS blob)}
    169 } {123abc}
    170 do_test cast-1.48 {
    171   execsql {SELECT typeof(CAST('123abc' AS blob))}
    172 } blob
    173 do_test cast-1.49 {
    174   execsql {SELECT CAST('123abc' AS integer)}
    175 } 123
    176 do_test cast-1.50 {
    177   execsql {SELECT typeof(CAST('123abc' AS integer))}
    178 } integer
    179 do_test cast-1.51 {
    180   execsql {SELECT CAST('123.5abc' AS numeric)}
    181 } 123.5
    182 do_test cast-1.53 {
    183   execsql {SELECT CAST('123.5abc' AS integer)}
    184 } 123
    185 
    186 do_test case-1.60 {
    187   execsql {SELECT CAST(null AS REAL)}
    188 } {{}}
    189 do_test case-1.61 {
    190   execsql {SELECT typeof(CAST(null AS REAL))}
    191 } {null}
    192 do_test case-1.62 {
    193   execsql {SELECT CAST(1 AS REAL)}
    194 } {1.0}
    195 do_test case-1.63 {
    196   execsql {SELECT typeof(CAST(1 AS REAL))}
    197 } {real}
    198 do_test case-1.64 {
    199   execsql {SELECT CAST('1' AS REAL)}
    200 } {1.0}
    201 do_test case-1.65 {
    202   execsql {SELECT typeof(CAST('1' AS REAL))}
    203 } {real}
    204 do_test case-1.66 {
    205   execsql {SELECT CAST('abc' AS REAL)}
    206 } {0.0}
    207 do_test case-1.67 {
    208   execsql {SELECT typeof(CAST('abc' AS REAL))}
    209 } {real}
    210 do_test case-1.68 {
    211   execsql {SELECT CAST(x'31' AS REAL)}
    212 } {1.0}
    213 do_test case-1.69 {
    214   execsql {SELECT typeof(CAST(x'31' AS REAL))}
    215 } {real}
    216 
    217 
    218 # Ticket #1662.  Ignore leading spaces in numbers when casting.
    219 #
    220 do_test cast-2.1 {
    221   execsql {SELECT CAST('   123' AS integer)}
    222 } 123
    223 do_test cast-2.2 {
    224   execsql {SELECT CAST('   -123.456' AS real)}
    225 } -123.456
    226 
    227 # ticket #2364.  Use full percision integers if possible when casting
    228 # to numeric.  Do not fallback to real (and the corresponding 48-bit
    229 # mantissa) unless absolutely necessary.
    230 #
    231 do_test cast-3.1 {
    232   execsql {SELECT CAST(9223372036854774800 AS integer)}
    233 } 9223372036854774800
    234 do_test cast-3.2 {
    235   execsql {SELECT CAST(9223372036854774800 AS numeric)}
    236 } 9223372036854774800
    237 do_test cast-3.3 {
    238   execsql {SELECT CAST(9223372036854774800 AS real)}
    239 } 9.22337203685477e+18
    240 do_test cast-3.4 {
    241   execsql {SELECT CAST(CAST(9223372036854774800 AS real) AS integer)}
    242 } 9223372036854774784
    243 do_test cast-3.5 {
    244   execsql {SELECT CAST(-9223372036854774800 AS integer)}
    245 } -9223372036854774800
    246 do_test cast-3.6 {
    247   execsql {SELECT CAST(-9223372036854774800 AS numeric)}
    248 } -9223372036854774800
    249 do_test cast-3.7 {
    250   execsql {SELECT CAST(-9223372036854774800 AS real)}
    251 } -9.22337203685477e+18
    252 do_test cast-3.8 {
    253   execsql {SELECT CAST(CAST(-9223372036854774800 AS real) AS integer)}
    254 } -9223372036854774784
    255 do_test cast-3.11 {
    256   execsql {SELECT CAST('9223372036854774800' AS integer)}
    257 } 9223372036854774800
    258 do_test cast-3.12 {
    259   execsql {SELECT CAST('9223372036854774800' AS numeric)}
    260 } 9223372036854774800
    261 do_test cast-3.13 {
    262   execsql {SELECT CAST('9223372036854774800' AS real)}
    263 } 9.22337203685477e+18
    264 ifcapable long_double {
    265   do_test cast-3.14 {
    266     execsql {SELECT CAST(CAST('9223372036854774800' AS real) AS integer)}
    267   } 9223372036854774784
    268 }
    269 do_test cast-3.15 {
    270   execsql {SELECT CAST('-9223372036854774800' AS integer)}
    271 } -9223372036854774800
    272 do_test cast-3.16 {
    273   execsql {SELECT CAST('-9223372036854774800' AS numeric)}
    274 } -9223372036854774800
    275 do_test cast-3.17 {
    276   execsql {SELECT CAST('-9223372036854774800' AS real)}
    277 } -9.22337203685477e+18
    278 ifcapable long_double {
    279   do_test cast-3.18 {
    280     execsql {SELECT CAST(CAST('-9223372036854774800' AS real) AS integer)}
    281   } -9223372036854774784
    282 }
    283 if {[db eval {PRAGMA encoding}]=="UTF-8"} {
    284   do_test cast-3.21 {
    285     execsql {SELECT CAST(x'39323233333732303336383534373734383030' AS integer)}
    286   } 9223372036854774800
    287   do_test cast-3.22 {
    288     execsql {SELECT CAST(x'39323233333732303336383534373734383030' AS numeric)}
    289   } 9223372036854774800
    290   do_test cast-3.23 {
    291     execsql {SELECT CAST(x'39323233333732303336383534373734383030' AS real)}
    292   } 9.22337203685477e+18
    293   ifcapable long_double {
    294     do_test cast-3.24 {
    295       execsql {
    296         SELECT CAST(CAST(x'39323233333732303336383534373734383030' AS real)
    297                     AS integer)
    298       }
    299     } 9223372036854774784
    300   }
    301 }
    302 do_test case-3.31 {
    303   execsql {SELECT CAST(NULL AS numeric)}
    304 } {{}}
    305 
    306 # Test to see if it is possible to trick SQLite into reading past 
    307 # the end of a blob when converting it to a number.
    308 do_test cast-3.32.1 {
    309   set blob "1234567890"
    310   set DB [sqlite3_connection_pointer db]
    311   set ::STMT [sqlite3_prepare $DB {SELECT CAST(? AS real)} -1 TAIL]
    312   sqlite3_bind_blob -static $::STMT 1 $blob 5
    313   sqlite3_step $::STMT
    314 } {SQLITE_ROW}
    315 do_test cast-3.32.2 {
    316   sqlite3_column_int $::STMT 0
    317 } {12345}
    318 do_test cast-3.32.3 {
    319   sqlite3_finalize $::STMT
    320 } {SQLITE_OK}
    321 
    322 
    323 do_test cast-4.1 {
    324   db eval {
    325     CREATE TABLE t1(a);
    326     INSERT INTO t1 VALUES('abc');
    327     SELECT a, CAST(a AS integer) FROM t1;
    328   }
    329 } {abc 0}
    330 do_test cast-4.2 {
    331   db eval {
    332     SELECT CAST(a AS integer), a FROM t1;
    333   }
    334 } {0 abc}
    335 do_test cast-4.3 {
    336   db eval {
    337     SELECT a, CAST(a AS integer), a FROM t1;
    338   }
    339 } {abc 0 abc}
    340 do_test cast-4.4 {
    341   db eval {
    342     SELECT CAST(a AS integer), a, CAST(a AS real), a FROM t1;
    343   }
    344 } {0 abc 0.0 abc}
    345 
    346 finish_test
    347