From 0117e917183c14e3df04cd98c6bfc8852b8a9e44 Mon Sep 17 00:00:00 2001 From: ulysses-you Date: Mon, 30 Jan 2023 13:48:57 +0800 Subject: [PATCH] IntegralDivide use decimal(1, 0) to represent 0 --- .../apache/spark/sql/catalyst/expressions/arithmetic.scala | 4 +++- .../src/test/scala/org/apache/spark/sql/DataFrameSuite.scala | 5 +++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/arithmetic.scala b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/arithmetic.scala index 116227224fdd..3ce11b9eb157 100644 --- a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/arithmetic.scala +++ b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/arithmetic.scala @@ -865,7 +865,9 @@ case class IntegralDivide( // This follows division rule val intDig = p1 - s1 + s2 // No precision loss can happen as the result scale is 0. - DecimalType.bounded(intDig, 0) + // If intDig is 0 that means the result data is 0, to be safe we use decimal(1, 0) + // to represent 0. + DecimalType.bounded(if (intDig == 0) 1 else intDig, 0) } override def sqlOperator: String = "div" diff --git a/sql/core/src/test/scala/org/apache/spark/sql/DataFrameSuite.scala b/sql/core/src/test/scala/org/apache/spark/sql/DataFrameSuite.scala index 72e459ca1982..12eb52bc168e 100644 --- a/sql/core/src/test/scala/org/apache/spark/sql/DataFrameSuite.scala +++ b/sql/core/src/test/scala/org/apache/spark/sql/DataFrameSuite.scala @@ -3584,6 +3584,11 @@ class DataFrameSuite extends QueryTest assert(row.getInt(0).toString == row.getString(3)) } } + + test("SPARK-41219: IntegralDivide use decimal(1, 0) to represent 0") { + val df = Seq("0.5944910").toDF("a") + checkAnswer(df.selectExpr("cast(a as decimal(7,7)) div 100"), Row(0)) + } } case class GroupByKey(a: Int, b: Int)