[
https://issues.apache.org/jira/browse/CALCITE-4022?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17164695#comment-17164695
]
Danny Chen edited comment on CALCITE-4022 at 7/25/20, 12:30 AM:
----------------------------------------------------------------
It seems that you want the SqlNode that has been visited by the SqlShuttle can
still be unparsed correctly. But i don't think the fix the right. For these
reasons:
1. SqlShuttle is a tool class, there is no guarantee that the node before &
after visited should be strictly the same
2. The original SqlSyntax.SPECIAL did the right thing, it throws exception to
let the SqlOperator customize the unparse intentially
If you did want to fix the unparse, in SqlInsert, override its
SqlInsert#OPERATOR#createCall, like this
{code:java}
new SqlSpecialOperator("INSERT", SqlKind.INSERT) {
@Override
public SqlCall createCall(SqlLiteral functionQualifier, SqlParserPos
pos, SqlNode... operands) {
return new SqlInsert(
pos,
(SqlNodeList) operands[0],
operands[1],
operands[2],
(SqlNodeList) operands[3]);
}
};
{code}
was (Author: danny0405):
It seems that you want the SqlNode that has been visited by the SqlShuttle can
still be unparsed correctly. But i don't think the fix the right. For these
reasons:
SqlShuttle is a tool class, there is no guarantee that the node before & after
visited should be strictly the same
The original SqlSyntax.SPECIAL did the right thing, it throws exception to let
the SqlOperator customize the unparse intentially
If you did want to fix the unparse, in SqlInsert, override its
SqlInsert#OPERATOR#createCall, like this
{code:java}
new SqlSpecialOperator("INSERT", SqlKind.INSERT) {
@Override
public SqlCall createCall(SqlLiteral functionQualifier, SqlParserPos
pos, SqlNode... operands) {
return new SqlInsert(
pos,
(SqlNodeList) operands[0],
operands[1],
operands[2],
(SqlNodeList) operands[3]);
}
};
{code}
> Support unparse special syntax when operator is INSERT
> ------------------------------------------------------
>
> Key: CALCITE-4022
> URL: https://issues.apache.org/jira/browse/CALCITE-4022
> Project: Calcite
> Issue Type: Wish
> Reporter: xzh_dz
> Assignee: Wang Yanlin
> Priority: Major
> Labels: pull-request-available
> Attachments: image-2020-05-25-17-38-36-009.png
>
> Time Spent: 2h 50m
> Remaining Estimate: 0h
>
> This exception can be reproduced as below:
> SqlParserTest:
> {code:java}
> @Test void test() throws Exception {
> final String sql = "insert into emps select * from emps";
> final SqlNode sqlNode = getSqlParser(sql).parseStmt();
> final SqlNode sqlNodeVisited = sqlNode.accept(new SqlShuttle() {
> @Override public SqlNode visit(SqlIdentifier identifier) {
> return new SqlIdentifier(identifier.names,
> identifier.getParserPosition());
> }
> });
> System.out.println(sqlNodeVisited.toString());
> }
> {code}
> !image-2020-05-25-17-38-36-009.png!
> Method threw 'java.lang.UnsupportedOperationException' exception. Cannot
> evaluate org.apache.calcite.sql.SqlBasicCall.toString()
> SqlInsert is a SqlSpecialOperator, when `toString` method is called, this
> problem is shown.We can see that `SqlSyntax#SPECIAL#unparse()` hasn't been
> implemented yet.
> exception :
> java.lang.UnsupportedOperationException: class
> org.apache.calcite.sql.SqlSyntax$6: SPECIAL
> at org.apache.calcite.util.Util.needToImplement(Util.java:967)
> at org.apache.calcite.sql.SqlSyntax$6.unparse(SqlSyntax.java:116)
> at org.apache.calcite.sql.SqlOperator.unparse(SqlOperator.java:333)
> at org.apache.calcite.sql.SqlDialect.unparseCall(SqlDialect.java:462)
> at org.apache.calcite.sql.SqlCall.unparse(SqlCall.java:104)
> at org.apache.calcite.sql.SqlNode.toSqlString(SqlNode.java:151)
> at org.apache.calcite.sql.SqlNode.toString(SqlNode.java:126)
--
This message was sent by Atlassian Jira
(v8.3.4#803005)