pentaho/pentaho-kettle · error · KettleException
SynchronizeAfterMergeMeta.Exception.TableNotSpecified
Error message
SynchronizeAfterMergeMeta.Exception.TableNotSpecified
What it means
Thrown by SynchronizeAfterMergeMeta.getTableFieldsMeta when the step's target table name resolves to empty/null, so the field metadata lookup cannot even be attempted. The library requires a concrete table name to query field layout from the database.
Solutions
- Open the Synchronize After Merge step dialog and set the Target table field
- Verify the variable used for the table name is defined in the runtime environment/transformation properties
- Re-check the transformation XML/repository entry to ensure <table> is persisted
- Add a default table name in setDefault() or validation before calling getTableFieldsMeta
Example fix
// before
meta.setTablename("${TABLE_NAME}"); // variable never defined
// after
meta.setTablename("customers"); // or ensure variables.xml defines TABLE_NAME Defensive patterns
Strategy: validation
Validate before calling
if (meta.getTablename() == null || meta.getTablename().trim().isEmpty()) { throw new IllegalArgumentException("Synchronize After Merge: target table must be set"); } Try / catch
try { fields = meta.getTableFieldsMeta(row, realSchema, realTable); } catch (KettleException e) { logError("Table not specified or lookup failed: " + e.getMessage()); } Prevention
- Always fill the target table field before saving the transformation
- Use literal names or verify variables are defined at runtime
- Run the step dialog's field-getter to validate config early
When it happens
Trigger: Calling getTableFieldsMeta() while the step's tablename field (after variable resolution) is null or empty string; a transformation saved without the table field populated.
Common situations: Transformation XML lost the table value during export/import; user filled schema but left table blank in the Synchronize After Merge dialog; variable bound to ${TABLE_NAME} not defined in the runtime environment.
Understand the failure class
Background: "is required", "must be set", "missing required field": configuration validation errors across open-source libraries — this error's family across 36 libraries.
Related errors
- GPBulkLoaderMeta.Exception.ConnectionNotDefined
- GPBulkLoaderMeta.Exception.TableNotSpecified
- InfobrightLoaderMeta.GetSQL.NoConnectionDefined
- LucidDBStreamingLoaderMeta.Exception.ConnectionNotDefined
- LucidDBStreamingLoaderMeta.Exception.TableNotSpecified
AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13).
Data as JSON: /api/errors/b739994e17b64801.
Report an issue: GitHub.
Appendix: source
Thrown at engine/src/main/java/org/pentaho/di/trans/steps/synchronizeaftermerge/SynchronizeAfterMergeMeta.java:1051
public RowMetaInterface getRequiredFields( VariableSpace space ) throws KettleException {
String realTableName = space.environmentSubstitute( tableName );
String realSchemaName = space.environmentSubstitute( schemaName );
if ( databaseMeta != null ) {
Database db = new Database( loggingObject, databaseMeta );
try {
db.connect();
if ( !Utils.isEmpty( realTableName ) ) {
// Check if this table exists...
if ( db.checkTableExists( realSchemaName, realTableName ) ) {
return db.getTableFieldsMeta( realSchemaName, realTableName );
} else {
throw new KettleException( BaseMessages.getString(
PKG, "SynchronizeAfterMergeMeta.Exception.TableNotFound" ) );
}
} else {
throw new KettleException( BaseMessages.getString(
PKG, "SynchronizeAfterMergeMeta.Exception.TableNotSpecified" ) );
}
} catch ( Exception e ) {
throw new KettleException( BaseMessages.getString(
PKG, "SynchronizeAfterMergeMeta.Exception.ErrorGettingFields" ), e );
} finally {
db.close();
}
} else {
throw new KettleException( BaseMessages.getString(
PKG, "SynchronizeAfterMergeMeta.Exception.ConnectionNotDefined" ) );
}
}
/**
* @return the schemaName
*/View on GitHub (pinned to f3058517a1)