tchivs created FLINK-38196: ------------------------------ Summary: IndexOutOfBoundsException when processing PostgreSQL tables with numeric(0) fields in Flink CDC Key: FLINK-38196 URL: https://issues.apache.org/jira/browse/FLINK-38196 Project: Flink Issue Type: Bug Components: Flink CDC Affects Versions: cdc-3.4.0 Environment: - **Database**: PostgreSQL with tables containing `numeric(0)` columns - **Connector**: PostgreSQL CDC Connector - **Configuration**: Any `debezium.decimal.handling.mode` setting Reporter: tchivs
### Problem Statement Flink CDC fails with `IndexOutOfBoundsException` when processing PostgreSQL tables containing `numeric(0)` fields, particularly when these fields have NULL values. This causes complete pipeline failure during binary decimal data deserialization. ### Error Details ``` Caused by: java.lang.IndexOutOfBoundsException: pos: -2130706416, length: 48, index: -2130706432, offset: 0 at org.apache.flink.core.memory.MemorySegment.get(MemorySegment.java:467) at org.apache.flink.cdc.common.data.binary.BinarySegmentUtils.copyToBytes(BinarySegmentUtils.java:131) at org.apache.flink.cdc.common.data.binary.BinarySegmentUtils.readDecimalData(BinarySegmentUtils.java:1003) at org.apache.flink.cdc.common.data.binary.BinaryRecordData.getDecimal(BinaryRecordData.java:163) at org.apache.flink.cdc.common.data.RecordData.lambda$createFieldGetter$7b8ca8ef$1(RecordData.java:195) ``` ### Steps to Reproduce 1. Create a PostgreSQL table with `numeric(0)` columns: ```sql CREATE TABLE test_table ( id SERIAL PRIMARY KEY, amount numeric(0), -- This causes the issue name VARCHAR(100) ); ``` 2. Insert data including NULL values: ```sql INSERT INTO test_table (amount, name) VALUES (NULL, 'test'); INSERT INTO test_table (amount, name) VALUES (123, 'test2'); ``` 3. Configure Flink CDC pipeline: ```yaml source: type: postgres hostname: localhost port: 5432 username: postgres password: password database-name: testdb schema-name: public table-name: test_table debezium.decimal.handling.mode: string ``` 4. Run the pipeline - it will crash with IndexOutOfBoundsException ### Expected Result - Pipeline should successfully process all rows including those with NULL `numeric(0)` values - No exceptions should be thrown during data processing ### Actual Result - Pipeline crashes with `IndexOutOfBoundsException` - Processing stops completely, preventing any data from being synchronized ### Root Cause Analysis 1. **Type Mapping Issue**: PostgreSQL `numeric(0)` fields are incorrectly mapped to `DECIMAL` with maximum precision in `PostgresTypeUtils.java` 2. **Binary Serialization Problem**: High-precision DECIMAL types create complex binary representations that are prone to corruption 3. **Missing Validation**: `BinarySegmentUtils.readDecimalData()` lacks bounds checking for invalid binary data, allowing negative memory offsets ### Impact Assessment - **Severity**: Major - Complete pipeline failure - **Scope**: Affects any PostgreSQL database using `numeric(0)` columns - **Workaround**: None available (users must modify table schema) ### Proposed Solution 1. Map PostgreSQL `numeric(0)` fields to `BIGINT` instead of `DECIMAL` to avoid complex binary serialization 2. Add defensive bounds checking in `BinarySegmentUtils.readDecimalData()` 3. Handle edge cases gracefully by returning zero values instead of crashing ### Additional Context - This issue commonly occurs in PostgreSQL databases where `numeric(0)` is used to store whole numbers without decimal places - The problem is exacerbated when fields are nullable, as NULL values create invalid binary offset calculations - Different `debezium.decimal.handling.mode` settings (string, double, precise) all exhibit the same issue ### Test Case Requirements - Unit tests for `PostgresTypeUtils` covering `numeric(0)` mapping - Unit tests for `BinarySegmentUtils` defensive bounds checking - Integration test with actual PostgreSQL table containing `numeric(0)` fields ### Documentation Impact - Update connector documentation to clarify `numeric(0)` field handling - Add troubleshooting section for IndexOutOfBoundsException issues -- This message was sent by Atlassian Jira (v8.20.10#820010)