{"record":{"id":"b1d66445a5ada8aa","repo":"pentaho/pentaho-kettle","slug":"jobsql-nosqlfilespecified","errorCode":"JobSQL.NoSQLFileSpecified","errorMessage":"JobSQL.NoSQLFileSpecified","messagePattern":"JobSQL\\.NoSQLFileSpecified","errorType":"error_code","errorClass":"KettleDatabaseException","httpStatus":null,"severity":"error","filePath":"engine/src/main/java/org/pentaho/di/job/entries/sql/JobEntrySQL.java","lineNumber":273,"sourceCode":"        } else {\n          db.execStatements( theSql );\n        }\n      } catch ( KettleDatabaseException je ) {\n        result.setNrErrors( 1 );\n        logError( BaseMessages.getString( PKG, \"JobSQL.ErrorRunJobEntry\", je.getMessage() ) );\n      }\n    } else {\n      result.setNrErrors( 1 );\n      logError( BaseMessages.getString( PKG, \"JobSQL.NoDatabaseConnection\" ) );\n    }\n\n    result.setResult( result.getNrErrors() == 0 );\n    return result;\n  }\n\n  public String buildSqlFromFile() throws KettleDatabaseException {\n    if ( sqlFilename == null ) {\n      throw new KettleDatabaseException( BaseMessages.getString( PKG, \"JobSQL.NoSQLFileSpecified\" ) );\n    }\n\n    String realFilename = environmentSubstitute( sqlFilename );\n    try ( FileObject sqlFile = KettleVFS.getInstance( parentJobMeta.getBowl() ).getFileObject( realFilename, this ) ) {\n      if ( !sqlFile.exists() ) {\n        logError( BaseMessages.getString( PKG, \"JobSQL.SQLFileNotExist\", realFilename ) );\n        throw new KettleDatabaseException( BaseMessages.getString(\n          PKG, \"JobSQL.SQLFileNotExist\", realFilename ) );\n      }\n      if ( isDetailed() ) {\n        logDetailed( BaseMessages.getString( PKG, \"JobSQL.SQLFileExists\", realFilename ) );\n      }\n\n      try ( InputStream inputStream = KettleVFS.getInputStream( sqlFile ) ) {\n        InputStreamReader bufferedStream = new InputStreamReader( new BufferedInputStream( inputStream, 500 ) );\n\n        BufferedReader buff = new BufferedReader( bufferedStream );\n        String sLine;","sourceCodeStart":255,"sourceCodeEnd":291,"githubUrl":"https://github.com/pentaho/pentaho-kettle/blob/f3058517a153da500bf4551f46d79b91bf8ec552/engine/src/main/java/org/pentaho/di/job/entries/sql/JobEntrySQL.java#L255-L291","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","solutions":["Open the SQL job entry in Spoon and set the 'SQL from file' filename.","If filename should come from a variable, ensure it is set at runtime instead of relying on null.","Or disable 'SQL from file' and supply the SQL directly in the entry's SQL box."],"exampleFix":"// before\njobEntrySQL.setSqlFromFile(true);\njobEntrySQL.setSQL(\"SELECT 1\"); // filename never set -> throws\n// after\njobEntrySQL.setSqlFromFile(true);\njobEntrySQL.setSqlFilename(\"${Internal.Job.Filename.Directory}/init.sql\");","handlingStrategy":"validation","validationCode":"JobEntrySQL sqlEntry = (JobEntrySQL) jobEntry;\nif (sqlEntry.isSQLFromFile() && (sqlEntry.getSqlFilename() == null || sqlEntry.getSqlFilename().trim().isEmpty())) {\n  throw new KettleException(\"'SQL from file' enabled but no SQL filename is set\");\n}\n","typeGuard":null,"tryCatchPattern":"try {\n  result = sqlEntry.execute(prev, 0);\n} catch (KettleDatabaseException e) {\n  if (e.getMessage() != null && e.getMessage().contains(\"NoSQLFileSpecified\")) {\n    logError(\"Configure the SQL filename before running\");\n  }\n}","preventionTips":["Always set the filename when enabling 'SQL from file'","Add a metadata review step before promoting jobs","Prefer variables with defaults over empty fields"],"tags":["configuration","pdi","job-entry","sql","missing-field"],"backgroundTag":"missing-required-config-field","analyzedSha":"f3058517a153da500bf4551f46d79b91bf8ec552","analyzedAt":"2026-09-13T14:04:16.340Z","contentChangedAt":"2026-09-13T14:04:16.340Z","schemaVersion":2},"datasetVersion":"2026-09-20T23:17:15.980Z"}