This is an automated email from the ASF dual-hosted git repository. jiajunxie 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 db192e92a5 [CALCITE-6102] SqlWriter in SqlInsert's unparse start a list but does not end it db192e92a5 is described below commit db192e92a5ff0a8688b6f24027d5a6c2bb92f792 Author: jiefei <jiefe...@126.com> AuthorDate: Fri Nov 10 17:56:52 2023 +0800 [CALCITE-6102] SqlWriter in SqlInsert's unparse start a list but does not end it --- .../java/org/apache/calcite/sql/SqlInsert.java | 3 ++- .../calcite/sql/test/SqlPrettyWriterTest.java | 24 ++++++++++++++++++++++ .../calcite/sql/test/SqlPrettyWriterTest.xml | 7 +++++++ 3 files changed, 33 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/org/apache/calcite/sql/SqlInsert.java b/core/src/main/java/org/apache/calcite/sql/SqlInsert.java index 699298b0ff..f95932bfbf 100644 --- a/core/src/main/java/org/apache/calcite/sql/SqlInsert.java +++ b/core/src/main/java/org/apache/calcite/sql/SqlInsert.java @@ -150,7 +150,7 @@ public class SqlInsert extends SqlCall { } @Override public void unparse(SqlWriter writer, int leftPrec, int rightPrec) { - writer.startList(SqlWriter.FrameTypeEnum.SELECT); + final SqlWriter.Frame frame = writer.startList(SqlWriter.FrameTypeEnum.SELECT); writer.sep(isUpsert() ? "UPSERT INTO" : "INSERT INTO"); final int opLeft = getOperator().getLeftPrec(); final int opRight = getOperator().getRightPrec(); @@ -160,6 +160,7 @@ public class SqlInsert extends SqlCall { } writer.newlineAndIndent(); source.unparse(writer, 0, 0); + writer.endList(frame); } @Override public void validate(SqlValidator validator, SqlValidatorScope scope) { diff --git a/core/src/test/java/org/apache/calcite/sql/test/SqlPrettyWriterTest.java b/core/src/test/java/org/apache/calcite/sql/test/SqlPrettyWriterTest.java index 37cd6bab81..03c65fce99 100644 --- a/core/src/test/java/org/apache/calcite/sql/test/SqlPrettyWriterTest.java +++ b/core/src/test/java/org/apache/calcite/sql/test/SqlPrettyWriterTest.java @@ -18,6 +18,7 @@ package org.apache.calcite.sql.test; import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.SqlSelect; +import org.apache.calcite.sql.SqlWith; import org.apache.calcite.sql.SqlWriter; import org.apache.calcite.sql.SqlWriterConfig; import org.apache.calcite.sql.parser.SqlParseException; @@ -486,6 +487,29 @@ class SqlPrettyWriterTest { .check(); } + @Test void testInsert() { + sql("insert into t1 select * from t2") + .check(); + } + + /** Test case for + * <a href="https://issues.apache.org/jira/browse/CALCITE-6102">[CALCITE-6102] + * SqlWriter in SqlInsert's unparse start a list but does not end it</a>. */ + @Test void testSqlWithBodyIsSqlInsert() throws SqlParseException { + final String withSql = "with tmp as (select * from t1) select 1"; + final String insertSql = "insert into t2 select * from tmp"; + final String expectedSql = "WITH `TMP` AS (SELECT *\n" + + "FROM `T1`) INSERT INTO `T2`\n" + + "SELECT *\n" + + "FROM `TMP`"; + final SqlNode sqlInsert = SqlParser.create(insertSql).parseStmt(); + final SqlNode sqlNode = SqlParser.create(withSql).parseQuery(); + assertThat(sqlNode, instanceOf(SqlWith.class)); + final SqlWith sqlWith = (SqlWith) sqlNode; + sqlWith.setOperand(1, sqlInsert); + assertThat(sqlWith, hasToString(isLinux(expectedSql))); + } + public static void main(String[] args) throws SqlParseException { final String sql = "select x as a, b as b, c as c, d," + " 'mixed-Case string'," diff --git a/core/src/test/resources/org/apache/calcite/sql/test/SqlPrettyWriterTest.xml b/core/src/test/resources/org/apache/calcite/sql/test/SqlPrettyWriterTest.xml index 965712f049..bf4d3a76b8 100644 --- a/core/src/test/resources/org/apache/calcite/sql/test/SqlPrettyWriterTest.xml +++ b/core/src/test/resources/org/apache/calcite/sql/test/SqlPrettyWriterTest.xml @@ -225,6 +225,13 @@ FROM `X` INNER JOIN `Y` ON `X`.`K` = `Y`.`K`]]> </Resource> </TestCase> + <TestCase name="testInsert"> + <Resource name="formatted"> + <![CDATA[INSERT INTO `T1` +SELECT * + FROM `T2`]]> + </Resource> + </TestCase> <TestCase name="testJoinClauseToString"> <Resource name="formatted"> <![CDATA[SELECT `T`.`REGION_NAME`, `T0`.`O_TOTALPRICE`