[CALCITE-2398] SqlSelect must call into SqlDialect for unparse (James Duong)
Close apache/calcite#750 Project: http://git-wip-us.apache.org/repos/asf/calcite/repo Commit: http://git-wip-us.apache.org/repos/asf/calcite/commit/606240d4 Tree: http://git-wip-us.apache.org/repos/asf/calcite/tree/606240d4 Diff: http://git-wip-us.apache.org/repos/asf/calcite/diff/606240d4 Branch: refs/heads/master Commit: 606240d4f1e39ab36447a9b4abe20c6c519d5cab Parents: 870e54f Author: James Duong <[email protected]> Authored: Tue Jul 3 16:42:18 2018 -0700 Committer: Julian Hyde <[email protected]> Committed: Sun Jul 8 22:41:09 2018 -0700 ---------------------------------------------------------------------- .../java/org/apache/calcite/sql/SqlSelect.java | 4 ++-- .../rel/rel2sql/RelToSqlConverterTest.java | 24 ++++++++++++++++++++ 2 files changed, 26 insertions(+), 2 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/calcite/blob/606240d4/core/src/main/java/org/apache/calcite/sql/SqlSelect.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/calcite/sql/SqlSelect.java b/core/src/main/java/org/apache/calcite/sql/SqlSelect.java index ad7d6ef..2c23774 100644 --- a/core/src/main/java/org/apache/calcite/sql/SqlSelect.java +++ b/core/src/main/java/org/apache/calcite/sql/SqlSelect.java @@ -233,10 +233,10 @@ public class SqlSelect extends SqlCall { // ORDER. In this case, we don't need a wrapper frame.) final SqlWriter.Frame frame = writer.startList(SqlWriter.FrameTypeEnum.SUB_QUERY, "(", ")"); - getOperator().unparse(writer, this, 0, 0); + writer.getDialect().unparseCall(writer, this, 0, 0); writer.endList(frame); } else { - getOperator().unparse(writer, this, leftPrec, rightPrec); + writer.getDialect().unparseCall(writer, this, leftPrec, rightPrec); } } http://git-wip-us.apache.org/repos/asf/calcite/blob/606240d4/core/src/test/java/org/apache/calcite/rel/rel2sql/RelToSqlConverterTest.java ---------------------------------------------------------------------- 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 53ba8a9..c5af61a 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 @@ -26,9 +26,12 @@ import org.apache.calcite.rel.RelNode; import org.apache.calcite.rel.rules.UnionMergeRule; import org.apache.calcite.runtime.FlatLists; import org.apache.calcite.schema.SchemaPlus; +import org.apache.calcite.sql.SqlCall; import org.apache.calcite.sql.SqlDialect; import org.apache.calcite.sql.SqlDialect.Context; import org.apache.calcite.sql.SqlNode; +import org.apache.calcite.sql.SqlSelect; +import org.apache.calcite.sql.SqlWriter; import org.apache.calcite.sql.dialect.CalciteSqlDialect; import org.apache.calcite.sql.dialect.HiveSqlDialect; import org.apache.calcite.sql.dialect.JethroDataSqlDialect; @@ -2514,6 +2517,27 @@ public class RelToSqlConverterTest { sql(query).ok(expected); } + @Test public void testUnparseSelectMustUseDialect() { + final String query = "select * from \"product\""; + final String expected = "SELECT *\n" + + "FROM foodmart.product"; + + final boolean[] callsUnparseCallOnSqlSelect = {false}; + final SqlDialect dialect = new SqlDialect(SqlDialect.EMPTY_CONTEXT) { + @Override public void unparseCall(SqlWriter writer, SqlCall call, + int leftPrec, int rightPrec) { + if (call instanceof SqlSelect) { + callsUnparseCallOnSqlSelect[0] = true; + } + super.unparseCall(writer, call, leftPrec, rightPrec); + } + }; + sql(query).dialect(dialect).ok(expected); + + assertThat("Dialect must be able to customize unparseCall() for SqlSelect", + callsUnparseCallOnSqlSelect[0], is(true)); + } + /** Fluid interface to run tests. */ private static class Sql { private CalciteAssert.SchemaSpec schemaSpec;
