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

xiong 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 6f2a6889cf [CALCITE-6892] CHAR_LENGTH Function is not recognized in 
DerbySQL
6f2a6889cf is described below

commit 6f2a6889cfc9d5c8d0e2e121b0274a8b060be8c0
Author: Yu Xu <[email protected]>
AuthorDate: Sat Mar 15 14:45:04 2025 +0800

    [CALCITE-6892] CHAR_LENGTH Function is not recognized in DerbySQL
---
 .../apache/calcite/sql/dialect/DerbySqlDialect.java   | 17 +++++++++++++++++
 .../calcite/rel/rel2sql/RelToSqlConverterTest.java    | 19 +++++++++++++++++++
 2 files changed, 36 insertions(+)

diff --git 
a/core/src/main/java/org/apache/calcite/sql/dialect/DerbySqlDialect.java 
b/core/src/main/java/org/apache/calcite/sql/dialect/DerbySqlDialect.java
index 36ec946f47..8ff6b76a6b 100644
--- a/core/src/main/java/org/apache/calcite/sql/dialect/DerbySqlDialect.java
+++ b/core/src/main/java/org/apache/calcite/sql/dialect/DerbySqlDialect.java
@@ -16,7 +16,11 @@
  */
 package org.apache.calcite.sql.dialect;
 
+import org.apache.calcite.sql.SqlCall;
 import org.apache.calcite.sql.SqlDialect;
+import org.apache.calcite.sql.SqlWriter;
+import org.apache.calcite.sql.fun.SqlLibraryOperators;
+import org.apache.calcite.sql.parser.SqlParserPos;
 
 /**
  * A <code>SqlDialect</code> implementation for the Apache Derby database.
@@ -31,4 +35,17 @@ public class DerbySqlDialect extends SqlDialect {
   public DerbySqlDialect(Context context) {
     super(context);
   }
+
+  @Override public void unparseCall(final SqlWriter writer, final SqlCall 
call, final int leftPrec,
+      final int rightPrec) {
+    switch (call.getKind()) {
+    case CHAR_LENGTH:
+      SqlCall lengthCall = SqlLibraryOperators.LENGTH
+          .createCall(SqlParserPos.ZERO, call.getOperandList());
+      super.unparseCall(writer, lengthCall, leftPrec, rightPrec);
+      break;
+    default:
+      super.unparseCall(writer, call, leftPrec, rightPrec);
+    }
+  }
 }
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 d63c1c46c1..54be478607 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
@@ -7578,6 +7578,21 @@ private void checkLiteral2(String expression, String 
expected) {
     sql(query).withPresto().ok(expected);
   }
 
+  /** Test case for
+   * <a 
href="https://issues.apache.org/jira/browse/CALCITE-6892";>[CALCITE-6892]
+   *  CHAR_LENGTH Function is not recognized in DerbySQL</a>. */
+  @Test void testDerbySqlLength() {
+    final String query = "select CHAR_LENGTH(\"brand_name\")\n"
+        + "from \"product\"";
+    final String expected = "SELECT LENGTH(brand_name)\n"
+        + "FROM foodmart.product";
+    sql(query).withDerby().ok(expected);
+
+    final String query1 = "select CHARACTER_LENGTH(\"brand_name\")\n"
+        + "from \"product\"";
+    sql(query1).withDerby().ok(expected);
+  }
+
   @Test void testSubstringInSpark() {
     final String query = "select substring(\"brand_name\" from 2) "
         + "from \"product\"\n";
@@ -9451,6 +9466,10 @@ Sql withClickHouse() {
       return dialect(DatabaseProduct.CLICKHOUSE.getDialect());
     }
 
+    Sql withDerby() {
+      return dialect(DatabaseProduct.DERBY.getDialect());
+    }
+
     Sql withDb2() {
       return dialect(DatabaseProduct.DB2.getDialect());
     }

Reply via email to