apache/seatunnel · warning

No columns found for catalog '{}', schema '{}', table '{}'.

Error message

No columns found for catalog '{}', schema '{}', table '{}'. Filtered {} rows returned by JDBC driver. The table may not exist or the database requires exact identifier case.

What it means

JdbcColumnConverter.convert() builds SeaTunnel columns from a JDBC ResultSetMetaData-bearing result. Rows may be filtered (e.g., by catalog/schema/type filters); if ALL rows were filtered out and no columns remain, it logs this warning because the driver matched nothing usable — usually meaning the table does not exist as named or the identifiers differ in case.

Source

Thrown at seatunnel-connectors-v2/connector-jdbc/src/main/java/org/apache/seatunnel/connectors/seatunnel/jdbc/catalog/utils/JdbcColumnConverter.java:130

                int columnSize = columnsResultSet.getInt("COLUMN_SIZE");
                int decimalDigits = columnsResultSet.getInt("DECIMAL_DIGITS");
                int nullable = columnsResultSet.getInt("NULLABLE");
                String comment = columnsResultSet.getString("REMARKS");

                Column column =
                        convert(
                                columnName,
                                jdbcType,
                                nativeType,
                                nullable,
                                columnSize,
                                decimalDigits,
                                comment);
                columns.add(column);
            }
        }
        if (columns.isEmpty() && filteredRows > 0) {
            LOG.warn(
                    "No columns found for catalog '{}', schema '{}', table '{}'. Filtered {} rows returned by JDBC driver. "
                            + "The table may not exist or the database requires exact identifier case.",
                    tablePath.getDatabaseName(),
                    tablePath.getSchemaName(),
                    tablePath.getTableName(),
                    filteredRows);
        }
        return columns;
    }

    public static Column convert(ResultSetMetaData metadata, int index) throws SQLException {
        String columnName = metadata.getColumnLabel(index);
        int jdbcType = metadata.getColumnType(index);
        String nativeType = metadata.getColumnTypeName(index);
        int isNullable = metadata.isNullable(index);
        int precision = metadata.getPrecision(index);
        int scale = metadata.getScale(index);
        return convert(columnName, jdbcType, nativeType, isNullable, precision, scale, null);

View on GitHub (pinned to cf67b549a7)

Solutions

  1. Pass exact-case, correctly quoted identifiers in TablePath (database/schema/table).
  2. Verify the table exists: run the equivalent DESC/SHOW or information_schema query manually.
  3. Confirm the catalog/schema fields on the connection and TablePath match the target, not the defaults.
  4. Check the connector version for filter bugs if the driver legitimately returns the columns.

Example fix

// before
TablePath path = TablePath.of("mydb", "MyTable");
// after (exact case for case-sensitive catalog)
TablePath path = TablePath.of("mydb", "public", "mytable");
Defensive patterns

Strategy: validation

Validate before calling

// Verify the table exists with exact identifiers before conversion
try (ResultSet rs = md.getTables(catalog, schemaPattern, tableName, null)) {
    if (!rs.next()) throw new IllegalStateException("Table not found: " + tableName);
}

Try / catch

List<SeaTunnelRowType> cols = converter.convert(...);
if (cols.isEmpty()) {
    throw new IllegalStateException("No columns resolved — check identifier case and TablePath");
}

Prevention

When it happens

Trigger: Calling convert/column on metadata where the driver returned rows but filtering (catalog/schemaNamePattern/tableNamePattern matching, row-type filtering) removed all of them, leaving zero columns.

Common situations: Wrong identifier case with case-sensitive databases (PostgreSQL/Xugu/Dameng quoted identifiers); wrong databaseName/schemaName in TablePath; driver returning row descriptors in unexpected order that the filter drops.

Understand the failure class

Background: EmptyResultError / "no results found": when an API or scraper succeeds but returns zero rows — this error's family across 9 libraries.

Related errors


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