pentaho/pentaho-kettle · error · KettleDatabaseException

JobSQL.NoSQLFileSpecified

JobSQL.NoSQLFileSpecified

Error message

JobSQL.NoSQLFileSpecified

What it means

KettleDatabaseException with localized message JobSQL.NoSQLFileSpecified thrown by JobEntrySQL.buildSqlFromFile when the entry is configured to run SQL from a file (sqlFromFile=true) but the sqlFilename field is null. Nothing was ever specified in the 'SQL from file' filename box.

Solutions

  1. Open the SQL job entry in Spoon and set the 'SQL from file' filename.
  2. If filename should come from a variable, ensure it is set at runtime instead of relying on null.
  3. Or disable 'SQL from file' and supply the SQL directly in the entry's SQL box.

Example fix

// before
jobEntrySQL.setSqlFromFile(true);
jobEntrySQL.setSQL("SELECT 1"); // filename never set -> throws
// after
jobEntrySQL.setSqlFromFile(true);
jobEntrySQL.setSqlFilename("${Internal.Job.Filename.Directory}/init.sql");
Defensive patterns

Strategy: validation

Validate before calling

JobEntrySQL sqlEntry = (JobEntrySQL) jobEntry;
if (sqlEntry.isSQLFromFile() && (sqlEntry.getSqlFilename() == null || sqlEntry.getSqlFilename().trim().isEmpty())) {
  throw new KettleException("'SQL from file' enabled but no SQL filename is set");
}

Try / catch

try {
  result = sqlEntry.execute(prev, 0);
} catch (KettleDatabaseException e) {
  if (e.getMessage() != null && e.getMessage().contains("NoSQLFileSpecified")) {
    logError("Configure the SQL filename before running");
  }
}

Prevention

When it happens

Trigger: Executing a SQL job entry where 'SQL from file' is enabled but the filename field is empty/unset; the guard fires before any file access.

Common situations: User enabled 'Read SQL from file' but forgot to type the filename; entry copied from another job where the filename was cleared; XML/repository load returned null for the filename attribute.

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


AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13). Data as JSON: /api/errors/b1d66445a5ada8aa. Report an issue: GitHub.

Appendix: source

Thrown at engine/src/main/java/org/pentaho/di/job/entries/sql/JobEntrySQL.java:273

        } else {
          db.execStatements( theSql );
        }
      } catch ( KettleDatabaseException je ) {
        result.setNrErrors( 1 );
        logError( BaseMessages.getString( PKG, "JobSQL.ErrorRunJobEntry", je.getMessage() ) );
      }
    } else {
      result.setNrErrors( 1 );
      logError( BaseMessages.getString( PKG, "JobSQL.NoDatabaseConnection" ) );
    }

    result.setResult( result.getNrErrors() == 0 );
    return result;
  }

  public String buildSqlFromFile() throws KettleDatabaseException {
    if ( sqlFilename == null ) {
      throw new KettleDatabaseException( BaseMessages.getString( PKG, "JobSQL.NoSQLFileSpecified" ) );
    }

    String realFilename = environmentSubstitute( sqlFilename );
    try ( FileObject sqlFile = KettleVFS.getInstance( parentJobMeta.getBowl() ).getFileObject( realFilename, this ) ) {
      if ( !sqlFile.exists() ) {
        logError( BaseMessages.getString( PKG, "JobSQL.SQLFileNotExist", realFilename ) );
        throw new KettleDatabaseException( BaseMessages.getString(
          PKG, "JobSQL.SQLFileNotExist", realFilename ) );
      }
      if ( isDetailed() ) {
        logDetailed( BaseMessages.getString( PKG, "JobSQL.SQLFileExists", realFilename ) );
      }

      try ( InputStream inputStream = KettleVFS.getInputStream( sqlFile ) ) {
        InputStreamReader bufferedStream = new InputStreamReader( new BufferedInputStream( inputStream, 500 ) );

        BufferedReader buff = new BufferedReader( bufferedStream );
        String sLine;

View on GitHub (pinned to f3058517a1)