{"record":{"id":"855ff72d26b60fcc","repo":"pentaho/pentaho-kettle","slug":"unable-to-clone-row-for-metadata","errorCode":null,"errorMessage":"Unable to clone row for metadata : ","messagePattern":"Unable to clone row for metadata : ","errorType":"exception","errorClass":"KettleStepException","httpStatus":null,"severity":"error","filePath":"ui/src/main/java/org/pentaho/di/ui/spoon/trans/TransPreviewDelegate.java","lineNumber":491,"sourceCode":"        previewDataMap.put( stepMeta, rowsData );\n        previewLogMap.put( stepMeta, loggingText );\n\n        StepInterface step = trans.findRunThread( stepMeta.getName() );\n\n        if ( step != null ) {\n\n          switch ( previewMode ) {\n            case LAST:\n              step.addRowListener( new RowAdapter() {\n                @Override\n                public void rowWrittenEvent( RowMetaInterface rowMeta, Object[] row ) throws KettleStepException {\n                  try {\n                    rowsData.add( new RowMetaAndData( rowMeta, rowMeta.cloneRow( row ) ) );\n                    if ( rowsData.size() > PropsUI.getInstance().getDefaultPreviewSize() ) {\n                      rowsData.remove( 0 );\n                    }\n                  } catch ( Exception e ) {\n                    throw new KettleStepException( \"Unable to clone row for metadata : \" + rowMeta, e );\n                  }\n                }\n              } );\n              break;\n            default:\n              step.addRowListener( new RowAdapter() {\n\n                @Override\n                public void rowWrittenEvent( RowMetaInterface rowMeta, Object[] row ) throws KettleStepException {\n                  if ( rowsData.size() < PropsUI.getInstance().getDefaultPreviewSize() ) {\n                    try {\n                      rowsData.add( new RowMetaAndData( rowMeta, rowMeta.cloneRow( row ) ) );\n                    } catch ( Exception e ) {\n                      throw new KettleStepException( \"Unable to clone row for metadata : \" + rowMeta, e );\n                    }\n                  }\n                }\n              } );","sourceCodeStart":473,"sourceCodeEnd":509,"githubUrl":"https://github.com/pentaho/pentaho-kettle/blob/f3058517a153da500bf4551f46d79b91bf8ec552/ui/src/main/java/org/pentaho/di/ui/spoon/trans/TransPreviewDelegate.java#L473-L509","documentation":"TransPreviewDelegate registers a RowListener during preview whose rowWrittenEvent clones each incoming row via rowMeta.cloneRow(row) to buffer it for display. If cloning throws, a KettleStepException with 'Unable to clone row for metadata : ' + rowMeta is raised, aborting the preview data flow for that step.","triggerScenarios":"Previewing a step whose row listener hits the default (non-first/non-last) branch and rowMeta.cloneRow(row) throws — typically when row data does not match the row metadata (wrong object type or null against a non-null field) or the row metadata itself is malformed.","commonSituations":"Custom step plugins produce rows inconsistent with their declared RowMeta; binary/object fields that cloneRow cannot deep-copy; rows passed after the metadata changed mid-execution.","solutions":["Inspect the wrapped cause (logged with the exception) to find the field index and mismatch.","Fix the producing step so emitted row objects match its RowMetaInterface (correct types per field).","Re-run the step's 'Get Fields' so its declared row metadata matches actual output.","If a plugin is at fault, update or fix the plugin's processRow implementation."],"exampleFix":"// before: emitting Integer for a declared String field\nObject[] row = { Integer.valueOf( 42 ) }; // rowMeta says String -> cloneRow fails\n// after\nObject[] row = { \"42\" }; // matches rowMeta String type","handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"try {\n  rowsData.add( new RowMetaAndData( rowMeta, rowMeta.cloneRow( row ) ) );\n} catch ( Exception e ) {\n  log.logError( \"Unable to clone row for metadata : \" + rowMeta, e );\n  // inspect e to find the mismatching field index/type\n}","preventionTips":["Ensure custom steps emit values whose types exactly match the declared RowMeta.","Run 'Get Fields' on steps after changing their configuration.","Test preview early on custom plugins to catch row/metadata drift."],"tags":["preview","row-clone","row-metadata","pentaho-kettle"],"backgroundTag":"row-clone-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"}