{"record":{"id":"6180924683fb828f","repo":"pentaho/pentaho-kettle","slug":"unsupported-situation-detected-where-more-than-one-mapping","errorCode":null,"errorMessage":"Unsupported situation detected where more than one Mapping Input step needs to be handled.  To solve it, insert a dummy step before the mapping step.","messagePattern":"Unsupported situation detected where more than one Mapping Input step needs to be handled\\.  To solve it, insert a dummy step before the mapping step\\.","errorType":"exception","errorClass":"KettleException","httpStatus":null,"severity":"error","filePath":"engine/src/main/java/org/pentaho/di/trans/steps/mapping/Mapping.java","lineNumber":97,"sourceCode":"\n          // Before we start, let's see if there are loose ends to tie up...\n          //\n          List<RowSet> inputRowSets = getInputRowSets();\n          if ( !inputRowSets.isEmpty() ) {\n            for ( RowSet rowSet : inputRowSets ) {\n              // Pass this rowset down to a mapping input step in the\n              // sub-transformation...\n              //\n              if ( mappingInputs.length == 1 ) {\n                // Simple case: only one input mapping. Move the RowSet over\n                //\n                mappingInputs[0].addRowSetToInputRowSets( rowSet );\n              } else {\n                // Difficult to see what's going on here.\n                // TODO: figure out where this RowSet needs to go and where it\n                // comes from.\n                //\n                throw new KettleException(\n                    \"Unsupported situation detected where more than one Mapping Input step needs to be handled.  \"\n                        + \"To solve it, insert a dummy step before the mapping step.\" );\n              }\n            }\n            clearInputRowSets();\n          }\n\n          // Do the same thing for remote input steps...\n          //\n          if ( !getRemoteInputSteps().isEmpty() ) {\n            // The remote server is likely a master or a slave server sending data\n            // over remotely to this mapping.\n            // However, the data needs to end up at a Mapping Input step of the\n            // sub-transformation, not in this step.\n            // We can move over the remote steps to the Mapping Input step as long\n            // as the threads haven't started yet.\n            //\n            for ( RemoteStep remoteStep : getRemoteInputSteps() ) {","sourceCodeStart":79,"sourceCodeEnd":115,"githubUrl":"https://github.com/pentaho/pentaho-kettle/blob/f3058517a153da500bf4551f46d79b91bf8ec552/engine/src/main/java/org/pentaho/di/trans/steps/mapping/Mapping.java#L79-L115","documentation":"In Mapping.processRow, while wiring up input row sets, the code can only attach a row set to mappingInputs[0]. If a second Mapping Input step exists in the sub-transformation, there is no defined place for the row set, so a KettleException is thrown. The Mapping step supports only one unambiguous mapping input unless a dummy step disambiguates the hop.","triggerScenarios":"A parent transformation feeds a Mapping (sub-transformation) step whose sub-transformation contains more than one 'Mapping Input' step, and the incoming row set cannot be matched to a single Mapping Input — detected while iterating input row sets in processRow (Mapping type Standard).","commonSituations":"Reusing a sub-transformation that has multiple Mapping Inputs with a plain Mapping step; adding a second Mapping Input while editing the sub-transf and forgetting the parent wiring; copying sub-transfs between transformations.","solutions":["Insert a Dummy step between the parent step and the Mapping step in the parent transformation, as the message says.","Alternatively, ensure the sub-transformation has exactly one Mapping Input step; remove or merge extra ones.","If multiple inputs are truly needed, redesign so each Mapping Input is fed by a separate, explicitly wired mapping usage or use 'Mapping (sub-transformation)' executor with proper input specification.","Check the 'Mapping Input step' selection in the Mapping step dialog matches the intended sub-step name."],"exampleFix":"// before (parent transformation)\nTableInput -----> Mapping(sub.ktr)   // sub.ktr has MappingInput1 and MappingInput2\n// after\nTableInput -----> Dummy -----> Mapping(sub.ktr)  // disambiguates hop wiring","handlingStrategy":"validation","validationCode":"// Inspect the sub-transformation before wiring:\nlong inputs = subTransMeta.getSteps().stream()\n  .filter(s -> \"MappingInput\".equals(s.getStepMeta().getTypeDescription().replace(\" \", \"\")))\n  .count();\nif (inputs > 1) throw new IllegalStateException(\"Sub-transformation has \" + inputs + \" Mapping Input steps; add a Dummy or reduce to 1\");","typeGuard":null,"tryCatchPattern":"try {\n  trans.execute(null);\n} catch (KettleException e) {\n  if (e.getMessage().contains(\"more than one Mapping Input\")) {\n    log.error(\"Ambiguous mapping input wiring: insert a Dummy step before the Mapping step\", e);\n  } else { throw e; }\n}","preventionTips":["Keep one Mapping Input step per reusable sub-transformation.","Insert a Dummy step whenever parent wiring is ambiguous.","Review sub-transf topology after refactoring/merging transformations.","Test mappings locally before deploying to shared environments."],"tags":["mapping","sub-transformation","wiring","kettle"],"backgroundTag":"invalid-argument-value","analyzedSha":"f3058517a153da500bf4551f46d79b91bf8ec552","analyzedAt":"2026-09-13T14:04:16.340Z","contentChangedAt":"2026-09-13T14:04:16.340Z","schemaVersion":2},"datasetVersion":"2026-09-20T23:17:15.980Z"}