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"