JingsongLi commented on a change in pull request #11490:
[FLINK-15579][table-planner-blink] UpsertStreamTableSink should work on batch
mode
URL: https://github.com/apache/flink/pull/11490#discussion_r396869516
##########
File path:
flink-table/flink-table-planner-blink/src/main/scala/org/apache/flink/table/planner/plan/nodes/physical/batch/BatchExecSink.scala
##########
@@ -81,13 +82,26 @@ class BatchExecSink[T](
override protected def translateToPlanInternal(
planner: BatchPlanner): Transformation[Any] = {
val resultTransformation = sink match {
- case _: RetractStreamTableSink[T] | _: UpsertStreamTableSink[T] =>
- throw new TableException("RetractStreamTableSink and
UpsertStreamTableSink is not" +
- " supported in Batch environment.")
-
case streamTableSink: StreamTableSink[T] =>
- // we can insert the bounded DataStream into a StreamTableSink
- val transformation = translateToTransformation(withChangeFlag = false,
planner)
+ val transformation = streamTableSink match {
+ case _: RetractStreamTableSink[T] =>
+ translateToTransformation(withChangeFlag = true, planner)
+
+ case upsertSink: UpsertStreamTableSink[T] =>
+ UpdatingPlanChecker.getUniqueKeyForUpsertSink(this, planner,
upsertSink) match {
+ case Some(keys) =>
+ upsertSink.setIsAppendOnly(false)
+ upsertSink.setKeyFields(keys)
+ case None =>
+ upsertSink.setIsAppendOnly(true)
+ upsertSink.setKeyFields(null)
Review comment:
`setIsAppendOnly(false)` should be more safe.
- User maybe use same MySQL table to multiple batch inserts. Update should
be safe.
- In future, maybe primary keys are come from DDL, batch can not ensure that
there is no duplicate key.
----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
For queries about this service, please contact Infrastructure at:
[email protected]
With regards,
Apache Git Services