[ 
https://issues.apache.org/jira/browse/CALCITE-5122?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17530366#comment-17530366
 ] 

Jiajun Xie edited comment on CALCITE-5122 at 4/30/22 9:38 AM:
--------------------------------------------------------------

This problem is similar to it CALCITE-3658

Self join table is easily to solve in RelToSqlConverter.
{code:java}
case UPDATE: {
  final Result input = visitInput(modify, 0);
  final Map<String, RelDataType> pairs =
      ImmutableMap.of(input.neededAlias, modify.getInput().getRowType());
  final Context context = aliasContext(pairs, false); {code}
Here is the UT.
{code:java}
sql("update \"foodmart\".\"product\" set \"product_id\" = \"product_id\" + 1")
    .ok("UPDATE \"foodmart\".\"product\" SET \"product_id\" = \"product_id\" + 
1"); {code}
 

But multiple table join need to unparse sourceSelect, I'm still looking for a 
better way.

 


was (Author: jiajunbernoulli):
This problem is similar to it CALCITE-3658

Self join table is easily to solve in RelToSqlConverter.
{code:java}
case UPDATE: {
  final Result input = visitInput(modify, 0);
  final Map<String, RelDataType> pairs =
      ImmutableMap.of(input.neededAlias, modify.getInput().getRowType());
  final Context context = aliasContext(pairs, false); {code}
Here is the UT.

 
{code:java}
sql("update \"foodmart\".\"product\" set \"product_id\" = \"product_id\" + 1")
    .ok("UPDATE \"foodmart\".\"product\" SET \"product_id\" = \"product_id\" + 
1"); {code}
But multiple table join need to unparse sourceSelect, I'm still looking for a 
better way.

 

> failed to convert update relnode to sqlnode
> -------------------------------------------
>
>                 Key: CALCITE-5122
>                 URL: https://issues.apache.org/jira/browse/CALCITE-5122
>             Project: Calcite
>          Issue Type: Bug
>          Components: core
>    Affects Versions: 1.30.0
>            Reporter: cwb
>            Assignee: Jiajun Xie
>            Priority: Major
>
> code:
> String sqlUpdate="update mysql2.user_info_2 a set name = (select account_name 
> from mysql2.account_info b  where b.account_id=a.id )";
> RelToSqlConverter relToSqlConverter = new 
> RelToSqlConverter(AnsiSqlDialect.DEFAULT);
>             SqlImplementor.Result visit;
>             SqlNode sqlNodeTarget;
>             String targetSql;
>             sqlNode = planner.parse(sqlUpdate);
>             planner.validate(sqlNode);
>             relRoot = planner.rel(sqlNode);
>             visit = relToSqlConverter.visitRoot(relRoot.rel);
>             sqlNodeTarget = visit.asStatement();
>             
> targetSql=sqlNodeTarget.toSqlString(MysqlSqlDialect.DEFAULT).getSql();
> error: (in public Result visit(TableModify modify)  )
> Exception in thread "main" java.lang.AssertionError: field ordinal 0 out of 
> range {}
>     at 
> org.apache.calcite.rel.rel2sql.SqlImplementor$AliasContext.field(SqlImplementor.java:1531)
>     at 
> org.apache.calcite.rel.rel2sql.SqlImplementor$Context.toSql(SqlImplementor.java:630)
>     at 
> org.apache.calcite.rel.rel2sql.RelToSqlConverter.lambda$12(RelToSqlConverter.java:1066)
>     at org.apache.calcite.util.Util$TransformingList.get(Util.java:2783)
>     at java.util.AbstractList$Itr.next(AbstractList.java:358)
>     at java.util.AbstractCollection.toArray(AbstractCollection.java:141)
>     at java.util.ArrayList.<init>(ArrayList.java:178)
>     at org.apache.calcite.sql.SqlNodeList.<init>(SqlNodeList.java:98)
>     at 
> org.apache.calcite.rel.rel2sql.RelToSqlConverter.exprList(RelToSqlConverter.java:1065)
>     at 
> org.apache.calcite.rel.rel2sql.RelToSqlConverter.visit(RelToSqlConverter.java:1038)



--
This message was sent by Atlassian Jira
(v8.20.7#820007)

Reply via email to