pentaho/pentaho-kettle · error · KettleTransException
Trans.Exception.UnableToGetDependencyInfoFromDB
Error message
Trans.Exception.UnableToGetDependencyInfoFromDB
What it means
Transformations can define date-range dependencies (table/field lookups) to compute a maximum dependency date. During init(), Trans queries each dependency's database; if the query returns no usable value (null max value) or the dependency's database meta is missing, it throws KettleTransException with Trans.Exception.UnableToGetDependencyInfoFromDB, including database, table, and field names.
Solutions
- Check that the dependency table exists, is non-empty, and the field name is correct
- Verify the dependency database connection is defined and reachable
- Run the MAX() query manually against the DB to see what it returns
- Fix or remove the date-range dependency in the transformation settings
Example fix
// before: dependency on missing field new TransDependency(dbMeta, "staging_log", "last_updtaed"); // after: corrected field new TransDependency(dbMeta, "staging_log", "last_updated");
Defensive patterns
Strategy: validation
Validate before calling
for (TransDependency td : transMeta.getDependencies()) {
if (td.getDatabase() == null) throw new IllegalStateException("Dependency db missing");
String sql = "SELECT MAX(" + td.getFieldname() + ") FROM " + td.getTablename();
// run via td.getDatabase() to confirm a non-null value exists
} Try / catch
try {
trans.execute(args);
} catch (KettleTransException e) {
if (e.getMessage().contains("UnableToGetDependencyInfoFromDB")) {
log.error("Dependency lookup failed: " + e.getMessage());
// fix table/field or remove dependency
} else throw e;
} Prevention
- Verify dependency tables are populated and fields exist before scheduled runs
- Keep dependency field names in sync with schema changes
- Ensure the dependency database connection is defined
- Prefer explicit date parameters when dependency tables may be empty
When it happens
Trigger: A TransDependency (td) lookup runs but either maxvalue is null (no rows returned) for the dependency field, or td.getDatabase() is null - both paths throw this message with db/table/field names.
Common situations: Dependency table empty or field name misspelled so the MAX() query returns null; dependency database connection missing from metadata; wrong schema/table names after a migration.
Understand the failure class
Background: EmptyResultError / "no results found": when an API or scraper succeeds but returns zero rows — this error's family across 9 libraries.
Related errors
- Trans.Exception.ErrorInDatabase
- TransDependency.Exception.UnableToLoadTransformationDependen…
- TransDependency.Exception.UnableToSaveTransformationDepency
- AccessInputMeta.Exception.ErrorReadingRepository
- AddSequence.Exception.CouldNotFindNextValueForSequence
AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13).
Data as JSON: /api/errors/9e2710313c494ed8.
Report an issue: GitHub.
Appendix: source
Thrown at engine/src/main/java/org/pentaho/di/trans/Trans.java:2396
try {
depdb.connect();
depdb.setCommit( logCommitSize );
String sql = "SELECT MAX(" + td.getFieldname() + ") FROM " + td.getTablename();
RowMetaAndData r1 = depdb.getOneRow( sql );
if ( r1 != null ) {
// OK, we have a row, get the result!
Date maxvalue = (Date) r1.getData()[ 0 ];
if ( maxvalue != null ) {
if ( log.isDetailed() ) {
log.logDetailed( BaseMessages.getString( PKG, "Trans.Log.FoundDateFromTable", td.getTablename(),
"." + td.getFieldname(), " = " + maxvalue.toString() ) );
}
if ( maxvalue.getTime() > maxdepdate.getTime() ) {
maxdepdate = maxvalue;
}
} else {
throw new KettleTransException( BaseMessages.getString( PKG,
"Trans.Exception.UnableToGetDependencyInfoFromDB", td.getDatabase().getName() + ".", td
.getTablename() + ".", td.getFieldname() ) );
}
} else {
throw new KettleTransException( BaseMessages.getString( PKG,
"Trans.Exception.UnableToGetDependencyInfoFromDB", td.getDatabase().getName() + ".", td
.getTablename() + ".", td.getFieldname() ) );
}
} catch ( KettleException e ) {
throw new KettleTransException( BaseMessages.getString( PKG, "Trans.Exception.ErrorInDatabase", "" + td
.getDatabase() ), e );
} finally {
depdb.close();
}
} else {
throw new KettleTransException( BaseMessages.getString( PKG, "Trans.Exception.ConnectionCouldNotBeFound",
"" + td.getDatabase() ) );
}View on GitHub (pinned to f3058517a1)