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

mihaibudiu 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 0b4704befe [CALCITE-7777] JDBC adapter generates || for concatenation, 
which SQL Server rejects
0b4704befe is described below

commit 0b4704befe9ce5cec4d5daa1212d12cf9453e56e
Author: Jerome Haltom <[email protected]>
AuthorDate: Sat Sep 12 10:10:13 2026 -0500

    [CALCITE-7777] JDBC adapter generates || for concatenation, which SQL 
Server rejects
---
 .../java/org/apache/calcite/sql/dialect/MssqlSqlDialect.java     | 5 +++++
 .../org/apache/calcite/rel/rel2sql/RelToSqlConverterTest.java    | 9 +++++++++
 2 files changed, 14 insertions(+)

diff --git 
a/core/src/main/java/org/apache/calcite/sql/dialect/MssqlSqlDialect.java 
b/core/src/main/java/org/apache/calcite/sql/dialect/MssqlSqlDialect.java
index 964fa03f8f..7a45559284 100644
--- a/core/src/main/java/org/apache/calcite/sql/dialect/MssqlSqlDialect.java
+++ b/core/src/main/java/org/apache/calcite/sql/dialect/MssqlSqlDialect.java
@@ -212,6 +212,11 @@ private static SqlNode createDatetimeCastSpec(String 
typeAlias, RelDataType type
       final SqlWriter.Frame frame = writer.startFunCall("CEILING");
       call.operand(0).unparse(writer, leftPrec, rightPrec);
       writer.endFunCall(frame);
+    } else if (call.getOperator().equals(SqlStdOperatorTable.CONCAT)) {
+      // MSSQL has no || operator. + concatenates and propagates NULL, as ||
+      // does; the CONCAT function does not, reading a NULL operand as ''.
+      SqlSyntax.BINARY.unparse(writer, SqlStdOperatorTable.PLUS, call, 
leftPrec,
+          rightPrec);
     } else {
       switch (call.getKind()) {
       case FLOOR:
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 877a1e99ee..8e43c4400d 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
@@ -11820,6 +11820,15 @@ private void checkLiteral2(String expression, String 
expected) {
     sql(query).dialect(MssqlSqlDialect.DEFAULT).ok(mssqlExpected);
   }
 
+  /** Test case for
+   * <a 
href="https://issues.apache.org/jira/browse/CALCITE-7777";>[CALCITE-7777]
+   * JDBC adapter generates || for concatenation, which SQL Server 
rejects</a>. */
+  @Test void testConcatOperatorEmulationForMSSQL() {
+    final String query = "select \"brand_name\" || \"product_name\" from 
\"product\"";
+    final String mssqlExpected = "SELECT [brand_name] + [product_name]\n"
+        + "FROM [foodmart].[product]";
+    sql(query).withMssql().ok(mssqlExpected);
+  }
 
   /** Test case for
    * <a 
href="https://issues.apache.org/jira/browse/CALCITE-6655";>[CALCITE-6655]

Reply via email to