pentaho/pentaho-kettle · error · KettleException
SalesforceInputDialog.ObjectNotQueryable
SalesforceInputDialog.ObjectNotQueryable
Error message
SalesforceInputDialog.ObjectNotQueryable
What it means
In query(), after a successful describe, the wrapper checks describeSObjectResult.isQueryable() and throws this dialog-keyed KettleException if the object does not support SOQL queries. Some Salesforce objects can be described but never queried via the API.
Solutions
- Choose a queryable object instead (check the object's 'queryable' flag in Workbench or a describe call).
- Retrieve history/data through the parent object or a supported API (e.g. EventLogFile via Bulk API).
- If you only need specific fields, query the owning object rather than the non-queryable child/metadata object.
- Confirm with the Salesforce admin whether the intended data is exposed via another supported object.
Example fix
// before
conn.setModule("UserLoginHistory"); // queryable=false via SOAP query
// after
conn.setModule("LoginHistory"); // queryable alternative Defensive patterns
Strategy: validation
Validate before calling
DescribeSObjectResult d = conn.getBinding().describeSObject(conn.getModule());
if (d != null && !d.isQueryable()) {
throw new IllegalArgumentException(conn.getModule() + " is not SOQL-queryable");
} Try / catch
try {
conn.query(false);
} catch (KettleException e) {
if (e.getMessage().contains("ObjectNotQueryable")) {
logError("Choose a queryable SObject for the Salesforce Input step");
}
throw e;
} Prevention
- Check the queryable flag in a describe call or Workbench before configuring the step.
- Avoid system/metadata/history objects not exposed to SOQL.
- Use alternative APIs (Bulk, EventLogFile) for non-queryable data.
When it happens
Trigger: query(specifyQuery=false) against an SObject whose describe reports queryable=false — e.g. certain system objects, history/audit objects, or metadata-like objects.
Common situations: Pointing the step at non-queryable objects (e.g. some EventLog/Feed/Share or setup objects); objects only accessible via specific APIs (Bulk/Reports) instead of the standard SOAP query.
Understand the failure class
Background: UnsupportedOperationException and "is not supported" errors: when a library deliberately refuses a call — this error's family across 30 libraries.
Related errors
- Erreur getting fields from module [
- Error getting fields from module [
- SalesforceInput.Error.ObjectNotReplicateable
- SalesforceInput.ErrorGettingObject
- SalesforceInsertMeta.Exception.ErrorReadingRepository
AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13).
Data as JSON: /api/errors/94cf41e7d71940cc.
Report an issue: GitHub.
Appendix: source
Thrown at plugins/salesforce/core/src/main/java/org/pentaho/di/trans/steps/salesforce/SalesforceConnection.java:395
throw new KettleException( BaseMessages.getString( PKG, "SalesforceInput.Error.Connection" ), e );
}
}
public void query( boolean specifyQuery ) throws KettleException {
if ( getBinding() == null ) {
throw new KettleException( BaseMessages.getString( PKG, "SalesforceInput.Exception.CanNotGetBiding" ) );
}
try {
if ( !specifyQuery ) {
// check if we can query this Object
DescribeSObjectResult describeSObjectResult = getBinding().describeSObject( getModule() );
if ( describeSObjectResult == null ) {
throw new KettleException( BaseMessages.getString( PKG, "SalesforceInput.ErrorGettingObject" ) );
}
if ( !describeSObjectResult.isQueryable() ) {
throw new KettleException( BaseMessages.getString(
PKG, "SalesforceInputDialog.ObjectNotQueryable", module ) );
}
if ( this.recordsFilter == SalesforceConnectionUtils.RECORDS_FILTER_UPDATED
|| this.recordsFilter == SalesforceConnectionUtils.RECORDS_FILTER_DELETED ) {
// The object must be replicateable
if ( !describeSObjectResult.isReplicateable() ) {
throw new KettleException( BaseMessages.getString(
PKG, "SalesforceInput.Error.ObjectNotReplicateable", getModule() ) );
}
}
}
if ( getSQL() != null && log.isDetailed() ) {
log.logDetailed( BaseMessages.getString( PKG, "SalesforceInput.Log.SQLString" ) + " : " + getSQL() );
}
switch ( this.recordsFilter ) {
case SalesforceConnectionUtils.RECORDS_FILTER_UPDATED:View on GitHub (pinned to f3058517a1)