[ https://issues.apache.org/jira/browse/CALCITE-1527?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15721810#comment-15721810 ]
Christian Tzolov commented on CALCITE-1527: ------------------------------------------- Here is the first PR: https://github.com/apache/calcite/pull/334 * I had to align the SqlUpdate's RowType with the rest of DML operations [https://github.com/apache/calcite/pull/334/commits/42a5461c6341ae89f444fdccb99f10e744fa4393]. Note that the DML operations (update including) return rowcount instead of ResultSet * UPDATE implementation requires access to the SET source expressions. While TableModify provides the SET column names it misses the set value expressions. Therefore I've added a new field: List<RexNode> sourceExpressionList to TableModify (and updated many impacted classes ) [https://github.com/apache/calcite/pull/334/commits/9c8f141771709b2ab2d2461b7f37f6cb48d0a1c4]. The sourceExpressionList is initialized from the SqlUpdate: {code} private RelNode convertUpdate(SqlUpdate call) { final SqlValidatorScope scope = validator.getWhereScope(call.getSourceSelect()); Blackboard bb = createBlackboard(scope, null, false); Builder<RexNode> rexNodeSourceExpressionListBuilder = ImmutableList.builder(); for (SqlNode n: call.getSourceExpressionList()) { RexNode rn = bb.convertExpression(n); rexNodeSourceExpressionListBuilder.add(rn); } .... {code} It works for the common use cases but failed with update sub-queries. Check the RelToSqlConverter#testUpdateSubQuery! I guess there is a better way to resolve the source expressions for sub-query? * [https://github.com/apache/calcite/pull/334/commits/658cc90461e3e822638405c19bfa463b5cbc1d77] Implements the Rel to SQL for the INSERT, UPDATE and DELETE operations. Note that DML returns row count instead of ResultSet. To support DML result i had to change the hardcoded statement.executeQuery(sql) (in ResultSetEnumerable) into boolean isResultSetProvided = statement.execute(sql) and handle the result according to the isResultSetProvided. To Support the Insert i had to make the JdbcTable a ModifiableTable - later is marked as experimental? Also i had to lower the JdbcTableModify cost (super.computeSelfCost(planner, mq).multiplyBy(.1)) to make it win over the EnumberableTableModify. > Support DML in the JDBC adapter > ------------------------------- > > Key: CALCITE-1527 > URL: https://issues.apache.org/jira/browse/CALCITE-1527 > Project: Calcite > Issue Type: Bug > Components: jdbc-adapter > Reporter: Christian Tzolov > > Currently the JDBC adapter does not support the DML operations: *INSERT*, > *DELETE* and *UPDATE*. > Solution needs to convert the parsed *Modify* and *Values* RelNodes into > *JdbcTableModify*, *JdbcValues* ... such and then in turn into corresponding > SqlInsert, SqlUpdate and SqlDelete. -- This message was sent by Atlassian JIRA (v6.3.4#6332)