This is an automated email from the ASF dual-hosted git repository.

twalthr pushed a commit to branch release-1.15
in repository https://gitbox.apache.org/repos/asf/flink.git


The following commit(s) were added to refs/heads/release-1.15 by this push:
     new b1b58ee4c2e [FLINK-27368][table-planner] Trim casts from character 
string to numeric
b1b58ee4c2e is described below

commit b1b58ee4c2e61bc6f8e9c4d356708c1e080b3ee9
Author: Timo Walther <twal...@apache.org>
AuthorDate: Mon Apr 25 09:39:29 2022 +0200

    [FLINK-27368][table-planner] Trim casts from character string to numeric
    
    This closes #19565.
---
 .../casting/StringToNumericPrimitiveCastRule.java         | 14 ++++++++------
 .../table/planner/functions/casting/CastRulesTest.java    | 15 +++++++++++++++
 2 files changed, 23 insertions(+), 6 deletions(-)

diff --git 
a/flink-table/flink-table-planner/src/main/java/org/apache/flink/table/planner/functions/casting/StringToNumericPrimitiveCastRule.java
 
b/flink-table/flink-table-planner/src/main/java/org/apache/flink/table/planner/functions/casting/StringToNumericPrimitiveCastRule.java
index 314930247a0..a0ba3698bae 100644
--- 
a/flink-table/flink-table-planner/src/main/java/org/apache/flink/table/planner/functions/casting/StringToNumericPrimitiveCastRule.java
+++ 
b/flink-table/flink-table-planner/src/main/java/org/apache/flink/table/planner/functions/casting/StringToNumericPrimitiveCastRule.java
@@ -28,6 +28,7 @@ import static 
org.apache.flink.table.planner.codegen.calls.BuiltInMethods.STRING
 import static 
org.apache.flink.table.planner.codegen.calls.BuiltInMethods.STRING_DATA_TO_INT;
 import static 
org.apache.flink.table.planner.codegen.calls.BuiltInMethods.STRING_DATA_TO_LONG;
 import static 
org.apache.flink.table.planner.codegen.calls.BuiltInMethods.STRING_DATA_TO_SHORT;
+import static 
org.apache.flink.table.planner.functions.casting.CastRuleUtils.methodCall;
 import static 
org.apache.flink.table.planner.functions.casting.CastRuleUtils.staticCall;
 
 /**
@@ -54,19 +55,20 @@ class StringToNumericPrimitiveCastRule
             String inputTerm,
             LogicalType inputLogicalType,
             LogicalType targetLogicalType) {
+        final String trimmedInputTerm = methodCall(inputTerm, "trim");
         switch (targetLogicalType.getTypeRoot()) {
             case TINYINT:
-                return staticCall(STRING_DATA_TO_BYTE(), inputTerm);
+                return staticCall(STRING_DATA_TO_BYTE(), trimmedInputTerm);
             case SMALLINT:
-                return staticCall(STRING_DATA_TO_SHORT(), inputTerm);
+                return staticCall(STRING_DATA_TO_SHORT(), trimmedInputTerm);
             case INTEGER:
-                return staticCall(STRING_DATA_TO_INT(), inputTerm);
+                return staticCall(STRING_DATA_TO_INT(), trimmedInputTerm);
             case BIGINT:
-                return staticCall(STRING_DATA_TO_LONG(), inputTerm);
+                return staticCall(STRING_DATA_TO_LONG(), trimmedInputTerm);
             case FLOAT:
-                return staticCall(STRING_DATA_TO_FLOAT(), inputTerm);
+                return staticCall(STRING_DATA_TO_FLOAT(), trimmedInputTerm);
             case DOUBLE:
-                return staticCall(STRING_DATA_TO_DOUBLE(), inputTerm);
+                return staticCall(STRING_DATA_TO_DOUBLE(), trimmedInputTerm);
         }
         throw new IllegalArgumentException("This is a bug. Please file an 
issue.");
     }
diff --git 
a/flink-table/flink-table-planner/src/test/java/org/apache/flink/table/planner/functions/casting/CastRulesTest.java
 
b/flink-table/flink-table-planner/src/test/java/org/apache/flink/table/planner/functions/casting/CastRulesTest.java
index f676f88ff8f..6b69667b2a6 100644
--- 
a/flink-table/flink-table-planner/src/test/java/org/apache/flink/table/planner/functions/casting/CastRulesTest.java
+++ 
b/flink-table/flink-table-planner/src/test/java/org/apache/flink/table/planner/functions/casting/CastRulesTest.java
@@ -169,6 +169,7 @@ class CastRulesTest {
                         .fail(STRING(), fromString("Apache"), 
TableException.class)
                         .fromCase(STRING(), fromString("1.234"), (byte) 1)
                         .fromCase(STRING(), fromString("123"), (byte) 123)
+                        .fromCase(STRING(), fromString(" 123 "), (byte) 123)
                         .fail(STRING(), fromString("-130"), 
TableException.class)
                         .fromCase(
                                 DECIMAL(4, 3),
@@ -203,6 +204,7 @@ class CastRulesTest {
                         .fail(STRING(), fromString("Apache"), 
TableException.class)
                         .fromCase(STRING(), fromString("1.234"), (short) 1)
                         .fromCase(STRING(), fromString("123"), (short) 123)
+                        .fromCase(STRING(), fromString(" 123 "), (short) 123)
                         .fail(STRING(), fromString("-32769"), 
TableException.class)
                         .fromCase(
                                 DECIMAL(4, 3),
@@ -247,6 +249,7 @@ class CastRulesTest {
                         .fail(STRING(), fromString("Apache"), 
TableException.class)
                         .fromCase(STRING(), fromString("1.234"), 1)
                         .fromCase(STRING(), fromString("123"), 123)
+                        .fromCase(STRING(), fromString(" 123 "), 123)
                         .fail(STRING(), fromString("-3276913443134"), 
TableException.class)
                         .fromCase(DECIMAL(4, 3), fromBigDecimal(new 
BigDecimal("9.87"), 4, 3), 9)
                         // https://issues.apache.org/jira/browse/FLINK-24420 - 
Check out of range
@@ -293,6 +296,7 @@ class CastRulesTest {
                         .fail(STRING(), fromString("Apache"), 
TableException.class)
                         .fromCase(STRING(), fromString("1.234"), 1L)
                         .fromCase(STRING(), fromString("123"), 123L)
+                        .fromCase(STRING(), fromString(" 123 "), 123L)
                         .fromCase(STRING(), fromString("-3276913443134"), 
-3276913443134L)
                         .fromCase(DECIMAL(4, 3), fromBigDecimal(new 
BigDecimal("9.87"), 4, 3), 9L)
                         .fromCase(
@@ -334,6 +338,7 @@ class CastRulesTest {
                         .fail(STRING(), fromString("Apache"), 
TableException.class)
                         .fromCase(STRING(), fromString("1.234"), 1.234f)
                         .fromCase(STRING(), fromString("123"), 123.0f)
+                        .fromCase(STRING(), fromString(" 123 "), 123.0f)
                         .fromCase(STRING(), fromString("-3276913443134"), 
-3.27691351E12f)
                         .fromCase(
                                 DECIMAL(4, 3), fromBigDecimal(new 
BigDecimal("9.87"), 4, 3), 9.87f)
@@ -380,6 +385,8 @@ class CastRulesTest {
                         .fail(STRING(), fromString("Apache"), 
TableException.class)
                         .fromCase(STRING(), fromString("1.234"), 1.234d)
                         .fromCase(STRING(), fromString("123"), 123.0d)
+                        .fromCase(STRING(), fromString(" 123 "), 123.0d)
+                        .fromCase(STRING(), fromString(" .123 "), 0.123d)
                         .fromCase(STRING(), fromString("-3276913443134"), 
-3.276913443134E12d)
                         .fromCase(
                                 DECIMAL(4, 3), fromBigDecimal(new 
BigDecimal("9.87"), 4, 3), 9.87d)
@@ -1251,6 +1258,14 @@ class CastRulesTest {
                                 STRING(),
                                 fromString("1.2"),
                                 fromBigDecimal(new BigDecimal("1.200"), 5, 3))
+                        .fromCase(
+                                STRING(),
+                                fromString(" 1.2 "),
+                                fromBigDecimal(new BigDecimal("1.200"), 5, 3))
+                        .fromCase(
+                                STRING(),
+                                fromString(" .2 "),
+                                fromBigDecimal(new BigDecimal("0.200"), 5, 3))
                         .fromCase(
                                 DECIMAL(4, 3),
                                 fromBigDecimal(new BigDecimal("9.87"), 4, 3),

Reply via email to