From e37b06482ce4634501bb08ac42172f48eeb71081 Mon Sep 17 00:00:00 2001 From: Shilong Duan Date: Mon, 8 Jun 2026 11:02:44 +0800 Subject: [PATCH 1/4] [VL] Fix CheckOverflowTransformer using wrong child type for cast decision --- .../apache/gluten/expression/UnaryExpressionTransformer.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gluten-substrait/src/main/scala/org/apache/gluten/expression/UnaryExpressionTransformer.scala b/gluten-substrait/src/main/scala/org/apache/gluten/expression/UnaryExpressionTransformer.scala index b762ec95b64..1c0faf599bb 100644 --- a/gluten-substrait/src/main/scala/org/apache/gluten/expression/UnaryExpressionTransformer.scala +++ b/gluten-substrait/src/main/scala/org/apache/gluten/expression/UnaryExpressionTransformer.scala @@ -87,7 +87,7 @@ case class CheckOverflowTransformer( context, substraitExprName, child.doTransform(context), - original.child.dataType, + child.dataType, original.dataType, original.nullable, original.nullOnOverflow) From 375b9f2d0b62b67613e39773a081c0fc87830ac3 Mon Sep 17 00:00:00 2001 From: Shilong Duan Date: Mon, 8 Jun 2026 14:36:10 +0800 Subject: [PATCH 2/4] rerun CI From a4d8a793f80e387d371f063bf7000536f414f1ae Mon Sep 17 00:00:00 2001 From: Shilong Duan Date: Wed, 10 Jun 2026 20:18:52 +0800 Subject: [PATCH 3/4] rerun CI From cb57f6c8ccbbaeab34adcbddc9c32bf4898b9032 Mon Sep 17 00:00:00 2001 From: Shilong Duan Date: Wed, 17 Jun 2026 17:14:21 +0800 Subject: [PATCH 4/4] add ut --- .../GlutenDecimalPrecisionSuite.scala | 27 +++++++++++++++++++ .../GlutenDecimalPrecisionSuite.scala | 27 +++++++++++++++++++ .../GlutenDecimalPrecisionSuite.scala | 27 +++++++++++++++++++ .../GlutenDecimalPrecisionSuite.scala | 27 +++++++++++++++++++ .../GlutenDecimalPrecisionSuite.scala | 27 +++++++++++++++++++ 5 files changed, 135 insertions(+) diff --git a/gluten-ut/spark33/src/test/scala/org/apache/spark/sql/catalyst/expressions/GlutenDecimalPrecisionSuite.scala b/gluten-ut/spark33/src/test/scala/org/apache/spark/sql/catalyst/expressions/GlutenDecimalPrecisionSuite.scala index 97e752d7d04..0b1b2a59179 100644 --- a/gluten-ut/spark33/src/test/scala/org/apache/spark/sql/catalyst/expressions/GlutenDecimalPrecisionSuite.scala +++ b/gluten-ut/spark33/src/test/scala/org/apache/spark/sql/catalyst/expressions/GlutenDecimalPrecisionSuite.scala @@ -17,6 +17,8 @@ package org.apache.spark.sql.catalyst.expressions import org.apache.gluten.expression._ +import org.apache.gluten.substrait.SubstraitContext +import org.apache.gluten.utils.BackendTestUtils import org.apache.spark.sql.GlutenTestsTrait import org.apache.spark.sql.catalyst.analysis.{Analyzer, EmptyFunctionRegistry, UnresolvedAttribute} @@ -135,4 +137,29 @@ class GlutenDecimalPrecisionSuite extends GlutenTestsTrait { checkType(Divide(expr, u), DoubleType) } } + + test("CheckOverflow transformer casts transformed child type") { + if (BackendTestUtils.isVeloxBackendLoaded()) { + val targetType = DecimalType(38, 17) + val transformedChildType = DecimalType(38, 18) + val original = CheckOverflow( + Literal(Decimal(0, targetType.precision, targetType.scale), targetType), + targetType, + nullOnOverflow = true) + val child = LiteralTransformer( + Literal( + Decimal(0, transformedChildType.precision, transformedChildType.scale), + transformedChildType)) + assert(original.child.dataType != child.dataType) + + val transformedNode = + CheckOverflowTransformer(ExpressionNames.CHECK_OVERFLOW, child, original) + .doTransform(new SubstraitContext) + .toProtobuf + assert(transformedNode.hasCast) + val castType = transformedNode.getCast.getType.getDecimal + assert(castType.getPrecision == targetType.precision) + assert(castType.getScale == targetType.scale) + } + } } diff --git a/gluten-ut/spark34/src/test/scala/org/apache/spark/sql/catalyst/expressions/GlutenDecimalPrecisionSuite.scala b/gluten-ut/spark34/src/test/scala/org/apache/spark/sql/catalyst/expressions/GlutenDecimalPrecisionSuite.scala index 97e752d7d04..0b1b2a59179 100644 --- a/gluten-ut/spark34/src/test/scala/org/apache/spark/sql/catalyst/expressions/GlutenDecimalPrecisionSuite.scala +++ b/gluten-ut/spark34/src/test/scala/org/apache/spark/sql/catalyst/expressions/GlutenDecimalPrecisionSuite.scala @@ -17,6 +17,8 @@ package org.apache.spark.sql.catalyst.expressions import org.apache.gluten.expression._ +import org.apache.gluten.substrait.SubstraitContext +import org.apache.gluten.utils.BackendTestUtils import org.apache.spark.sql.GlutenTestsTrait import org.apache.spark.sql.catalyst.analysis.{Analyzer, EmptyFunctionRegistry, UnresolvedAttribute} @@ -135,4 +137,29 @@ class GlutenDecimalPrecisionSuite extends GlutenTestsTrait { checkType(Divide(expr, u), DoubleType) } } + + test("CheckOverflow transformer casts transformed child type") { + if (BackendTestUtils.isVeloxBackendLoaded()) { + val targetType = DecimalType(38, 17) + val transformedChildType = DecimalType(38, 18) + val original = CheckOverflow( + Literal(Decimal(0, targetType.precision, targetType.scale), targetType), + targetType, + nullOnOverflow = true) + val child = LiteralTransformer( + Literal( + Decimal(0, transformedChildType.precision, transformedChildType.scale), + transformedChildType)) + assert(original.child.dataType != child.dataType) + + val transformedNode = + CheckOverflowTransformer(ExpressionNames.CHECK_OVERFLOW, child, original) + .doTransform(new SubstraitContext) + .toProtobuf + assert(transformedNode.hasCast) + val castType = transformedNode.getCast.getType.getDecimal + assert(castType.getPrecision == targetType.precision) + assert(castType.getScale == targetType.scale) + } + } } diff --git a/gluten-ut/spark35/src/test/scala/org/apache/spark/sql/catalyst/expressions/GlutenDecimalPrecisionSuite.scala b/gluten-ut/spark35/src/test/scala/org/apache/spark/sql/catalyst/expressions/GlutenDecimalPrecisionSuite.scala index 97e752d7d04..0b1b2a59179 100644 --- a/gluten-ut/spark35/src/test/scala/org/apache/spark/sql/catalyst/expressions/GlutenDecimalPrecisionSuite.scala +++ b/gluten-ut/spark35/src/test/scala/org/apache/spark/sql/catalyst/expressions/GlutenDecimalPrecisionSuite.scala @@ -17,6 +17,8 @@ package org.apache.spark.sql.catalyst.expressions import org.apache.gluten.expression._ +import org.apache.gluten.substrait.SubstraitContext +import org.apache.gluten.utils.BackendTestUtils import org.apache.spark.sql.GlutenTestsTrait import org.apache.spark.sql.catalyst.analysis.{Analyzer, EmptyFunctionRegistry, UnresolvedAttribute} @@ -135,4 +137,29 @@ class GlutenDecimalPrecisionSuite extends GlutenTestsTrait { checkType(Divide(expr, u), DoubleType) } } + + test("CheckOverflow transformer casts transformed child type") { + if (BackendTestUtils.isVeloxBackendLoaded()) { + val targetType = DecimalType(38, 17) + val transformedChildType = DecimalType(38, 18) + val original = CheckOverflow( + Literal(Decimal(0, targetType.precision, targetType.scale), targetType), + targetType, + nullOnOverflow = true) + val child = LiteralTransformer( + Literal( + Decimal(0, transformedChildType.precision, transformedChildType.scale), + transformedChildType)) + assert(original.child.dataType != child.dataType) + + val transformedNode = + CheckOverflowTransformer(ExpressionNames.CHECK_OVERFLOW, child, original) + .doTransform(new SubstraitContext) + .toProtobuf + assert(transformedNode.hasCast) + val castType = transformedNode.getCast.getType.getDecimal + assert(castType.getPrecision == targetType.precision) + assert(castType.getScale == targetType.scale) + } + } } diff --git a/gluten-ut/spark40/src/test/scala/org/apache/spark/sql/catalyst/expressions/GlutenDecimalPrecisionSuite.scala b/gluten-ut/spark40/src/test/scala/org/apache/spark/sql/catalyst/expressions/GlutenDecimalPrecisionSuite.scala index 97e752d7d04..0b1b2a59179 100644 --- a/gluten-ut/spark40/src/test/scala/org/apache/spark/sql/catalyst/expressions/GlutenDecimalPrecisionSuite.scala +++ b/gluten-ut/spark40/src/test/scala/org/apache/spark/sql/catalyst/expressions/GlutenDecimalPrecisionSuite.scala @@ -17,6 +17,8 @@ package org.apache.spark.sql.catalyst.expressions import org.apache.gluten.expression._ +import org.apache.gluten.substrait.SubstraitContext +import org.apache.gluten.utils.BackendTestUtils import org.apache.spark.sql.GlutenTestsTrait import org.apache.spark.sql.catalyst.analysis.{Analyzer, EmptyFunctionRegistry, UnresolvedAttribute} @@ -135,4 +137,29 @@ class GlutenDecimalPrecisionSuite extends GlutenTestsTrait { checkType(Divide(expr, u), DoubleType) } } + + test("CheckOverflow transformer casts transformed child type") { + if (BackendTestUtils.isVeloxBackendLoaded()) { + val targetType = DecimalType(38, 17) + val transformedChildType = DecimalType(38, 18) + val original = CheckOverflow( + Literal(Decimal(0, targetType.precision, targetType.scale), targetType), + targetType, + nullOnOverflow = true) + val child = LiteralTransformer( + Literal( + Decimal(0, transformedChildType.precision, transformedChildType.scale), + transformedChildType)) + assert(original.child.dataType != child.dataType) + + val transformedNode = + CheckOverflowTransformer(ExpressionNames.CHECK_OVERFLOW, child, original) + .doTransform(new SubstraitContext) + .toProtobuf + assert(transformedNode.hasCast) + val castType = transformedNode.getCast.getType.getDecimal + assert(castType.getPrecision == targetType.precision) + assert(castType.getScale == targetType.scale) + } + } } diff --git a/gluten-ut/spark41/src/test/scala/org/apache/spark/sql/catalyst/expressions/GlutenDecimalPrecisionSuite.scala b/gluten-ut/spark41/src/test/scala/org/apache/spark/sql/catalyst/expressions/GlutenDecimalPrecisionSuite.scala index 97e752d7d04..0b1b2a59179 100644 --- a/gluten-ut/spark41/src/test/scala/org/apache/spark/sql/catalyst/expressions/GlutenDecimalPrecisionSuite.scala +++ b/gluten-ut/spark41/src/test/scala/org/apache/spark/sql/catalyst/expressions/GlutenDecimalPrecisionSuite.scala @@ -17,6 +17,8 @@ package org.apache.spark.sql.catalyst.expressions import org.apache.gluten.expression._ +import org.apache.gluten.substrait.SubstraitContext +import org.apache.gluten.utils.BackendTestUtils import org.apache.spark.sql.GlutenTestsTrait import org.apache.spark.sql.catalyst.analysis.{Analyzer, EmptyFunctionRegistry, UnresolvedAttribute} @@ -135,4 +137,29 @@ class GlutenDecimalPrecisionSuite extends GlutenTestsTrait { checkType(Divide(expr, u), DoubleType) } } + + test("CheckOverflow transformer casts transformed child type") { + if (BackendTestUtils.isVeloxBackendLoaded()) { + val targetType = DecimalType(38, 17) + val transformedChildType = DecimalType(38, 18) + val original = CheckOverflow( + Literal(Decimal(0, targetType.precision, targetType.scale), targetType), + targetType, + nullOnOverflow = true) + val child = LiteralTransformer( + Literal( + Decimal(0, transformedChildType.precision, transformedChildType.scale), + transformedChildType)) + assert(original.child.dataType != child.dataType) + + val transformedNode = + CheckOverflowTransformer(ExpressionNames.CHECK_OVERFLOW, child, original) + .doTransform(new SubstraitContext) + .toProtobuf + assert(transformedNode.hasCast) + val castType = transformedNode.getCast.getType.getDecimal + assert(castType.getPrecision == targetType.precision) + assert(castType.getScale == targetType.scale) + } + } }