{"record":{"id":"a40928e9902c36e2","repo":"apache/beam","slug":"converting-jdbctype-to-beam-schema-type-is-not-supported","errorCode":null,"errorMessage":"Converting ${jdbcType} to Beam schema type is not supported","messagePattern":"Converting (.+?) to Beam schema type is not supported","errorType":"exception","errorClass":"UnsupportedOperationException","httpStatus":null,"severity":"error","filePath":"sdks/java/io/jdbc/src/main/java/org/apache/beam/sdk/io/jdbc/SchemaUtil.java","lineNumber":172,"sourceCode":"        return beamFieldOfType(LogicalTypes.JDBC_TIMESTAMP_WITH_TIMEZONE_TYPE);\n      case TINYINT:\n        return beamFieldOfType(Schema.FieldType.BYTE);\n      case VARBINARY:\n        return beamLogicalField(VARBINARY.getName(), VariableBytes::of);\n      case VARCHAR:\n        return beamLogicalField(VARCHAR.getName(), VariableString::of);\n      case BLOB:\n        return beamFieldOfType(FieldType.BYTES);\n      case CLOB:\n        return beamFieldOfType(FieldType.STRING);\n      case OTHER:\n      case JAVA_OBJECT:\n        if (UUID.class.getName().equals(className)) {\n          return beamFieldOfType(LogicalTypes.JDBC_UUID_TYPE);\n        }\n        return beamFieldOfType(LogicalTypes.OTHER_AS_STRING_TYPE);\n      default:\n        throw new UnsupportedOperationException(\n            \"Converting \" + jdbcType + \" to Beam schema type is not supported\");\n    }\n  }\n\n  /** Infers the Beam {@link Schema} from {@link ResultSetMetaData}. */\n  public static Schema toBeamSchema(ResultSetMetaData md) throws SQLException {\n    Schema.Builder schemaBuilder = Schema.builder();\n\n    for (int i = 1; i <= md.getColumnCount(); i++) {\n      JDBCType jdbcType = JDBCType.valueOf(md.getColumnType(i));\n      String className = md.getColumnClassName(i);\n      BeamFieldConverter fieldConverter = jdbcTypeToBeamFieldConverter(jdbcType, className);\n      schemaBuilder.addField(fieldConverter.create(i, md));\n    }\n\n    return schemaBuilder.build();\n  }\n","sourceCodeStart":154,"sourceCodeEnd":190,"githubUrl":"https://github.com/apache/beam/blob/12126d8942aaf848030c478b4c6a28c6af861c66/sdks/java/io/jdbc/src/main/java/org/apache/beam/sdk/io/jdbc/SchemaUtil.java#L154-L190","documentation":"SchemaUtil.jdbcTypeToBeamFieldConverter maps JDBC metadata types to Beam Schema.FieldTypes. The default branch throws UnsupportedOperationException for JDBC types the mapper does not handle (unless the Java Object is a UUID, which maps to JDBC_UUID, or falls back to OTHER_AS_STRING).","triggerScenarios":"Calling SchemaUtil.toBeamSchema / fieldConverter on a ResultSetMetaData containing an exotic column type (ARRAY, STRUCT, REF, DATALINK, DISTINCT, or a vendor-specific JAVA_OBJECT that is not UUID) during a JDBC read.","commonSituations":"Reading from tables with vendor-specific column types (e.g. Postgres array/jsonb columns surfacing as ARRAY/JAVA_OBJECT on some drivers); connecting to less common databases with nonstandard type mappings.","solutions":["Cast or exclude the unsupported column from the SELECT list (e.g. SELECT col::text to read as VARCHAR)","Upgrade to a newer Beam version — the type map gains support over time","Read the column with a custom statement and convert it in a DoFn instead of automatic schema inference","If the column is a UUID-like object, ensure the driver reports it as a java.util.UUID class name so it maps to JDBC_UUID"],"exampleFix":"// before\nStatement stmt = conn.createStatement();\nResultSet rs = stmt.executeQuery(\"SELECT id, tags FROM t\"); // tags is an ARRAY column\n// after\nResultSet rs = stmt.executeQuery(\"SELECT id, ARRAY_TO_STRING(tags, ',') AS tags FROM t\");","handlingStrategy":"try-catch","validationCode":"ResultSetMetaData md = rs.getMetaData();\nfor (int i = 1; i <= md.getColumnCount(); i++) {\n  int t = md.getColumnType(i);\n  if (t == java.sql.Types.ARRAY || t == java.sql.Types.STRUCT || t == java.sql.Types.JAVA_OBJECT\n      || t == java.sql.Types.REF || t == java.sql.Types.DATALINK) {\n    throw new IllegalArgumentException(\"Column \" + md.getColumnName(i) + \" type \" + t + \" needs cast/exclusion\");\n  }\n}","typeGuard":null,"tryCatchPattern":"try {\n  Schema s = SchemaUtil.toBeamSchema(metaData);\n} catch (UnsupportedOperationException e) {\n  if (e.getMessage().contains(\"to Beam schema type is not supported\")) {\n    LOG.error(\"Unsupported JDBC column type: {} — cast it in SQL or exclude the column\", e.getMessage());\n  }\n  throw e;\n}","preventionTips":["Cast exotic columns (arrays, json, geometry) to text/varchar in the SELECT list","Check vendor type mappings of your JDBC driver before using readRows with auto schema","Keep Beam version current for broader type support"],"tags":["jdbc","beam","schema","type-conversion"],"backgroundTag":"unsupported-operation","analyzedSha":"12126d8942aaf848030c478b4c6a28c6af861c66","analyzedAt":"2026-09-13T01:50:10.254Z","contentChangedAt":"2026-09-13T01:50:10.254Z","schemaVersion":2},"datasetVersion":"2026-09-14T16:17:12.679Z"}