{"record":{"id":"4dc26f168b91b985","repo":"pentaho/pentaho-kettle","slug":"unable-to-load-job-entry-of-type-sql-from-xml-node","errorCode":null,"errorMessage":"Unable to load job entry of type 'sql' from XML node","messagePattern":"Unable to load job entry of type 'sql' from XML node","errorType":"exception","errorClass":"KettleXMLException","httpStatus":null,"severity":"error","filePath":"engine/src/main/java/org/pentaho/di/job/entries/sql/JobEntrySQL.java","lineNumber":138,"sourceCode":"      if ( sSubs != null && sSubs.equalsIgnoreCase( \"T\" ) ) {\n        useVariableSubstitution = true;\n      }\n      databaseMeta = DatabaseMeta.findDatabase( databases, dbname );\n\n      String ssql = XMLHandler.getTagValue( entrynode, SQLFROMFILE_TAG );\n      if ( ssql != null && ssql.equalsIgnoreCase( \"T\" ) ) {\n        sqlFromFile = true;\n      }\n\n      sqlFilename = XMLHandler.getTagValue( entrynode, SQLFILENAME_TAG );\n\n      String sOneStatement = XMLHandler.getTagValue( entrynode, SEND_ONE_STATEMENT_TAG );\n      if ( sOneStatement != null && sOneStatement.equalsIgnoreCase( \"T\" ) ) {\n        sendOneStatement = true;\n      }\n\n    } catch ( KettleException e ) {\n      throw new KettleXMLException( \"Unable to load job entry of type 'sql' from XML node\", e );\n    }\n  }\n\n  public void loadRep( Repository rep, IMetaStore metaStore, ObjectId idJobentry, List<DatabaseMeta> databases,\n    List<SlaveServer> slaveServers ) throws KettleException {\n    try {\n      sql = rep.getJobEntryAttributeString( idJobentry, SQL_TAG );\n      String sSubs = rep.getJobEntryAttributeString( idJobentry, USE_VARIABLE_SUBSTITUTION_TAG );\n      if ( sSubs != null && sSubs.equalsIgnoreCase( \"T\" ) ) {\n        useVariableSubstitution = true;\n      }\n\n      String ssql = rep.getJobEntryAttributeString( idJobentry, SQLFROMFILE_TAG );\n      if ( ssql != null && ssql.equalsIgnoreCase( \"T\" ) ) {\n        sqlFromFile = true;\n      }\n\n      String ssendOneStatement = rep.getJobEntryAttributeString( idJobentry, SEND_ONE_STATEMENT_TAG );","sourceCodeStart":120,"sourceCodeEnd":156,"githubUrl":"https://github.com/pentaho/pentaho-kettle/blob/f3058517a153da500bf4551f46d79b91bf8ec552/engine/src/main/java/org/pentaho/di/job/entries/sql/JobEntrySQL.java#L120-L156","documentation":"KettleXMLException thrown by JobEntrySQL.loadXML when parsing a 'sql' job entry's XML node fails with a KettleException. It wraps parse errors (missing/broken nodes) encountered while reading attributes like SQL filename, connection, and sendOneStatement.","triggerScenarios":"Calling loadXML with a .kjb <entry> node of type SQL that is malformed, missing expected tags, or whose XMLHandler parsing throws KettleXMLException/KettleException (e.g. invalid characters, truncated file).","commonSituations":"Hand-edited job XML with a broken <sql> entry; file truncated during transfer; XML exported from a newer PDI version with tags the older parser chokes on.","solutions":["Open the .kjb file in an XML validator/editor and fix malformed markup around the SQL entry node.","Re-export or re-save the job from Spoon to regenerate well-formed XML.","Verify the entry node has the expected SQL entry tags (sql, connection, sqlFilename, etc.).","Check the wrapped cause exception for the exact parse failure."],"exampleFix":"// before\nNode entryNode = XMLHandler.getSubNode(jobNode, \"entry\");\nsqlEntry.loadXML(entryNode, databases, slaveServers, rep, metaStore);\n// after\nNode entryNode = XMLHandler.getSubNode(jobNode, \"entry\");\nif (entryNode == null) {\n  throw new KettleXMLException(\"Missing <entry> node in job XML\");\n}\nsqlEntry.loadXML(entryNode, databases, slaveServers, rep, metaStore);","handlingStrategy":"validation","validationCode":"Document document = XMLHandler.loadXMLFile(jobFile);\nNode job = XMLHandler.getSubNode(document, KitchenConfiguration.JOB_TAG); // or \"job\"\nNode entry = XMLHandler.getSubNode(job, \"entry\");\nif (entry == null) throw new KettleXMLException(\"Job XML has no <entry> node\");\n","typeGuard":"boolean isValidEntryNode(Node n) {\n  return n != null && XMLHandler.getSubNode(n, \"type\") != null;\n}","tryCatchPattern":"try {\n  sqlEntry.loadXML(entrynode, databases, slaveServers, rep, metaStore);\n} catch (KettleXMLException e) {\n  logError(\"Malformed SQL entry XML: \" + e.getCause(), e);\n}","preventionTips":["Never hand-edit .kjb files without validating afterwards","Transfer job files in binary-safe mode to avoid truncation","Re-save jobs in Spoon after version migrations"],"tags":["xml","pdi","job-entry","parse"],"backgroundTag":"json-parse-error","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"}