apache/seatunnel · error · JdbcConnectorException
COMMON_UNSUPPORTED_OPERATION
COMMON_UNSUPPORTED_OPERATION
Error message
Unsupported rowKind:
What it means
BufferReducedBatchStatementExecutor.changeFlag() decides whether a row kind triggers a buffer flush/insert (INSERT, UPDATE_AFTER=true) or a delete/before-image (DELETE, UPDATE_BEFORE=false). Any other RowKind (e.g. INSERT absent here or custom kinds) reaches default and throws JdbcConnectorException with UNSUPPORTED_OPERATION.
Source
Thrown at seatunnel-connectors-v2/connector-jdbc/src/main/java/org/apache/seatunnel/connectors/seatunnel/jdbc/internal/executor/BufferReducedBatchStatementExecutor.java:125
}
@Override
public void clearBatch() throws SQLException {
buffer.clear();
upsertExecutor.clearBatch();
deleteExecutor.clearBatch();
}
private boolean changeFlag(RowKind rowKind) {
switch (rowKind) {
case INSERT:
case UPDATE_AFTER:
return true;
case DELETE:
case UPDATE_BEFORE:
return false;
default:
throw new JdbcConnectorException(
CommonErrorCodeDeprecated.UNSUPPORTED_OPERATION,
"Unsupported rowKind: " + rowKind);
}
}
}
View on GitHub (pinned to cf67b549a7)
Solutions
- Check which RowKind is reaching the sink and ensure the source emits standard INSERT/UPDATE_AFTER/DELETE/UPDATE_BEFORE kinds
- Configure the sink to support the CDC mode being used (e.g. enable auto-upsert / correct delete handling options)
- Filter or convert unsupported RowKinds upstream (e.g. via a transform mapping them to supported kinds)
- Upgrade the connector if a newer version handles the missing RowKind
Example fix
// before
default:
throw new JdbcConnectorException(UNSUPPORTED_OPERATION, "Unsupported rowKind: " + rowKind);
// after
case INSERT:
return true; // handled upstream if previously missing
default:
throw new JdbcConnectorException(UNSUPPORTED_OPERATION, "Unsupported rowKind: " + rowKind); Defensive patterns
Strategy: try-catch
Validate before calling
switch (row.getRowKind()) {
case INSERT: case UPDATE_AFTER: case DELETE: case UPDATE_BEFORE: break;
default: throw new IllegalArgumentException("RowKind not supported by JDBC sink: " + row.getRowKind());
} Type guard
boolean isSupportedRowKind(SeaTunnelRow r) {
switch (r.getRowKind()) {
case INSERT: case UPDATE_AFTER: case DELETE: case UPDATE_BEFORE: return true;
default: return false;
}
} Try / catch
try {
executor.addToBatch(row);
} catch (JdbcConnectorException e) {
if (CommonErrorCodeDeprecated.UNSUPPORTED_OPERATION.equals(e.getErrorCode())
&& e.getMessage().startsWith("Unsupported rowKind")) {
log.warn("Skipping row with unsupported kind {}", row.getRowKind());
} else throw e;
} Prevention
- Configure the CDC source to emit only INSERT/UPDATE_BEFORE/UPDATE_AFTER/DELETE
- Map row kinds in a transform before the JDBC sink when using non-standard sources
- Enable the sink's CDC/upsert options matching the source's changelog semantics
When it happens
Trigger: The executor processes a SeaTunnelRow whose RowKind is not one of INSERT/DELETE/UPDATE_BEFORE/UPDATE_AFTER handled by the switch — typically rows arriving as UPDATE kind variants or CDC row kinds the JDBC buffer-reduced executor doesn't recognize in this code path.
Common situations: CDC pipelines with row kinds not expected by the sink config; source connector emitting non-standard RowKind values; enabling buffered JDBC writing with an unsupported CDC event stream.
Understand the failure class
Background: UnsupportedOperationException and "is not supported" errors: when a library deliberately refuses a call — this error's family across 30 libraries.
Related errors
- UNSUPPORTED_ROW_KIND
- COMMON_UNSUPPORTED_OPERATION
- Failed to discover captured tables for enumerator
- Failed to discover remaining tables to capture
- Exactly once is enabled, but not found primary key or unique
AI-assisted analysis of apache/seatunnel@cf67b549a7 (2026-09-10).
Data as JSON: /api/errors/40d0e15343ceb224.
Report an issue: GitHub.