You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@flink.apache.org by li...@apache.org on 2024/11/08 06:22:49 UTC
(flink) branch master updated: [FLINK-36654][table-planner] Fix incorrect cast when dividing decimals by integers
This is an automated email from the ASF dual-hosted git repository.
lincoln pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/flink.git
The following commit(s) were added to refs/heads/master by this push:
new bd6f292ad7f [FLINK-36654][table-planner] Fix incorrect cast when dividing decimals by integers
bd6f292ad7f is described below
commit bd6f292ad7fc75e1285ca6987a16422c980836ad
Author: XuShuai <ye...@alibaba-inc.com>
AuthorDate: Fri Nov 8 14:22:41 2024 +0800
[FLINK-36654][table-planner] Fix incorrect cast when dividing decimals by integers
This closes #25604
---
.../table/planner/codegen/calls/ScalarOperatorGens.scala | 4 +++-
.../flink/table/planner/expressions/SqlExpressionTest.scala | 12 ++++++++++++
2 files changed, 15 insertions(+), 1 deletion(-)
diff --git a/flink-table/flink-table-planner/src/main/scala/org/apache/flink/table/planner/codegen/calls/ScalarOperatorGens.scala b/flink-table/flink-table-planner/src/main/scala/org/apache/flink/table/planner/codegen/calls/ScalarOperatorGens.scala
index 7590299ba2b..3e6d869d2fc 100644
--- a/flink-table/flink-table-planner/src/main/scala/org/apache/flink/table/planner/codegen/calls/ScalarOperatorGens.scala
+++ b/flink-table/flink-table-planner/src/main/scala/org/apache/flink/table/planner/codegen/calls/ScalarOperatorGens.scala
@@ -38,7 +38,7 @@ import org.apache.flink.table.types.logical._
import org.apache.flink.table.types.logical.LogicalTypeFamily.DATETIME
import org.apache.flink.table.types.logical.LogicalTypeRoot._
import org.apache.flink.table.types.logical.utils.LogicalTypeChecks
-import org.apache.flink.table.types.logical.utils.LogicalTypeChecks.getFieldTypes
+import org.apache.flink.table.types.logical.utils.LogicalTypeChecks.{getFieldTypes, getPrecision, getScale}
import org.apache.flink.table.types.logical.utils.LogicalTypeMerging.findCommonType
import org.apache.flink.table.utils.DateTimeUtils.MILLIS_PER_DAY
import org.apache.flink.util.Preconditions.checkArgument
@@ -107,6 +107,8 @@ object ScalarOperatorGens {
// use it as is during calculation.
def castToDec(t: LogicalType): String => String = t match {
case _: DecimalType => (operandTerm: String) => s"$operandTerm"
+ case _: TinyIntType | _: SmallIntType | _: IntType | _: BigIntType =>
+ numericCasting(ctx, t, new DecimalType(getPrecision(t), getScale(t)))
case _ => numericCasting(ctx, t, resultType)
}
val methods =
diff --git a/flink-table/flink-table-planner/src/test/scala/org/apache/flink/table/planner/expressions/SqlExpressionTest.scala b/flink-table/flink-table-planner/src/test/scala/org/apache/flink/table/planner/expressions/SqlExpressionTest.scala
index f45e0c93e2e..ac796f529eb 100644
--- a/flink-table/flink-table-planner/src/test/scala/org/apache/flink/table/planner/expressions/SqlExpressionTest.scala
+++ b/flink-table/flink-table-planner/src/test/scala/org/apache/flink/table/planner/expressions/SqlExpressionTest.scala
@@ -145,6 +145,18 @@ class SqlExpressionTest extends ExpressionTestBase {
testSqlApi("2.0/(-3)", "-0.666666666667")
testSqlApi("-7.9/2", "-3.950000000000")
+ // Decimal(2,1) / Integer => Decimal(13,12)
+ testSqlApi("1.0/400", "0.002500000000")
+
+ // Decimal(2,1) / BigInteger => Decimal(22,21)
+ testSqlApi("1.0/100000000000", "0.000000000010000000000")
+
+ // Decimal(2,1) / TinyInt => Decimal(7,6)
+ testSqlApi("1.0/cast(100 as TINYINT)", "0.010000")
+
+ // Decimal(2,1) / SmallInt => Decimal(8,7)
+ testSqlApi("1.0/cast(10000 as SMALLINT)", "0.0001000")
+
// invalid division
val divisorZeroException = "Division by zero"
testExpectedSqlException(