blob: 55c13b31b186362724d59a65babd5446480c949e [file] [log] [blame]
# name: test/sql/types/decimal/decimal_arithmetic.test
# description: Test basic decimals
# group: [decimal]
statement ok
PRAGMA enable_verification
# negate
query II
SELECT -('0.1'::DECIMAL), -('-0.1'::DECIMAL)
----
-0.1 0.1
# unary +
query II
SELECT +('0.1'::DECIMAL), +('-0.1'::DECIMAL)
----
0.1 -0.1
# addition
query I
SELECT '0.1'::DECIMAL + '0.1'::DECIMAL
----
0.2
# addition with non-decimal
query I
SELECT '0.1'::DECIMAL + 1::INTEGER
----
1.1
# addition that would overflow the base types
query I
SELECT '0.5'::DECIMAL(4,4) + '0.5'::DECIMAL(4,4)
----
1.0
# addition between different decimal types
query I
SELECT '0.5'::DECIMAL(1,1) + '100.0'::DECIMAL(3,0)
----
100.5
# test decimals and integers with big decimals
query IIIIII
SELECT ('0.5'::DECIMAL(1,1) + 10000)::VARCHAR,
('0.54321'::DECIMAL(5,5) + 10000)::VARCHAR,
('0.5432154321'::DECIMAL(10,10) + 10000)::VARCHAR,
('0.543215432154321'::DECIMAL(15,15) + 10000::DECIMAL(20,15))::VARCHAR,
('0.54321543215432154321'::DECIMAL(20,20) + 10000)::VARCHAR,
('0.5432154321543215432154321'::DECIMAL(25,25) + 10000)::VARCHAR
----
10000.5
10000.54321
10000.5432154321
10000.543215432154321
10000.54321543215432154321
10000.5432154321543215432154321
# no out of range
query I
SELECT ('0.54321543215432154321543215432154321'::DECIMAL(35,35) + 10000)::VARCHAR
----
10000.54321543215432154321543215432154321
# different types
query IIII
SELECT '0.5'::DECIMAL(1,1) + 1::TINYINT,
'0.5'::DECIMAL(1,1) + 1::SMALLINT,
'0.5'::DECIMAL(1,1) + 1::INTEGER,
'0.5'::DECIMAL(1,1) + 1::BIGINT
----
1.5 1.5 1.5 1.5
# negative numbers
query IIII
SELECT '0.5'::DECIMAL(1,1) + -1::TINYINT,
'0.5'::DECIMAL(1,1) + -1::SMALLINT,
'0.5'::DECIMAL(1,1) + -1::INTEGER,
'0.5'::DECIMAL(1,1) + -1::BIGINT
----
-0.5 -0.5 -0.5 -0.5
# subtract
query IIII
SELECT '0.5'::DECIMAL(1,1) - 1::TINYINT,
'0.5'::DECIMAL(1,1) - 1::SMALLINT,
'0.5'::DECIMAL(1,1) - 1::INTEGER,
'0.5'::DECIMAL(1,1) - 1::BIGINT
----
-0.5 -0.5 -0.5 -0.5
# negative numbers
query IIII
SELECT '0.5'::DECIMAL(1,1) - -1::TINYINT,
'0.5'::DECIMAL(1,1) - -1::SMALLINT,
'0.5'::DECIMAL(1,1) - -1::INTEGER,
'0.5'::DECIMAL(1,1) - -1::BIGINT
----
1.5 1.5 1.5 1.5
# now with a table
statement ok
CREATE TABLE decimals(d DECIMAL(3, 2));
statement ok
INSERT INTO decimals VALUES ('0.1'), ('0.2');
query II
SELECT d + '0.1'::DECIMAL, d + 10000 FROM decimals ORDER BY d;
----
0.2 10000.1
0.3 10000.2
# multiplication
query I
SELECT '0.1'::DECIMAL * '10.0'::DECIMAL
----
1.0
query I
SELECT typeof('0.1'::DECIMAL(2,1) * '10.0'::DECIMAL(3,1))
----
DECIMAL(5, 2)
query I
SELECT '0.1'::DECIMAL * '0.1'::DECIMAL
----
0.01
# multiplication with non-decimal
query I
SELECT '0.1'::DECIMAL * 10::INTEGER
----
1.0
# multiplication that would overflow the base types
query I
SELECT '5.0'::DECIMAL(4,3) * '5.0'::DECIMAL(4,3)
----
25.0
# negative multiplication
query I
SELECT '-5.0'::DECIMAL(4,3) * '5.0'::DECIMAL(4,3)
----
-25.0
# no precision is lost
query I
SELECT ('18.25'::DECIMAL(4,2) * '17.25'::DECIMAL(4,2))::VARCHAR
----
314.8125
# different types
query IIII
SELECT '0.001'::DECIMAL * 100::TINYINT,
'0.001'::DECIMAL * 10000::SMALLINT,
'0.001'::DECIMAL * 1000000::INTEGER,
'0.001'::DECIMAL * 100000000::BIGINT
----
0.100
10.000
1000.000
100000.000
# multiplication could be performed exactly
query I
SELECT '0.000000000000000000000000000001'::DECIMAL(38,30) * '0.000000000000000000000000000001'::DECIMAL(38,30)
----
0.000000000000000000000000000000000000000000000000000000000001
# test addition, subtraction and multiplication with various scales and precisions
query IIII
SELECT 2.0 + 1.0,
2.0000 + 1.0000,
2.000000000000 + 1.000000000000,
2.00000000000000000000 + 1.00000000000000000000
----
3.0
3.0000
3.000000000000
3.00000000000000000000
query IIII
SELECT 2.0 - 1.0,
2.0000 - 1.0000,
2.000000000000 - 1.000000000000,
2.00000000000000000000 - 1.00000000000000000000
----
1.0
1.0000
1.000000000000
1.00000000000000000000
query II
SELECT 2.0 * 1.0,
2.0000 * 1.0000
----
2.0
2.0000