apache/seatunnel · error · DebeziumException

No table filters found for filtered publication %s

Error message

No table filters found for filtered publication %s

What it means

createOrUpdatePublicationModeFilterted builds the table list for a FILTERED publication from determineCapturedTables(); if the resulting comma-joined, double-quoted table list is empty it throws this DebeziumException, because a filtered publication with no tables is meaningless and would silently capture nothing.

Source

Thrown at seatunnel-connectors-v2/connector-cdc/connector-cdc-opengauss/src/main/java/io/debezium/connector/postgresql/connection/PostgresReplicationConnection.java:258

                conn.commit();
                conn.setAutoCommit(true);
            } catch (SQLException e) {
                throw new JdbcConnectionException(e);
            }
        }
    }

    private void createOrUpdatePublicationModeFilterted(
            String tableFilterString, PostgresConnection conn, boolean isUpdate) {
        String createOrUpdatePublicationStmt;
        try {
            Set<TableId> tablesToCapture = determineCapturedTables();
            tableFilterString =
                    tablesToCapture.stream()
                            .map(TableId::toDoubleQuotedString)
                            .collect(Collectors.joining(", "));
            if (tableFilterString.isEmpty()) {
                throw new DebeziumException(
                        String.format(
                                "No table filters found for filtered publication %s",
                                publicationName));
            }
            createOrUpdatePublicationStmt =
                    isUpdate
                            ? String.format(
                                    "ALTER PUBLICATION %s SET TABLE %s;",
                                    publicationName, tableFilterString)
                            : String.format(
                                    "CREATE PUBLICATION %s FOR TABLE %s;",
                                    publicationName, tableFilterString);
            LOGGER.info(
                    isUpdate
                            ? "Updating Publication with statement '{}'"
                            : "Creating Publication with statement '{}'",
                    createOrUpdatePublicationStmt);
            conn.execute(createOrUpdatePublicationStmt);

View on GitHub (pinned to cf67b549a7)

Solutions

  1. Fix table include/exclude lists so they match actual tables: SELECT table_schema, table_name FROM information_schema.tables WHERE table_schema NOT IN ('pg_catalog','information_schema');
  2. Remember Postgres lowercases unquoted identifiers — quote names in regex/filters or create tables without mixed case.
  3. Point the connector at the correct database containing the tables to capture.
  4. If you truly want all tables, switch publication.autocreate.mode to all_tables.

Example fix

// before: filter matches nothing due to case
"table.include.list" = "^Public\\.Orders$"
// after: lowercase schema/table as stored in Postgres
"table.include.list" = "^public\\.orders$"
Defensive patterns

Strategy: validation

Validate before calling

SELECT table_schema || '.' || table_name FROM information_schema.tables WHERE table_schema || '.' || table_name ~ '^public\\.orders$'; -- include-list regex must match at least one row

Try / catch

try {
    connection.initPublication();
} catch (DebeziumException e) {
    // empty filtered table set: fix table.include.list or use all_tables mode
}

Prevention

When it happens

Trigger: publication.autocreate.mode=filtered is used and determineCapturedTables() returns an empty set — the connector's table/include/exclude filters match zero tables in the database, so the CREATE/ALTER PUBLICATION statement would have no tables.

Common situations: schema/table include-list typos or case-sensitivity mistakes (Postgres folds unquoted names to lowercase); tables exist in a different schema than configured; wrong database in the JDBC URL so the filtered tables are simply not present.

Understand the failure class

Background: "must not be empty", "cannot be empty" — required-field validation errors across open-source libraries — this error's family across 41 libraries.

Related errors


AI-assisted analysis of apache/seatunnel@cf67b549a7 (2026-09-10). Data as JSON: /api/errors/ab1c7025137a2d22. Report an issue: GitHub.