# 2017 December 9 # # 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. # #*********************************************************************** # set testdir [file dirname $argv0] source $testdir/tester.tcl set testprefix decimal if {[catch {load_static_extension db decimal} error]} { puts "Skipping zipfile tests, hit load error: $error" finish_test; return } do_execsql_test 1000 { SELECT decimal(1); } {1} do_execsql_test 1010 { SELECT decimal(1.0); } {1.0} do_execsql_test 1020 { SELECT decimal(0001.0); } {1.0} do_execsql_test 1030 { SELECT decimal(+0001.0); } {1.0} do_execsql_test 1040 { SELECT decimal(-0001.0); } {-1.0} do_execsql_test 1050 { SELECT decimal(1.0e72); } {1000000000000000000000000000000000000000000000000000000000000000000000000} # 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123 do_execsql_test 1060 { SELECT decimal(1.0e-72); } {0.0000000000000000000000000000000000000000000000000000000000000000000000010} # 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123 do_execsql_test 1070 { SELECT decimal(-123e-4); } {-0.0123} do_execsql_test 1080 { SELECT decimal(+123e+4); } {1230000.0} do_execsql_test 2000 { CREATE TABLE t1(seq INTEGER PRIMARY KEY, val TEXT); INSERT INTO t1 VALUES (1, '-9999e99'), (2, '-9998.000e+99'), (3, '-9999.0'), (4, '-1'), (5, '-9999e-20'), (6, '0'), (7, '1e-30'), (8, '1e-29'), (9, '1'), (10,'1.00000000000000001'), (11,'+1.00001'), (12,'99e+99'); SELECT *, '|' FROM t1 AS a, t1 AS b WHERE a.seq=0; } {} do_execsql_test 2010 { SELECT *, '|' FROM t1 AS a, t1 AS b WHERE a.seq<>b.seq AND decimal_cmp(a.val,b.val)==0; } {} do_execsql_test 2020 { SELECT *, '|' FROM t1 AS a, t1 AS b WHERE a.seq>b.seq AND decimal_cmp(a.val,b.val)<=0; } {} do_execsql_test 2030 { SELECT seq FROM t1 ORDER BY val COLLATE decimal; } {1 2 3 4 5 6 7 8 9 10 11 12} do_execsql_test 2040 { SELECT seq FROM t1 ORDER BY val COLLATE decimal DESC; } {12 11 10 9 8 7 6 5 4 3 2 1} do_execsql_test 3000 { CREATE TABLE t3(seq INTEGER PRIMARY KEY, val TEXT); WITH RECURSIVE c(x) AS (VALUES(1) UNION SELECT x+1 FROM c WHERE x<10) INSERT INTO t3(seq, val) SELECT x, x FROM c; WITH RECURSIVE c(x) AS (VALUES(1) UNION SELECT x+1 FROM c WHERE x<5) INSERT INTO t3(seq, val) SELECT x+10, x*1000 FROM c; SELECT decimal(val) FROM t3 ORDER BY seq; } {1 2 3 4 5 6 7 8 9 10 1000 2000 3000 4000 5000} do_execsql_test 3020 { SELECT decimal_add(val,'0.5') FROM t3 WHERE seq>5 ORDER BY seq } {6.5 7.5 8.5 9.5 10.5 1000.5 2000.5 3000.5 4000.5 5000.5} do_execsql_test 3030 { SELECT decimal_add(val,'-10') FROM t3 ORDER BY seq; } {-9 -8 -7 -6 -5 -4 -3 -2 -1 0 990 1990 2990 3990 4990} do_execsql_test 4000 { SELECT decimal_sum(val) FROM t3; } {15055} do_execsql_test 4010 { SELECT decimal_sum(decimal_add(val,val||'e+10')) FROM t3; } {150550000015055} do_execsql_test 4010 { SELECT decimal_sum(decimal_add(val||'e+20',decimal_add(val,val||'e-20'))) FROM t3; } {1505500000000000000015055.00000000000000015055} do_execsql_test 5000 { WITH RECURSIVE c(x,y,z) AS ( VALUES(0,'1','1') UNION ALL SELECT x+1, decimal_mul(y,'2'), decimal_mul(z,'0.5') FROM c WHERE x<32 ) SELECT count(*) FROM c WHERE decimal_mul(y,z)='1'; } {33} do_execsql_test 5100 { SELECT decimal_mul('1234.00','2.00'); } {2468.00} do_execsql_test 5101 { SELECT decimal_mul('1234.00','2.0000'); } {2468.00} do_execsql_test 5102 { SELECT decimal_mul('1234.0000','2.000'); } {2468.000} do_execsql_test 5103 { SELECT decimal_mul('1234.0000','2'); } {2468} finish_test