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 8925773e9b [CALCITE-7408] URL_ENCODE/URL_DECODE is unparsed 
incorrectly for ClickHouseSqlDialect
8925773e9b is described below

commit 8925773e9bcbabc7d5525459de775a1ad7b2ff7d
Author: xuzifu666 <[email protected]>
AuthorDate: Wed Feb 4 14:38:43 2026 +0800

    [CALCITE-7408] URL_ENCODE/URL_DECODE is unparsed incorrectly for 
ClickHouseSqlDialect
---
 .../apache/calcite/sql/dialect/ClickHouseSqlDialect.java  | 15 +++++++++++++++
 .../apache/calcite/rel/rel2sql/RelToSqlConverterTest.java | 13 +++++++++++++
 2 files changed, 28 insertions(+)

diff --git 
a/core/src/main/java/org/apache/calcite/sql/dialect/ClickHouseSqlDialect.java 
b/core/src/main/java/org/apache/calcite/sql/dialect/ClickHouseSqlDialect.java
index cd9e736f24..fd5a719e1a 100644
--- 
a/core/src/main/java/org/apache/calcite/sql/dialect/ClickHouseSqlDialect.java
+++ 
b/core/src/main/java/org/apache/calcite/sql/dialect/ClickHouseSqlDialect.java
@@ -39,6 +39,7 @@
 import org.apache.calcite.sql.SqlTimeLiteral;
 import org.apache.calcite.sql.SqlTimestampLiteral;
 import org.apache.calcite.sql.SqlWriter;
+import org.apache.calcite.sql.fun.SqlLibraryOperators;
 import org.apache.calcite.sql.fun.SqlStdOperatorTable;
 import org.apache.calcite.sql.parser.SqlParserPos;
 import org.apache.calcite.sql.type.SqlTypeName;
@@ -228,6 +229,20 @@ private static SqlDataTypeSpec 
createSqlDataTypeSpecByName(String typeAlias,
       return;
     }
 
+    // refer to 
https://clickhouse.com/docs/sql-reference/functions/url-functions#encodeURLComponent
+    if (call.getOperator() == SqlLibraryOperators.URL_ENCODE) {
+      RelToSqlConverterUtil.specialOperatorByName("encodeURLComponent")
+          .unparse(writer, call, 0, 0);
+      return;
+    }
+
+    // refer to 
https://clickhouse.com/docs/sql-reference/functions/url-functions#decodeURLComponent
+    if (call.getOperator() == SqlLibraryOperators.URL_DECODE) {
+      RelToSqlConverterUtil.specialOperatorByName("decodeURLComponent")
+          .unparse(writer, call, 0, 0);
+      return;
+    }
+
     switch (call.getKind()) {
     case MAP_VALUE_CONSTRUCTOR:
       writer.print(call.getOperator().getName().toLowerCase(Locale.ROOT));
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 d161f774b5..a98f7fd1f8 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
@@ -3701,6 +3701,19 @@ private SqlDialect nonOrdinalDialect() {
     sql(query2).withSpark().ok(expected2);
   }
 
+  /** Test case for
+   * <a 
href="https://issues.apache.org/jira/browse/CALCITE-7408";>[CALCITE-7408]
+   * URL_ENCODE/URL_DECODE is unparsed incorrectly for 
ClickHouseSqlDialect</a>. */
+  @Test void testUrlencodeAndUrldecode() {
+    final String query = "SELECT URL_ENCODE(\"product_name\") from 
\"product\"";
+    final String expected = "SELECT encodeURLComponent(`product_name`)\nFROM 
`foodmart`.`product`";
+    sql(query).withLibrary(SqlLibrary.SPARK).withClickHouse().ok(expected);
+
+    final String query1 = "SELECT URL_DECODE(\"product_name\") from 
\"product\"";
+    final String expected1 = "SELECT decodeURLComponent(`product_name`)\nFROM 
`foodmart`.`product`";
+    sql(query1).withLibrary(SqlLibrary.SPARK).withClickHouse().ok(expected1);
+  }
+
   @Test void testInstrFunction4Operands() {
     final String query = "SELECT INSTR('ABC', 'A', 1, 1) from \"product\"";
     final String expectedBQ = "SELECT INSTR('ABC', 'A', 1, 1)\n"

Reply via email to