blob: c8eb102157c22348262fce9aedd101c0119c98af [file] [log] [blame]
====
---- QUERY
# Test DECIMAL V1 divide result type
set decimal_v2=false;
select d1 / d2, d2 / d1, d3 / d4, d5 / d3, d3 / d5 from decimal_tbl;
---- RESULTS
0.55535553555,1.8006482982,NULL,10000.0891810008,0.000099999108197945064
21.12612612612,0.0473347547,NULL,0.2544210023,3.930493123209169054441
37.07207207207,0.0269744835,NULL,0.0000810000,12345.678900000000000000000
37.07207207207,0.0269744835,NULL,0.0908820008,11.003278877005347593582
398.92492492492,0.0025067373,NULL,0.0000630900,15850.349728459731155875669
---- TYPES
DECIMAL, DECIMAL, DECIMAL, DECIMAL, DECIMAL
====
---- QUERY
# Verify DECIMAL V2. Differences with V1:
# * d3/d4 does not overflow
# * d5/d3 has more scale
set decimal_v2=true;
select d1 / d2, d2 / d1, d3 / d4, d5 / d3, d3 / d5 from decimal_tbl;
---- RESULTS
0.55535553555,1.8006482982,10.000000,10000.08918100081154710738508,0.000099999108197945065
21.12612612613,0.0473347548,100.000000,0.25442100231523112106860,3.930493123209169054441
37.07207207207,0.0269744836,1000.000000,0.09088200082702620752594,11.003278877005347593583
37.07207207207,0.0269744836,10000.000000,0.00008100000073710000671,12345.678900000000000000000
398.92492492492,0.0025067373,100000.000000,0.00006309009057411982422,15850.349728459731155875669
---- TYPES
DECIMAL, DECIMAL, DECIMAL, DECIMAL, DECIMAL
====
---- QUERY
# Test DECIMAL V1 division by zero.
set decimal_v2=false;
select d1 / cast(0 as decimal(7, 2)), d1 / 0, 10.0 / 0 from decimal_tbl;
---- RESULTS
NULL,NULL,Infinity
NULL,NULL,Infinity
NULL,NULL,Infinity
NULL,NULL,Infinity
NULL,NULL,Infinity
---- TYPES
DECIMAL,DECIMAL,DOUBLE
====
---- QUERY
# Test DECIMAL V2 division by zero. Verify that Impala throws an error.
set decimal_v2=true;
select d1 / cast(0 as decimal(7, 2)) from decimal_tbl;
---- CATCH
UDF ERROR: Cannot divide decimal by zero
====
---- QUERY
set decimal_v2=true;
select d1 / 0 from decimal_tbl;
---- CATCH
UDF ERROR: Cannot divide decimal by zero
====
---- QUERY
set decimal_v2=true;
select 10.0 / 0;
---- CATCH
UDF ERROR: Cannot divide decimal by zero
====
---- QUERY
# Test DECIMAL V1 modulo zero.
set decimal_v2=false;
select d1 % cast(0 as decimal(7, 2)), d1 % 0, 10.0 % 0 from decimal_tbl;
---- RESULTS
NULL,NULL,NULL
NULL,NULL,NULL
NULL,NULL,NULL
NULL,NULL,NULL
NULL,NULL,NULL
---- TYPES
DECIMAL,DECIMAL,DOUBLE
====
---- QUERY
# Test DECIMAL V2 modulo zero. Verify that Impala throws an error.
set decimal_v2=true;
select d1 % cast(0 as decimal(7, 2)) from decimal_tbl;
---- CATCH
UDF ERROR: Cannot divide decimal by zero
====
---- QUERY
# Test DECIMAL V2 modulo zero. Verify that Impala throws an error.
set decimal_v2=true;
select d1 % 0 from decimal_tbl;
---- CATCH
UDF ERROR: Cannot divide decimal by zero
====
---- QUERY
# Test DECIMAL V2 modulo zero. Verify that Impala throws an error.
set decimal_v2=true;
select 10.0 % 0 from decimal_tbl;
---- CATCH
UDF ERROR: Cannot divide decimal by zero
====
---- QUERY
# Test DECIMAL V1 decimal overflow
set decimal_v2=false;
select
cast(9999999999999999999999999999 as decimal(38, 6)) *
cast(9999999999999999999999999999 as decimal(38, 6))
---- RESULTS
NULL
---- TYPES
DECIMAL
---- ERRORS
UDF WARNING: Decimal expression overflowed, returning NULL
====
---- QUERY
# Test DECIMAL V2 decimal overflow
set decimal_v2=true;
select
cast(9999999999999999999999999999 as decimal(38, 6)) *
cast(9999999999999999999999999999 as decimal(38, 6))
---- CATCH
UDF ERROR: Decimal expression overflowed
====
---- QUERY
# IMPALA-1837: Handle loss of precision when implicitly casting a literal to a decimal.
# Here "1.8" will be implicitly cast to a decimal(38,38), losing precision.
set decimal_v2=false;
select coalesce(1.8, cast(0 as decimal(38,38)));
---- TYPES
DECIMAL
---- RESULTS
0.00000000000000000000000000000000000000
---- ERRORS
UDF WARNING: Decimal expression overflowed, returning NULL
====
---- QUERY
# DECIMAL v1 sum() overflow. A negative number is incorrectly returned due to overflow.
set decimal_v2=false;
select sum(d6 * cast(4e37 as decimal(38,0))) from decimal_tbl;
---- RESULTS
-40282366920938463463374607431768211456
---- TYPES
DECIMAL
====
---- QUERY
# DECIMAL v2 sum() overflow.
set decimal_v2=true;
select sum(d6 * cast(4e37 as decimal(38,0))) from decimal_tbl;
---- CATCH
UDF ERROR: Sum computation overflowed
====
---- QUERY
# DECIMAL v1 avg() overflow. A negative number is incorrectly returned due to overflow.
set decimal_v2=false;
select avg(d6 * cast(4e37 as decimal(38,0))) from decimal_tbl;
---- RESULTS
-28056473384187692692674921486353642291
---- TYPES
DECIMAL
====
---- QUERY
# DECIMAL v2 avg() overflow.
set decimal_v2=true;
select avg(d6 * cast(4e37 as decimal(38,0))) from decimal_tbl;
---- CATCH
UDF ERROR: Avg computation overflowed
====
---- QUERY
# DECIMAL v1 avg() and sum() could incorrecly indicate an overflow error if
# only the absolute values are considered.
set decimal_v2=false;
with t as (
select cast(99999999999999999999999999999999999999 as decimal(38, 0)) as c
union all
select cast(-99999999999999999999999999999999999999 as decimal(38, 0)) as c)
select sum(c), avg(c) from t;
---- RESULTS
0,0
---- TYPES
DECIMAL,DECIMAL
====
---- QUERY
# DECIMAL v2 avg() and sum() could incorrecly indicate an overflow error if
# only the absolute values are considered.
set decimal_v2=true;
with t as (
select cast(99999999999999999999999999999999999999 as decimal(38, 0)) as c
union all
select cast(-99999999999999999999999999999999999999 as decimal(38, 0)) as c)
select sum(c), avg(c) from t;
---- RESULTS
0,0.000000
---- TYPES
DECIMAL,DECIMAL
====
---- QUERY
# Test casting behavior without decimal_v2 query option set.
set decimal_v2=false;
select cast(d3 as decimal(20, 3)) from decimal_tbl;
---- RESULTS
1.234
12.345
123.456
1234.567
12345.678
---- TYPES
DECIMAL
====
---- QUERY
# Test casting behavior with decimal_v2 query option set.
set decimal_v2=true;
select cast(d3 as decimal(20, 3)) from decimal_tbl;
---- RESULTS
1.235
12.346
123.457
1234.568
12345.679
---- TYPES
DECIMAL
====
---- QUERY
# Test casting behavior without decimal_v2 query option set.
set decimal_v2=false;
select sum(cast(d3 as DECIMAL(20,2)) + cast(d5 as DECIMAL(20,4))) from decimal_tbl;
---- RESULTS
26078.2788
---- TYPES
DECIMAL
====
---- QUERY
# Test casting behavior with decimal_v2 query option set.
set decimal_v2=true;
select sum(cast(d3 as DECIMAL(20,2)) + cast(d5 as DECIMAL(20,4))) from decimal_tbl;
---- RESULTS
26078.3189
---- TYPES
DECIMAL
====
---- QUERY
# Test AVG() with DECIMAL_V1
set decimal_v2=false;
select avg(d1), avg(d2), avg(d3), avg(d4), avg(d5), avg(d6) from decimal_tbl;
---- RESULTS
32222,666,2743.4567651580,0.12345678900000000000000000000000000000,2472.20577,1
---- TYPES
DECIMAL,DECIMAL,DECIMAL,DECIMAL,DECIMAL,DECIMAL
====
---- QUERY
# Test AVG() with DECIMAL_V2
set decimal_v2=true;
select avg(d1), avg(d2), avg(d3), avg(d4), avg(d5), avg(d6) from decimal_tbl;
---- RESULTS
32222.200000,666.400000,2743.4567651580,0.12345678900000000000000000000000000000,2472.205778,1.000000
---- TYPES
DECIMAL,DECIMAL,DECIMAL,DECIMAL,DECIMAL,DECIMAL
====
---- QUERY
# Test AVG() with DECIMAL_V1
set decimal_v2=false;
select l_tax, avg(cast(l_extendedprice as decimal(38,10))), avg(l_extendedprice)
from tpch_parquet.lineitem group by l_tax order by 1;
---- RESULTS
0.00,38241.5984613546,38241.59
0.01,38283.5417664599,38283.54
0.02,38250.4873094187,38250.48
0.03,38259.2810374789,38259.28
0.04,38247.1967454731,38247.19
0.05,38234.8480874721,38234.84
0.06,38246.4342924027,38246.43
0.07,38281.1963710003,38281.19
0.08,38251.6233675941,38251.62
---- TYPES
DECIMAL,DECIMAL,DECIMAL
====
---- QUERY
# Test AVG() with DECIMAL_V2
set decimal_v2=true;
select l_tax, avg(cast(l_extendedprice as decimal(38,10))), avg(l_extendedprice)
from tpch_parquet.lineitem group by l_tax order by 1;
---- RESULTS
0.00,38241.5984613546,38241.598461
0.01,38283.5417664600,38283.541766
0.02,38250.4873094187,38250.487309
0.03,38259.2810374789,38259.281037
0.04,38247.1967454731,38247.196745
0.05,38234.8480874721,38234.848087
0.06,38246.4342924027,38246.434292
0.07,38281.1963710004,38281.196371
0.08,38251.6233675942,38251.623368
---- TYPES
DECIMAL,DECIMAL,DECIMAL
====
---- QUERY
# Test AVG() with DECIMAL_V1
set decimal_v2=false;
select avg(l_extendedprice) as a from tpch_parquet.lineitem
group by l_tax having avg(l_extendedprice) > 38247.190 order by 1;
---- RESULTS
38250.48
38251.62
38259.28
38281.19
38283.54
---- TYPES
DECIMAL
====
---- QUERY
# Test AVG() with DECIMAL_V2
set decimal_v2=true;
select avg(l_extendedprice) as a from tpch_parquet.lineitem
group by l_tax having avg(l_extendedprice) > 38247.190 order by 1;
---- RESULTS
38247.196745
38250.487309
38251.623368
38259.281037
38281.196371
38283.541766
---- TYPES
DECIMAL
====
---- QUERY
# Test AVG overflow due to DECIMAL_v2
set decimal_v2=false;
select avg(c) from (select cast(1e32 as decimal(38,0)) - cast(1 as decimal(38,0)) as c) t
---- RESULTS
99999999999999999999999999999999
---- TYPES
DECIMAL
====
---- QUERY
set decimal_v2=false;
select avg(c) from (select cast(1e32 as decimal(38,0)) as c) t;
---- RESULTS
100000000000000000000000000000000
---- TYPES
DECIMAL
====
---- QUERY
set decimal_v2=true;
select avg(c) from (select cast(1e32 as decimal(38,0)) - cast(1 as decimal(38,0)) as c) t
---- RESULTS
99999999999999999999999999999999.000000
---- TYPES
DECIMAL
====
---- QUERY
set decimal_v2=true;
select avg(c) from (select cast(1e32 as decimal(38,0)) as c) t;
---- CATCH
UDF ERROR: Avg computation overflowed
====
---- QUERY
# Test sum() and avg() analytic fns with start bounds (tests Remove() for decimal)
# with DECIMAL_V1
set decimal_v2=false;
select
sum(c1) over (order by c1 rows between 5 preceding and current row),
sum(c2) over (order by c1 rows between 5 preceding and 5 following),
sum(c3) over (order by c1 rows between 5 preceding and 2 preceding),
avg(c1) over (order by c1 rows between 5 preceding and current row),
avg(c2) over (order by c1 rows between 5 preceding and 5 following),
avg(c3) over (order by c1 rows between 5 preceding and 2 preceding)
from decimal_tiny where c2 < 112
---- RESULTS: VERIFY_IS_EQUAL_SORTED
0.0000,618.33330,NULL,0.0000,103.05555,NULL
0.1111,725.66662,NULL,0.0555,103.66666,NULL
0.3333,834.22216,0.0,0.1111,104.27777,0.0
0.6666,943.99992,0.1,0.1666,104.88888,0.0
1.1110,1054.99990,0.3,0.2222,105.49999,0.1
1.6665,1054.99990,0.6,0.2777,105.49999,0.1
2.3331,954.99990,1.0,0.3888,106.11110,0.2
2.9997,853.77768,1.4,0.4999,106.72221,0.3
3.6663,751.33324,1.8,0.6110,107.33332,0.4
4.3329,647.66658,2.2,0.7221,107.94443,0.5
---- TYPES
DECIMAL,DECIMAL,DECIMAL,DECIMAL,DECIMAL,DECIMAL
====
---- QUERY
# Test sum() and avg() analytic fns with start bounds (tests Remove() for decimal)
# with DECIMAL_V2
set decimal_v2=true;
select
sum(c1) over (order by c1 rows between 5 preceding and current row),
sum(c2) over (order by c1 rows between 5 preceding and 5 following),
sum(c3) over (order by c1 rows between 5 preceding and 2 preceding),
avg(c1) over (order by c1 rows between 5 preceding and current row),
avg(c2) over (order by c1 rows between 5 preceding and 5 following),
avg(c3) over (order by c1 rows between 5 preceding and 2 preceding)
from decimal_tiny where c2 < 112
---- RESULTS: VERIFY_IS_EQUAL_SORTED
0.0000,618.33330,NULL,0.000000,103.055550,NULL
0.1111,725.66662,NULL,0.055550,103.666660,NULL
0.3333,834.22216,0.0,0.111100,104.277770,0.000000
0.6666,943.99992,0.1,0.166650,104.888880,0.050000
1.1110,1054.99990,0.3,0.222200,105.499990,0.100000
1.6665,1054.99990,0.6,0.277750,105.499990,0.150000
2.3331,954.99990,1.0,0.388850,106.111100,0.250000
2.9997,853.77768,1.4,0.499950,106.722210,0.350000
3.6663,751.33324,1.8,0.611050,107.333320,0.450000
4.3329,647.66658,2.2,0.722150,107.944430,0.550000
---- TYPES
DECIMAL,DECIMAL,DECIMAL,DECIMAL,DECIMAL,DECIMAL
====
---- QUERY
# IMPALA-6183: Make sure precision is not lost when converting decimal to double
# with DECIMAL_V1
set decimal_v2=false;
select
cast(cast(1.01234567890123456789 as decimal(21,20)) as double),
cast(cast(1.01234567890123456789 as decimal(38,37)) as double),
cast(cast(1.01234567890123456789 as decimal(11,10)) as double)
---- RESULTS
1.0123456789012345,1.0123456789012345,1.0123456789
---- TYPES
DOUBLE,DOUBLE,DOUBLE
====
---- QUERY
# IMPALA-6183: Make sure precision is not lost when converting decimal to double
# with DECIMAL_V2
set decimal_v2=true;
select
cast(cast(1.01234567890123456789 as decimal(21,20)) as double),
cast(cast(1.01234567890123456789 as decimal(38,37)) as double),
cast(cast(1.01234567890123456789 as decimal(11,10)) as double)
---- RESULTS
1.0123456789012345,1.0123456789012345,1.0123456789
---- TYPES
DOUBLE,DOUBLE,DOUBLE
====
---- QUERY
# IMPALA-5936: big decimal numbers with % operator
set decimal_v2=true;
select
cast(42607032167 as decimal(18, 0)) % 3,
cast(42606774111 as decimal(18, 0)) % 3,
cast(42363009429 as decimal(18, 0)) % 3,
cast(42603003271 as decimal(18, 0)) % 3,
cast(42606961501 as decimal(18, 0)) % 3,
cast(42608445511 as decimal(18, 0)) % 3
---- RESULTS
2,0,0,1,1,1
---- TYPES
DECIMAL,DECIMAL,DECIMAL,DECIMAL,DECIMAL,DECIMAL
====
---- QUERY
# IMPALA-5014: Check that we round when converting a decimal to timestamp
set decimal_v2=false;
select
cast(cast(12333333333.9999999994 as decimal(38, 10)) as timestamp),
cast(cast(12333333333.9999999995 as decimal(38, 10)) as timestamp),
cast(cast(333.9999999994 as decimal(13, 10)) as timestamp),
cast(cast(333.9999999995 as decimal(13, 10)) as timestamp),
cast(cast(12333333333.1111111114 as decimal(38, 10)) as timestamp),
cast(cast(12333333333.1111111115 as decimal(38, 10)) as timestamp),
cast(cast(12333333333.111111111411111 as decimal(38, 15)) as timestamp),
cast(cast(12333333333.111111111511111 as decimal(38, 15)) as timestamp),
cast(cast(12333333333.1111111114 as decimal(38, 27)) as timestamp),
cast(cast(12333333333.1111111115 as decimal(38, 27)) as timestamp),
cast(cast(12333333333.111 as decimal(38, 3)) as timestamp),
cast(cast(12333333333 as decimal(38, 0)) as timestamp);
---- RESULTS
2360-10-29 21:55:33.999999999,2360-10-29 21:55:33.999999999,1970-01-01 00:05:33.999999999,1970-01-01 00:05:33.999999999,2360-10-29 21:55:33.111111111,2360-10-29 21:55:33.111111111,2360-10-29 21:55:33.111111111,2360-10-29 21:55:33.111111111,2360-10-29 21:55:33.111111111,2360-10-29 21:55:33.111111111,2360-10-29 21:55:33.111000000,2360-10-29 21:55:33
---- TYPES
TIMESTAMP, TIMESTAMP, TIMESTAMP, TIMESTAMP, TIMESTAMP, TIMESTAMP, TIMESTAMP, TIMESTAMP, TIMESTAMP, TIMESTAMP, TIMESTAMP, TIMESTAMP
====
---- QUERY
set decimal_v2=true;
select
cast(cast(12333333333.9999999994 as decimal(38, 10)) as timestamp),
cast(cast(12333333333.9999999995 as decimal(38, 10)) as timestamp),
cast(cast(333.9999999994 as decimal(13, 10)) as timestamp),
cast(cast(333.9999999995 as decimal(13, 10)) as timestamp),
cast(cast(12333333333.1111111114 as decimal(38, 10)) as timestamp),
cast(cast(12333333333.1111111115 as decimal(38, 10)) as timestamp),
cast(cast(12333333333.111111111411111 as decimal(38, 15)) as timestamp),
cast(cast(12333333333.111111111511111 as decimal(38, 15)) as timestamp),
cast(cast(12333333333.1111111114 as decimal(38, 27)) as timestamp),
cast(cast(12333333333.1111111115 as decimal(38, 27)) as timestamp),
cast(cast(12333333333.111 as decimal(38, 3)) as timestamp),
cast(cast(12333333333 as decimal(38, 0)) as timestamp);
---- RESULTS
2360-10-29 21:55:33.999999999,2360-10-29 21:55:34,1970-01-01 00:05:33.999999999,1970-01-01 00:05:34,2360-10-29 21:55:33.111111111,2360-10-29 21:55:33.111111112,2360-10-29 21:55:33.111111111,2360-10-29 21:55:33.111111112,2360-10-29 21:55:33.111111111,2360-10-29 21:55:33.111111112,2360-10-29 21:55:33.111000000,2360-10-29 21:55:33
---- TYPES
TIMESTAMP, TIMESTAMP, TIMESTAMP, TIMESTAMP, TIMESTAMP, TIMESTAMP, TIMESTAMP, TIMESTAMP, TIMESTAMP, TIMESTAMP, TIMESTAMP, TIMESTAMP
====
---- QUERY
# Check that converting from decimal to date is not allowed
set decimal_v2=false;
select cast(cast(0.499 as decimal(9, 3)) as date);
---- CATCH
AnalysisException: Invalid type cast of CAST(0.499 AS DECIMAL(9,3)) from DECIMAL(9,3) to DATE
====
---- QUERY
set decimal_v2=true;
select cast(cast(0.499 as decimal(9, 3)) as date);
---- CATCH
AnalysisException: Invalid type cast of CAST(0.499 AS DECIMAL(9,3)) from DECIMAL(9,3) to DATE
====
---- QUERY
# IMPALA-6405: String to Decimal conversion errors
set decimal_v2=false;
select cast("abc" as decimal(5, 2));
---- RESULTS
NULL
---- TYPES
DECIMAL
---- ERRORS
UDF WARNING: String to Decimal parse failed
====
---- QUERY
set decimal_v2=true;
select cast("abc" as decimal(5, 2));
---- CATCH
UDF ERROR: String to Decimal parse failed
====
---- QUERY
set decimal_v2=false;
select cast("1234.5" as decimal(5, 2));
---- RESULTS
NULL
---- TYPES
DECIMAL
---- ERRORS
UDF WARNING: String to Decimal cast overflowed
====
---- QUERY
set decimal_v2=true;
select cast("1234.5" as decimal(5, 2));
---- CATCH
UDF ERROR: String to Decimal cast overflowed
====
---- QUERY
# mod and % should be equivalent in Decimal V2 mode.
set decimal_v2=true;
select typeof(9.8 % 3);
---- RESULTS
'DECIMAL(2,1)'
====
---- QUERY
# mod and % should be equivalent in Decimal V2 mode.
set decimal_v2=true;
select typeof(mod(9.7,3));
---- RESULTS
'DECIMAL(2,1)'
====
---- QUERY
# mod and % are different in Decimal V1 mode for this case.
set decimal_v2=false;
select typeof(9.6 % 3);
---- RESULTS
'DOUBLE'
====
---- QUERY
# mod and % are different in Decimal V1 mode for this case.
set decimal_v2=false;
select typeof(mod(9.6, 3));
---- RESULTS
'DECIMAL(4,1)'
====