mirror of
https://github.com/apache/impala.git
synced 2025-12-30 12:02:10 -05:00
In this patch we implement strict decimal type checking in the FE in various situations when DECIMAL_V2 is enabled. What is affected: - Union. If we union two decimals and it is not possible to come up with a decimal that will be able to contain all the digits, an error is thrown. For example, the union(decimal(20, 10), decimal(20, 20)) returns decimal(30, 20). However, for union(decimal(38, 0), decimal(38, 38)) the ideal return type would be decimal(76,38), but this is too large, so an error is thrown. - Insert. If we are inserting a decimal value into a column where we are not guaranteed that all digits will fit, an error is thrown. For example, inserting a decimal(38,0) value into a decimal(38,38) column. - Functions such as coalesce(). If we are unable to determine the output type that guarantees that all digits will fit from all the arguments, an error is thrown. For example, coalesce(decimal(38,38), decimal(38,0)) will throw an error. - Hash Join. When joining on two decimals, if a type cannot be determined that both columns can be cast to, we throw an error. For example, join on decimal(38,0) and decimal(38,38) will result in an error. To avoid these errors, you need to use CAST() on some of the decimals. In this patch we also change the output decimal calculation of decimal round, truncate and related functions. If these functions are a no-op, the resulting decimal type is the same as the input type. Testing: - Ran a core build which passed. Change-Id: Id406f4189e01a909152985fabd5cca7a1527a568 Reviewed-on: http://gerrit.cloudera.org:8080/9930 Reviewed-by: Alex Behm <alex.behm@cloudera.com> Tested-by: Impala Public Jenkins <impala-public-jenkins@cloudera.com>
515 lines
16 KiB
Plaintext
515 lines
16 KiB
Plaintext
====
|
|
---- 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
|
|
# 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
|
|
====
|