OLD | NEW |
1 # 2008 April 28 | 1 # 2008 April 28 |
2 # | 2 # |
3 # The author disclaims copyright to this source code. In place of | 3 # The author disclaims copyright to this source code. In place of |
4 # a legal notice, here is a blessing: | 4 # a legal notice, here is a blessing: |
5 # | 5 # |
6 # May you do good and not evil. | 6 # May you do good and not evil. |
7 # May you find forgiveness for yourself and forgive others. | 7 # May you find forgiveness for yourself and forgive others. |
8 # May you share freely, never taking more than you give. | 8 # May you share freely, never taking more than you give. |
9 # | 9 # |
10 #*********************************************************************** | 10 #*********************************************************************** |
11 # | 11 # |
12 # Ticket #3060 | 12 # Ticket #3060 |
13 # | 13 # |
14 # Make sure IEEE floating point NaN values are handled properly. | 14 # Make sure IEEE floating point NaN values are handled properly. |
15 # SQLite should always convert NaN into NULL. | 15 # SQLite should always convert NaN into NULL. |
16 # | 16 # |
17 # Also verify that the decimal to IEEE754 binary conversion routines | 17 # Also verify that the decimal to IEEE754 binary conversion routines |
18 # correctly generate 0.0, +Inf, and -Inf as appropriate for numbers | 18 # correctly generate 0.0, +Inf, and -Inf as appropriate for numbers |
19 # out of range. | 19 # out of range. |
20 # | 20 # |
21 # $Id: nan.test,v 1.5 2008/09/18 11:30:13 danielk1977 Exp $ | 21 # $Id: nan.test,v 1.5 2008/09/18 11:30:13 danielk1977 Exp $ |
22 # | 22 # |
23 | 23 |
24 set testdir [file dirname $argv0] | 24 set testdir [file dirname $argv0] |
25 source $testdir/tester.tcl | 25 source $testdir/tester.tcl |
26 | 26 |
| 27 # Do not use a codec for tests in this file, as the database file is |
| 28 # manipulated directly using tcl scripts (using the [hexio_write] command). |
| 29 # |
| 30 do_not_use_codec |
| 31 |
27 do_test nan-1.1.1 { | 32 do_test nan-1.1.1 { |
28 db eval { | 33 db eval { |
29 PRAGMA auto_vacuum=OFF; | 34 PRAGMA auto_vacuum=OFF; |
30 PRAGMA page_size=1024; | 35 PRAGMA page_size=1024; |
31 CREATE TABLE t1(x FLOAT); | 36 CREATE TABLE t1(x FLOAT); |
32 } | 37 } |
33 set ::STMT [sqlite3_prepare db "INSERT INTO t1 VALUES(?)" -1 TAIL] | 38 set ::STMT [sqlite3_prepare db "INSERT INTO t1 VALUES(?)" -1 TAIL] |
34 sqlite3_bind_double $::STMT 1 NaN | 39 sqlite3_bind_double $::STMT 1 NaN |
35 sqlite3_step $::STMT | 40 sqlite3_step $::STMT |
36 sqlite3_reset $::STMT | 41 sqlite3_reset $::STMT |
(...skipping 17 matching lines...) Expand all Loading... |
54 sqlite3_step $::STMT | 59 sqlite3_step $::STMT |
55 sqlite3_reset $::STMT | 60 sqlite3_reset $::STMT |
56 db eval {SELECT x, typeof(x) FROM t1} | 61 db eval {SELECT x, typeof(x) FROM t1} |
57 } {{} null inf real -inf real {} null} | 62 } {{} null inf real -inf real {} null} |
58 do_test nan-1.1.5 { | 63 do_test nan-1.1.5 { |
59 sqlite3_bind_double $::STMT 1 NaN0 | 64 sqlite3_bind_double $::STMT 1 NaN0 |
60 sqlite3_step $::STMT | 65 sqlite3_step $::STMT |
61 sqlite3_reset $::STMT | 66 sqlite3_reset $::STMT |
62 db eval {SELECT x, typeof(x) FROM t1} | 67 db eval {SELECT x, typeof(x) FROM t1} |
63 } {{} null inf real -inf real {} null {} null} | 68 } {{} null inf real -inf real {} null {} null} |
64 do_test nan-1.1.5 { | 69 do_test nan-1.1.6 { |
65 sqlite3_bind_double $::STMT 1 -NaN0 | 70 sqlite3_bind_double $::STMT 1 -NaN0 |
66 sqlite3_step $::STMT | 71 sqlite3_step $::STMT |
67 sqlite3_reset $::STMT | 72 sqlite3_reset $::STMT |
68 db eval {SELECT x, typeof(x) FROM t1} | 73 db eval {SELECT x, typeof(x) FROM t1} |
69 } {{} null inf real -inf real {} null {} null {} null} | 74 } {{} null inf real -inf real {} null {} null {} null} |
70 do_test nan-1.1.6 { | 75 do_test nan-1.1.7 { |
71 db eval { | 76 db eval { |
72 UPDATE t1 SET x=x-x; | 77 UPDATE t1 SET x=x-x; |
73 SELECT x, typeof(x) FROM t1; | 78 SELECT x, typeof(x) FROM t1; |
74 } | 79 } |
75 } {{} null {} null {} null {} null {} null {} null} | 80 } {{} null {} null {} null {} null {} null {} null} |
76 } | 81 } |
77 | 82 |
78 # The following block of tests, nan-1.2.*, are the same as the nan-1.1.* | 83 # The following block of tests, nan-1.2.*, are the same as the nan-1.1.* |
79 # tests above, except that the SELECT queries used to validate data | 84 # tests above, except that the SELECT queries used to validate data |
80 # convert floating point values to text internally before returning them | 85 # convert floating point values to text internally before returning them |
(...skipping 27 matching lines...) Expand all Loading... |
108 sqlite3_step $::STMT | 113 sqlite3_step $::STMT |
109 sqlite3_reset $::STMT | 114 sqlite3_reset $::STMT |
110 db eval {SELECT CAST(x AS text), typeof(x) FROM t1} | 115 db eval {SELECT CAST(x AS text), typeof(x) FROM t1} |
111 } {{} null Inf real -Inf real {} null} | 116 } {{} null Inf real -Inf real {} null} |
112 do_test nan-1.2.5 { | 117 do_test nan-1.2.5 { |
113 sqlite3_bind_double $::STMT 1 NaN0 | 118 sqlite3_bind_double $::STMT 1 NaN0 |
114 sqlite3_step $::STMT | 119 sqlite3_step $::STMT |
115 sqlite3_reset $::STMT | 120 sqlite3_reset $::STMT |
116 db eval {SELECT CAST(x AS text), typeof(x) FROM t1} | 121 db eval {SELECT CAST(x AS text), typeof(x) FROM t1} |
117 } {{} null Inf real -Inf real {} null {} null} | 122 } {{} null Inf real -Inf real {} null {} null} |
118 do_test nan-1.2.5 { | 123 do_test nan-1.2.6 { |
119 sqlite3_bind_double $::STMT 1 -NaN0 | 124 sqlite3_bind_double $::STMT 1 -NaN0 |
120 sqlite3_step $::STMT | 125 sqlite3_step $::STMT |
121 sqlite3_reset $::STMT | 126 sqlite3_reset $::STMT |
122 db eval {SELECT CAST(x AS text), typeof(x) FROM t1} | 127 db eval {SELECT CAST(x AS text), typeof(x) FROM t1} |
123 } {{} null Inf real -Inf real {} null {} null {} null} | 128 } {{} null Inf real -Inf real {} null {} null {} null} |
124 do_test nan-1.2.6 { | 129 do_test nan-1.2.7 { |
125 db eval { | 130 db eval { |
126 UPDATE t1 SET x=x-x; | 131 UPDATE t1 SET x=x-x; |
127 SELECT CAST(x AS text), typeof(x) FROM t1; | 132 SELECT CAST(x AS text), typeof(x) FROM t1; |
128 } | 133 } |
129 } {{} null {} null {} null {} null {} null {} null} | 134 } {{} null {} null {} null {} null {} null {} null} |
130 | 135 |
131 do_test nan-2.1 { | 136 do_test nan-2.1 { |
132 db eval { | 137 db eval { |
133 DELETE FROM T1; | 138 DELETE FROM T1; |
134 } | 139 } |
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
241 db eval {DELETE FROM t1} | 246 db eval {DELETE FROM t1} |
242 db eval "INSERT INTO t1 VALUES([string repeat 9 309].0)" | 247 db eval "INSERT INTO t1 VALUES([string repeat 9 309].0)" |
243 db eval {SELECT CAST(x AS text), typeof(x) FROM t1} | 248 db eval {SELECT CAST(x AS text), typeof(x) FROM t1} |
244 } {Inf real} | 249 } {Inf real} |
245 do_test nan-4.10 { | 250 do_test nan-4.10 { |
246 db eval {DELETE FROM t1} | 251 db eval {DELETE FROM t1} |
247 db eval "INSERT INTO t1 VALUES(-[string repeat 9 309].0)" | 252 db eval "INSERT INTO t1 VALUES(-[string repeat 9 309].0)" |
248 db eval {SELECT CAST(x AS text), typeof(x) FROM t1} | 253 db eval {SELECT CAST(x AS text), typeof(x) FROM t1} |
249 } {-Inf real} | 254 } {-Inf real} |
250 | 255 |
251 do_test nan-4.10 { | 256 do_test nan-4.11 { |
252 db eval {DELETE FROM t1} | 257 db eval {DELETE FROM t1} |
253 db eval "INSERT INTO t1 VALUES(1234.5[string repeat 0 10000]12345)" | 258 db eval "INSERT INTO t1 VALUES(1234.5[string repeat 0 10000]12345)" |
254 db eval {SELECT x, typeof(x) FROM t1} | 259 db eval {SELECT x, typeof(x) FROM t1} |
255 } {1234.5 real} | 260 } {1234.5 real} |
256 do_test nan-4.11 { | 261 do_test nan-4.12 { |
257 db eval {DELETE FROM t1} | 262 db eval {DELETE FROM t1} |
258 db eval "INSERT INTO t1 VALUES(-1234.5[string repeat 0 10000]12345)" | 263 db eval "INSERT INTO t1 VALUES(-1234.5[string repeat 0 10000]12345)" |
259 db eval {SELECT x, typeof(x) FROM t1} | 264 db eval {SELECT x, typeof(x) FROM t1} |
260 } {-1234.5 real} | 265 } {-1234.5 real} |
261 do_test nan-4.12 { | 266 do_test nan-4.13 { |
262 db eval {DELETE FROM t1} | 267 db eval {DELETE FROM t1} |
263 set small [string repeat 0 10000].[string repeat 0 324][string repeat 9 10000] | 268 set small [string repeat 0 10000].[string repeat 0 324][string repeat 9 10000] |
264 db eval "INSERT INTO t1 VALUES($small)" | 269 db eval "INSERT INTO t1 VALUES($small)" |
265 db eval {SELECT x, typeof(x) FROM t1} | 270 db eval {SELECT x, typeof(x) FROM t1} |
266 } {0.0 real} | 271 } {0.0 real} |
267 do_test nan-4.13 { | 272 do_test nan-4.14 { |
268 db eval {DELETE FROM t1} | 273 db eval {DELETE FROM t1} |
269 set small \ | 274 set small \ |
270 -[string repeat 0 10000].[string repeat 0 324][string repeat 9 10000] | 275 -[string repeat 0 10000].[string repeat 0 324][string repeat 9 10000] |
271 db eval "INSERT INTO t1 VALUES($small)" | 276 db eval "INSERT INTO t1 VALUES($small)" |
272 db eval {SELECT x, typeof(x) FROM t1} | 277 db eval {SELECT x, typeof(x) FROM t1} |
273 } {0.0 real} | 278 } {0.0 real} |
274 | 279 |
275 # These tests test some really, really small floating point numbers. | 280 # These tests test some really, really small floating point numbers. |
276 # | 281 # |
277 if {$tcl_platform(platform) != "symbian"} { | 282 if {$tcl_platform(platform) != "symbian"} { |
278 # These two are not run on symbian because tcl has trouble converting | 283 # These two are not run on symbian because tcl has trouble converting |
279 # the very small numbers back to text form (probably due to a difference | 284 # the very small numbers back to text form (probably due to a difference |
280 # in the sprintf() implementation). | 285 # in the sprintf() implementation). |
281 # | 286 # |
282 do_test nan-4.14 { | 287 do_test nan-4.15 { |
283 db eval {DELETE FROM t1} | 288 db eval {DELETE FROM t1} |
284 set small \ | 289 set small \ |
285 [string repeat 0 10000].[string repeat 0 323][string repeat 9 10000] | 290 [string repeat 0 10000].[string repeat 0 323][string repeat 9 10000] |
286 db eval "INSERT INTO t1 VALUES($small)" | 291 db eval "INSERT INTO t1 VALUES($small)" |
287 db eval {SELECT x, typeof(x) FROM t1} | 292 db eval {SELECT x, typeof(x) FROM t1} |
288 } {9.88131291682493e-324 real} | 293 } {9.88131291682493e-324 real} |
289 do_test nan-4.15 { | 294 do_test nan-4.16 { |
290 db eval {DELETE FROM t1} | 295 db eval {DELETE FROM t1} |
291 set small \ | 296 set small \ |
292 -[string repeat 0 10000].[string repeat 0 323][string repeat 9 10000] | 297 -[string repeat 0 10000].[string repeat 0 323][string repeat 9 10000] |
293 db eval "INSERT INTO t1 VALUES($small)" | 298 db eval "INSERT INTO t1 VALUES($small)" |
294 db eval {SELECT x, typeof(x) FROM t1} | 299 db eval {SELECT x, typeof(x) FROM t1} |
295 } {-9.88131291682493e-324 real} | 300 } {-9.88131291682493e-324 real} |
296 } | 301 } |
297 do_test nan-4.16 { | 302 do_test nan-4.17 { |
298 db eval {DELETE FROM t1} | 303 db eval {DELETE FROM t1} |
299 set small [string repeat 0 10000].[string repeat 0 323][string repeat 9 10000] | 304 set small [string repeat 0 10000].[string repeat 0 323][string repeat 9 10000] |
300 db eval "INSERT INTO t1 VALUES($small)" | 305 db eval "INSERT INTO t1 VALUES($small)" |
301 db eval {SELECT CAST(x AS text), typeof(x) FROM t1} | 306 db eval {SELECT CAST(x AS text), typeof(x) FROM t1} |
302 } {9.88131291682493e-324 real} | 307 } {9.88131291682493e-324 real} |
303 do_test nan-4.17 { | 308 do_test nan-4.18 { |
304 db eval {DELETE FROM t1} | 309 db eval {DELETE FROM t1} |
305 set small \ | 310 set small \ |
306 -[string repeat 0 10000].[string repeat 0 323][string repeat 9 10000] | 311 -[string repeat 0 10000].[string repeat 0 323][string repeat 9 10000] |
307 db eval "INSERT INTO t1 VALUES($small)" | 312 db eval "INSERT INTO t1 VALUES($small)" |
308 db eval {SELECT CAST(x AS text), typeof(x) FROM t1} | 313 db eval {SELECT CAST(x AS text), typeof(x) FROM t1} |
309 } {-9.88131291682493e-324 real} | 314 } {-9.88131291682493e-324 real} |
310 | 315 |
311 do_test nan-4.20 { | 316 do_test nan-4.20 { |
312 db eval {DELETE FROM t1} | 317 db eval {DELETE FROM t1} |
313 set big [string repeat 9 10000].0e-9000 | 318 set big [string repeat 9 10000].0e-9000 |
314 db eval "INSERT INTO t1 VALUES($big)" | 319 db eval "INSERT INTO t1 VALUES($big)" |
315 db eval {SELECT x, typeof(x) FROM t1} | 320 db eval {SELECT x, typeof(x) FROM t1} |
316 } {inf real} | 321 } {inf real} |
317 | 322 |
318 | 323 |
319 | 324 |
320 finish_test | 325 finish_test |
OLD | NEW |