xref: /sqlite-3.40.0/test/decimal.test (revision d8b3c199)
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