1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2 +++ b/os/persistentdata/persistentstorage/sqlite3api/TEST/TclScript/nan.test Fri Jun 15 03:10:57 2012 +0200
1.3 @@ -0,0 +1,329 @@
1.4 +# 2008 April 28
1.5 +#
1.6 +# Portions Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiaries. All rights reserved.
1.7 +#
1.8 +# The author disclaims copyright to this source code. In place of
1.9 +# a legal notice, here is a blessing:
1.10 +#
1.11 +# May you do good and not evil.
1.12 +# May you find forgiveness for yourself and forgive others.
1.13 +# May you share freely, never taking more than you give.
1.14 +#
1.15 +#***********************************************************************
1.16 +#
1.17 +# Ticket #3060
1.18 +#
1.19 +# Make sure IEEE floating point NaN values are handled properly.
1.20 +# SQLite should always convert NaN into NULL.
1.21 +#
1.22 +# Also verify that the decimal to IEEE754 binary conversion routines
1.23 +# correctly generate 0.0, +Inf, and -Inf as appropriate for numbers
1.24 +# out of range.
1.25 +#
1.26 +# $Id: nan.test,v 1.5 2008/09/18 11:30:13 danielk1977 Exp $
1.27 +#
1.28 +
1.29 +set testdir [file dirname $argv0]
1.30 +source $testdir/tester.tcl
1.31 +
1.32 +do_test nan-1.1.1 {
1.33 + db eval {
1.34 + PRAGMA auto_vacuum=OFF;
1.35 + PRAGMA page_size=1024;
1.36 + CREATE TABLE t1(x FLOAT);
1.37 + }
1.38 + set ::STMT [sqlite3_prepare db "INSERT INTO t1 VALUES(?)" -1 TAIL]
1.39 + sqlite3_bind_double $::STMT 1 NaN
1.40 + sqlite3_step $::STMT
1.41 + sqlite3_reset $::STMT
1.42 + db eval {SELECT x, typeof(x) FROM t1}
1.43 +} {{} null}
1.44 +if {$tcl_platform(platform) != "symbian"} {
1.45 + do_test nan-1.1.2 {
1.46 + sqlite3_bind_double $::STMT 1 +Inf
1.47 + sqlite3_step $::STMT
1.48 + sqlite3_reset $::STMT
1.49 + db eval {SELECT x, typeof(x) FROM t1}
1.50 + } {{} null inf real}
1.51 + do_test nan-1.1.3 {
1.52 + sqlite3_bind_double $::STMT 1 -Inf
1.53 + sqlite3_step $::STMT
1.54 + sqlite3_reset $::STMT
1.55 + db eval {SELECT x, typeof(x) FROM t1}
1.56 + } {{} null inf real -inf real}
1.57 + do_test nan-1.1.4 {
1.58 + sqlite3_bind_double $::STMT 1 -NaN
1.59 + sqlite3_step $::STMT
1.60 + sqlite3_reset $::STMT
1.61 + db eval {SELECT x, typeof(x) FROM t1}
1.62 + } {{} null inf real -inf real {} null}
1.63 + do_test nan-1.1.5 {
1.64 + sqlite3_bind_double $::STMT 1 NaN0
1.65 + sqlite3_step $::STMT
1.66 + sqlite3_reset $::STMT
1.67 + db eval {SELECT x, typeof(x) FROM t1}
1.68 + } {{} null inf real -inf real {} null {} null}
1.69 + do_test nan-1.1.5 {
1.70 + sqlite3_bind_double $::STMT 1 -NaN0
1.71 + sqlite3_step $::STMT
1.72 + sqlite3_reset $::STMT
1.73 + db eval {SELECT x, typeof(x) FROM t1}
1.74 + } {{} null inf real -inf real {} null {} null {} null}
1.75 + do_test nan-1.1.6 {
1.76 + db eval {
1.77 + UPDATE t1 SET x=x-x;
1.78 + SELECT x, typeof(x) FROM t1;
1.79 + }
1.80 + } {{} null {} null {} null {} null {} null {} null}
1.81 +}
1.82 +
1.83 +# The following block of tests, nan-1.2.*, are the same as the nan-1.1.*
1.84 +# tests above, except that the SELECT queries used to validate data
1.85 +# convert floating point values to text internally before returning them
1.86 +# to Tcl. This allows the tests to be run on platforms where Tcl has
1.87 +# problems converting "inf" and "-inf" from floating point to text format.
1.88 +# It also tests the internal float->text conversion routines a bit.
1.89 +#
1.90 +do_test nan-1.2.1 {
1.91 + db eval {
1.92 + DELETE FROM T1;
1.93 + }
1.94 + sqlite3_bind_double $::STMT 1 NaN
1.95 + sqlite3_step $::STMT
1.96 + sqlite3_reset $::STMT
1.97 + db eval {SELECT CAST(x AS text), typeof(x) FROM t1}
1.98 +} {{} null}
1.99 +do_test nan-1.2.2 {
1.100 + sqlite3_bind_double $::STMT 1 +Inf
1.101 + sqlite3_step $::STMT
1.102 + sqlite3_reset $::STMT
1.103 + db eval {SELECT CAST(x AS text), typeof(x) FROM t1}
1.104 +} {{} null Inf real}
1.105 +do_test nan-1.2.3 {
1.106 + sqlite3_bind_double $::STMT 1 -Inf
1.107 + sqlite3_step $::STMT
1.108 + sqlite3_reset $::STMT
1.109 + db eval {SELECT CAST(x AS text), typeof(x) FROM t1}
1.110 +} {{} null Inf real -Inf real}
1.111 +do_test nan-1.2.4 {
1.112 + sqlite3_bind_double $::STMT 1 -NaN
1.113 + sqlite3_step $::STMT
1.114 + sqlite3_reset $::STMT
1.115 + db eval {SELECT CAST(x AS text), typeof(x) FROM t1}
1.116 +} {{} null Inf real -Inf real {} null}
1.117 +do_test nan-1.2.5 {
1.118 + sqlite3_bind_double $::STMT 1 NaN0
1.119 + sqlite3_step $::STMT
1.120 + sqlite3_reset $::STMT
1.121 + db eval {SELECT CAST(x AS text), typeof(x) FROM t1}
1.122 +} {{} null Inf real -Inf real {} null {} null}
1.123 +do_test nan-1.2.5 {
1.124 + sqlite3_bind_double $::STMT 1 -NaN0
1.125 + sqlite3_step $::STMT
1.126 + sqlite3_reset $::STMT
1.127 + db eval {SELECT CAST(x AS text), typeof(x) FROM t1}
1.128 +} {{} null Inf real -Inf real {} null {} null {} null}
1.129 +do_test nan-1.2.6 {
1.130 + db eval {
1.131 + UPDATE t1 SET x=x-x;
1.132 + SELECT CAST(x AS text), typeof(x) FROM t1;
1.133 + }
1.134 +} {{} null {} null {} null {} null {} null {} null}
1.135 +
1.136 +do_test nan-2.1 {
1.137 + db eval {
1.138 + DELETE FROM T1;
1.139 + }
1.140 + sqlite3_bind_double $::STMT 1 NaN
1.141 + sqlite3_step $::STMT
1.142 + sqlite3_reset $::STMT
1.143 + db eval {SELECT x, typeof(x) FROM t1}
1.144 +} {{} null}
1.145 +sqlite3_finalize $::STMT
1.146 +
1.147 +# SQLite always converts NaN into NULL so it is not possible to write
1.148 +# a NaN value into the database file using SQLite. The following series
1.149 +# of tests writes a normal floating point value (0.5) into the database,
1.150 +# then writes directly into the database file to change the 0.5 into NaN.
1.151 +# Then it reads the value of the database to verify it is converted into
1.152 +# NULL.
1.153 +#
1.154 +do_test nan-3.1 {
1.155 + db eval {
1.156 + DELETE FROM t1;
1.157 + INSERT INTO t1 VALUES(0.5);
1.158 + PRAGMA auto_vacuum=OFF;
1.159 + PRAGMA page_size=1024;
1.160 + VACUUM;
1.161 + }
1.162 + hexio_read test.db 2040 8
1.163 +} {3FE0000000000000}
1.164 +do_test nan-3.2 {
1.165 + db eval {
1.166 + SELECT x, typeof(x) FROM t1
1.167 + }
1.168 +} {0.5 real}
1.169 +do_test nan-3.3 {
1.170 + db close
1.171 + hexio_write test.db 2040 FFF8000000000000
1.172 + sqlite3 db test.db
1.173 + db eval {SELECT x, typeof(x) FROM t1}
1.174 +} {{} null}
1.175 +do_test nan-3.4 {
1.176 + db close
1.177 + hexio_write test.db 2040 7FF8000000000000
1.178 + sqlite3 db test.db
1.179 + db eval {SELECT x, typeof(x) FROM t1}
1.180 +} {{} null}
1.181 +do_test nan-3.5 {
1.182 + db close
1.183 + hexio_write test.db 2040 FFFFFFFFFFFFFFFF
1.184 + sqlite3 db test.db
1.185 + db eval {SELECT x, typeof(x) FROM t1}
1.186 +} {{} null}
1.187 +do_test nan-3.6 {
1.188 + db close
1.189 + hexio_write test.db 2040 7FFFFFFFFFFFFFFF
1.190 + sqlite3 db test.db
1.191 + db eval {SELECT x, typeof(x) FROM t1}
1.192 +} {{} null}
1.193 +
1.194 +# Verify that the sqlite3AtoF routine is able to handle extreme
1.195 +# numbers.
1.196 +#
1.197 +do_test nan-4.1 {
1.198 + db eval {DELETE FROM t1}
1.199 + db eval "INSERT INTO t1 VALUES([string repeat 9 307].0)"
1.200 + db eval {SELECT x, typeof(x) FROM t1}
1.201 +} {1e+307 real}
1.202 +do_test nan-4.2 {
1.203 + db eval {DELETE FROM t1}
1.204 + db eval "INSERT INTO t1 VALUES([string repeat 9 308].0)"
1.205 + db eval {SELECT x, typeof(x) FROM t1}
1.206 +} {1e+308 real}
1.207 +do_test nan-4.3 {
1.208 + db eval {DELETE FROM t1}
1.209 + db eval "INSERT INTO t1 VALUES(-[string repeat 9 307].0)"
1.210 + db eval {SELECT x, typeof(x) FROM t1}
1.211 +} {-1e+307 real}
1.212 +do_test nan-4.4 {
1.213 + db eval {DELETE FROM t1}
1.214 + db eval "INSERT INTO t1 VALUES(-[string repeat 9 308].0)"
1.215 + db eval {SELECT x, typeof(x) FROM t1}
1.216 +} {-1e+308 real}
1.217 +do_test nan-4.5 {
1.218 + db eval {DELETE FROM t1}
1.219 + set big -[string repeat 0 10000][string repeat 9 308].[string repeat 0 10000]
1.220 + db eval "INSERT INTO t1 VALUES($big)"
1.221 + db eval {SELECT x, typeof(x) FROM t1}
1.222 +} {-1e+308 real}
1.223 +do_test nan-4.6 {
1.224 + db eval {DELETE FROM t1}
1.225 + set big [string repeat 0 10000][string repeat 9 308].[string repeat 0 10000]
1.226 + db eval "INSERT INTO t1 VALUES($big)"
1.227 + db eval {SELECT x, typeof(x) FROM t1}
1.228 +} {1e+308 real}
1.229 +
1.230 +if {$tcl_platform(platform) != "symbian"} {
1.231 + # Do not run these tests on Symbian, as the Tcl port doesn't like to
1.232 + # convert from floating point value "-inf" to a string.
1.233 + #
1.234 + do_test nan-4.7 {
1.235 + db eval {DELETE FROM t1}
1.236 + db eval "INSERT INTO t1 VALUES([string repeat 9 309].0)"
1.237 + db eval {SELECT x, typeof(x) FROM t1}
1.238 + } {inf real}
1.239 + do_test nan-4.8 {
1.240 + db eval {DELETE FROM t1}
1.241 + db eval "INSERT INTO t1 VALUES(-[string repeat 9 309].0)"
1.242 + db eval {SELECT x, typeof(x) FROM t1}
1.243 + } {-inf real}
1.244 +}
1.245 +do_test nan-4.9 {
1.246 + db eval {DELETE FROM t1}
1.247 + db eval "INSERT INTO t1 VALUES([string repeat 9 309].0)"
1.248 + db eval {SELECT CAST(x AS text), typeof(x) FROM t1}
1.249 +} {Inf real}
1.250 +do_test nan-4.10 {
1.251 + db eval {DELETE FROM t1}
1.252 + db eval "INSERT INTO t1 VALUES(-[string repeat 9 309].0)"
1.253 + db eval {SELECT CAST(x AS text), typeof(x) FROM t1}
1.254 +} {-Inf real}
1.255 +
1.256 +do_test nan-4.10 {
1.257 + db eval {DELETE FROM t1}
1.258 + db eval "INSERT INTO t1 VALUES(1234.5[string repeat 0 10000]12345)"
1.259 + db eval {SELECT x, typeof(x) FROM t1}
1.260 +} {1234.5 real}
1.261 +do_test nan-4.11 {
1.262 + db eval {DELETE FROM t1}
1.263 + db eval "INSERT INTO t1 VALUES(-1234.5[string repeat 0 10000]12345)"
1.264 + db eval {SELECT x, typeof(x) FROM t1}
1.265 +} {-1234.5 real}
1.266 +do_test nan-4.12 {
1.267 + db eval {DELETE FROM t1}
1.268 + set small [string repeat 0 10000].[string repeat 0 324][string repeat 9 10000]
1.269 + db eval "INSERT INTO t1 VALUES($small)"
1.270 + db eval {SELECT x, typeof(x) FROM t1}
1.271 +} {0.0 real}
1.272 +do_test nan-4.13 {
1.273 + db eval {DELETE FROM t1}
1.274 + set small \
1.275 + -[string repeat 0 10000].[string repeat 0 324][string repeat 9 10000]
1.276 + db eval "INSERT INTO t1 VALUES($small)"
1.277 + db eval {SELECT x, typeof(x) FROM t1}
1.278 +} {0.0 real}
1.279 +
1.280 +# These tests test some really, really small floating point numbers.
1.281 +#
1.282 +if {$tcl_platform(platform) != "symbian"} {
1.283 + # These two are not run on symbian because tcl has trouble converting
1.284 + # the very small numbers back to text form (probably due to a difference
1.285 + # in the sprintf() implementation).
1.286 + #
1.287 + do_test nan-4.14 {
1.288 + db eval {DELETE FROM t1}
1.289 + set small \
1.290 + [string repeat 0 10000].[string repeat 0 323][string repeat 9 10000]
1.291 + db eval "INSERT INTO t1 VALUES($small)"
1.292 + db eval {SELECT x, typeof(x) FROM t1}
1.293 + } {9.88131291682493e-324 real}
1.294 + do_test nan-4.15 {
1.295 + db eval {DELETE FROM t1}
1.296 + set small \
1.297 + -[string repeat 0 10000].[string repeat 0 323][string repeat 9 10000]
1.298 + db eval "INSERT INTO t1 VALUES($small)"
1.299 + db eval {SELECT x, typeof(x) FROM t1}
1.300 + } {-9.88131291682493e-324 real}
1.301 +}
1.302 +#
1.303 +# Symbian OS: the next test fails due to problems in sprintf/printf formatting.
1.304 +if {$::tcl_platform(platform)!="symbian"} {
1.305 + do_test nan-4.16 {
1.306 + db eval {DELETE FROM t1}
1.307 + set small [string repeat 0 10000].[string repeat 0 323][string repeat 9 10000]
1.308 + db eval "INSERT INTO t1 VALUES($small)"
1.309 + db eval {SELECT CAST(x AS text), typeof(x) FROM t1}
1.310 + } {9.88131291682493e-324 real}
1.311 +}
1.312 +#
1.313 +# Symbian OS: the next test fails due to problems in sprintf/printf formatting.
1.314 +if {$::tcl_platform(platform)!="symbian"} {
1.315 +do_test nan-4.17 {
1.316 + db eval {DELETE FROM t1}
1.317 + set small \
1.318 + -[string repeat 0 10000].[string repeat 0 323][string repeat 9 10000]
1.319 + db eval "INSERT INTO t1 VALUES($small)"
1.320 + db eval {SELECT CAST(x AS text), typeof(x) FROM t1}
1.321 + } {-9.88131291682493e-324 real}
1.322 +}
1.323 +do_test nan-4.20 {
1.324 + db eval {DELETE FROM t1}
1.325 + set big [string repeat 9 10000].0e-9000
1.326 + db eval "INSERT INTO t1 VALUES($big)"
1.327 + db eval {SELECT x, typeof(x) FROM t1}
1.328 +} {{} null}
1.329 +
1.330 +
1.331 +
1.332 +finish_test