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
- Pass exact-case, correctly quoted identifiers in TablePath (database/schema/table).
- Verify the table exists: run the equivalent DESC/SHOW or information_schema query manually.
- Confirm the catalog/schema fields on the connection and TablePath match the target, not the defaults.
- 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
- Use exact-case identifiers for case-sensitive databases (Postgres, Xugu, etc.)
- Validate TablePath database/schema/table against SHOW/DESC output before running
- Ensure the connection's current catalog/database matches the TablePath
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
- No columns found for catalog '{}', schema '{}', table '{}'.
- Error reading default database charsets: ${e.getMessage()}
- Error reading MySQL variables: ${e.getMessage()}
- SQL_OPERATION_FAILED
- Failed getting table {tablePath.getFullName()}
AI-assisted analysis of apache/seatunnel@cf67b549a7 (2026-09-10).
Data as JSON: /api/errors/1eda057577708d83.
Report an issue: GitHub.