pentaho/pentaho-kettle · error · KettleException
GPLoadMeta.Exception.TableNotSpecified
GPLoadMeta.Exception.TableNotSpecified
Error message
GPLoadMeta.Exception.TableNotSpecified
What it means
In GPLoadMeta's table-fields lookup, if the real (variable-resolved) table name is empty the code skips the existence check entirely and throws a KettleException with the TableNotSpecified message key. The library refuses to proceed without a concrete target table name.
Solutions
- Enter the target table name in the GPLoad step's Table field
- Define/initialize the ${TABLE} variable (e.g. via a Set Variables step or kettle.properties) so it resolves to a non-empty value
- Re-open and re-save the step metadata to confirm the table field persisted
Example fix
// before (kettle.properties missing the variable) # TABLE_NAME not set -> resolves to "" // after TABLE_NAME=sales_fact
Defensive patterns
Strategy: validation
Validate before calling
// Before execution, resolve and check the table name
String realTable = transMeta.environmentSubstitute(meta.getTableName());
if (realTable == null || realTable.trim().isEmpty()) {
throw new IllegalStateException("GPLoad table name is empty (check variables)");
} Try / catch
try { meta.getTableFields(); } catch (KettleException e) { if (e.getMessage().contains("TableNotSpecified")) { promptForTableName(); } else { throw e; } } Prevention
- Always fill the Table field in the GPLoad dialog
- Define table-name variables in kettle.properties or a Set Variables step upstream
- Never leave ${VAR} placeholders unresolved in production configs
When it happens
Trigger: Calling getTableFields() when tableName (after variable substitution) is null or empty — the Table field in the GPLoad step dialog is blank or a ${TABLE_VAR} resolves to an empty string.
Common situations: Forgetting to fill the Table name; a table-name variable not defined in the runtime environment; importing a transformation where the field was lost; dynamically-set variable evaluated in a scope where it is unset.
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
- GPLoad.Execption.FileDoesNotExist
- GPLoad.Log.ExitValuePsqlPath
- GPLoadMeta.Exception.ConnectionNotDefined
- GPLoadMeta.Exception.ErrorGettingFields
- GPLoadMeta.Exception.TableNotFound
AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13).
Data as JSON: /api/errors/b77a6d0981d5f783.
Report an issue: GitHub.
Appendix: source
Thrown at plugins/gpload/core/src/main/java/org/pentaho/di/trans/steps/gpload/GPLoadMeta.java:786
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 ) ) {
String schemaTable = databaseMeta.getQuotedSchemaTableCombination( realSchemaName, realTableName );
// Check if this table exists...
if ( db.checkTableExists( schemaTable ) ) {
return db.getTableFields( schemaTable );
} else {
throw new KettleException( BaseMessages.getString( PKG, "GPLoadMeta.Exception.TableNotFound" ) );
}
} else {
throw new KettleException( BaseMessages.getString( PKG, "GPLoadMeta.Exception.TableNotSpecified" ) );
}
} catch ( Exception e ) {
throw new KettleException( BaseMessages.getString( PKG, "GPLoadMeta.Exception.ErrorGettingFields" ), e );
} finally {
db.close();
}
} else {
throw new KettleException( BaseMessages.getString( PKG, "GPLoadMeta.Exception.ConnectionNotDefined" ) );
}
}
/**
* @return the schemaName
*/
public String getSchemaName() {
return schemaName;
}
View on GitHub (pinned to f3058517a1)