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

libenchao pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/calcite.git


The following commit(s) were added to refs/heads/main by this push:
     new cdf3f5cb6b [CALCITE-6147] CAST(CAST(EMPNO AS VARCHAR) AS INT) should 
be simplified to EMPNO
cdf3f5cb6b is described below

commit cdf3f5cb6b31ae135c0f72d181761a0d82866903
Author: Benchao Li <[email protected]>
AuthorDate: Fri Dec 1 13:42:21 2023 +0800

    [CALCITE-6147] CAST(CAST(EMPNO AS VARCHAR) AS INT) should be simplified to 
EMPNO
    
    Close apache/calcite#3555
---
 .../main/java/org/apache/calcite/rex/RexUtil.java    |  5 ++++-
 .../calcite/rel/rel2sql/RelToSqlConverterTest.java   | 20 ++++++++++----------
 .../org/apache/calcite/rex/RexLosslessCastTest.java  |  6 ++++++
 3 files changed, 20 insertions(+), 11 deletions(-)

diff --git a/core/src/main/java/org/apache/calcite/rex/RexUtil.java 
b/core/src/main/java/org/apache/calcite/rex/RexUtil.java
index 6077329498..0ae2fc31fe 100644
--- a/core/src/main/java/org/apache/calcite/rex/RexUtil.java
+++ b/core/src/main/java/org/apache/calcite/rex/RexUtil.java
@@ -72,6 +72,8 @@ import java.util.function.Predicate;
 
 import static com.google.common.collect.ImmutableList.toImmutableList;
 
+import static org.apache.calcite.rel.type.RelDataType.PRECISION_NOT_SPECIFIED;
+
 import static java.util.Objects.requireNonNull;
 
 /**
@@ -1697,7 +1699,8 @@ public class RexUtil {
       if (source.getScale() != -1 && source.getScale() != 0) {
         sourceLength += source.getScale() + 1; // include decimal mark
       }
-      return target.getPrecision() >= sourceLength;
+      final int targetPrecision = target.getPrecision();
+      return targetPrecision == PRECISION_NOT_SPECIFIED || targetPrecision >= 
sourceLength;
     }
     // Return FALSE by default
     return false;
diff --git 
a/core/src/test/java/org/apache/calcite/rel/rel2sql/RelToSqlConverterTest.java 
b/core/src/test/java/org/apache/calcite/rel/rel2sql/RelToSqlConverterTest.java
index 8f10a1386a..709e83e698 100644
--- 
a/core/src/test/java/org/apache/calcite/rel/rel2sql/RelToSqlConverterTest.java
+++ 
b/core/src/test/java/org/apache/calcite/rel/rel2sql/RelToSqlConverterTest.java
@@ -2130,7 +2130,7 @@ class RelToSqlConverterTest {
   @Test void testHiveCastAsInt() {
     String query = "select cast( cast(\"employee_id\" as varchar) as int) "
         + "from \"foodmart\".\"reserve_employee\" ";
-    final String expected = "SELECT CAST(CAST(employee_id AS VARCHAR) AS 
INT)\n"
+    final String expected = "SELECT employee_id\n"
         + "FROM foodmart.reserve_employee";
     sql(query).withHive().ok(expected);
   }
@@ -2151,17 +2151,17 @@ class RelToSqlConverterTest {
             + "cast(cast(\"employee_id\" as varchar) as time), "
             + "cast(cast(\"employee_id\" as varchar) as boolean) "
             + "from \"foodmart\".\"reserve_employee\" ";
-    final String expected = "SELECT CAST(CAST(employee_id AS STRING) AS 
INT64), "
-            + "CAST(CAST(employee_id AS STRING) AS INT64), "
-            + "CAST(CAST(employee_id AS STRING) AS INT64), "
-            + "CAST(CAST(employee_id AS STRING) AS INT64), "
-            + "CAST(CAST(employee_id AS STRING) AS FLOAT64), "
-            + "CAST(CAST(employee_id AS STRING) AS STRING), "
+    final String expected = "SELECT CAST(employee_id AS INT64), "
+            + "CAST(employee_id AS INT64), "
+            + "CAST(employee_id AS INT64), "
+            + "employee_id, "
+            + "CAST(employee_id AS FLOAT64), "
+            + "CAST(employee_id AS STRING), "
             + "CAST(CAST(employee_id AS STRING) AS BYTES), "
             + "CAST(CAST(employee_id AS STRING) AS BYTES), "
-            + "CAST(CAST(employee_id AS STRING) AS TIMESTAMP), "
-            + "CAST(CAST(employee_id AS STRING) AS FLOAT64), "
-            + "CAST(CAST(employee_id AS STRING) AS NUMERIC), "
+            + "CAST(employee_id AS TIMESTAMP), "
+            + "CAST(employee_id AS FLOAT64), "
+            + "CAST(employee_id AS NUMERIC), "
             + "CAST(CAST(employee_id AS STRING) AS DATE), "
             + "CAST(CAST(employee_id AS STRING) AS TIME), "
             + "CAST(CAST(employee_id AS STRING) AS BOOL)\n"
diff --git a/core/src/test/java/org/apache/calcite/rex/RexLosslessCastTest.java 
b/core/src/test/java/org/apache/calcite/rex/RexLosslessCastTest.java
index 7124ac1938..334b3d1ed4 100644
--- a/core/src/test/java/org/apache/calcite/rex/RexLosslessCastTest.java
+++ b/core/src/test/java/org/apache/calcite/rex/RexLosslessCastTest.java
@@ -40,6 +40,7 @@ class RexLosslessCastTest extends RexProgramTestBase {
     final RelDataType charType6 = typeFactory.createSqlType(SqlTypeName.CHAR, 
6);
     final RelDataType varCharType10 = 
typeFactory.createSqlType(SqlTypeName.VARCHAR, 10);
     final RelDataType varCharType11 = 
typeFactory.createSqlType(SqlTypeName.VARCHAR, 11);
+    final RelDataType varcharType = 
typeFactory.createSqlType(SqlTypeName.VARCHAR);
 
     // Negative
     assertThat(RexUtil.isLosslessCast(rexBuilder.makeInputRef(intType, 0)), 
is(false));
@@ -125,6 +126,10 @@ class RexLosslessCastTest extends RexProgramTestBase {
         RexUtil.isLosslessCast(
             rexBuilder.makeCast(
                 varCharType11, rexBuilder.makeInputRef(varCharType10, 0))), 
is(true));
+    assertThat(
+        RexUtil.isLosslessCast(
+            rexBuilder.makeCast(
+                varcharType, rexBuilder.makeInputRef(intType, 0))), is(true));
   }
 
   @Test void removeRedundantCast() {
@@ -151,6 +156,7 @@ class RexLosslessCastTest extends RexProgramTestBase {
     checkSimplify(
         cast(cast(cast(core, tInt()), tBigInt()), tInt()),
         "?0.notNullInt0");
+    checkSimplify(cast(cast(vInt(), tVarchar()), tInt()), 
"CAST(?0.int0):INTEGER NOT NULL");
   }
 
   @Test void removeLosslesssCastChar() {

Reply via email to