{"record":{"id":"4841dcbbf6af3df3","repo":"pentaho/pentaho-kettle","slug":"columnexists-error-tablenamefieldmissing","errorCode":null,"errorMessage":"ColumnExists.Error.TablenameFieldMissing","messagePattern":"ColumnExists\\.Error\\.TablenameFieldMissing","errorType":"exception","errorClass":"KettleException","httpStatus":null,"severity":"error","filePath":"plugins/core/impl/src/main/java/org/pentaho/di/trans/steps/columnexists/ColumnExists.java","lineNumber":77,"sourceCode":"    boolean columnexists = false;\n\n    if ( first ) {\n      first = false;\n\n      data.outputRowMeta = getInputRowMeta().clone();\n      meta.getFields( getTransMeta().getBowl(), data.outputRowMeta, getStepname(), null, null, this, repository,\n        metaStore );\n\n      // Check is columnname field is provided\n      if ( Utils.isEmpty( meta.getDynamicColumnnameField() ) ) {\n        logError( BaseMessages.getString( PKG, \"ColumnExists.Error.ColumnnameFieldMissing\" ) );\n        throw new KettleException( BaseMessages.getString( PKG, \"ColumnExists.Error.ColumnnameFieldMissing\" ) );\n      }\n      if ( meta.isTablenameInField() ) {\n        // Check is tablename field is provided\n        if ( Utils.isEmpty( meta.getDynamicTablenameField() ) ) {\n          logError( BaseMessages.getString( PKG, \"ColumnExists.Error.TablenameFieldMissing\" ) );\n          throw new KettleException( BaseMessages.getString( PKG, \"ColumnExists.Error.TablenameFieldMissing\" ) );\n        }\n\n        // cache the position of the field\n        if ( data.indexOfTablename < 0 ) {\n          data.indexOfTablename = getInputRowMeta().indexOfValue( meta.getDynamicTablenameField() );\n          if ( data.indexOfTablename < 0 ) {\n            // The field is unreachable !\n            logError( BaseMessages.getString( PKG, \"ColumnExists.Exception.CouldnotFindField\" ) + \"[\"\n                + meta.getDynamicTablenameField() + \"]\" );\n            throw new KettleException( BaseMessages.getString( PKG, \"ColumnExists.Exception.CouldnotFindField\",\n              meta.getDynamicTablenameField() ) );\n          }\n        }\n      } else {\n        if ( !Utils.isEmpty( data.schemaname ) ) {\n          data.tablename = data.db.getDatabaseMeta().getQuotedSchemaTableCombination( data.schemaname, data.tablename );\n        } else {\n          data.tablename = data.db.getDatabaseMeta().quoteField( data.tablename );","sourceCodeStart":59,"sourceCodeEnd":95,"githubUrl":"https://github.com/pentaho/pentaho-kettle/blob/f3058517a153da500bf4551f46d79b91bf8ec552/plugins/core/impl/src/main/java/org/pentaho/di/trans/steps/columnexists/ColumnExists.java#L59-L95","documentation":"The ColumnExists step is configured to read the table name from an incoming field (isTablenameInField=true), but the 'Dynamic tablename field' setting is empty. The step cannot determine which table to check without it, so it logs and throws a KettleException, aborting processRow.","triggerScenarios":"processRow runs with meta.isTablenameInField()==true and Utils.isEmpty(meta.getDynamicTablenameField()) returns true — i.e. the 'tablename field' textbox on the step dialog was left blank while 'tablename defined in a field' is checked.","commonSituations":"Importing a transformation XML/repo entry where the field was never saved; checking the dynamic-table option but forgetting to pick the field; copying the step and resetting the field name.","solutions":["Open the ColumnExists step dialog and set 'The tablename fieldname' to a valid incoming field name","Uncheck 'tablename defined in a field?' if you intended to use a static table name","Validate the saved ktr XML contains <dynamic_tablename_field> before running"],"exampleFix":"// before (dialog XML missing field)\n<istablenameInfield>Y</istablenameInfield>\n// after\n<istablenameInfield>Y</istablenameInfield>\n<dynamic_tablename_field>TABLE_NAME</dynamic_tablename_field>","handlingStrategy":"validation","validationCode":"if (meta.isTablenameInField() && (meta.getDynamicTablenameField() == null || meta.getDynamicTablenameField().isEmpty())) {\n  throw new IllegalStateException(\"ColumnExists: tablename field required when 'tablename in field' is enabled\");\n}","typeGuard":null,"tryCatchPattern":"try { step.processRow(); } catch (KettleException e) { log.error(\"ColumnExists config error: \" + e.getMessage(), e); throw e; }","preventionTips":["Always click Get Fields on the step dialog after enabling 'tablename defined in a field'","Validate saved ktr XML in CI (grep for dynamic_tablename_field)","Never hand-edit istablenameInfield without setting the field"],"tags":["kettle","pdi","configuration","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"}