{"record":{"id":"8509b8e887bb2feb","repo":"pentaho/pentaho-kettle","slug":"mergerowsmeta-exception-flagfieldnotspecified","errorCode":"MergeRowsMeta.Exception.FlagFieldNotSpecified","errorMessage":"MergeRowsMeta.Exception.FlagFieldNotSpecified","messagePattern":"MergeRowsMeta\\.Exception\\.FlagFieldNotSpecified","errorType":"exception","errorClass":"KettleStepException","httpStatus":null,"severity":"error","filePath":"engine/src/main/java/org/pentaho/di/trans/steps/mergerows/MergeRowsMeta.java","lineNumber":296,"sourceCode":"\n  @Override\n  public void getFields( Bowl bowl, RowMetaInterface r, String name, RowMetaInterface[] info, StepMeta nextStep,\n    VariableSpace space, Repository repository, IMetaStore metaStore ) throws KettleStepException {\n    // We don't have any input fields here in \"r\" as they are all info fields.\n    // So we just merge in the info fields.\n    //\n    if ( info != null ) {\n      boolean found = false;\n      for ( int i = 0; i < info.length && !found; i++ ) {\n        if ( info[i] != null ) {\n          r.mergeRowMeta( info[i], name );\n          found = true;\n        }\n      }\n    }\n\n    if ( Utils.isEmpty( flagField ) ) {\n      throw new KettleStepException( BaseMessages.getString( PKG, \"MergeRowsMeta.Exception.FlagFieldNotSpecified\" ) );\n    }\n    ValueMetaInterface flagFieldValue = new ValueMetaString( flagField );\n    flagFieldValue.setOrigin( name );\n    r.addValueMeta( flagFieldValue );\n\n  }\n\n  @Override\n  public void check( List<CheckResultInterface> remarks, TransMeta transMeta, StepMeta stepMeta,\n    RowMetaInterface prev, String[] input, String[] output, RowMetaInterface info, VariableSpace space,\n    Repository repository, IMetaStore metaStore ) {\n    CheckResult cr;\n\n    List<StreamInterface> infoStreams = getStepIOMeta().getInfoStreams();\n    StreamInterface referenceStream = infoStreams.get( 0 );\n    StreamInterface compareStream = infoStreams.get( 1 );\n\n    if ( referenceStream.getStepname() != null && compareStream.getStepname() != null ) {","sourceCodeStart":278,"sourceCodeEnd":314,"githubUrl":"https://github.com/pentaho/pentaho-kettle/blob/f3058517a153da500bf4551f46d79b91bf8ec552/engine/src/main/java/org/pentaho/di/trans/steps/mergerows/MergeRowsMeta.java#L278-L314","documentation":"MergeRowsMeta.getFields() builds the output row layout for the Merge Rows step and appends a string flag field that marks each row as 'identical', 'changed', 'new', or 'deleted'. If the flag field name is empty or null, the step cannot produce valid output rows, so it throws a KettleStepException with 'FlagFieldNotSpecified'.","triggerScenarios":"Executing a transformation whose Merge Rows step has an empty 'flag field' setting, i.e. setFlagField was never called or the UI field was left blank, causing Utils.isEmpty(flagField) to be true during getFields (row layout resolution at execution time).","commonSituations":"Transformation XML/repository metadata missing the flagfield attribute; programmatically constructed TransMeta where MergeRowsMeta.setFlagField() was forgotten; upgrading a transformation where the flag field was cleared.","solutions":["Open the Merge Rows step dialog and set the 'Flag field name' to a non-empty value, then re-save and rerun","Programmatically call mergeRowsMeta.setFlagField( \"flagField\" ) before executing","Inspect the transformation XML/ktr (or repository attributes) and add the flag field entry","Add a pre-execution metadata validation that fails early with a clear message"],"exampleFix":"// before\nMergeRowsMeta meta = new MergeRowsMeta();\nmeta.allocate();\n// flagField never set -> KettleStepException at getFields\n// after\nMergeRowsMeta meta = new MergeRowsMeta();\nmeta.setFlagField( \"mergeFlag\" );\nmeta.allocate();","handlingStrategy":"validation","validationCode":"MergeRowsMeta meta = (MergeRowsMeta) stepMeta.getStepMetaInterface();\nif ( meta.getFlagField() == null || meta.getFlagField().trim().isEmpty() ) {\n  throw new IllegalArgumentException( \"Merge Rows step requires a non-empty flag field name\" );\n}","typeGuard":"function hasFlagField( meta ) {\n  return meta != null && typeof meta.getFlagField === 'function'\n    && typeof meta.getFlagField() === 'string' && meta.getFlagField().length > 0;\n}","tryCatchPattern":"try {\n  transMeta.execute( args );\n} catch ( KettleStepException e ) {\n  if ( e.getMessage() != null && e.getMessage().contains( \"FlagFieldNotSpecified\" ) ) {\n    // open step config and set the flag field name\n  } else { throw e; }\n}","preventionTips":["Never leave the 'Flag field name' blank in the Merge Rows dialog","When building TransMeta in code, always call setFlagField() alongside other MergeRowsMeta setters","Add a checkSteps()/metadata validation pass to CI before running transformations","When importing ktr files, validate that flagfield attribute exists"],"tags":["kettle","merge-rows","row-metadata","missing-field"],"backgroundTag":"missing-required-config-field","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"}