[
https://issues.apache.org/jira/browse/FLINK-15728?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17021004#comment-17021004
]
Jingsong Lee edited comment on FLINK-15728 at 1/22/20 3:01 PM:
---------------------------------------------------------------
Thanks [~dasbh] for explanation. It is clear.
I think it may not be a small change. We may need to modify the interface of
JDBCDialect.
Before dialect, there was an interface call QueryExecutor, which can customize
the process of upsert. When JDBCDialect was introduced to replace
QueryExecutor, it was assumed that each dialect had the same requirements for
set fields.
But seems that the ability to customize the upsert is needed.
was (Author: lzljs3620320):
Thanks [~dasbh] for explanation. It is clear.
I think it may not be a small change. We may need to modify the interface of
JDBCDialect.
Before dialect, there was an interface call QueryExecutor, which can customize
the process of upsert. When JDBCDialect was introduced to replace
QueryExecutor, it was assumed that each dialect had the same requirements for
set fields.
But now the implementation of H2 and Oracle needs to change this, and the
ability to customize the upsert is needed.
> JDBCUpsertOutputFormat does not set bind parameter keyFields in
> updateStatement
> -------------------------------------------------------------------------------
>
> Key: FLINK-15728
> URL: https://issues.apache.org/jira/browse/FLINK-15728
> Project: Flink
> Issue Type: Bug
> Components: Connectors / JDBC
> Affects Versions: 1.9.1
> Reporter: Bhagavan
> Assignee: Bhagavan
> Priority: Major
>
> When using JDBCUpsertOutputFormat custom dialect e.g. H2/Oracle which uses
> UpsertWriterUsingInsertUpdateStatement, code fails with below error.
> {code:java}
> Caused by: org.h2.jdbc.JdbcSQLDataException: Parameter "#6" is not set
> [90012-200]
> at org.h2.message.DbException.getJdbcSQLException(DbException.java:590)
> at org.h2.message.DbException.getJdbcSQLException(DbException.java:429)
> at org.h2.message.DbException.get(DbException.java:205)
> at org.h2.message.DbException.get(DbException.java:181)
> at org.h2.expression.Parameter.checkSet(Parameter.java:83)
> at
> org.h2.jdbc.JdbcPreparedStatement.addBatch(JdbcPreparedStatement.java:1275)
> at
> org.apache.flink.api.java.io.jdbc.writer.UpsertWriter$UpsertWriterUsingInsertUpdateStatement.processOneRowInBatch(UpsertWriter.java:233)
>
> at
> org.apache.flink.api.java.io.jdbc.writer.UpsertWriter.executeBatch(UpsertWriter.java:111)
> {code}
> This is due to UpsertWriterUsingInsertUpdateStatement#processOneRowInBatch
> does not set all bind paramters in case of Update.
> This bug does get surfaced while using Derby DB.
> In JDBCUpsertOutputFormatTest if we replace Derby with H2 we can reproduce
> the bug.
> The fix is trivial. Happy to raise PR.
> {code:java}
> //for update case replace below
> setRecordToStatement(updateStatement, fieldTypes, row);
> //with
> setRecordToStatement(updateStatement, fieldTypes + pkTypes, row + pkRow);
> //NOTE: as prepared updateStatement contains additional where clause we need
> pass additional bind values and its sql Types
> {code}
--
This message was sent by Atlassian Jira
(v8.3.4#803005)