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 116227224fdd1..3ce11b9eb1572 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 72e459ca1982f..12eb52bc168e2 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)