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