Uploaded image for project: 'Debezium'
  1. Debezium
  2. DBZ-4416

Oracle NaN, +Inf and -Inf cause an error in streaming mode

    XMLWordPrintable

Details

    • Bug
    • Resolution: Unresolved
    • Major
    • Backlog
    • 1.7.1.Final
    • oracle-connector
    • None
    • False
    • False
    • Hide

      1. Create a table in an Oracle table with BINARY_FLOAT and BINARY_DOUBLE columns, for example:

      CREATE TABLE test_table (id INT PRIMARY KEY, col1 BINARY_FLOAT, col2 BINARY_DOUBLE);

      2. Create an Oracle connector that includes this table.

      3. When the connector is in streaming mode, insert NaN/+Inf/-Inf:

      INSERT INTO test_table VALUES (0, 'NaN', 'NaN');
      INSERT INTO test_table VALUES (3, BINARY_FLOAT_INFINITY, BINARY_FLOAT_INFINITY);
      INSERT INTO test_table VALUES (4, -BINARY_FLOAT_INFINITY, -BINARY_FLOAT_INFINITY)
      Show
      1. Create a table in an Oracle table with BINARY_FLOAT and BINARY_DOUBLE columns, for example: CREATE TABLE test_table (id INT PRIMARY KEY , col1 BINARY_FLOAT, col2 BINARY_DOUBLE); 2. Create an Oracle connector that includes this table. 3. When the connector is in streaming mode, insert NaN/+Inf/-Inf: INSERT INTO test_table VALUES (0, 'NaN' , 'NaN' ); INSERT INTO test_table VALUES (3, BINARY_FLOAT_INFINITY, BINARY_FLOAT_INFINITY); INSERT INTO test_table VALUES (4, -BINARY_FLOAT_INFINITY, -BINARY_FLOAT_INFINITY)

    Description

      Hi,

      In case of an Oracle database with a table with a BINARY_FLOAT or a BINARY_DOUBLE column that contains NaN, +Inf or -Inf, the following errors occur with Logminer:

      (NaN, BINARY_FLOAT)

       

      2021-12-08 10:40:27,150 ERROR  Oracle|transporter-repl1-iusxhg--1|streaming  Failed to properly convert data value for 'ORCLPDB1.DEBEZIUM.TEST_TABLE.COL2' of type BINARY_FLOAT for row [7, Nan, Nan]:   [io.debezium.relational.TableSchemaBuilder]
      java.lang.NumberFormatException: For input string: "Nan"
          at java.base/jdk.internal.math.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:2054)
          at java.base/jdk.internal.math.FloatingDecimal.parseFloat(FloatingDecimal.java:122)
          at java.base/java.lang.Float.parseFloat(Float.java:455)
          at io.debezium.connector.oracle.OracleValueConverters.convertFloat(OracleValueConverters.java:364)
          at io.debezium.connector.oracle.OracleValueConverters.lambda$converter$2(OracleValueConverters.java:199)
          at io.debezium.relational.TableSchemaBuilder.lambda$createValueGenerator$5(TableSchemaBuilder.java:264)
          at io.debezium.relational.TableSchema.valueFromColumnData(TableSchema.java:141)
          at io.debezium.relational.RelationalChangeRecordEmitter.emitCreateRecord(RelationalChangeRecordEmitter.java:70)
          at io.debezium.relational.RelationalChangeRecordEmitter.emitChangeRecords(RelationalChangeRecordEmitter.java:46)
          at io.debezium.pipeline.EventDispatcher.dispatchDataChangeEvent(EventDispatcher.java:218)
          at io.debezium.connector.oracle.logminer.processor.memory.MemoryLogMinerEventProcessor$1.accept(MemoryLogMinerEventProcessor.java:279)
          at io.debezium.connector.oracle.logminer.processor.memory.MemoryLogMinerEventProcessor$1.accept(MemoryLogMinerEventProcessor.java:259)
          at io.debezium.connector.oracle.logminer.processor.TransactionCommitConsumer.dispatchChangeEvent(TransactionCommitConsumer.java:143)
          at io.debezium.connector.oracle.logminer.processor.TransactionCommitConsumer.close(TransactionCommitConsumer.java:99)
          at io.debezium.connector.oracle.logminer.processor.memory.MemoryLogMinerEventProcessor.handleCommit(MemoryLogMinerEventProcessor.java:302)
          at io.debezium.connector.oracle.logminer.processor.AbstractLogMinerEventProcessor.processRow(AbstractLogMinerEventProcessor.java:199)
          at io.debezium.connector.oracle.logminer.processor.AbstractLogMinerEventProcessor.processResults(AbstractLogMinerEventProcessor.java:177)
          at io.debezium.connector.oracle.logminer.processor.memory.MemoryLogMinerEventProcessor.process(MemoryLogMinerEventProcessor.java:134)
          at io.debezium.connector.oracle.logminer.LogMinerStreamingChangeEventSource.execute(LogMinerStreamingChangeEventSource.java:167)
          at io.debezium.connector.oracle.logminer.LogMinerStreamingChangeEventSource.execute(LogMinerStreamingChangeEventSource.java:58)
          at io.debezium.pipeline.ChangeEventSourceCoordinator.streamEvents(ChangeEventSourceCoordinator.java:166)
          at io.debezium.pipeline.ChangeEventSourceCoordinator.lambda$start$0(ChangeEventSourceCoordinator.java:127)
          at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
          at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
          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)

      (+Inf, BINARY_FLOAT)

      2021-12-08 10:40:27,153 ERROR  Oracle|transporter-repl1-iusxhg--1|streaming  Failed to properly convert data value for 'ORCLPDB1.DEBEZIUM.TEST_TABLE.COL2' of type BINARY_FLOAT for row [8, Inf, Inf]:   [io.debezium.relational.TableSchemaBuilder]
      java.lang.NumberFormatException: For input string: "Inf"
          at java.base/jdk.internal.math.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:2054)
          at java.base/jdk.internal.math.FloatingDecimal.parseFloat(FloatingDecimal.java:122)
          at java.base/java.lang.Float.parseFloat(Float.java:455)
          at io.debezium.connector.oracle.OracleValueConverters.convertFloat(OracleValueConverters.java:364)
          at io.debezium.connector.oracle.OracleValueConverters.lambda$converter$2(OracleValueConverters.java:199)
          at io.debezium.relational.TableSchemaBuilder.lambda$createValueGenerator$5(TableSchemaBuilder.java:264)
          at io.debezium.relational.TableSchema.valueFromColumnData(TableSchema.java:141)
          at io.debezium.relational.RelationalChangeRecordEmitter.emitCreateRecord(RelationalChangeRecordEmitter.java:70)
          at io.debezium.relational.RelationalChangeRecordEmitter.emitChangeRecords(RelationalChangeRecordEmitter.java:46)
          at io.debezium.pipeline.EventDispatcher.dispatchDataChangeEvent(EventDispatcher.java:218)
          at io.debezium.connector.oracle.logminer.processor.memory.MemoryLogMinerEventProcessor$1.accept(MemoryLogMinerEventProcessor.java:279)
          at io.debezium.connector.oracle.logminer.processor.memory.MemoryLogMinerEventProcessor$1.accept(MemoryLogMinerEventProcessor.java:259)
          at io.debezium.connector.oracle.logminer.processor.TransactionCommitConsumer.dispatchChangeEvent(TransactionCommitConsumer.java:143)
          at io.debezium.connector.oracle.logminer.processor.TransactionCommitConsumer.close(TransactionCommitConsumer.java:99)
          at io.debezium.connector.oracle.logminer.processor.memory.MemoryLogMinerEventProcessor.handleCommit(MemoryLogMinerEventProcessor.java:302)
          at io.debezium.connector.oracle.logminer.processor.AbstractLogMinerEventProcessor.processRow(AbstractLogMinerEventProcessor.java:199)
          at io.debezium.connector.oracle.logminer.processor.AbstractLogMinerEventProcessor.processResults(AbstractLogMinerEventProcessor.java:177)
          at io.debezium.connector.oracle.logminer.processor.memory.MemoryLogMinerEventProcessor.process(MemoryLogMinerEventProcessor.java:134)
          at io.debezium.connector.oracle.logminer.LogMinerStreamingChangeEventSource.execute(LogMinerStreamingChangeEventSource.java:167)
          at io.debezium.connector.oracle.logminer.LogMinerStreamingChangeEventSource.execute(LogMinerStreamingChangeEventSource.java:58)
          at io.debezium.pipeline.ChangeEventSourceCoordinator.streamEvents(ChangeEventSourceCoordinator.java:166)
          at io.debezium.pipeline.ChangeEventSourceCoordinator.lambda$start$0(ChangeEventSourceCoordinator.java:127)
          at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
          at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
          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)

      (-Inf, BINARY_FLOAT)

      2021-12-08 10:40:27,153 ERROR  Oracle|transporter-repl1-iusxhg--1|streaming  Failed to properly convert data value for 'ORCLPDB1.DEBEZIUM.TEST_TABLE.COL2' of type BINARY_FLOAT for row [9, -Inf, -Inf]:   [io.debezium.relational.TableSchemaBuilder]
      java.lang.NumberFormatException: For input string: "-Inf"
          at java.base/jdk.internal.math.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:2054)
          at java.base/jdk.internal.math.FloatingDecimal.parseFloat(FloatingDecimal.java:122)
          at java.base/java.lang.Float.parseFloat(Float.java:455)
          at io.debezium.connector.oracle.OracleValueConverters.convertFloat(OracleValueConverters.java:364)
          at io.debezium.connector.oracle.OracleValueConverters.lambda$converter$2(OracleValueConverters.java:199)
          at io.debezium.relational.TableSchemaBuilder.lambda$createValueGenerator$5(TableSchemaBuilder.java:264)
          at io.debezium.relational.TableSchema.valueFromColumnData(TableSchema.java:141)
          at io.debezium.relational.RelationalChangeRecordEmitter.emitCreateRecord(RelationalChangeRecordEmitter.java:70)
          at io.debezium.relational.RelationalChangeRecordEmitter.emitChangeRecords(RelationalChangeRecordEmitter.java:46)
          at io.debezium.pipeline.EventDispatcher.dispatchDataChangeEvent(EventDispatcher.java:218)
          at io.debezium.connector.oracle.logminer.processor.memory.MemoryLogMinerEventProcessor$1.accept(MemoryLogMinerEventProcessor.java:279)
          at io.debezium.connector.oracle.logminer.processor.memory.MemoryLogMinerEventProcessor$1.accept(MemoryLogMinerEventProcessor.java:259)
          at io.debezium.connector.oracle.logminer.processor.TransactionCommitConsumer.dispatchChangeEvent(TransactionCommitConsumer.java:143)
          at io.debezium.connector.oracle.logminer.processor.TransactionCommitConsumer.close(TransactionCommitConsumer.java:99)
          at io.debezium.connector.oracle.logminer.processor.memory.MemoryLogMinerEventProcessor.handleCommit(MemoryLogMinerEventProcessor.java:302)
          at io.debezium.connector.oracle.logminer.processor.AbstractLogMinerEventProcessor.processRow(AbstractLogMinerEventProcessor.java:199)
          at io.debezium.connector.oracle.logminer.processor.AbstractLogMinerEventProcessor.processResults(AbstractLogMinerEventProcessor.java:177)
          at io.debezium.connector.oracle.logminer.processor.memory.MemoryLogMinerEventProcessor.process(MemoryLogMinerEventProcessor.java:134)
          at io.debezium.connector.oracle.logminer.LogMinerStreamingChangeEventSource.execute(LogMinerStreamingChangeEventSource.java:167)
          at io.debezium.connector.oracle.logminer.LogMinerStreamingChangeEventSource.execute(LogMinerStreamingChangeEventSource.java:58)
          at io.debezium.pipeline.ChangeEventSourceCoordinator.streamEvents(ChangeEventSourceCoordinator.java:166)
          at io.debezium.pipeline.ChangeEventSourceCoordinator.lambda$start$0(ChangeEventSourceCoordinator.java:127)
          at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
          at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
          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) 

      A very similar error occurs with BINARY_DOUBLE, for example in the case of NaN:

      2021-12-08 10:40:27,152 ERROR  Oracle|transporter-repl1-iusxhg--1|streaming  Failed to properly convert data value for 'ORCLPDB1.DEBEZIUM.TEST_TABLE.COL3' of type BINARY_DOUBLE for row [7, Nan, Nan]:   [io.debezium.relational.TableSchemaBuilder]
      java.lang.NumberFormatException: For input string: "Nan"
          at java.base/jdk.internal.math.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:2054)
          at java.base/jdk.internal.math.FloatingDecimal.parseDouble(FloatingDecimal.java:110)
          at java.base/java.lang.Double.parseDouble(Double.java:543)
          at io.debezium.connector.oracle.OracleValueConverters.convertDouble(OracleValueConverters.java:381)
          at io.debezium.connector.oracle.OracleValueConverters.lambda$converter$3(OracleValueConverters.java:201)
          at io.debezium.relational.TableSchemaBuilder.lambda$createValueGenerator$5(TableSchemaBuilder.java:264)
          at io.debezium.relational.TableSchema.valueFromColumnData(TableSchema.java:141)
          at io.debezium.relational.RelationalChangeRecordEmitter.emitCreateRecord(RelationalChangeRecordEmitter.java:70)
          at io.debezium.relational.RelationalChangeRecordEmitter.emitChangeRecords(RelationalChangeRecordEmitter.java:46)
          at io.debezium.pipeline.EventDispatcher.dispatchDataChangeEvent(EventDispatcher.java:218)
          at io.debezium.connector.oracle.logminer.processor.memory.MemoryLogMinerEventProcessor$1.accept(MemoryLogMinerEventProcessor.java:279)
          at io.debezium.connector.oracle.logminer.processor.memory.MemoryLogMinerEventProcessor$1.accept(MemoryLogMinerEventProcessor.java:259)
          at io.debezium.connector.oracle.logminer.processor.TransactionCommitConsumer.dispatchChangeEvent(TransactionCommitConsumer.java:143)
          at io.debezium.connector.oracle.logminer.processor.TransactionCommitConsumer.close(TransactionCommitConsumer.java:99)
          at io.debezium.connector.oracle.logminer.processor.memory.MemoryLogMinerEventProcessor.handleCommit(MemoryLogMinerEventProcessor.java:302)
          at io.debezium.connector.oracle.logminer.processor.AbstractLogMinerEventProcessor.processRow(AbstractLogMinerEventProcessor.java:199)
          at io.debezium.connector.oracle.logminer.processor.AbstractLogMinerEventProcessor.processResults(AbstractLogMinerEventProcessor.java:177)
          at io.debezium.connector.oracle.logminer.processor.memory.MemoryLogMinerEventProcessor.process(MemoryLogMinerEventProcessor.java:134)
          at io.debezium.connector.oracle.logminer.LogMinerStreamingChangeEventSource.execute(LogMinerStreamingChangeEventSource.java:167)
          at io.debezium.connector.oracle.logminer.LogMinerStreamingChangeEventSource.execute(LogMinerStreamingChangeEventSource.java:58)
          at io.debezium.pipeline.ChangeEventSourceCoordinator.streamEvents(ChangeEventSourceCoordinator.java:166)
          at io.debezium.pipeline.ChangeEventSourceCoordinator.lambda$start$0(ChangeEventSourceCoordinator.java:127)
          at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
          at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
          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)

      I have only tested this with Logminer, I'm not sure what would happen with XStream. No problems occur during a snapshot.

       

      Attachments

        Activity

          People

            Unassigned Unassigned
            robin-vanderstraeten-klarrio Robin Vanderstraeten (Inactive)
            Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

            Dates

              Created:
              Updated: