# 2013 March 10 # # The author disclaims copyright to this source code. In place of # a legal notice, here is a blessing: # # May you do good and not evil. # May you find forgiveness for yourself and forgive others. # May you share freely, never taking more than you give. # #*********************************************************************** # This file implements regression tests for SQLite library. The focus of # this file is testing the tointeger() and toreal() functions. # # Several of the toreal() tests are disabled on platforms where floating # point precision is not high enough to represent their constant integer # expression arguments as double precision floating point values. # set testdir [file dirname $argv0] source $testdir/tester.tcl set saved_tcl_precision $tcl_precision set tcl_precision 0 load_static_extension db totype set highPrecision(1) [expr \ {[db eval {SELECT tointeger(9223372036854775807 + 1);}] eq {{}}}] do_execsql_test func4-1.1 { SELECT tointeger(NULL); } {{}} do_execsql_test func4-1.2 { SELECT tointeger(''); } {{}} do_execsql_test func4-1.3 { SELECT tointeger(' '); } {{}} do_execsql_test func4-1.4 { SELECT tointeger('1234'); } {1234} do_execsql_test func4-1.5 { SELECT tointeger(' 1234'); } {{}} do_execsql_test func4-1.6 { SELECT tointeger('bad'); } {{}} do_execsql_test func4-1.7 { SELECT tointeger('0xBAD'); } {{}} do_execsql_test func4-1.8 { SELECT tointeger('123BAD'); } {{}} do_execsql_test func4-1.9 { SELECT tointeger('0x123BAD'); } {{}} do_execsql_test func4-1.10 { SELECT tointeger('123NO'); } {{}} do_execsql_test func4-1.11 { SELECT tointeger('0x123NO'); } {{}} do_execsql_test func4-1.12 { SELECT tointeger('-0x1'); } {{}} do_execsql_test func4-1.13 { SELECT tointeger('-0x0'); } {{}} do_execsql_test func4-1.14 { SELECT tointeger('0x0'); } {{}} do_execsql_test func4-1.15 { SELECT tointeger('0x1'); } {{}} do_execsql_test func4-1.16 { SELECT tointeger(-1); } {-1} do_execsql_test func4-1.17 { SELECT tointeger(-0); } {0} do_execsql_test func4-1.18 { SELECT tointeger(0); } {0} do_execsql_test func4-1.19 { SELECT tointeger(1); } {1} do_execsql_test func4-1.20 { SELECT tointeger(-1.79769313486232e308 - 1); } {{}} do_execsql_test func4-1.21 { SELECT tointeger(-1.79769313486232e308); } {{}} do_execsql_test func4-1.22 { SELECT tointeger(-1.79769313486232e308 + 1); } {{}} do_execsql_test func4-1.23 { SELECT tointeger(-9223372036854775808 - 1); } {{}} do_execsql_test func4-1.24 { SELECT tointeger(-9223372036854775808); } {-9223372036854775808} do_execsql_test func4-1.25 { SELECT tointeger(-9223372036854775808 + 1); } {-9223372036854775807} do_execsql_test func4-1.26 { SELECT tointeger(-9223372036854775807 - 1); } {-9223372036854775808} do_execsql_test func4-1.27 { SELECT tointeger(-9223372036854775807); } {-9223372036854775807} do_execsql_test func4-1.28 { SELECT tointeger(-9223372036854775807 + 1); } {-9223372036854775806} do_execsql_test func4-1.29 { SELECT tointeger(-2147483648 - 1); } {-2147483649} do_execsql_test func4-1.30 { SELECT tointeger(-2147483648); } {-2147483648} do_execsql_test func4-1.31 { SELECT tointeger(-2147483648 + 1); } {-2147483647} do_execsql_test func4-1.32 { SELECT tointeger(2147483647 - 1); } {2147483646} do_execsql_test func4-1.33 { SELECT tointeger(2147483647); } {2147483647} do_execsql_test func4-1.34 { SELECT tointeger(2147483647 + 1); } {2147483648} do_execsql_test func4-1.35 { SELECT tointeger(9223372036854775807 - 1); } {9223372036854775806} do_execsql_test func4-1.36 { SELECT tointeger(9223372036854775807); } {9223372036854775807} if {$highPrecision(1)} { do_execsql_test func4-1.37 { SELECT tointeger(9223372036854775807 + 1); } {{}} } do_execsql_test func4-1.38 { SELECT tointeger(1.79769313486232e308 - 1); } {{}} do_execsql_test func4-1.39 { SELECT tointeger(1.79769313486232e308); } {{}} do_execsql_test func4-1.40 { SELECT tointeger(1.79769313486232e308 + 1); } {{}} do_execsql_test func4-1.41 { SELECT tointeger(4503599627370496 - 1); } {4503599627370495} do_execsql_test func4-1.42 { SELECT tointeger(4503599627370496); } {4503599627370496} do_execsql_test func4-1.43 { SELECT tointeger(4503599627370496 + 1); } {4503599627370497} do_execsql_test func4-1.44 { SELECT tointeger(9007199254740992 - 1); } {9007199254740991} do_execsql_test func4-1.45 { SELECT tointeger(9007199254740992); } {9007199254740992} do_execsql_test func4-1.46 { SELECT tointeger(9007199254740992 + 1); } {9007199254740993} do_execsql_test func4-1.47 { SELECT tointeger(9223372036854775807 - 1); } {9223372036854775806} do_execsql_test func4-1.48 { SELECT tointeger(9223372036854775807); } {9223372036854775807} if {$highPrecision(1)} { do_execsql_test func4-1.49 { SELECT tointeger(9223372036854775807 + 1); } {{}} do_execsql_test func4-1.50 { SELECT tointeger(9223372036854775808 - 1); } {{}} do_execsql_test func4-1.51 { SELECT tointeger(9223372036854775808); } {{}} do_execsql_test func4-1.52 { SELECT tointeger(9223372036854775808 + 1); } {{}} } do_execsql_test func4-1.53 { SELECT tointeger(18446744073709551616 - 1); } {{}} do_execsql_test func4-1.54 { SELECT tointeger(18446744073709551616); } {{}} do_execsql_test func4-1.55 { SELECT tointeger(18446744073709551616 + 1); } {{}} ifcapable floatingpoint { set highPrecision(2) [expr \ {[db eval {SELECT toreal(-9223372036854775808 + 1);}] eq {{}}}] do_execsql_test func4-2.1 { SELECT toreal(NULL); } {{}} do_execsql_test func4-2.2 { SELECT toreal(''); } {{}} do_execsql_test func4-2.3 { SELECT toreal(' '); } {{}} do_execsql_test func4-2.4 { SELECT toreal('1234'); } {1234.0} do_execsql_test func4-2.5 { SELECT toreal(' 1234'); } {{}} do_execsql_test func4-2.6 { SELECT toreal('bad'); } {{}} do_execsql_test func4-2.7 { SELECT toreal('0xBAD'); } {{}} do_execsql_test func4-2.8 { SELECT toreal('123BAD'); } {{}} do_execsql_test func4-2.9 { SELECT toreal('0x123BAD'); } {{}} do_execsql_test func4-2.10 { SELECT toreal('123NO'); } {{}} do_execsql_test func4-2.11 { SELECT toreal('0x123NO'); } {{}} do_execsql_test func4-2.12 { SELECT toreal('-0x1'); } {{}} do_execsql_test func4-2.13 { SELECT toreal('-0x0'); } {{}} do_execsql_test func4-2.14 { SELECT toreal('0x0'); } {{}} do_execsql_test func4-2.15 { SELECT toreal('0x1'); } {{}} do_execsql_test func4-2.16 { SELECT toreal(-1); } {-1.0} do_execsql_test func4-2.17 { SELECT toreal(-0); } {0.0} do_execsql_test func4-2.18 { SELECT toreal(0); } {0.0} do_execsql_test func4-2.19 { SELECT toreal(1); } {1.0} do_execsql_test func4-2.20 { SELECT toreal(-1.79769313486232e308 - 1); } {-Inf} do_execsql_test func4-2.21 { SELECT toreal(-1.79769313486232e308); } {-Inf} do_execsql_test func4-2.22 { SELECT toreal(-1.79769313486232e308 + 1); } {-Inf} do_execsql_test func4-2.23 { SELECT toreal(-9223372036854775808 - 1); } {-9.223372036854776e+18} do_execsql_test func4-2.24 { SELECT toreal(-9223372036854775808); } {{}} if {$highPrecision(2)} { do_execsql_test func4-2.25 { SELECT toreal(-9223372036854775808 + 1); } {{}} } do_execsql_test func4-2.26 { SELECT toreal(-9223372036854775807 - 1); } {{}} if {$highPrecision(2)} { do_execsql_test func4-2.27 { SELECT toreal(-9223372036854775807); } {{}} do_execsql_test func4-2.28 { SELECT toreal(-9223372036854775807 + 1); } {{}} } do_execsql_test func4-2.29 { SELECT toreal(-2147483648 - 1); } {-2147483649.0} do_execsql_test func4-2.30 { SELECT toreal(-2147483648); } {-2147483648.0} do_execsql_test func4-2.31 { SELECT toreal(-2147483648 + 1); } {-2147483647.0} do_execsql_test func4-2.32 { SELECT toreal(2147483647 - 1); } {2147483646.0} do_execsql_test func4-2.33 { SELECT toreal(2147483647); } {2147483647.0} do_execsql_test func4-2.34 { SELECT toreal(2147483647 + 1); } {2147483648.0} if {$highPrecision(2)} { do_execsql_test func4-2.35 { SELECT toreal(9223372036854775807 - 1); } {{}} if {$highPrecision(1)} { do_execsql_test func4-2.36 { SELECT toreal(9223372036854775807); } {{}} } } do_execsql_test func4-2.37 { SELECT toreal(9223372036854775807 + 1); } {9.223372036854776e+18} do_execsql_test func4-2.38 { SELECT toreal(1.79769313486232e308 - 1); } {Inf} do_execsql_test func4-2.39 { SELECT toreal(1.79769313486232e308); } {Inf} do_execsql_test func4-2.40 { SELECT toreal(1.79769313486232e308 + 1); } {Inf} do_execsql_test func4-2.41 { SELECT toreal(4503599627370496 - 1); } {4503599627370495.0} do_execsql_test func4-2.42 { SELECT toreal(4503599627370496); } {4503599627370496.0} do_execsql_test func4-2.43 { SELECT toreal(4503599627370496 + 1); } {4503599627370497.0} do_execsql_test func4-2.44 { SELECT toreal(9007199254740992 - 1); } {9007199254740991.0} do_execsql_test func4-2.45 { SELECT toreal(9007199254740992); } {9007199254740992.0} if {$highPrecision(2)} { do_execsql_test func4-2.46 { SELECT toreal(9007199254740992 + 1); } {{}} } do_execsql_test func4-2.47 { SELECT toreal(9007199254740992 + 2); } {9007199254740994.0} do_execsql_test func4-2.48 { SELECT toreal(tointeger(9223372036854775808) - 1); } {{}} if {$highPrecision(1)} { do_execsql_test func4-2.49 { SELECT toreal(tointeger(9223372036854775808)); } {{}} do_execsql_test func4-2.50 { SELECT toreal(tointeger(9223372036854775808) + 1); } {{}} } do_execsql_test func4-2.51 { SELECT toreal(tointeger(18446744073709551616) - 1); } {{}} do_execsql_test func4-2.52 { SELECT toreal(tointeger(18446744073709551616)); } {{}} do_execsql_test func4-2.53 { SELECT toreal(tointeger(18446744073709551616) + 1); } {{}} } ifcapable check { do_execsql_test func4-3.1 { CREATE TABLE t1( x INTEGER CHECK(tointeger(x) IS NOT NULL) ); } {} do_test func4-3.2 { catchsql { INSERT INTO t1 (x) VALUES (NULL); } } {1 {CHECK constraint failed: tointeger(x) IS NOT NULL}} do_test func4-3.3 { catchsql { INSERT INTO t1 (x) VALUES (NULL); } } {1 {CHECK constraint failed: tointeger(x) IS NOT NULL}} do_test func4-3.4 { catchsql { INSERT INTO t1 (x) VALUES (''); } } {1 {CHECK constraint failed: tointeger(x) IS NOT NULL}} do_test func4-3.5 { catchsql { INSERT INTO t1 (x) VALUES ('bad'); } } {1 {CHECK constraint failed: tointeger(x) IS NOT NULL}} do_test func4-3.6 { catchsql { INSERT INTO t1 (x) VALUES ('1234bad'); } } {1 {CHECK constraint failed: tointeger(x) IS NOT NULL}} do_test func4-3.7 { catchsql { INSERT INTO t1 (x) VALUES ('1234.56bad'); } } {1 {CHECK constraint failed: tointeger(x) IS NOT NULL}} do_test func4-3.8 { catchsql { INSERT INTO t1 (x) VALUES (1234); } } {0 {}} do_test func4-3.9 { catchsql { INSERT INTO t1 (x) VALUES (1234.56); } } {1 {CHECK constraint failed: tointeger(x) IS NOT NULL}} do_test func4-3.10 { catchsql { INSERT INTO t1 (x) VALUES ('1234'); } } {0 {}} do_test func4-3.11 { catchsql { INSERT INTO t1 (x) VALUES ('1234.56'); } } {1 {CHECK constraint failed: tointeger(x) IS NOT NULL}} do_test func4-3.12 { catchsql { INSERT INTO t1 (x) VALUES (ZEROBLOB(4)); } } {1 {CHECK constraint failed: tointeger(x) IS NOT NULL}} do_test func4-3.13 { catchsql { INSERT INTO t1 (x) VALUES (X''); } } {1 {CHECK constraint failed: tointeger(x) IS NOT NULL}} do_test func4-3.14 { catchsql { INSERT INTO t1 (x) VALUES (X'1234'); } } {1 {CHECK constraint failed: tointeger(x) IS NOT NULL}} do_test func4-3.15 { catchsql { INSERT INTO t1 (x) VALUES (X'12345678'); } } {1 {CHECK constraint failed: tointeger(x) IS NOT NULL}} do_test func4-3.16 { catchsql { INSERT INTO t1 (x) VALUES ('1234.00'); } } {0 {}} do_test func4-3.17 { catchsql { INSERT INTO t1 (x) VALUES (1234.00); } } {0 {}} do_test func4-3.18 { catchsql { INSERT INTO t1 (x) VALUES ('-9223372036854775809'); } } {1 {CHECK constraint failed: tointeger(x) IS NOT NULL}} if {$highPrecision(1)} { do_test func4-3.19 { catchsql { INSERT INTO t1 (x) VALUES (9223372036854775808); } } {1 {CHECK constraint failed: tointeger(x) IS NOT NULL}} } do_execsql_test func4-3.20 { SELECT x FROM t1 WHERE x>0 ORDER BY x; } {1234 1234 1234 1234} ifcapable floatingpoint { do_execsql_test func4-4.1 { CREATE TABLE t2( x REAL CHECK(toreal(x) IS NOT NULL) ); } {} do_test func4-4.2 { catchsql { INSERT INTO t2 (x) VALUES (NULL); } } {1 {CHECK constraint failed: toreal(x) IS NOT NULL}} do_test func4-4.3 { catchsql { INSERT INTO t2 (x) VALUES (NULL); } } {1 {CHECK constraint failed: toreal(x) IS NOT NULL}} do_test func4-4.4 { catchsql { INSERT INTO t2 (x) VALUES (''); } } {1 {CHECK constraint failed: toreal(x) IS NOT NULL}} do_test func4-4.5 { catchsql { INSERT INTO t2 (x) VALUES ('bad'); } } {1 {CHECK constraint failed: toreal(x) IS NOT NULL}} do_test func4-4.6 { catchsql { INSERT INTO t2 (x) VALUES ('1234bad'); } } {1 {CHECK constraint failed: toreal(x) IS NOT NULL}} do_test func4-4.7 { catchsql { INSERT INTO t2 (x) VALUES ('1234.56bad'); } } {1 {CHECK constraint failed: toreal(x) IS NOT NULL}} do_test func4-4.8 { catchsql { INSERT INTO t2 (x) VALUES (1234); } } {0 {}} do_test func4-4.9 { catchsql { INSERT INTO t2 (x) VALUES (1234.56); } } {0 {}} do_test func4-4.10 { catchsql { INSERT INTO t2 (x) VALUES ('1234'); } } {0 {}} do_test func4-4.11 { catchsql { INSERT INTO t2 (x) VALUES ('1234.56'); } } {0 {}} do_test func4-4.12 { catchsql { INSERT INTO t2 (x) VALUES (ZEROBLOB(4)); } } {1 {CHECK constraint failed: toreal(x) IS NOT NULL}} do_test func4-4.13 { catchsql { INSERT INTO t2 (x) VALUES (X''); } } {1 {CHECK constraint failed: toreal(x) IS NOT NULL}} do_test func4-4.14 { catchsql { INSERT INTO t2 (x) VALUES (X'1234'); } } {1 {CHECK constraint failed: toreal(x) IS NOT NULL}} do_test func4-4.15 { catchsql { INSERT INTO t2 (x) VALUES (X'12345678'); } } {1 {CHECK constraint failed: toreal(x) IS NOT NULL}} do_execsql_test func4-4.16 { SELECT x FROM t2 ORDER BY x; } {1234.0 1234.0 1234.56 1234.56} } } ifcapable floatingpoint { do_execsql_test func4-5.1 { SELECT tointeger(toreal('1234')); } {1234} do_execsql_test func4-5.2 { SELECT tointeger(toreal(-1)); } {-1} do_execsql_test func4-5.3 { SELECT tointeger(toreal(-0)); } {0} do_execsql_test func4-5.4 { SELECT tointeger(toreal(0)); } {0} do_execsql_test func4-5.5 { SELECT tointeger(toreal(1)); } {1} do_execsql_test func4-5.6 { SELECT tointeger(toreal(-9223372036854775808 - 1)); } {{}} do_execsql_test func4-5.7 { SELECT tointeger(toreal(-9223372036854775808)); } {{}} if {$highPrecision(2)} { do_execsql_test func4-5.8 { SELECT tointeger(toreal(-9223372036854775808 + 1)); } {{}} } do_execsql_test func4-5.9 { SELECT tointeger(toreal(-2147483648 - 1)); } {-2147483649} do_execsql_test func4-5.10 { SELECT tointeger(toreal(-2147483648)); } {-2147483648} do_execsql_test func4-5.11 { SELECT tointeger(toreal(-2147483648 + 1)); } {-2147483647} do_execsql_test func4-5.12 { SELECT tointeger(toreal(2147483647 - 1)); } {2147483646} do_execsql_test func4-5.13 { SELECT tointeger(toreal(2147483647)); } {2147483647} do_execsql_test func4-5.14 { SELECT tointeger(toreal(2147483647 + 1)); } {2147483648} do_execsql_test func4-5.15 { SELECT tointeger(toreal(9223372036854775807 - 1)); } {{}} if {$highPrecision(1)} { do_execsql_test func4-5.16 { SELECT tointeger(toreal(9223372036854775807)); } {{}} do_execsql_test func4-5.17 { SELECT tointeger(toreal(9223372036854775807 + 1)); } {{}} } do_execsql_test func4-5.18 { SELECT tointeger(toreal(4503599627370496 - 1)); } {4503599627370495} do_execsql_test func4-5.19 { SELECT tointeger(toreal(4503599627370496)); } {4503599627370496} do_execsql_test func4-5.20 { SELECT tointeger(toreal(4503599627370496 + 1)); } {4503599627370497} do_execsql_test func4-5.21 { SELECT tointeger(toreal(9007199254740992 - 1)); } {9007199254740991} do_execsql_test func4-5.22 { SELECT tointeger(toreal(9007199254740992)); } {9007199254740992} if {$highPrecision(2)} { do_execsql_test func4-5.23 { SELECT tointeger(toreal(9007199254740992 + 1)); } {{}} } do_execsql_test func4-5.24 { SELECT tointeger(toreal(9007199254740992 + 2)); } {9007199254740994} if {$highPrecision(1)} { do_execsql_test func4-5.25 { SELECT tointeger(toreal(9223372036854775808 - 1)); } {{}} do_execsql_test func4-5.26 { SELECT tointeger(toreal(9223372036854775808)); } {{}} do_execsql_test func4-5.27 { SELECT tointeger(toreal(9223372036854775808 + 1)); } {{}} } do_execsql_test func4-5.28 { SELECT tointeger(toreal(18446744073709551616 - 1)); } {{}} do_execsql_test func4-5.29 { SELECT tointeger(toreal(18446744073709551616)); } {{}} do_execsql_test func4-5.30 { SELECT tointeger(toreal(18446744073709551616 + 1)); } {{}} } for {set i 0} {$i < 10} {incr i} { if {$i == 8} continue do_execsql_test func4-6.1.$i.1 [subst { SELECT tointeger(x'[string repeat 01 $i]'); }] {{}} ifcapable floatingpoint { do_execsql_test func4-6.1.$i.2 [subst { SELECT toreal(x'[string repeat 01 $i]'); }] {{}} } } do_execsql_test func4-6.2.1 { SELECT tointeger(x'0102030405060708'); } {578437695752307201} do_execsql_test func4-6.2.2 { SELECT tointeger(x'0807060504030201'); } {72623859790382856} ifcapable floatingpoint { do_execsql_test func4-6.3.1 { SELECT toreal(x'ffefffffffffffff'); } {-1.7976931348623157e+308} do_execsql_test func4-6.3.2 { SELECT toreal(x'8010000000000000'); } {-2.2250738585072014e-308} do_execsql_test func4-6.3.3 { SELECT toreal(x'c000000000000000'); } {-2.0} do_execsql_test func4-6.3.4 { SELECT toreal(x'bff0000000000000'); } {-1.0} do_execsql_test func4-6.3.5 { SELECT toreal(x'8000000000000000'); } {-0.0} do_execsql_test func4-6.3.6 { SELECT toreal(x'0000000000000000'); } {0.0} do_execsql_test func4-6.3.7 { SELECT toreal(x'3ff0000000000000'); } {1.0} do_execsql_test func4-6.3.8 { SELECT toreal(x'4000000000000000'); } {2.0} do_execsql_test func4-6.3.9 { SELECT toreal(x'0010000000000000'); } {2.2250738585072014e-308} do_execsql_test func4-6.3.10 { SELECT toreal(x'7fefffffffffffff'); } {1.7976931348623157e+308} do_execsql_test func4-6.3.11 { SELECT toreal(x'8000000000000001'); } {-5e-324} do_execsql_test func4-6.3.12 { SELECT toreal(x'800fffffffffffff'); } {-2.225073858507201e-308} do_execsql_test func4-6.3.13 { SELECT toreal(x'0000000000000001'); } {5e-324} do_execsql_test func4-6.3.14 { SELECT toreal(x'000fffffffffffff'); } {2.225073858507201e-308} do_execsql_test func4-6.3.15 { SELECT toreal(x'fff0000000000000'); } {-Inf} do_execsql_test func4-6.3.16 { SELECT toreal(x'7ff0000000000000'); } {Inf} do_execsql_test func4-6.3.17 { SELECT toreal(x'fff8000000000000'); } {{}} do_execsql_test func4-6.3.18 { SELECT toreal(x'fff0000000000001'); } {{}} do_execsql_test func4-6.3.19 { SELECT toreal(x'fff7ffffffffffff'); } {{}} do_execsql_test func4-6.3.20 { SELECT toreal(x'7ff0000000000001'); } {{}} do_execsql_test func4-6.3.21 { SELECT toreal(x'7ff7ffffffffffff'); } {{}} do_execsql_test func4-6.3.22 { SELECT toreal(x'fff8000000000001'); } {{}} do_execsql_test func4-6.3.23 { SELECT toreal(x'ffffffffffffffff'); } {{}} do_execsql_test func4-6.3.24 { SELECT toreal(x'7ff8000000000000'); } {{}} do_execsql_test func4-6.3.25 { SELECT toreal(x'7fffffffffffffff'); } {{}} } set tcl_precision $saved_tcl_precision unset saved_tcl_precision finish_test