You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@arrow.apache.org by al...@apache.org on 2022/10/13 10:37:32 UTC
[arrow-datafusion] branch master updated: Add `precision != 0` check when making decimal type (#3818)
This is an automated email from the ASF dual-hosted git repository.
alamb pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/arrow-datafusion.git
The following commit(s) were added to refs/heads/master by this push:
new 051f243bc Add `precision != 0` check when making decimal type (#3818)
051f243bc is described below
commit 051f243bc26fec9ad2e53749c6c880d2c2328eb2
Author: Remzi Yang <59...@users.noreply.github.com>
AuthorDate: Thu Oct 13 18:37:25 2022 +0800
Add `precision != 0` check when making decimal type (#3818)
* add precision check for zero
Signed-off-by: remzi <13...@gmail.com>
* update error msg
Signed-off-by: remzi <13...@gmail.com>
Signed-off-by: remzi <13...@gmail.com>
---
datafusion/sql/src/planner.rs | 35 ++++++++++++++++++++++++++++-------
datafusion/sql/src/utils.rs | 4 ++--
2 files changed, 30 insertions(+), 9 deletions(-)
diff --git a/datafusion/sql/src/planner.rs b/datafusion/sql/src/planner.rs
index 400bbe4fc..ff8998549 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 952ef3110..16f24deff 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 {