{"record":{"id":"ed723922a81007c7","repo":"apache/beam","slug":"renamefields-does-not-support-renaming-logical-types","errorCode":null,"errorMessage":"RenameFields does not support renaming logical types.","messagePattern":"RenameFields does not support renaming logical types\\.","errorType":"exception","errorClass":"RuntimeException","httpStatus":null,"severity":"error","filePath":"sdks/java/core/src/main/java/org/apache/beam/sdk/schemas/transforms/RenameFields.java","lineNumber":127,"sourceCode":"                inputType.getCollectionElementType(),\n                renames,\n                renamedSchemasMap,\n                nestedFieldRenamedMap));\n      case ITERABLE:\n        return FieldType.iterable(\n            renameFieldType(\n                inputType.getCollectionElementType(),\n                renames,\n                renamedSchemasMap,\n                nestedFieldRenamedMap));\n      case MAP:\n        return FieldType.map(\n            renameFieldType(\n                inputType.getMapKeyType(), renames, renamedSchemasMap, nestedFieldRenamedMap),\n            renameFieldType(\n                inputType.getMapValueType(), renames, renamedSchemasMap, nestedFieldRenamedMap));\n      case LOGICAL_TYPE:\n        throw new RuntimeException(\"RenameFields does not support renaming logical types.\");\n      default:\n        return inputType;\n    }\n  }\n\n  // Apply the user-specified renames to the input schema.\n  @VisibleForTesting\n  static void renameSchema(\n      Schema inputSchema,\n      Collection<RenamePair> renames,\n      Map<UUID, Schema> renamedSchemasMap,\n      Map<UUID, BitSet> nestedFieldRenamedMap) {\n    // The mapping of renames to apply at this level of the schema.\n    Map<Integer, String> topLevelRenames = Maps.newHashMap();\n    // For nested schemas, collect all applicable renames here.\n    Multimap<Integer, RenamePair> nestedRenames = ArrayListMultimap.create();\n\n    for (RenamePair rename : renames) {","sourceCodeStart":109,"sourceCodeEnd":145,"githubUrl":"https://github.com/apache/beam/blob/12126d8942aaf848030c478b4c6a28c6af861c66/sdks/java/core/src/main/java/org/apache/beam/sdk/schemas/transforms/RenameFields.java#L109-L145","documentation":"renameFieldType recursively applies renames to a FieldType's structure, but logical types are not supported: renaming nested fields inside a logical type's representation is not implemented, so the LOGICAL_TYPE case throws RuntimeException rather than silently producing a wrong schema.","triggerScenarios":"Applying RenameFields to a schema (or nested schema/map/array element) containing a LOGICAL_TYPE field — e.g. a custom logical type column — even when the rename targets only other fields.","commonSituations":"Pipelines with schemas containing logical types (e.g. custom LogicalType implementations or certain portable/SQL logical types) being passed through RenameFields for column-name harmonization.","solutions":["Convert the logical type column to a plain ROW/primitive before renaming, then convert back after.","Drop or replace logical-typed fields before applying RenameFields.","Implement renaming via a custom DoFn mapping Row fields instead of RenameFields.","Check FieldType.getTypeName() for LOGICAL_TYPE in a pre-check and handle it manually."],"exampleFix":"// before\nschema containing FieldType of logicalType \"myLogical\"\np.apply(RenameFields.of(...))\n// after\nselect fields without the logical type, rename, then re-add the logical type field","handlingStrategy":"validation","validationCode":"boolean hasLogical(Schema s) { return s.getFields().stream().anyMatch(f -> containsLogical(f.getType())); } if (hasLogical(inputSchema)) { /* rename manually or convert logical types first */ }","typeGuard":"boolean containsLogical(FieldType t) { if (t.getTypeName()==TypeName.LOGICAL_TYPE) return true; return t.getCollectionElementType()!=null ? containsLogical(t.getCollectionElementType()) : (t.getRowSchema()!=null && containsLogical(t.getRowSchema())); }","tryCatchPattern":"try { out = input.apply(RenameFields.of(renames)); } catch (RuntimeException e) { if (e.getMessage().contains(\"logical types\")) { /* use manual Row field mapping */ } throw e; }","preventionTips":["Scan schemas for LOGICAL_TYPE fields before applying RenameFields","Prefer Select/DoFn-based field mapping when logical types are present","Keep logical-type columns out of rename pipelines"],"tags":["java","apache-beam","rename-fields","logical-type","unsupported"],"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"}