apache/seatunnel · error · IllegalArgumentException
Unsupported Paimon data type
Error message
Unsupported Paimon data type :${dataType.getTypeRoot()} What it means
convertValueByPaimonDataType converts literal values to the target column's Paimon data type via a switch over LogicalTypeRoot; types not covered (e.g. ARRAY, MAP, ROW, or scalars missing from the switch) hit the default branch and throw. Only scalar types are supported for predicate literals.
Solutions
- Remove predicates on complex-type (ARRAY/MAP/ROW) columns from the WHERE clause; filter after read.
- Verify the column's actual type in the Paimon schema and ensure the predicate targets a scalar column.
- Add a case to the type switch in convertValueByPaimonDataType if the scalar type should be supported.
Example fix
// before: WHERE tags = 'a,b' (tags is ARRAY<STRING>) | // after: remove predicate; filter tags after read
Defensive patterns
Strategy: validation
Validate before calling
Set<String> OK = Set.of("CHAR","VARCHAR","BOOLEAN","TINYINT","SMALLINT","INT","BIGINT","FLOAT","DOUBLE","DATE","TIME_WITHOUT_TIME_ZONE","TIMESTAMP_WITHOUT_TIME_ZONE","TIMESTAMP_WITH_LOCAL_TIME_ZONE"); LogicalType t = rowType.getTypeAt(rowType.getFieldIndex(col)); boolean convertible = OK.contains(t.getTypeRoot().toString()); Try / catch
try { pred = converter.convertSqlWhereToPaimonPredicate(where, rowType); } catch (IllegalArgumentException e) { if (e.getMessage().contains("Unsupported Paimon data type")) { /* remove predicate for that column */ } throw e; } Prevention
- Restrict pushdown predicates to scalar-typed columns.
- Check the rowType before generating predicates on any column.
- Update the type switch when new types are introduced to the schema.
When it happens
Trigger: A comparison or IN literal is converted for a column whose rowType entry has an unsupported LogicalTypeRoot (complex types or a newly added type not in the switch).
Common situations: Pushdown predicates against complex-type columns; schema evolution introducing a type the converter's switch was never updated for.
Related errors
AI-assisted analysis of apache/seatunnel@cf67b549a7 (2026-09-10).
Data as JSON: /api/errors/71157313780a2c83.
Report an issue: GitHub.
Appendix: source
Thrown at seatunnel-connectors-v2/connector-paimon/src/main/java/org/apache/seatunnel/connectors/seatunnel/paimon/source/converter/SqlToPaimonPredicateConverter.java:399
return Short.parseShort(strValue);
case INTEGER:
return Integer.parseInt(strValue);
case BIGINT:
return Long.parseLong(strValue);
case FLOAT:
return Float.parseFloat(strValue);
case DOUBLE:
return Double.parseDouble(strValue);
case DATE:
return DateTimeUtils.toInternal(DateUtils.parse(strValue));
case TIME_WITHOUT_TIME_ZONE:
return DateTimeUtils.toInternal(TimeUtils.parse(strValue));
case TIMESTAMP_WITHOUT_TIME_ZONE:
case TIMESTAMP_WITH_LOCAL_TIME_ZONE:
return Timestamp.fromLocalDateTime(
org.apache.seatunnel.common.utils.DateTimeUtils.parse(strValue));
default:
throw new IllegalArgumentException(
"Unsupported Paimon data type :" + dataType.getTypeRoot());
}
}
throw new IllegalArgumentException(
String.format("The column named [%s] is not exists", columnName));
}
private static Object getJSQLParserDataTypeValue(Expression expression) {
if (expression instanceof LongValue) {
return ((LongValue) expression).getValue();
} else if (expression instanceof StringValue || expression instanceof HexValue) {
return BinaryString.fromString(((StringValue) expression).getValue());
} else if (expression instanceof DoubleValue) {
return ((DoubleValue) expression).getValue();
} else if (expression instanceof DateValue) {
return ((DateValue) expression).getValue();
} else if (expression instanceof TimeValue) {
return ((TimeValue) expression).getValue();View on GitHub (pinned to cf67b549a7)