{"record":{"id":"c8e1c3692eee2881","repo":"OtterMind/Chat2DB","slug":"missing-jdbc-type-for-kylin-column-name","errorCode":null,"errorMessage":"Missing JDBC type for Kylin column: {name}","messagePattern":"Missing JDBC type for Kylin column: (.+?)","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"chat2db-community-server/chat2db-community-plugins/chat2db-community-kylin/src/main/java/ai/chat2db/plugin/kylin/KylinMetaData.java","lineNumber":82,"sourceCode":"        StringBuilder definition = new StringBuilder(quoteIdentifier(column.getName()))\n                .append(' ')\n                .append(dataType);\n\n        if (Objects.equals(column.getNullable(), 0)) {\n            definition.append(\" NOT NULL\");\n        }\n        if (StringUtils.isNotEmpty(column.getComment())) {\n            definition.append(\" COMMENT '\")\n                    .append(getSQLIdentifierProcessor().escapeString(column.getComment()))\n                    .append('\\'');\n        }\n        return definition.toString();\n    }\n\n    private String renderColumnType(TableColumn column) {\n        Integer jdbcType = column.getDataType();\n        if (jdbcType == null) {\n            throw new IllegalArgumentException(\"Missing JDBC type for Kylin column: \" + column.getName());\n        }\n\n        String typeName = switch (jdbcType) {\n            case Types.BIT, Types.BOOLEAN -> \"BOOLEAN\";\n            case Types.TINYINT -> \"TINYINT\";\n            case Types.SMALLINT -> \"SMALLINT\";\n            case Types.INTEGER -> \"INTEGER\";\n            case Types.BIGINT -> \"BIGINT\";\n            case Types.FLOAT -> \"FLOAT\";\n            case Types.REAL -> \"REAL\";\n            case Types.DOUBLE -> \"DOUBLE\";\n            case Types.NUMERIC, Types.DECIMAL -> \"DECIMAL\";\n            case Types.CHAR, Types.NCHAR -> \"CHAR\";\n            case Types.VARCHAR, Types.LONGVARCHAR, Types.NVARCHAR, Types.LONGNVARCHAR -> \"VARCHAR\";\n            case Types.DATE -> \"DATE\";\n            case Types.TIME -> \"TIME\";\n            case Types.TIMESTAMP -> \"TIMESTAMP\";\n            case Types.JAVA_OBJECT -> \"ANY\";","sourceCodeStart":64,"sourceCodeEnd":100,"githubUrl":"https://github.com/OtterMind/Chat2DB/blob/5ee1e990e73fbcae1969dc554be254fedb3ab888/chat2db-community-server/chat2db-community-plugins/chat2db-community-kylin/src/main/java/ai/chat2db/plugin/kylin/KylinMetaData.java#L64-L100","documentation":"Thrown by KylinMetaData.renderColumnType when TableColumn.getDataType() (the JDBC java.sql.Types code) is null. Without a JDBC type code the type cannot be mapped to a Kylin column type, so building the CREATE TABLE column definition fails fast.","triggerScenarios":"Generating Kylin table DDL (KylinMetaData.tableDDL -> buildColumnDefinition -> renderColumnType) for a column whose dataType was not populated by the JDBC metadata reader.","commonSituations":"A Kylin driver/JDBC metadata row that did not return a DATA_TYPE value; a manually constructed TableColumn used for DDL without setting dataType; a stale column model after a schema change.","solutions":["Ensure every TableColumn has a non-null dataType (java.sql.Types integer) before generating Kylin DDL.","Filter out columns with null dataType and log them, rather than aborting the whole table.","If the driver omits DATA_TYPE, populate it from TYPE_NAME at the metadata-read layer."],"exampleFix":"// before\nTableColumn c = new TableColumn();\nc.setName(\"c1\"); // dataType left null\ncolumns.add(c);\nkylinMetaData.tableDDL(...);\n\n// after\nTableColumn c = new TableColumn();\nc.setName(\"c1\");\nc.setDataType(Types.VARCHAR); // required java.sql.Types code\ncolumns.add(c);","handlingStrategy":"validation","validationCode":"static boolean hasJdbcType(TableColumn c) {\n    return c != null && c.getDataType() != null;\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Populate TableColumn.dataType (java.sql.Types) for every column before Kylin DDL generation.","Filter out columns with null dataType and log them rather than aborting the whole table.","If the driver omits DATA_TYPE, infer it from TYPE_NAME at the metadata-read layer."],"tags":["kylin","metadata","ddl","jdbc","validation"],"backgroundTag":null,"analyzedSha":"5ee1e990e73fbcae1969dc554be254fedb3ab888","analyzedAt":"2026-08-14T07:05:03.077Z","schemaVersion":2},"datasetVersion":"2026-08-14T10:17:34.591Z"}