apache/seatunnel · error · SeaTunnelRuntimeException

COMMON-17

COMMON-17

Error message

'${identifier}' unsupported convert type '${dataType}' of '${field}' to SeaTunnel data type.

What it means

SqlServerTypeConverter.convert() maps a SQL Server column type string to a SeaTunnel data type when reading. Type strings with no case in the switch (unmapped SQL Server types) hit default and throw CommonError.convertToSeaTunnelTypeError. The source cannot represent that column in the SeaTunnel type system.

Source

Thrown at seatunnel-connectors-v2/connector-jdbc/src/main/java/org/apache/seatunnel/connectors/seatunnel/jdbc/internal/dialect/sqlserver/SqlServerTypeConverter.java:304

            case SQLSERVER_DATETIME2:
                builder.sourceType(
                        String.format("%s(%s)", SQLSERVER_DATETIME2, typeDefine.getScale()));
                builder.dataType(LocalTimeType.LOCAL_DATE_TIME_TYPE);
                builder.scale(typeDefine.getScale());
                break;
            case SQLSERVER_DATETIMEOFFSET:
                // DATETIMEOFFSET is LTZ (includes timezone offset)
                builder.sourceType(
                        String.format("%s(%s)", SQLSERVER_DATETIMEOFFSET, typeDefine.getScale()));
                builder.dataType(LocalTimeType.OFFSET_DATE_TIME_TYPE);
                builder.scale(typeDefine.getScale());
                break;
            case SQLSERVER_SMALLDATETIME:
                builder.sourceType(SQLSERVER_SMALLDATETIME);
                builder.dataType(LocalTimeType.LOCAL_DATE_TIME_TYPE);
                break;
            default:
                throw CommonError.convertToSeaTunnelTypeError(
                        DatabaseIdentifier.SQLSERVER, sqlServerType, typeDefine.getName());
        }
        return builder.build();
    }

    @Override
    public BasicTypeDefine reconvert(Column column) {
        BasicTypeDefine.BasicTypeDefineBuilder builder =
                BasicTypeDefine.builder()
                        .name(column.getName())
                        .nullable(column.isNullable())
                        .comment(column.getComment())
                        .defaultValue(column.getDefaultValue());
        switch (column.getDataType().getSqlType()) {
            case BOOLEAN:
                builder.columnType(SQLSERVER_BIT);
                builder.dataType(SQLSERVER_BIT);
                break;

View on GitHub (pinned to cf67b549a7)

Solutions

  1. Cast the column in the source query, e.g. SELECT CAST(geo AS NVARCHAR(MAX)) AS geo FROM t.
  2. Create a view excluding/casting unsupported columns and read from it.
  3. Select only supported columns in the connector's query.
  4. Add a converter case for the type (e.g. map GEOGRAPHY to STRING) if appropriate, and contribute upstream.

Example fix

// before: SELECT * FROM places (has GEOGRAPHY col)
// after
SELECT id, CONVERT(NVARCHAR(MAX), geo) AS geo_str FROM places
Defensive patterns

Strategy: validation

Validate before calling

-- Find unsupported SQL Server columns before reading
SELECT COLUMN_NAME, DATA_TYPE
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'MyTable'
  AND DATA_TYPE IN ('hierarchyid','geography','geometry','sql_variant','sysname','table','timestamp');

Try / catch

try {
    sourceReader.read();
} catch (SeaTunnelRuntimeException e) {
    if (e.getMessage().contains("unsupported convert type")) {
        // rewrite query with CONVERT(NVARCHAR(MAX), col) for the named column
    } else { throw e; }
}

Prevention

When it happens

Trigger: Reading a SQL Server table containing a column type not handled by the converter, e.g. HIERARCHYID, GEOGRAPHY, GEOMETRY, SQL_VARIANT, SYSNAME, or TABLE type in the metadata.

Common situations: Legacy SQL Server schemas using spatial or hierarchyid columns; sql_variant columns populated via generic CDC or catalog metadata reads; type names changed across SQL Server versions.

Related errors


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