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

xuzifu666 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 3fc5f464ee [CALCITE-7563] Oracle dialect generates invalid CAST to 
VARCHAR without precision
3fc5f464ee is described below

commit 3fc5f464ee087f69cd7b1f8dd54ee612050a917d
Author: zzwqqq <[email protected]>
AuthorDate: Thu May 28 19:54:24 2026 +0800

    [CALCITE-7563] Oracle dialect generates invalid CAST to VARCHAR without 
precision
---
 .../org/apache/calcite/sql/dialect/OracleSqlDialect.java  |  7 +++++++
 .../apache/calcite/rel/rel2sql/RelToSqlConverterTest.java | 15 +++++++++++++++
 2 files changed, 22 insertions(+)

diff --git 
a/core/src/main/java/org/apache/calcite/sql/dialect/OracleSqlDialect.java 
b/core/src/main/java/org/apache/calcite/sql/dialect/OracleSqlDialect.java
index 2de588f118..9aab15f5e2 100644
--- a/core/src/main/java/org/apache/calcite/sql/dialect/OracleSqlDialect.java
+++ b/core/src/main/java/org/apache/calcite/sql/dialect/OracleSqlDialect.java
@@ -116,6 +116,13 @@ public OracleSqlDialect(Context context) {
     case DOUBLE:
       castSpec = "DOUBLE PRECISION";
       break;
+    case VARCHAR:
+      if (type.getPrecision() == RelDataType.PRECISION_NOT_SPECIFIED) {
+        final int precision = 
getTypeSystem().getMaxPrecision(SqlTypeName.VARCHAR);
+        castSpec = "VARCHAR(" + precision + ")";
+        break;
+      }
+      return super.getCastSpec(type);
     default:
       return super.getCastSpec(type);
     }
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 2953f3b186..66afda8653 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
@@ -1708,6 +1708,21 @@ private static String toSql(RelNode root, SqlDialect 
dialect,
         .ok(expectedOracle);
   }
 
+  /** Test case for
+   * <a 
href="https://issues.apache.org/jira/browse/CALCITE-7563";>[CALCITE-7563]
+   * Oracle dialect generates invalid CAST to VARCHAR without precision</a>. */
+  @Test void testCastVarcharWithoutPrecisionOracle() {
+    final String query = "select cast(\"store_id\" as VARCHAR)\n"
+        + " from \"expense_fact\"";
+    final String expected = "SELECT CAST(\"store_id\" AS VARCHAR(4000))\n"
+        + "FROM \"foodmart\".\"expense_fact\"";
+    final String expectedModifiedTypeSystem = "SELECT CAST(\"store_id\" AS 
VARCHAR(512))\n"
+        + "FROM \"foodmart\".\"expense_fact\"";
+    sql(query)
+        .withOracle().ok(expected)
+        .withOracleModifiedTypeSystem().ok(expectedModifiedTypeSystem);
+  }
+
   /** Test case for
    * <a 
href="https://issues.apache.org/jira/browse/CALCITE-1174";>[CALCITE-1174]
    * When generating SQL, translate SUM0(x) to COALESCE(SUM(x), 0)</a>. */

Reply via email to