[
https://issues.apache.org/jira/browse/CALCITE-3606?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16999883#comment-16999883
]
Ran Cao commented on CALCITE-3606:
----------------------------------
{code:java}
final RelToSqlConverter converter = new
RelToSqlConverter(SqlDialect.DatabaseProduct.CALCITE.getDialect());
@Test public void test() throws Exception {
String singleColumnSql = "INSERT INTO DEPT VALUES (?,?)";
String multiColumnsSql = "INSERT INTO DEPT VALUES (?,?),(?,?)";
assertEquals(transform(singleColumnSql), "INSERT INTO
\"CATALOG\".\"SALES\".\"DEPT\" (\"DEPTNO\", \"NAME\")\r\n" + "(SELECT ? AS
\"DEPTNO\", ? AS \"NAME\"\r\n" + "FROM (VALUES (0)) AS \"t\" (\"ZERO\"))");
assertEquals(transform(multiColumnsSql), "INSERT INTO
\"CATALOG\".\"SALES\".\"DEPT\" (\"EXPR$0\", \"EXPR$1\")\r\n" + "SELECT ?,
?\r\n" + "FROM (VALUES (0)) AS \"t\" (\"ZERO\")\r\n" + "UNION ALL\r\n" +
"SELECT ?, ?\r\n" + "FROM (VALUES (0)) AS \"t\" (\"ZERO\")");
}
private String transform(String sql) {
RelRoot relRoot = tester.convertSqlToRel(sql);
final SqlNode sqlNode = converter.visitChild(0, relRoot.rel).asStatement();
return
sqlNode.toSqlString(SqlDialect.DatabaseProduct.CALCITE.getDialect()).getSql();
}{code}
after transform, the second sql's column name was wrong.
> batch insert failed
> -------------------
>
> Key: CALCITE-3606
> URL: https://issues.apache.org/jira/browse/CALCITE-3606
> Project: Calcite
> Issue Type: Wish
> Components: core
> Affects Versions: 1.21.0
> Reporter: Ran Cao
> Priority: Major
>
> when I try to execute sql like (insert into example_table (column1,column2)
> values (value1,value2),(value1,value2)), it will failed with error message
> like this: column "EXPR$0" of relation "example_table" does not exist. I find
> the reason is that when converting SqlNode(insert sql) to
> RelNode(TableModify), one of the steps is to change the column that stored in
> RelDataType from the fake column name (like "EXPR$0") to the real column name
> (like "id"). But when the values part in sql is more than one , the step
> above-mentioned will skip because the RelNode is instance of LogicalUnion
> instead of Project, the code refered to org.apache.calcite.tools.RelBuilder
> line 1461:
> if (input instanceof Project && fieldNames != null) {
> // change the column name
> }
>
--
This message was sent by Atlassian Jira
(v8.3.4#803005)