1beb9def0Sdrh# 2017 December 9 2beb9def0Sdrh# 3beb9def0Sdrh# The author disclaims copyright to this source code. In place of 4beb9def0Sdrh# a legal notice, here is a blessing: 5beb9def0Sdrh# 6beb9def0Sdrh# May you do good and not evil. 7beb9def0Sdrh# May you find forgiveness for yourself and forgive others. 8beb9def0Sdrh# May you share freely, never taking more than you give. 9beb9def0Sdrh# 10beb9def0Sdrh#*********************************************************************** 11beb9def0Sdrh# 12beb9def0Sdrh 13beb9def0Sdrhset testdir [file dirname $argv0] 14beb9def0Sdrhsource $testdir/tester.tcl 15beb9def0Sdrhset testprefix decimal 16beb9def0Sdrh 17beb9def0Sdrhif {[catch {load_static_extension db decimal} error]} { 18*d8b3c199Sdrh puts "Skipping decimal tests, hit load error: $error" 19beb9def0Sdrh finish_test; return 20beb9def0Sdrh} 21beb9def0Sdrh 22beb9def0Sdrhdo_execsql_test 1000 { 23beb9def0Sdrh SELECT decimal(1); 24beb9def0Sdrh} {1} 25beb9def0Sdrhdo_execsql_test 1010 { 26beb9def0Sdrh SELECT decimal(1.0); 27beb9def0Sdrh} {1.0} 28beb9def0Sdrhdo_execsql_test 1020 { 29beb9def0Sdrh SELECT decimal(0001.0); 30beb9def0Sdrh} {1.0} 31beb9def0Sdrhdo_execsql_test 1030 { 32beb9def0Sdrh SELECT decimal(+0001.0); 33beb9def0Sdrh} {1.0} 34beb9def0Sdrhdo_execsql_test 1040 { 35beb9def0Sdrh SELECT decimal(-0001.0); 36beb9def0Sdrh} {-1.0} 37beb9def0Sdrhdo_execsql_test 1050 { 38beb9def0Sdrh SELECT decimal(1.0e72); 39beb9def0Sdrh} {1000000000000000000000000000000000000000000000000000000000000000000000000} 40beb9def0Sdrh# 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123 41beb9def0Sdrhdo_execsql_test 1060 { 42beb9def0Sdrh SELECT decimal(1.0e-72); 43beb9def0Sdrh} {0.0000000000000000000000000000000000000000000000000000000000000000000000010} 44beb9def0Sdrh# 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123 45beb9def0Sdrhdo_execsql_test 1070 { 46beb9def0Sdrh SELECT decimal(-123e-4); 47beb9def0Sdrh} {-0.0123} 48beb9def0Sdrhdo_execsql_test 1080 { 49beb9def0Sdrh SELECT decimal(+123e+4); 50beb9def0Sdrh} {1230000.0} 51beb9def0Sdrh 52beb9def0Sdrh 53beb9def0Sdrhdo_execsql_test 2000 { 54beb9def0Sdrh CREATE TABLE t1(seq INTEGER PRIMARY KEY, val TEXT); 55beb9def0Sdrh INSERT INTO t1 VALUES 56beb9def0Sdrh (1, '-9999e99'), 57beb9def0Sdrh (2, '-9998.000e+99'), 58beb9def0Sdrh (3, '-9999.0'), 59beb9def0Sdrh (4, '-1'), 60beb9def0Sdrh (5, '-9999e-20'), 61beb9def0Sdrh (6, '0'), 62beb9def0Sdrh (7, '1e-30'), 63beb9def0Sdrh (8, '1e-29'), 64beb9def0Sdrh (9, '1'), 65beb9def0Sdrh (10,'1.00000000000000001'), 66beb9def0Sdrh (11,'+1.00001'), 67beb9def0Sdrh (12,'99e+99'); 68beb9def0Sdrh SELECT *, '|' 69beb9def0Sdrh FROM t1 AS a, t1 AS b 70beb9def0Sdrh WHERE a.seq<b.seq 71beb9def0Sdrh AND decimal_cmp(a.val,b.val)>=0; 72beb9def0Sdrh} {} 73beb9def0Sdrhdo_execsql_test 2010 { 74beb9def0Sdrh SELECT *, '|' 75beb9def0Sdrh FROM t1 AS a, t1 AS b 76beb9def0Sdrh WHERE a.seq<>b.seq 77beb9def0Sdrh AND decimal_cmp(a.val,b.val)==0; 78beb9def0Sdrh} {} 79beb9def0Sdrhdo_execsql_test 2020 { 80beb9def0Sdrh SELECT *, '|' 81beb9def0Sdrh FROM t1 AS a, t1 AS b 82beb9def0Sdrh WHERE a.seq>b.seq 83beb9def0Sdrh AND decimal_cmp(a.val,b.val)<=0; 84beb9def0Sdrh} {} 85beb9def0Sdrhdo_execsql_test 2030 { 86beb9def0Sdrh SELECT seq FROM t1 ORDER BY val COLLATE decimal; 87beb9def0Sdrh} {1 2 3 4 5 6 7 8 9 10 11 12} 88beb9def0Sdrhdo_execsql_test 2040 { 89beb9def0Sdrh SELECT seq FROM t1 ORDER BY val COLLATE decimal DESC; 90beb9def0Sdrh} {12 11 10 9 8 7 6 5 4 3 2 1} 91beb9def0Sdrh 92beb9def0Sdrhdo_execsql_test 3000 { 93beb9def0Sdrh CREATE TABLE t3(seq INTEGER PRIMARY KEY, val TEXT); 94beb9def0Sdrh WITH RECURSIVE c(x) AS (VALUES(1) UNION SELECT x+1 FROM c WHERE x<10) 95beb9def0Sdrh INSERT INTO t3(seq, val) SELECT x, x FROM c; 96beb9def0Sdrh WITH RECURSIVE c(x) AS (VALUES(1) UNION SELECT x+1 FROM c WHERE x<5) 97beb9def0Sdrh INSERT INTO t3(seq, val) SELECT x+10, x*1000 FROM c; 98beb9def0Sdrh SELECT decimal(val) FROM t3 ORDER BY seq; 99beb9def0Sdrh} {1 2 3 4 5 6 7 8 9 10 1000 2000 3000 4000 5000} 100beb9def0Sdrhdo_execsql_test 3020 { 101beb9def0Sdrh SELECT decimal_add(val,'0.5') FROM t3 WHERE seq>5 ORDER BY seq 102beb9def0Sdrh} {6.5 7.5 8.5 9.5 10.5 1000.5 2000.5 3000.5 4000.5 5000.5} 103beb9def0Sdrhdo_execsql_test 3030 { 104beb9def0Sdrh SELECT decimal_add(val,'-10') FROM t3 ORDER BY seq; 105beb9def0Sdrh} {-9 -8 -7 -6 -5 -4 -3 -2 -1 0 990 1990 2990 3990 4990} 106beb9def0Sdrh 107beb9def0Sdrhdo_execsql_test 4000 { 108beb9def0Sdrh SELECT decimal_sum(val) FROM t3; 109beb9def0Sdrh} {15055} 110beb9def0Sdrhdo_execsql_test 4010 { 111beb9def0Sdrh SELECT decimal_sum(decimal_add(val,val||'e+10')) FROM t3; 112beb9def0Sdrh} {150550000015055} 113beb9def0Sdrhdo_execsql_test 4010 { 114beb9def0Sdrh SELECT decimal_sum(decimal_add(val||'e+20',decimal_add(val,val||'e-20'))) 115beb9def0Sdrh FROM t3; 116beb9def0Sdrh} {1505500000000000000015055.00000000000000015055} 117beb9def0Sdrh 118427af8dcSdrhdo_execsql_test 5000 { 119427af8dcSdrh WITH RECURSIVE c(x,y,z) AS ( 120427af8dcSdrh VALUES(0,'1','1') 121427af8dcSdrh UNION ALL 122427af8dcSdrh SELECT x+1, decimal_mul(y,'2'), decimal_mul(z,'0.5') 123427af8dcSdrh FROM c WHERE x<32 124427af8dcSdrh ) 125427af8dcSdrh SELECT count(*) FROM c WHERE decimal_mul(y,z)='1'; 126427af8dcSdrh} {33} 127427af8dcSdrh 1286b647186Sdrhdo_execsql_test 5100 { 1296b647186Sdrh SELECT decimal_mul('1234.00','2.00'); 1306b647186Sdrh} {2468.00} 1316b647186Sdrhdo_execsql_test 5101 { 1326b647186Sdrh SELECT decimal_mul('1234.00','2.0000'); 1336b647186Sdrh} {2468.00} 1346b647186Sdrhdo_execsql_test 5102 { 1356b647186Sdrh SELECT decimal_mul('1234.0000','2.000'); 1366b647186Sdrh} {2468.000} 1376b647186Sdrhdo_execsql_test 5103 { 1386b647186Sdrh SELECT decimal_mul('1234.0000','2'); 1396b647186Sdrh} {2468} 1406b647186Sdrh 141*d8b3c199Sdrhif {[catch {load_static_extension db ieee754} error]} { 142*d8b3c199Sdrh puts "Skipping ieee754 tests, hit load error: $error" 143*d8b3c199Sdrh finish_test; return 144*d8b3c199Sdrh} 145*d8b3c199Sdrh 146*d8b3c199Sdrhdo_execsql_test 6000 { 147*d8b3c199Sdrh CREATE TABLE pow2(x INTEGER PRIMARY KEY, v TEXT); 148*d8b3c199Sdrh WITH RECURSIVE c(x,v) AS ( 149*d8b3c199Sdrh VALUES(0,'1') 150*d8b3c199Sdrh UNION ALL 151*d8b3c199Sdrh SELECT x+1, decimal_mul(v,'2') FROM c WHERE x+1<=971 152*d8b3c199Sdrh ) INSERT INTO pow2(x,v) SELECT x, v FROM c; 153*d8b3c199Sdrh WITH RECURSIVE c(x,v) AS ( 154*d8b3c199Sdrh VALUES(-1,'0.5') 155*d8b3c199Sdrh UNION ALL 156*d8b3c199Sdrh SELECT x-1, decimal_mul(v,'0.5') FROM c WHERE x-1>=-1075 157*d8b3c199Sdrh ) INSERT INTO pow2(x,v) SELECT x, v FROM c; 158*d8b3c199Sdrh} {} 159*d8b3c199Sdrhdo_execsql_test 6010 { 160*d8b3c199Sdrh WITH c(n) AS (SELECT ieee754_from_blob(x'0000000000000001')) 161*d8b3c199SdrhSELECT decimal_mul(ieee754_mantissa(c.n),pow2.v) 162*d8b3c199Sdrh FROM pow2, c WHERE pow2.x=ieee754_exponent(c.n); 163*d8b3c199Sdrh} {0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004940656458412465441765687928682213723650598026143247644255856825006755072702087518652998363616359923797965646954457177309266567103559397963987747960107818781263007131903114045278458171678489821036887186360569987307230500063874091535649843873124733972731696151400317153853980741262385655911710266585566867681870395603106249319452715914924553293054565444011274801297099995419319894090804165633245247571478690147267801593552386115501348035264934720193790268107107491703332226844753335720832431936092382893458368060106011506169809753078342277318329247904982524730776375927247874656084778203734469699533647017972677717585125660551199131504891101451037862738167250955837389733598993664809941164205702637090279242767544565229087538682506419718265533447265625} 164*d8b3c199Sdrhdo_execsql_test 6020 { 165*d8b3c199Sdrh WITH c(n) AS (SELECT ieee754_from_blob(x'7fefffffffffffff')) 166*d8b3c199SdrhSELECT decimal_mul(ieee754_mantissa(c.n),pow2.v) 167*d8b3c199Sdrh FROM pow2, c WHERE pow2.x=ieee754_exponent(c.n); 168*d8b3c199Sdrh} {179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368} 169*d8b3c199Sdrh 170*d8b3c199Sdrhdo_execsql_test 6100 { 171*d8b3c199Sdrh SELECT ieee754(ieee754_from_blob(x'0000000000000001')); 172*d8b3c199Sdrh} {ieee754(1,-1074)} 173*d8b3c199Sdrhdo_execsql_test 6110 { 174*d8b3c199Sdrh SELECT ieee754(ieee754_from_blob(x'7fefffffffffffff')); 175*d8b3c199Sdrh} {ieee754(9007199254740991,971)} 176*d8b3c199Sdrhdo_execsql_test 6120 { 177*d8b3c199Sdrh SELECT printf('%.8e',ieee754_from_blob(x'0000000000000001')); 178*d8b3c199Sdrh} {4.94065646e-324} 179*d8b3c199Sdrhdo_execsql_test 6130 { 180*d8b3c199Sdrh SELECT printf('%.8e',ieee754_from_blob(x'ffefffffffffffff')); 181*d8b3c199Sdrh} {-1.79769313e+308} 182*d8b3c199Sdrh 183*d8b3c199Sdrh 184*d8b3c199Sdrh 1856b647186Sdrh 186beb9def0Sdrhfinish_test 187