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

  1. Remove predicates on complex-type (ARRAY/MAP/ROW) columns from the WHERE clause; filter after read.
  2. Verify the column's actual type in the Paimon schema and ensure the predicate targets a scalar column.
  3. 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

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)