tchivs created FLINK-38221:
------------------------------

             Summary: PostgreSQL CDC fails to capture data from partition 
tables when configured with parent table names
                 Key: FLINK-38221
                 URL: https://issues.apache.org/jira/browse/FLINK-38221
             Project: Flink
          Issue Type: Bug
          Components: Flink CDC
    Affects Versions: cdc-3.4.0
         Environment: PostgreSQL CDC with partitioned tables
            Reporter: tchivs
             Fix For: cdc-3.5.0


h2. Problem Description
h3. Critical Data Loss Bug

PostgreSQL CDC connector completely fails to capture any changelog data when 
users configure partition tables using standard parent table names. This is a 
*critical data loss bug* affecting production deployments.
h3. Reproduction Steps
 # *Create a partitioned table in PostgreSQL:*
{{CREATE TABLE aia_t_icc_jjdb (
    id BIGINT,
    name VARCHAR(255),
    partition_date DATE NOT NULL,
    PRIMARY KEY (id, partition_date)
) PARTITION BY RANGE (partition_date);

CREATE TABLE aia_t_icc_jjdb_202401 PARTITION OF aia_t_icc_jjdb
    FOR VALUES FROM ('2024-01-01') TO ('2024-02-01');}}
 # *Configure Flink CDC with parent table name:*
{{source:
  type: postgres-cdc
  hostname: localhost
  port: 5432
  username: postgres
  password: password
  database-name: testdb
  schema-name: public
  table-name: aia_t_icc_jjdb  # Parent partition table}}
 # *Insert data into the partition table:*
 {{INSERT INTO aia_t_icc_jjdb (id, name, partition_date) 
VALUES (1, 'test', '2024-01-15');}}

h3. Expected Behavior
 * CDC should discover the parent partition table {{aia_t_icc_jjdb}}
 * CDC should capture INSERT/UPDATE/DELETE operations on the partition table
 * Changelog events should be emitted for data changes

h3. Actual Behavior
 * *NO CDC data is captured* - complete data loss
 * Parent partition table {{aia_t_icc_jjdb}} is filtered out during table 
discovery
 * CDC connector runs without errors but produces zero changelog events
 * Users receive no indication that the table configuration is ineffective

h2. Root Cause Analysis
h3. Technical Root Cause

The issue is in {{TableDiscoveryUtils.java}} line 55-56:

{{Set<TableId> allTableIds = jdbc.readTableNames(
    database, null, null, new String[] \{"TABLE"});  // Missing "PARTITIONED 
TABLE"}}
h3. PostgreSQL Partition Table Structure
 * {*}Parent partition tables{*}: {{pg_class.relkind = 'p'}} (partitioned table)
 * {*}Child partition tables{*}: {{pg_class.relkind = 'r'}} (regular table)
 * {*}Table discovery query{*}: Only looks for {{tabletype = 'TABLE'}}
 * {*}Problem{*}: Parent partitions need {{tabletype = 'PARTITIONED TABLE'}} to 
be discovered

h3. Discovery Failure Chain
 # User configures {{table-name: "aia_t_icc_jjdb"}} (parent partition)
 # TableDiscoveryUtils queries {{pg_tables WHERE tabletype IN ('TABLE')}}
 # Parent partition table not found (it's type 'PARTITIONED TABLE')
 # Table filter excludes the configured table name
 # Result: Zero CDC data captured

h2. Current User Workarounds (and their problems)
h3. Workaround 1: Regex Pattern Matching

{{table-name: "aia_t_icc_jjdb_\\d\{6}"  # Match child partitions}}

*Problems:*
 * Extremely slow initialization (loads schema for every child partition)
 * Complex configuration requiring internal partition naming knowledge
 * Error-prone and maintenance-intensive
 * Breaks when partition naming changes

h3. Workaround 2: List All Child Partitions

{{table-name: "aia_t_icc_jjdb_202401,aia_t_icc_jjdb_202402,..."}}

*Problems:*
 * Manual maintenance required for new partitions
 * Configuration becomes unmanageable with many partitions
 * Still slower than parent table approach

h2. Impact Assessment
h3. Severity: Critical
 * {*}Data Loss{*}: Complete CDC data loss for partition tables
 * {*}Silent Failure{*}: No obvious error messages, difficult to diagnose
 * {*}Production Impact{*}: Affects real-time data pipelines using partition 
tables
 * {*}User Experience{*}: Forces complex, error-prone configurations

h3. Affected Scenarios
 * Any PostgreSQL CDC deployment using partitioned tables
 * Range partitioned tables (most common use case)
 * List partitioned tables
 * Hash partitioned tables
 * Multi-level partition hierarchies

h3. Business Impact
 * Real-time analytics miss partition table data changes
 * Data synchronization failures in production
 * Increased operational complexity due to workarounds
 * Potential compliance issues due to incomplete data capture

h2. Proposed Solution
h3. Core Fix

Enhance {{TableDiscoveryUtils.java}} to include partitioned tables:

{{Set<TableId> allTableIds = jdbc.readTableNames(
    database, null, null, new String[] \{"TABLE", "PARTITIONED TABLE"});}}



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to