{"record":{"id":"5f233c3407783ad9","repo":"apache/seatunnel","slug":"unsupported-jdbc-type","errorCode":null,"errorMessage":"Unsupported JDBC type: ","messagePattern":"Unsupported JDBC type: ","errorType":"exception","errorClass":"UnsupportedOperationException","httpStatus":null,"severity":"error","filePath":"seatunnel-connectors-v2/connector-jdbc/src/main/java/org/apache/seatunnel/connectors/seatunnel/jdbc/catalog/utils/JdbcColumnConverter.java","lineNumber":236,"sourceCode":"                seaTunnelType = LocalTimeType.LOCAL_DATE_TYPE;\n                break;\n            case TIME:\n            case TIME_WITH_TIMEZONE:\n                seaTunnelType = LocalTimeType.LOCAL_TIME_TYPE;\n                break;\n            case TIMESTAMP:\n            case TIMESTAMP_WITH_TIMEZONE:\n                seaTunnelType = LocalTimeType.LOCAL_DATE_TIME_TYPE;\n                break;\n            case BINARY:\n            case VARBINARY:\n            case LONGVARBINARY:\n            case BLOB:\n                seaTunnelType = PrimitiveByteArrayType.INSTANCE;\n                bitLength = precision * 8;\n                break;\n            default:\n                throw new UnsupportedOperationException(\"Unsupported JDBC type: \" + jdbcType);\n        }\n\n        return PhysicalColumn.of(\n                columnName,\n                seaTunnelType,\n                columnLength,\n                isNullable != ResultSetMetaData.columnNoNulls,\n                null,\n                comment,\n                nativeType,\n                false,\n                false,\n                bitLength,\n                Collections.emptyMap(),\n                longColumnLength);\n    }\n}\n","sourceCodeStart":218,"sourceCodeEnd":254,"githubUrl":"https://github.com/apache/seatunnel/blob/cf67b549a7a6c35fa0beb12d83c62892427ea919/seatunnel-connectors-v2/connector-jdbc/src/main/java/org/apache/seatunnel/connectors/seatunnel/jdbc/catalog/utils/JdbcColumnConverter.java#L218-L254","documentation":"JdbcColumnConverter.convert() maps JDBC java.sql.Types values to SeaTunnel PhysicalColumn types; when the result-set metadata reports a JDBC type not covered by the switch (e.g. vendor-specific or rarely used types like REF_CURSOR, SQLXML, or driver-specific mappings), it throws UnsupportedOperationException 'Unsupported JDBC type: <type>'. This means the connector cannot translate that column's type into a SeaTunnel type.","triggerScenarios":"Reading a table whose column metadata contains an unmapped JDBC type integer — e.g. custom driver type codes from less-common databases, TIMESTAMP_WITH_TIMEZONE variants on older drivers, or NULL/OTHER types — during catalog schema reads or source type conversion.","commonSituations":"Connecting to a database whose driver maps proprietary types to unusual java.sql.Types codes; using an outdated JDBC driver that reports different type codes; tables with computed/exotic column types (XML, arrays, UDTs) that the converter has no case for.","solutions":["Identify the offending type number from the message and map it to java.sql.Types to see what the column is.","Change the column type in the source table to a supported equivalent (e.g. convert XML/UDT to VARCHAR/CLOB).","Upgrade connector-jdbc — newer versions add more type mappings in JdbcColumnConverter.","If you control the code, add a case for the type in the switch mapping it to the closest SeaTunnel type (e.g. VARCHAR for SQLXML)."],"exampleFix":"// before\ncolumns: [ payload OTHER ]  // jdbcType OTHER -> UnsupportedOperationException\n// after\ncase OTHER:\n    seaTunnelType = StringType.STRING; // or cast the column to VARCHAR in the source\n    break;","handlingStrategy":"type-guard","validationCode":"// java\nResultSetMetaData md = rs.getMetaData();\nfor (int i = 1; i <= md.getColumnCount(); i++) {\n    int t = md.getColumnType(i);\n    if (t == Types.OTHER || t == Types.NULL || t == Types.REF_CURSOR) {\n        throw new IllegalArgumentException(\"unsupported JDBC type \" + t + \" on column \" + md.getColumnName(i));\n    }\n}","typeGuard":"// java\nstatic boolean isSupportedJdbcType(int jdbcType) {\n    switch (jdbcType) {\n        case Types.CHAR: case Types.VARCHAR: case Types.LONGVARCHAR:\n        case Types.NUMERIC: case Types.DECIMAL: case Types.TINYINT:\n        case Types.SMALLINT: case Types.INTEGER: case Types.BIGINT:\n        case Types.REAL: case Types.FLOAT: case Types.DOUBLE:\n        case Types.DATE: case Types.TIME: case Types.TIMESTAMP:\n        case Types.BINARY: case Types.VARBINARY: case Types.LONGVARBINARY:\n        case Types.BLOB:\n            return true;\n        default:\n            return false;\n    }\n}","tryCatchPattern":"// java\ntry {\n    PhysicalColumn col = converter.convert(metaData, i);\n} catch (UnsupportedOperationException e) {\n    LOG.warn(\"falling back to STRING for: {}\", e.getMessage());\n    col = PhysicalColumn.of(name, StringType.STRING, 0, true, null, null, null);\n}","preventionTips":["Cast unsupported source column types (XML, UDT, arrays) to VARCHAR/CLOB in queries.","Keep the JDBC driver and connector-jdbc versions aligned so type codes map as expected.","Pre-audit table schemas for exotic types before catalog reads."],"tags":["jdbc","type-mapping","unsupported-operation"],"backgroundTag":"unsupported-dtype","analyzedSha":"cf67b549a7a6c35fa0beb12d83c62892427ea919","analyzedAt":"2026-09-10T21:44:55.265Z","contentChangedAt":"2026-09-10T21:44:55.265Z","schemaVersion":2},"datasetVersion":"2026-09-14T11:17:12.474Z"}