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

cancai 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 2761850647 [CALCITE-6931] STARTSWITH/ENDSWITH in SPARK should not 
convert to STARTS_WITH/ENDS_WITH
2761850647 is described below

commit 2761850647e467582b3549ea951add627d036a04
Author: Yu Xu <[email protected]>
AuthorDate: Mon Mar 31 21:46:24 2025 +0800

    [CALCITE-6931] STARTSWITH/ENDSWITH in SPARK should not convert to 
STARTS_WITH/ENDS_WITH
---
 .../apache/calcite/sql/dialect/SparkSqlDialect.java    | 11 +++++++++++
 .../calcite/rel/rel2sql/RelToSqlConverterTest.java     | 18 ++++++++++++++----
 2 files changed, 25 insertions(+), 4 deletions(-)

diff --git 
a/core/src/main/java/org/apache/calcite/sql/dialect/SparkSqlDialect.java 
b/core/src/main/java/org/apache/calcite/sql/dialect/SparkSqlDialect.java
index 4fa694841c..eaf5acdc1e 100644
--- a/core/src/main/java/org/apache/calcite/sql/dialect/SparkSqlDialect.java
+++ b/core/src/main/java/org/apache/calcite/sql/dialect/SparkSqlDialect.java
@@ -34,6 +34,7 @@
 import org.apache.calcite.sql.SqlWriter;
 import org.apache.calcite.sql.fun.SqlCase;
 import org.apache.calcite.sql.fun.SqlFloorFunction;
+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.BasicSqlType;
@@ -126,6 +127,16 @@ public SparkSqlDialect(SqlDialect.Context context) {
     case MAP_VALUE_CONSTRUCTOR:
       unparseSparkArrayAndMap(writer, call, leftPrec, rightPrec);
       break;
+    case STARTS_WITH:
+      SqlCall starsWithCall = SqlLibraryOperators.STARTSWITH
+          .createCall(SqlParserPos.ZERO, call.getOperandList());
+      super.unparseCall(writer, starsWithCall, leftPrec, rightPrec);
+      break;
+    case ENDS_WITH:
+      SqlCall endsWithCall = SqlLibraryOperators.ENDSWITH
+          .createCall(SqlParserPos.ZERO, call.getOperandList());
+      super.unparseCall(writer, endsWithCall, leftPrec, rightPrec);
+      break;
     case FLOOR:
       if (call.operandCount() != 2) {
         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 b815987236..ba9d311f20 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
@@ -7659,8 +7659,10 @@ private void checkLiteral2(String expression, String 
expected) {
 
   /** Test case for
    * <a 
href="https://issues.apache.org/jira/browse/CALCITE-6156";>[CALCITE-6156]
-   * Add ENDSWITH, STARTSWITH functions (enabled in Postgres, Snowflake 
libraries)</a>. */
-  @Test void testSnowflakeStartsWith() {
+   * Add ENDSWITH, STARTSWITH functions (enabled in Postgres, Snowflake 
libraries)</a>,
+   * <a 
href="https://issues.apache.org/jira/browse/CALCITE-6931";>[CALCITE-6931]
+   * STARTSWITH/ENDSWITH in SPARK should not convert to 
STARTS_WITH/ENDS_WITH</a>. */
+  @Test void testStartsWith() {
     final String query = "select startswith(\"brand_name\", 'a')\n"
         + "from \"product\"";
     final String expectedBigQuery = "SELECT STARTS_WITH(brand_name, 'a')\n"
@@ -7669,15 +7671,20 @@ private void checkLiteral2(String expression, String 
expected) {
         + "FROM \"foodmart\".\"product\"";
     final String expectedSnowflake = "SELECT STARTSWITH(\"brand_name\", 'a')\n"
         + "FROM \"foodmart\".\"product\"";
+    final String expectedSpark = "SELECT STARTSWITH(`brand_name`, 'a')\n"
+        + "FROM `foodmart`.`product`";
     
sql(query).withLibrary(SqlLibrary.SNOWFLAKE).withBigQuery().ok(expectedBigQuery);
     
sql(query).withLibrary(SqlLibrary.SNOWFLAKE).withPostgresql().ok(expectedPostgres);
     
sql(query).withLibrary(SqlLibrary.SNOWFLAKE).withSnowflake().ok(expectedSnowflake);
+    sql(query).withLibrary(SqlLibrary.SPARK).withSpark().ok(expectedSpark);
   }
 
   /** Test case for
    * <a 
href="https://issues.apache.org/jira/browse/CALCITE-6156";>[CALCITE-6156]
-   * Add ENDSWITH, STARTSWITH functions (enabled in Postgres, Snowflake 
libraries)</a>. */
-  @Test void testSnowflakeEndsWith() {
+   * Add ENDSWITH, STARTSWITH functions (enabled in Postgres, Snowflake 
libraries)</a>,
+   * <a 
href="https://issues.apache.org/jira/browse/CALCITE-6931";>[CALCITE-6931]
+   * STARTSWITH/ENDSWITH in SPARK should not convert to 
STARTS_WITH/ENDS_WITH</a>. */
+  @Test void testEndsWith() {
     final String query = "select endswith(\"brand_name\", 'a')\n"
         + "from \"product\"";
     final String expectedBigQuery = "SELECT ENDS_WITH(brand_name, 'a')\n"
@@ -7686,9 +7693,12 @@ private void checkLiteral2(String expression, String 
expected) {
         + "FROM \"foodmart\".\"product\"";
     final String expectedSnowflake = "SELECT ENDSWITH(\"brand_name\", 'a')\n"
         + "FROM \"foodmart\".\"product\"";
+    final String expectedSpark = "SELECT ENDSWITH(`brand_name`, 'a')\n"
+        + "FROM `foodmart`.`product`";
     
sql(query).withLibrary(SqlLibrary.SNOWFLAKE).withBigQuery().ok(expectedBigQuery);
     
sql(query).withLibrary(SqlLibrary.SNOWFLAKE).withPostgresql().ok(expectedPostgres);
     
sql(query).withLibrary(SqlLibrary.SNOWFLAKE).withSnowflake().ok(expectedSnowflake);
+    sql(query).withLibrary(SqlLibrary.SPARK).withSpark().ok(expectedSpark);
   }
 
   /** Test case for

Reply via email to