-- ****************************** -- * Now check the behaviour of the decimal type -- ****************************** select * from num_data order by 1,2; -- ****************************** -- * Addition check -- ****************************** drop table if exists num_result; CREATE TABLE num_result (id1 int, id2 int, result decimal(38,10)) distributed by hash(id1) properties("replication_num"="1"); INSERT INTO num_result SELECT t1.id, t2.id, t1.val + t2.val FROM num_data t1, num_data t2; SELECT t1.id1, t1.id2, t1.result, t2.expected FROM num_result t1, num_exp_add t2 WHERE t1.id1 = t2.id1 AND t1.id2 = t2.id2 AND t1.result != t2.expected order by 1,2,3,4; drop table if exists num_result; CREATE TABLE num_result (id1 int, id2 int, result decimal(38,10)) distributed by hash(id1) properties("replication_num"="1"); INSERT INTO num_result SELECT t1.id, t2.id, round(t1.val + t2.val, 10) FROM num_data t1, num_data t2; SELECT t1.id1, t1.id2, t1.result, round(t2.expected, 10) as expected FROM num_result t1, num_exp_add t2 WHERE t1.id1 = t2.id1 AND t1.id2 = t2.id2 AND t1.result != round(t2.expected, 10) order by 1,2,3,4; -- ****************************** -- * Subtraction check -- ****************************** DROP TABLE num_result; CREATE TABLE num_result (id1 int, id2 int, result decimal(38,10)) distributed by hash(id1) properties("replication_num"="1"); INSERT INTO num_result SELECT t1.id, t2.id, t1.val - t2.val FROM num_data t1, num_data t2; SELECT t1.id1, t1.id2, t1.result, t2.expected FROM num_result t1, num_exp_sub t2 WHERE t1.id1 = t2.id1 AND t1.id2 = t2.id2 AND t1.result != t2.expected order by 1,2,3,4; DROP TABLE num_result; CREATE TABLE num_result (id1 int, id2 int, result decimal(38,10)) distributed by hash(id1) properties("replication_num"="1"); INSERT INTO num_result SELECT t1.id, t2.id, round(t1.val - t2.val, 40) FROM num_data t1, num_data t2; SELECT t1.id1, t1.id2, t1.result, round(t2.expected, 40) FROM num_result t1, num_exp_sub t2 WHERE t1.id1 = t2.id1 AND t1.id2 = t2.id2 AND t1.result != round(t2.expected, 40) order by 1,2,3,4; -- ****************************** -- * Multiply check -- ****************************** set enable_decimal256=true; DROP TABLE num_result; CREATE TABLE num_result (id1 int, id2 int, result decimal(76,20)) distributed by hash(id1) properties("replication_num"="1"); INSERT INTO num_result SELECT t1.id, t2.id, t1.val * t2.val FROM num_data t1, num_data t2; SELECT t1.id1, t1.id2, t1.result, t2.expected FROM num_result t1, num_exp_mul t2 WHERE t1.id1 = t2.id1 AND t1.id2 = t2.id2 AND t1.result != t2.expected order by 1,2,3,4; DROP TABLE num_result; CREATE TABLE num_result (id1 int, id2 int, result decimal(76,20)) distributed by hash(id1) properties("replication_num"="1"); INSERT INTO num_result SELECT t1.id, t2.id, round(t1.val * t2.val, 30) FROM num_data t1, num_data t2; SELECT t1.id1, t1.id2, t1.result, round(t2.expected, 30) as expected FROM num_result t1, num_exp_mul t2 WHERE t1.id1 = t2.id1 AND t1.id2 = t2.id2 AND t1.result != round(t2.expected, 30) order by 1,2,3,4; -- ****************************** -- * Division check -- ****************************** DROP TABLE num_result; CREATE TABLE num_result (id1 int, id2 int, result decimal(76,20)) distributed by hash(id1) properties("replication_num"="1"); INSERT INTO num_result SELECT t1.id, t2.id, cast(t1.val as decimal(37, 16)) / t2.val FROM num_data t1, num_data t2 WHERE t2.val != '0.0'; SELECT t1.id1, t1.id2, t1.result, t2.expected FROM num_result t1, num_exp_div t2 WHERE t1.id1 = t2.id1 AND t1.id2 = t2.id2 AND t1.result != t2.expected order by 1,2,3,4; DROP TABLE num_result; CREATE TABLE num_result (id1 int, id2 int, result decimal(76,20)) distributed by hash(id1) properties("replication_num"="1"); INSERT INTO num_result SELECT t1.id, t2.id, round(cast(t1.val as decimal(37, 16)) / t2.val, 80) FROM num_data t1, num_data t2 WHERE t2.val != '0.0'; SELECT t1.id1, t1.id2, t1.result, round(t2.expected, 80) as expected FROM num_result t1, num_exp_div t2 WHERE t1.id1 = t2.id1 AND t1.id2 = t2.id2 AND t1.result != round(t2.expected, 80) order by 1,2,3,4; -- TODO: sqrt, ln, log currently return double -- ****************************** -- * Square root check -- ****************************** -- DROP TABLE num_result; -- CREATE TABLE num_result (id1 int, id2 int, result decimal(38,20)) distributed by hash(id1) properties("replication_num"="1"); -- INSERT INTO num_result SELECT id, 0, SQRT(ABS(val)) -- FROM num_data; -- SELECT t1.id1, t1.result, t2.expected -- FROM num_result t1, num_exp_sqrt t2 -- WHERE t1.id1 = t2.id -- AND t1.result != t2.expected order by 1,2,3; -- ****************************** -- * Natural logarithm check -- ****************************** -- DROP TABLE num_result; -- CREATE TABLE num_result (id1 int, id2 int, result decimal(38,20)) distributed by hash(id1) properties("replication_num"="1"); -- INSERT INTO num_result SELECT id, 0, LN(ABS(val)) -- FROM num_data -- WHERE val != '0.0'; -- SELECT t1.id1, t1.result, t2.expected -- FROM num_result t1, num_exp_ln t2 -- WHERE t1.id1 = t2.id -- AND t1.result != t2.expected order by 1,2,3; -- ****************************** -- * Logarithm base 10 check -- ****************************** -- DROP TABLE num_result; -- CREATE TABLE num_result (id1 int, id2 int, result decimal(38,20)) distributed by hash(id1) properties("replication_num"="1"); -- INSERT INTO num_result SELECT id, 0, LOG(cast('10' as decimal), ABS(val)) -- FROM num_data -- WHERE val != '0.0'; -- SELECT t1.id1, t1.result, t2.expected -- FROM num_result t1, num_exp_log10 t2 -- WHERE t1.id1 = t2.id -- AND t1.result != t2.expected order by 1,2,3; -- ****************************** -- * POWER(10, LN(value)) check -- ****************************** -- DROP TABLE num_result; -- CREATE TABLE num_result (id1 int, id2 int, result decimal(38,10)) distributed by hash(id1) properties("replication_num"="1"); -- INSERT INTO num_result SELECT id, 0, POWER(cast('10' as decimal), LN(ABS(round(val,200)))) -- FROM num_data -- WHERE val != '0.0'; -- SELECT t1.id1, t1.result, t2.expected -- FROM num_result t1, num_exp_power_10_ln t2 -- WHERE t1.id1 = t2.id -- AND t1.result != t2.expected; SELECT power(cast('-2' as decimal), '3'); SELECT power(cast('-2' as decimal), '-1'); -- ****************************** -- * miscellaneous checks for things that have been broken in the past... -- ****************************** -- decimal AVG used to fail on some platforms SELECT AVG(val) FROM num_data; SELECT MAX(val) FROM num_data; SELECT MIN(val) FROM num_data; -- TODO: stddev and VARIANCE result is same as MySQL but different with Postgres -- postgres: -- SELECT STDDEV(val) FROM num_data; -- stddev -- ------------------------------- -- 27791203.28758835329805617386 -- (1 row) -- -- SELECT VARIANCE(val) FROM num_data; -- variance -- -------------------------------------- -- 772350980172061.69659105821915863601 -- (1 row) SELECT STDDEV(val) FROM num_data; SELECT VARIANCE(val) FROM num_data; -- Check for appropriate rounding and overflow drop table if exists fract_only; CREATE TABLE fract_only (id int, val decimal(4,4)) distributed by hash(id) properties("replication_num"="1"); INSERT INTO fract_only VALUES (1, '0.0'); INSERT INTO fract_only VALUES (2, '0.1'); -- currently doris insert 0.9999 -- INSERT INTO fract_only VALUES (3, '1.0'); -- should fail INSERT INTO fract_only VALUES (4, '-0.9999'); INSERT INTO fract_only VALUES (5, '0.99994'); -- INSERT INTO fract_only VALUES (6, '0.99995'); -- should fail INSERT INTO fract_only VALUES (7, '0.00001'); INSERT INTO fract_only VALUES (8, '0.00017'); -- INSERT INTO fract_only VALUES (10, 'Inf'); -- should fail -- INSERT INTO fract_only VALUES (11, '-Inf'); -- should fail SELECT * FROM fract_only order by 1,2; -- Check conversion to integers -- SELECT (-9223372036854775808.5)::int8; -- should fail SELECT cast(-9223372036854775808.4 as bigint); -- ok SELECT cast(9223372036854775807.4 as bigint); -- ok -- SELECT 9223372036854775807.5::int8; -- should fail -- SELECT (-2147483648.5)::int; -- should fail SELECT cast(-2147483648.4 as int); -- ok SELECT cast(2147483647.4 as int); -- ok -- SELECT 2147483647.5::int; -- should fail -- SELECT (-32768.5)::int2; -- should fail SELECT cast(-32768.4 as smallint); -- ok SELECT cast(32767.4 as smallint); -- ok -- SELECT 32767.5::int2; -- should fail -- Simple check that ceil(), floor(), and round() work correctly drop table if exists ceil_floor_round; CREATE TABLE ceil_floor_round (a decimal(38,7)) distributed by hash(a) properties("replication_num"="1"); INSERT INTO ceil_floor_round VALUES ('-5.5'); INSERT INTO ceil_floor_round VALUES ('-5.499999'); INSERT INTO ceil_floor_round VALUES ('9.5'); INSERT INTO ceil_floor_round VALUES ('9.4999999'); INSERT INTO ceil_floor_round VALUES ('0.0'); INSERT INTO ceil_floor_round VALUES ('0.0000001'); INSERT INTO ceil_floor_round VALUES ('-0.000001'); SELECT a, ceil(a), ceiling(a), floor(a), round(a) FROM ceil_floor_round order by 1,2,3,4,5; DROP TABLE ceil_floor_round; -- TODO: strict mode -- DROP TABLE if exists num_input_test; -- CREATE TABLE num_input_test (n1 decimal(38,10)) distributed by hash(n1) properties("replication_num"="1"); -- INSERT INTO num_input_test(n1) VALUES (' 123'); -- INSERT INTO num_input_test(n1) VALUES (' 3245874 '); -- INSERT INTO num_input_test(n1) VALUES (' -93853'); -- INSERT INTO num_input_test(n1) VALUES ('555.50'); -- INSERT INTO num_input_test(n1) VALUES ('-555.50'); -- INSERT INTO num_input_test(n1) VALUES ('NaN '); -- INSERT INTO num_input_test(n1) VALUES (' nan'); -- INSERT INTO num_input_test(n1) VALUES (' inf '); -- INSERT INTO num_input_test(n1) VALUES (' +inf '); -- INSERT INTO num_input_test(n1) VALUES (' -inf '); -- INSERT INTO num_input_test(n1) VALUES (' Infinity '); -- INSERT INTO num_input_test(n1) VALUES (' +inFinity '); -- INSERT INTO num_input_test(n1) VALUES (' -INFINITY '); -- INSERT INTO num_input_test(n1) VALUES ('12_000_000_000'); -- INSERT INTO num_input_test(n1) VALUES ('12_000.123_456'); -- INSERT INTO num_input_test(n1) VALUES ('23_000_000_000e-1_0'); -- INSERT INTO num_input_test(n1) VALUES ('.000_000_000_123e1_0'); -- INSERT INTO num_input_test(n1) VALUES ('.000_000_000_123e+1_1'); -- INSERT INTO num_input_test(n1) VALUES ('0b10001110111100111100001001010'); -- INSERT INTO num_input_test(n1) VALUES (' -0B_1010_1011_0101_0100_1010_1001_1000_1100_1110_1011_0001_1111_0000_1010_1101_0010 '); -- INSERT INTO num_input_test(n1) VALUES (' +0o112402761777 '); -- INSERT INTO num_input_test(n1) VALUES ('-0O0012_5524_5230_6334_3167_0261'); -- INSERT INTO num_input_test(n1) VALUES ('-0x0000000000000000000000000deadbeef'); -- INSERT INTO num_input_test(n1) VALUES (' 0X_30b1_F33a_6DF0_bD4E_64DF_9BdA_7D15 '); -- -- -- bad inputs -- INSERT INTO num_input_test(n1) VALUES (' '); -- INSERT INTO num_input_test(n1) VALUES (' 1234 %'); -- INSERT INTO num_input_test(n1) VALUES ('xyz'); -- INSERT INTO num_input_test(n1) VALUES ('- 1234'); -- INSERT INTO num_input_test(n1) VALUES ('5 . 0'); -- INSERT INTO num_input_test(n1) VALUES ('5. 0 '); -- INSERT INTO num_input_test(n1) VALUES (''); -- INSERT INTO num_input_test(n1) VALUES (' N aN '); -- INSERT INTO num_input_test(n1) VALUES ('+NaN'); -- INSERT INTO num_input_test(n1) VALUES ('-NaN'); -- INSERT INTO num_input_test(n1) VALUES ('+ infinity'); -- INSERT INTO num_input_test(n1) VALUES ('_123'); -- INSERT INTO num_input_test(n1) VALUES ('123_'); -- INSERT INTO num_input_test(n1) VALUES ('12__34'); -- INSERT INTO num_input_test(n1) VALUES ('123_.456'); -- INSERT INTO num_input_test(n1) VALUES ('123._456'); -- INSERT INTO num_input_test(n1) VALUES ('1.2e_34'); -- INSERT INTO num_input_test(n1) VALUES ('1.2e34_'); -- INSERT INTO num_input_test(n1) VALUES ('1.2e3__4'); -- INSERT INTO num_input_test(n1) VALUES ('0b1112'); -- INSERT INTO num_input_test(n1) VALUES ('0c1112'); -- INSERT INTO num_input_test(n1) VALUES ('0o12345678'); -- INSERT INTO num_input_test(n1) VALUES ('0x1eg'); -- INSERT INTO num_input_test(n1) VALUES ('0x12.34'); -- INSERT INTO num_input_test(n1) VALUES ('0x__1234'); -- INSERT INTO num_input_test(n1) VALUES ('0x1234_'); -- INSERT INTO num_input_test(n1) VALUES ('0x12__34'); -- -- SELECT * FROM num_input_test order by 1; -- -- Test some corner cases for division -- select cast(999999999999999999999 as decimal(21,0))/1000000000000000000000; select mod(999999999999999999999,1000000000000000000000); select cast(-9999999999999999999999 as decimal(22,0))/1000000000000000000000; select mod(-9999999999999999999999,1000000000000000000000); -- test integer division -- select (-9999999999999999999999/1000000000000000000000)*1000000000000000000000 + mod(-9999999999999999999999,1000000000000000000000); select mod (70.0,70) ; select 70.0 / 70 ; select 12345678901234567890 % 123; select 12345678901234567890 / 123; -- -- Test some corner cases for square root -- -- select sqrt(cast(1.000000000000003 as decimal(16,15))); -- select sqrt(cast(1.000000000000004 as decimal(16,15))); -- select sqrt(cast(96627521408608.56340355805 as decimal(25,11))); -- select sqrt(cast(96627521408608.56340355806 as decimal(25,11))); -- select sqrt(cast(515549506212297735.073688290367 as decimal(31, 12))); -- select sqrt(cast(515549506212297735.073688290368 as decimal(31, 12))); -- select sqrt(8015491789940783531003294973900306); -- select sqrt(8015491789940783531003294973900307);