OtterMind/Chat2DB · error · IllegalArgumentException

Unsupported Kylin JDBC column type: {jdbcType}

Error message

Unsupported Kylin JDBC column type: {jdbcType}

What it means

Thrown by KylinMetaData.renderColumnType in the default branch of the JDBC type switch when column.dataType is a java.sql.Types code this builder does not map (e.g. BLOB, CLOB, DISTINCT, STRUCT, REF, ROWID, SQLXML). Only a fixed set of Kylin-supported types has a case.

Source

Thrown at chat2db-community-server/chat2db-community-plugins/chat2db-community-kylin/src/main/java/ai/chat2db/plugin/kylin/KylinMetaData.java:102

        String typeName = switch (jdbcType) {
            case Types.BIT, Types.BOOLEAN -> "BOOLEAN";
            case Types.TINYINT -> "TINYINT";
            case Types.SMALLINT -> "SMALLINT";
            case Types.INTEGER -> "INTEGER";
            case Types.BIGINT -> "BIGINT";
            case Types.FLOAT -> "FLOAT";
            case Types.REAL -> "REAL";
            case Types.DOUBLE -> "DOUBLE";
            case Types.NUMERIC, Types.DECIMAL -> "DECIMAL";
            case Types.CHAR, Types.NCHAR -> "CHAR";
            case Types.VARCHAR, Types.LONGVARCHAR, Types.NVARCHAR, Types.LONGNVARCHAR -> "VARCHAR";
            case Types.DATE -> "DATE";
            case Types.TIME -> "TIME";
            case Types.TIMESTAMP -> "TIMESTAMP";
            case Types.JAVA_OBJECT -> "ANY";
            case Types.ARRAY -> renderArrayType(column);
            default -> throw new IllegalArgumentException("Unsupported Kylin JDBC column type: " + jdbcType);
        };

        Integer columnSize = column.getColumnSize();
        if (StringUtils.equalsAny(typeName, "VARCHAR", "CHAR") && columnSize != null && columnSize > 0) {
            return typeName + '(' + columnSize.toString() + ')';
        }
        if ("DECIMAL".equals(typeName) && columnSize != null && columnSize > 0) {
            Integer decimalDigits = column.getDecimalDigits();
            if (decimalDigits != null && decimalDigits >= 0) {
                return typeName + '(' + columnSize.toString() + ',' + decimalDigits + ')';
            }
            return typeName + '(' + columnSize.toString() + ')';
        }
        return typeName;
    }

    private String renderArrayType(TableColumn column) {
        String jdbcTypeName = column.getColumnType();

View on GitHub (pinned to 5ee1e990e7)

Solutions

  1. Use only Kylin-supported JDBC types in the modeled columns.
  2. Map unsupported types to a Kylin-compatible type (e.g. ANY for JAVA_OBJECT) at the metadata-read layer, or drop the column with a warning.
  3. Extend the switch with a new case if a real Kylin type exists for that JDBC code.

Example fix

// before
column.setDataType(Types.BLOB); // no case -> default throws
kylinMetaData.tableDDL(...);

// after
column.setDataType(Types.VARBINARY); // map to a supported Kylin type
// or drop the column from the DDL build
Defensive patterns

Strategy: validation

Validate before calling

static final Set<Integer> KYLIN_SUPPORTED = Set.of(
    Types.BIT, Types.BOOLEAN, Types.TINYINT, Types.SMALLINT, Types.INTEGER, Types.BIGINT,
    Types.FLOAT, Types.REAL, Types.DOUBLE, Types.NUMERIC, Types.DECIMAL,
    Types.CHAR, Types.NCHAR, Types.VARCHAR, Types.LONGVARCHAR, Types.NVARCHAR, Types.LONGNVARCHAR,
    Types.DATE, Types.TIME, Types.TIMESTAMP, Types.JAVA_OBJECT, Types.ARRAY);
static boolean isKylinSupportedType(Integer t) {
    return t != null && KYLIN_SUPPORTED.contains(t);
}

Prevention

When it happens

Trigger: Generating Kylin DDL for a column whose JDBC DATA_TYPE is outside the supported set (BIT/BOOLEAN, TINYINT, SMALLINT, INTEGER, BIGINT, FLOAT, REAL, DOUBLE, NUMERIC/DECIMAL, CHAR/NCHAR, VARCHAR family, DATE, TIME, TIMESTAMP, JAVA_OBJECT, ARRAY).

Common situations: A Kylin column reported by the driver as BLOB/CLOB/STRUCT; a schema using a type Kylin does not support; a driver returning an unusual Types constant.

Related errors


AI-assisted analysis of OtterMind/Chat2DB@5ee1e990e7 (2026-08-14). Data as JSON: /api/errors/81762b2127eb7152. Report an issue: GitHub.