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

  1. Check which RowKind is reaching the sink and ensure the source emits standard INSERT/UPDATE_AFTER/DELETE/UPDATE_BEFORE kinds
  2. Configure the sink to support the CDC mode being used (e.g. enable auto-upsert / correct delete handling options)
  3. Filter or convert unsupported RowKinds upstream (e.g. via a transform mapping them to supported kinds)
  4. 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

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


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