{"record":{"id":"196abb8aea319859","repo":"pentaho/pentaho-kettle","slug":"mergejoinmeta-exception-unabletosavestepinfo","errorCode":"MergeJoinMeta.Exception.UnableToSaveStepInfo","errorMessage":"MergeJoinMeta.Exception.UnableToSaveStepInfo","messagePattern":"MergeJoinMeta\\.Exception\\.UnableToSaveStepInfo","errorType":"exception","errorClass":"KettleException","httpStatus":null,"severity":"error","filePath":"engine/src/main/java/org/pentaho/di/trans/steps/mergejoin/MergeJoinMeta.java","lineNumber":265,"sourceCode":"  }\n\n  public void saveRep( Repository rep, IMetaStore metaStore, ObjectId id_transformation, ObjectId id_step ) throws KettleException {\n    try {\n      for ( int i = 0; i < keyFields1.length; i++ ) {\n        rep.saveStepAttribute( id_transformation, id_step, i, \"keys_1\", keyFields1[i] );\n      }\n\n      for ( int i = 0; i < keyFields2.length; i++ ) {\n        rep.saveStepAttribute( id_transformation, id_step, i, \"keys_2\", keyFields2[i] );\n      }\n\n      List<StreamInterface> infoStreams = getStepIOMeta().getInfoStreams();\n\n      rep.saveStepAttribute( id_transformation, id_step, \"step1\", infoStreams.get( 0 ).getStepname() );\n      rep.saveStepAttribute( id_transformation, id_step, \"step2\", infoStreams.get( 1 ).getStepname() );\n      rep.saveStepAttribute( id_transformation, id_step, \"join_type\", getJoinType() );\n    } catch ( Exception e ) {\n      throw new KettleException( BaseMessages.getString( PKG, \"MergeJoinMeta.Exception.UnableToSaveStepInfo\" )\n        + id_step, e );\n    }\n  }\n\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    /*\n     * @todo Need to check for the following: 1) Join type must be one of INNER / LEFT OUTER / RIGHT OUTER / FULL OUTER\n     * 2) Number of input streams must be two (for now at least) 3) The field names of input streams must be unique\n     */\n    CheckResult cr =\n      new CheckResult( CheckResultInterface.TYPE_RESULT_WARNING, BaseMessages.getString(\n        PKG, \"MergeJoinMeta.CheckResult.StepNotVerified\" ), stepMeta );\n    remarks.add( cr );\n  }\n\n  @Override","sourceCodeStart":247,"sourceCodeEnd":283,"githubUrl":"https://github.com/pentaho/pentaho-kettle/blob/f3058517a153da500bf4551f46d79b91bf8ec552/engine/src/main/java/org/pentaho/di/trans/steps/mergejoin/MergeJoinMeta.java#L247-L283","documentation":"Thrown by MergeJoinMeta.saveRep when persisting the Merge Join step attributes (step1, step2, join_type) to the Kettle repository fails. Any Exception from rep.saveStepAttribute is wrapped in a KettleException with this message plus the id_step appended.","triggerScenarios":"Saving a transformation to a repository when the saveStepAttribute insert/update for id_step throws — e.g. database connection loss, transaction failure, read-only repository, or exceeding column length limits.","commonSituations":"Repository database down or network blip while saving; repository user lacks write permission; repository in read-only/maintenance mode; very long join type or step names overflowing DB columns.","solutions":["Check the wrapped cause for the underlying database error and fix connectivity/permission issues.","Confirm the repository user has INSERT/UPDATE rights on R_STEP_ATTRIBUTE.","Retry saving after the database recovers; if a transaction is stuck, resolve locks on the repository tables.","As a workaround, export the transformation to a .ktr file instead of saving to the repository."],"exampleFix":null,"handlingStrategy":"retry","validationCode":"// Pre-check write access to the repository\nif (!repository.isConnected() || repository.isReadOnly()) {\n  throw new IllegalStateException(\"Repository not writable\");\n}","typeGuard":null,"tryCatchPattern":"try {\n  transMeta.saveRep(repository, directory, transName, description);\n} catch (KettleException e) {\n  // inspect cause (DB connectivity/permissions) and retry once recovered\n}","preventionTips":["Grant repository users INSERT/UPDATE on R_STEP_ATTRIBUTE.","Monitor repository DB availability before scheduled saves.","Keep step/field names within repository column length limits.","Use file-based .ktr export as a fallback when the repository is unstable."],"tags":["kettle","repository","save-failed","merge-join"],"backgroundTag":"database-write-failed","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"}