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

jhyde pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/calcite.git


The following commit(s) were added to refs/heads/master by this push:
     new 67ece68  [CALCITE-4463] JDBC adapter for Spark generates incorrect 
ORDER BY syntax (Yanjing Wang)
67ece68 is described below

commit 67ece68208af8385c9e06b6b5cc812d6ad36293c
Author: hannerwang <[email protected]>
AuthorDate: Wed Jan 13 10:27:03 2021 +0800

    [CALCITE-4463] JDBC adapter for Spark generates incorrect ORDER BY syntax 
(Yanjing Wang)
    
    Close apache/calcite#2324
---
 .../java/org/apache/calcite/sql/SqlOrderBy.java    | 21 +---------
 .../apache/calcite/sql/parser/SqlParserTest.java   | 49 ++++++++++++++++++++++
 2 files changed, 51 insertions(+), 19 deletions(-)

diff --git a/core/src/main/java/org/apache/calcite/sql/SqlOrderBy.java 
b/core/src/main/java/org/apache/calcite/sql/SqlOrderBy.java
index 0d455c6..25227e6 100644
--- a/core/src/main/java/org/apache/calcite/sql/SqlOrderBy.java
+++ b/core/src/main/java/org/apache/calcite/sql/SqlOrderBy.java
@@ -97,25 +97,8 @@ public class SqlOrderBy extends SqlCall {
         writer.list(SqlWriter.FrameTypeEnum.ORDER_BY_LIST, SqlWriter.COMMA,
             orderBy.orderList);
       }
-      if (orderBy.offset != null) {
-        final SqlWriter.Frame frame2 =
-            writer.startList(SqlWriter.FrameTypeEnum.OFFSET);
-        writer.newlineAndIndent();
-        writer.keyword("OFFSET");
-        orderBy.offset.unparse(writer, -1, -1);
-        writer.keyword("ROWS");
-        writer.endList(frame2);
-      }
-      if (orderBy.fetch != null) {
-        final SqlWriter.Frame frame3 =
-            writer.startList(SqlWriter.FrameTypeEnum.FETCH);
-        writer.newlineAndIndent();
-        writer.keyword("FETCH");
-        writer.keyword("NEXT");
-        orderBy.fetch.unparse(writer, -1, -1);
-        writer.keyword("ROWS");
-        writer.keyword("ONLY");
-        writer.endList(frame3);
+      if (orderBy.offset != null || orderBy.fetch != null) {
+        writer.fetchOffset(orderBy.fetch, orderBy.offset);
       }
       writer.endList(frame);
     }
diff --git 
a/core/src/test/java/org/apache/calcite/sql/parser/SqlParserTest.java 
b/core/src/test/java/org/apache/calcite/sql/parser/SqlParserTest.java
index df07eb2..3430afe 100644
--- a/core/src/test/java/org/apache/calcite/sql/parser/SqlParserTest.java
+++ b/core/src/test/java/org/apache/calcite/sql/parser/SqlParserTest.java
@@ -30,6 +30,7 @@ import org.apache.calcite.sql.SqlSelect;
 import org.apache.calcite.sql.SqlSetOption;
 import org.apache.calcite.sql.SqlWriterConfig;
 import org.apache.calcite.sql.dialect.AnsiSqlDialect;
+import org.apache.calcite.sql.dialect.SparkSqlDialect;
 import org.apache.calcite.sql.parser.impl.SqlParserImpl;
 import org.apache.calcite.sql.pretty.SqlPrettyWriter;
 import org.apache.calcite.sql.test.SqlTests;
@@ -3165,6 +3166,54 @@ public class SqlParserTest {
             + "OFFSET 1 ROWS");
   }
 
+  /** Test case for
+   * <a 
href="https://issues.apache.org/jira/browse/CALCITE-4463";>[CALCITE-4463]
+   * JDBC adapter for Spark generates incorrect ORDER BY syntax</a>.
+   *
+   * <p>Similar to {@link #testLimit}, but parses and unparses in the Spark
+   * dialect, which uses LIMIT and OFFSET rather than OFFSET and FETCH. */
+  @Test void testLimitSpark() {
+    final String sql1 = "select a from foo order by b, c limit 2 offset 1";
+    final String expected1 = "SELECT A\n"
+        + "FROM FOO\n"
+        + "ORDER BY B, C\n"
+        + "LIMIT 2\n"
+        + "OFFSET 1";
+    sql(sql1).withDialect(SparkSqlDialect.DEFAULT).ok(expected1);
+
+    final String sql2 = "select a from foo order by b, c limit 2";
+    final String expected2 = "SELECT A\n"
+        + "FROM FOO\n"
+        + "ORDER BY B, C\n"
+        + "LIMIT 2";
+    sql(sql2).withDialect(SparkSqlDialect.DEFAULT).ok(expected2);
+
+    final String sql3 = "select a from foo order by b, c offset 1";
+    final String expected3 = "SELECT A\n"
+        + "FROM FOO\n"
+        + "ORDER BY B, C\n"
+        + "OFFSET 1";
+    sql(sql3).withDialect(SparkSqlDialect.DEFAULT).ok(expected3);
+
+    final String sql4 = "select a from foo offset 10";
+    final String expected4 = "SELECT A\n"
+        + "FROM FOO\n"
+        + "OFFSET 10";
+    sql(sql4).withDialect(SparkSqlDialect.DEFAULT).ok(expected4);
+
+    final String sql5 = "select a from foo\n"
+        + "union\n"
+        + "select b from baz\n"
+        + "limit 3";
+    final String expected5 = "(SELECT A\n"
+        + "FROM FOO\n"
+        + "UNION\n"
+        + "SELECT B\n"
+        + "FROM BAZ)\n"
+        + "LIMIT 3";
+    sql(sql5).withDialect(SparkSqlDialect.DEFAULT).ok(expected5);
+  }
+
   /** Test case that does not reproduce but is related to
    * <a 
href="https://issues.apache.org/jira/browse/CALCITE-1238";>[CALCITE-1238]
    * Unparsing LIMIT without ORDER BY after validation</a>. */

Reply via email to