{"record":{"id":"d2ea9b3c8b83fa44","repo":"apache/beam","slug":"missing-input-for-transform-s","errorCode":null,"errorMessage":"Missing input for transform: %s","messagePattern":"Missing input for transform: (.+?)","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"sdks/python/apache_beam/runners/pipeline_utils.py","lineNumber":122,"sourceCode":"      output_values_coder = pipeline_proto.components.coders[\n          output_values_coder_id]\n      if output_values_coder.spec.urn != common_urns.coders.ITERABLE.urn:\n        raise ValueError(\n            \"Output value coder %s for transform %s must be an iterable \"\n            \"coder, but uses URN %s\" % (\n                output_values_coder_id,\n                transform_id,\n                output_values_coder.spec.urn))\n      input_value_coder_id = input_coder.component_coder_ids[1]\n      output_value_coder_id = output_values_coder.component_coder_ids[0]\n      if output_value_coder_id != input_value_coder_id:\n        raise ValueError(\n            \"Input value coder %s does not match output value coder %s for \"\n            \"transform %s\" %\n            (input_value_coder_id, output_value_coder_id, transform_id))\n    elif transform_proto.spec.urn == common_urns.primitives.ASSIGN_WINDOWS.urn:\n      if not transform_proto.inputs:\n        raise ValueError(\"Missing input for transform: %s\" % transform_proto)\n    elif transform_proto.spec.urn == common_urns.primitives.PAR_DO.urn:\n      if not transform_proto.inputs:\n        raise ValueError(\"Missing input for transform: %s\" % transform_proto)\n\n    for t in transform_proto.subtransforms:\n      validate_transform(t)\n\n  for t in pipeline_proto.root_transform_ids:\n    validate_transform(t)\n\n\ndef _dep_key(dep):\n  if dep.type_urn == common_urns.artifact_types.FILE.urn:\n    payload = beam_runner_api_pb2.ArtifactFilePayload.FromString(\n        dep.type_payload)\n    if payload.sha256:\n      type_info = 'sha256', payload.sha256\n    else:","sourceCodeStart":104,"sourceCodeEnd":140,"githubUrl":"https://github.com/apache/beam/blob/12126d8942aaf848030c478b4c6a28c6af861c66/sdks/python/apache_beam/runners/pipeline_utils.py#L104-L140","documentation":"Raised by validate_transform when an ASSIGN_WINDOWS (WindowInto) transform has no inputs. Window assignment is a 1-in/1-out primitive in the Beam model; a windowing node without an input is a malformed graph. Validation runs recursively from root_transform_ids via validate_pipeline_graph before execution.","triggerScenarios":"A pipeline proto containing an ASSIGN_WINDOWS transform with an empty transform_proto.inputs map — from hand-constructed protos, buggy translators, or externally modified graphs.","commonSituations":"Custom graph-building tooling that drops windowing input edges; pipeline fragment merging that lost the input PCollection reference; hand-edited serialized pipeline JSON.","solutions":["Wire exactly one input PCollection into the ASSIGN_WINDOWS transform (set transform_proto.inputs)","Rebuild the pipeline from Beam Python code (beam.WindowInto(...)) instead of editing protos","Fix custom translator code so WindowInto always consumes an input PCollection","Validate the pipeline graph with validate_pipeline_graph before submission in tooling"],"exampleFix":"// before\nwin.spec.ClearField('inputs')  # empty inputs -> raises\n// after\nwin.spec.inputs['input'] = upstream_pc_id\nassert len(win.spec.inputs) == 1","handlingStrategy":"validation","validationCode":"def check_window_has_input(t: beam_runner_api_pb2.PTransform) -> bool:\n    return (t.spec.urn != common_urns.primitives.ASSIGN_WINDOWS.urn\n            or bool(t.inputs))","typeGuard":"def window_is_wired(t) -> bool:\n    return t.spec.urn != 'beam:transform:assign_windows:v1' or len(t.inputs) > 0","tryCatchPattern":"try:\n    validate_pipeline_graph(pipeline_proto)\nexcept ValueError as e:\n    if 'Missing input for transform' in str(e):\n        rewire_orphan_transforms(pipeline_proto)\n    else:\n        raise","preventionTips":["Attach WindowInto to a real PCollection; never create detached windowing nodes","Check inputs maps after any pipeline-fragment merging step","Run validate_pipeline_graph in CI for tooling that emits protos","Avoid hand-editing serialized pipeline graphs"],"tags":["python","apache-beam","pipeline-validation","windowing"],"backgroundTag":"schema-validation-failed","analyzedSha":"12126d8942aaf848030c478b4c6a28c6af861c66","analyzedAt":"2026-09-13T01:50:10.254Z","contentChangedAt":"2026-09-13T01:50:10.254Z","schemaVersion":2},"datasetVersion":"2026-09-20T03:17:13.778Z"}