OLD | NEW |
| (Empty) |
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_realnum_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_realnum_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_realnum_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_realnum_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_realnum_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 | |
OLD | NEW |