{"record":{"id":"c2cc97f5549ff0a0","repo":"apache/seatunnel","slug":"unsupported-data-type-c2cc97","errorCode":"UNSUPPORTED_DATA_TYPE","errorMessage":"Unexpected value: ","messagePattern":"Unexpected value: ","errorType":"error_code","errorClass":"JdbcConnectorException","httpStatus":null,"severity":"error","filePath":"seatunnel-connectors-v2/connector-jdbc/src/main/java/org/apache/seatunnel/connectors/seatunnel/jdbc/internal/converter/AbstractJdbcRowConverter.java","lineNumber":353,"sourceCode":"                Object[] array = (Object[]) value;\n                if (array == null) {\n                    statement.setNull(statementIndex, java.sql.Types.ARRAY);\n                    break;\n                }\n                if (SqlType.TINYINT.equals(elementType.getSqlType())) {\n                    Short[] shortArray = new Short[array.length];\n                    for (int i = 0; i < array.length; i++) {\n                        shortArray[i] = Short.valueOf(array[i].toString());\n                    }\n                    statement.setObject(statementIndex, shortArray);\n                } else {\n                    statement.setObject(statementIndex, array);\n                }\n                break;\n            case MAP:\n            case ROW:\n            default:\n                throw new JdbcConnectorException(\n                        CommonErrorCodeDeprecated.UNSUPPORTED_DATA_TYPE,\n                        \"Unexpected value: \" + seaTunnelDataType);\n        }\n    }\n\n    protected void writeTime(PreparedStatement statement, int index, LocalTime time)\n            throws SQLException {\n        statement.setTime(index, java.sql.Time.valueOf(time));\n    }\n}\n","sourceCodeStart":335,"sourceCodeEnd":364,"githubUrl":"https://github.com/apache/seatunnel/blob/cf67b549a7a6c35fa0beb12d83c62892427ea919/seatunnel-connectors-v2/connector-jdbc/src/main/java/org/apache/seatunnel/connectors/seatunnel/jdbc/internal/converter/AbstractJdbcRowConverter.java#L335-L364","documentation":"setValueToStatementByDataType only implements JDBC parameter binding for scalar SeaTunnel types; MAP, ROW types (and any default/unknown case) hit the switch default and throw UNSUPPORTED_DATA_TYPE with 'Unexpected value: <type>'. The JDBC sink cannot flatten nested structures into a single SQL column via this converter path.","triggerScenarios":"toExternal() is called on a row whose schema contains a MAP or ROW field (or an otherwise unmapped data type), and the converter attempts to set that field on the PreparedStatement.","commonSituations":"Upstream source (e.g. JSON, MongoDB, Kafka) emits nested objects/arrays that flow unmodified into a JDBC sink; schema not flattened before writing to relational storage; missing dialect support for array/struct types for your database.","solutions":["Flatten MAP/ROW fields into scalar columns before the JDBC sink (use a Transform to extract fields)","If supported for your dialect, enable dialect-specific nested-type handling or upgrade SeaTunnel for broader type support","Change the sink table/schema so nested data is serialized to a JSON string column first","Check AbstractJdbcRowConverter's supported cases and pick a sink/converter that supports your type"],"exampleFix":"// before\nfield { name = \"addr\" type = ROW { city STRING zip STRING } }   # goes to JDBC sink\n// after\nfields: addr_city STRING, addr_zip STRING  (flatten with a Transform before sink)","handlingStrategy":"validation","validationCode":"for (SeaTunnelDataType t : rowType.getFieldTypes()) {\n    if (t instanceof MapType || t instanceof RowType || t instanceof ArrayType) {\n        throw new IllegalArgumentException(\"JDBC sink cannot bind nested type: \" + t);\n    }\n}","typeGuard":"boolean isFlatScalar(SeaTunnelDataType<?> t) {\n    return !(t instanceof MapType) && !(t instanceof RowType) && !(t instanceof ArrayType);\n}","tryCatchPattern":"try {\n    converter.toExternal(row, statement);\n} catch (JdbcConnectorException e) {\n    if (e.getErrorCode() == CommonErrorCodeDeprecated.UNSUPPORTED_DATA_TYPE) {\n        LOG.error(\"Flatten nested field before JDBC sink; offending type: {}\", e.getMessage());\n    }\n    throw e;\n}","preventionTips":["Flatten MAP/ROW/ARRAY fields with a Transform before relational sinks","Serialize nested data to JSON strings if a single column is required","Review the sink schema for nested types during job design review","Check dialect-specific nested-type support before enabling it"],"tags":["jdbc","unsupported-type","nested-data","sink"],"backgroundTag":"unsupported-operation","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"}