diff --git a/datafusion/sql/src/planner.rs b/datafusion/sql/src/planner.rs index 400bbe4fcaa9..ff899854977c 100644 --- a/datafusion/sql/src/planner.rs +++ b/datafusion/sql/src/planner.rs @@ -2862,13 +2862,34 @@ mod tests { } #[test] - fn test_int_decimal_scale_larger_precision() { - let sql = "SELECT CAST(10 AS DECIMAL(5, 10))"; - let err = logical_plan(sql).expect_err("query should have failed"); - assert_eq!( - r##"Internal("For decimal(precision, scale) precision must be less than or equal to 38 and scale can't be greater than precision. Got (5, 10)")"##, - format!("{:?}", err) - ); + fn cast_to_invalid_decimal_type() { + // precision == 0 + { + let sql = "SELECT CAST(10 AS DECIMAL(0))"; + let err = logical_plan(sql).expect_err("query should have failed"); + assert_eq!( + r##"Internal("Decimal(precision = 0, scale = 0) should satisty `0 < precision <= 38`, and `scale <= precision`.")"##, + format!("{:?}", err) + ); + } + // precision > 38 + { + let sql = "SELECT CAST(10 AS DECIMAL(39))"; + let err = logical_plan(sql).expect_err("query should have failed"); + assert_eq!( + r##"Internal("Decimal(precision = 39, scale = 0) should satisty `0 < precision <= 38`, and `scale <= precision`.")"##, + format!("{:?}", err) + ); + } + // precision < scale + { + let sql = "SELECT CAST(10 AS DECIMAL(5, 10))"; + let err = logical_plan(sql).expect_err("query should have failed"); + assert_eq!( + r##"Internal("Decimal(precision = 5, scale = 10) should satisty `0 < precision <= 38`, and `scale <= precision`.")"##, + format!("{:?}", err) + ); + } } #[test] diff --git a/datafusion/sql/src/utils.rs b/datafusion/sql/src/utils.rs index 952ef31106fd..16f24deff8a3 100644 --- a/datafusion/sql/src/utils.rs +++ b/datafusion/sql/src/utils.rs @@ -508,9 +508,9 @@ pub(crate) fn make_decimal_type( }; // Arrow decimal is i128 meaning 38 maximum decimal digits - if precision > DECIMAL128_MAX_PRECISION || scale > precision { + if precision == 0 || precision > DECIMAL128_MAX_PRECISION || scale > precision { Err(DataFusionError::Internal(format!( - "For decimal(precision, scale) precision must be less than or equal to 38 and scale can't be greater than precision. Got ({}, {})", + "Decimal(precision = {}, scale = {}) should satisty `0 < precision <= 38`, and `scale <= precision`.", precision, scale ))) } else {