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>. */