MyeoungDev opened a new issue, #8872:
URL: https://github.com/apache/seatunnel/issues/8872

   ### Search before asking
   
   - [x] I had searched in the 
[issues](https://github.com/apache/seatunnel/issues?q=is%3Aissue+label%3A%22bug%22)
 and found no similar issues.
   
   
   ### What happened
   
   An `IndexOutOfBoundsException` occurs when using the `primary_keys` option 
in `JDBC Sink` with an empty array.
   
   The issue occurs when constructing `JdbcSink` inside `JdbcSinkFactory`.
   
   As per PR #5150, when `primary_keys` is `null`, the system automatically 
constructs a `PrimaryKey` using a `Unique Key`.
   
   To resolve this issue, the following modification is proposed:
   
   Before
   
   ```bash
   if (!config.getOptional(PRIMARY_KEYS).isPresent()) {
   ```
   
   After
   
   ```bash
   List<String> primaryKeysOption = config.getOptional(PRIMARY_KEYS)
           .orElse(Collections.emptyList());
   
   if (primaryKeysOption.isEmpty()) {
   ```
   
   This change ensures that an empty array (`[]`) is treated consistently with 
a `null` value, preventing `IndexOutOfBoundsException` while maintaining 
existing behavior.
   
   ### SeaTunnel Version
   
   2.3.9
   
   ### SeaTunnel Config
   
   ```conf
   {
     "env": {
       "job.mode": "BATCH"
     },
     "source": [
       {
         "plugin_name": "Jdbc",
         "url": "jdbc:mysql://xx.xx.xxx.xxx:xxxx/seatunnel",
         "driver": "com.mysql.cj.jdbc.Driver",
         "user": "xxxx",
         "password": "xxxx",
         "database" : "seatunnel",
         "table" : "public.xxxx_xxxx",
         "query" : "SELECT * FROM public.xxxx_xxxx",
         "plugin_output": "seatunnel"
       }
     ],
     "sink": [
       {
         "plugin_name": "Jdbc",
         "url": "jdbc:postgresql://xx.xx.xxx.xxx:xxxx/seatunnel",
         "driver": "org.postgresql.Driver",
         "user": "xxxx",
         "password": "xxxx",
         "database" : "seatunnel",
         "table" : "public.xxxx_xxxx",
         "generate_sink_sql": true,
         "plugin_input": "seatunnel",
         "primary_keys": []
       }
     ]
   }
   ```
   
   ### Running Command
   
   ```shell
   ./bin/seatunnel-cluster.sh -d -r master
   ```
   
   ### Error Exception
   
   ```log
   [947010428246949889] 2025-02-26 15:01:29,878 ERROR 
[.s.e.s.c.CheckpointCoordinator] [hz.main.generic-operation.thread-30] - report 
error from task
   org.apache.seatunnel.common.utils.SeaTunnelException: 
java.lang.IndexOutOfBoundsException: Index 0 out of bounds for length 0
           at 
java.base/jdk.internal.util.Preconditions.outOfBounds(Preconditions.java:64)
           at 
java.base/jdk.internal.util.Preconditions.outOfBoundsCheckIndex(Preconditions.java:70)
           at 
java.base/jdk.internal.util.Preconditions.checkIndex(Preconditions.java:248)
           at java.base/java.util.Objects.checkIndex(Objects.java:374)
           at java.base/java.util.ArrayList.get(ArrayList.java:459)
           at 
org.apache.seatunnel.connectors.seatunnel.jdbc.sink.JdbcSink.createWriter(JdbcSink.java:132)
           at 
org.apache.seatunnel.connectors.seatunnel.jdbc.sink.JdbcSink.createWriter(JdbcSink.java:66)
           at 
org.apache.seatunnel.api.sink.multitablesink.MultiTableSink.createWriter(MultiTableSink.java:80)
           at 
org.apache.seatunnel.engine.server.task.flow.SinkFlowLifeCycle.restoreState(SinkFlowLifeCycle.java:342)
           at 
org.apache.seatunnel.engine.server.task.SeaTunnelTask.lambda$restoreState$16(SeaTunnelTask.java:426)
           at 
java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183)
           at 
java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:195)
           at 
java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:177)
           at 
java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1655)
           at 
java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484)
           at 
java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474)
           at 
java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150)
           at 
java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173)
           at 
java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
           at 
java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:497)
           at 
org.apache.seatunnel.engine.server.task.SeaTunnelTask.restoreState(SeaTunnelTask.java:423)
           at 
org.apache.seatunnel.engine.server.checkpoint.operation.NotifyTaskRestoreOperation.lambda$null$0(NotifyTaskRestoreOperation.java:107)
           at 
java.base/java.util.concurrent.CompletableFuture$AsyncRun.run(CompletableFuture.java:1736)
           at 
org.apache.seatunnel.api.tracing.MDCRunnable.run(MDCRunnable.java:43)
           at 
java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
           at 
java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
           at java.base/java.lang.Thread.run(Thread.java:829)
   
           at 
org.apache.seatunnel.engine.server.checkpoint.CheckpointCoordinator.reportCheckpointErrorFromTask(CheckpointCoordinator.java:391)
 ~[seatunnel-starter.jar:2.3.9]
           at 
org.apache.seatunnel.engine.server.checkpoint.CheckpointManager.reportCheckpointErrorFromTask(CheckpointManager.java:182)
 ~[seatunnel-starter.jar:2.3.9]
           at 
org.apache.seatunnel.engine.server.checkpoint.operation.CheckpointErrorReportOperation.runInternal(CheckpointErrorReportOperation.java:48)
 ~[seatunnel-starter.jar:2.3.9]
           at 
org.apache.seatunnel.engine.server.task.operation.TracingOperation.run(TracingOperation.java:42)
 ~[seatunnel-starter.jar:2.3.9]
           at 
com.hazelcast.spi.impl.operationservice.Operation.call(Operation.java:189) 
~[seatunnel-starter.jar:2.3.9]
           at 
com.hazelcast.spi.impl.operationservice.impl.OperationRunnerImpl.call(OperationRunnerImpl.java:273)
 ~[seatunnel-starter.jar:2.3.9]
           at 
com.hazelcast.spi.impl.operationservice.impl.OperationRunnerImpl.run(OperationRunnerImpl.java:248)
 ~[seatunnel-starter.jar:2.3.9]
           at 
com.hazelcast.spi.impl.operationservice.impl.OperationRunnerImpl.run(OperationRunnerImpl.java:213)
 ~[seatunnel-starter.jar:2.3.9]
           at 
com.hazelcast.spi.impl.operationexecutor.impl.OperationThread.process(OperationThread.java:175)
 ~[seatunnel-starter.jar:2.3.9]
           at 
com.hazelcast.spi.impl.operationexecutor.impl.OperationThread.process(OperationThread.java:139)
 ~[seatunnel-starter.jar:2.3.9]
           at 
com.hazelcast.spi.impl.operationexecutor.impl.OperationThread.executeRun(OperationThread.java:123)
 ~[seatunnel-starter.jar:2.3.9]
   ```
   
   ### Zeta or Flink or Spark Version
   
   Zeta
   
   ### Java or Scala Version
   
   Java 1.8
   
   ### Screenshots
   
   _No response_
   
   ### Are you willing to submit PR?
   
   - [x] Yes I am willing to submit a PR!
   
   ### Code of Conduct
   
   - [x] I agree to follow this project's [Code of 
Conduct](https://www.apache.org/foundation/policies/conduct)
   


-- 
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.

To unsubscribe, e-mail: commits-unsubscr...@seatunnel.apache.org.apache.org

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org

Reply via email to