{"record":{"id":"e0424eec6e253d5b","repo":"pentaho/pentaho-kettle","slug":"gpload-exception-delimitermissing","errorCode":null,"errorMessage":"GPload.Exception.DelimiterMissing","messagePattern":"GPload\\.Exception\\.DelimiterMissing","errorType":"exception","errorClass":"KettleException","httpStatus":null,"severity":"error","filePath":"plugins/gpload/core/src/main/java/org/pentaho/di/trans/steps/gpload/GPLoad.java","lineNumber":211,"sourceCode":"      }\n    }\n\n    // data file validation\n    String dataFilename = meta.getDataFile();\n    if ( !Utils.isEmpty( dataFilename ) ) {\n      dataFilename = environmentSubstitute( dataFilename ).trim();\n    }\n    if ( Utils.isEmpty( dataFilename ) ) {\n      throw new KettleException( BaseMessages.getString( PKG, \"GPload.Exception.DataFileMissing\" ) );\n    }\n\n    // delimiter validation\n    String delimiter = meta.getDelimiter();\n    if ( !Utils.isEmpty( delimiter ) ) {\n      delimiter = environmentSubstitute( delimiter ).trim();\n    }\n    if ( Utils.isEmpty( delimiter ) ) {\n      throw new KettleException( BaseMessages.getString( PKG, \"GPload.Exception.DelimiterMissing\" ) );\n    }\n\n    // Now we start building the contents\n    StringBuffer contents = new StringBuffer( 1000 );\n\n    // Source: GP Admin Guide 3.3.6, page 635:\n    contents.append( GPLoad.GPLOAD_YAML_VERSION ).append( Const.CR );\n    contents.append( \"DATABASE: \" );\n    contents.append( environmentSubstitute( databaseMeta.getDatabaseName() ) );\n    contents.append( Const.CR );\n    contents.append( \"USER: \" ).append( environmentSubstitute( databaseMeta.getUsername() ) ).append( Const.CR );\n    contents.append( \"HOST: \" ).append( environmentSubstitute( databaseMeta.getHostname() ) ).append( Const.CR );\n    contents.append( \"PORT: \" ).append( environmentSubstitute( databaseMeta.getDatabasePortNumberString() ) ).append(\n        Const.CR );\n    contents.append( \"GPLOAD:\" ).append( Const.CR );\n    contents.append( GPLoad.INDENT ).append( \"INPUT: \" ).append( Const.CR );\n    contents.append( GPLoad.INDENT ).append( \"- SOURCE: \" ).append( Const.CR );\n","sourceCodeStart":193,"sourceCodeEnd":229,"githubUrl":"https://github.com/pentaho/pentaho-kettle/blob/f3058517a153da500bf4551f46d79b91bf8ec552/plugins/gpload/core/src/main/java/org/pentaho/di/trans/steps/gpload/GPLoad.java#L193-L229","documentation":"GPLoad requires a field delimiter to write the data-file format into the gpload control file. If meta.getDelimiter() is empty (or empty after environment substitution and trim), the exception is thrown because gpload cannot parse the data file without a defined delimiter.","triggerScenarios":"getControlFileContents invoked while meta.getDelimiter() is null/empty, including the case where a delimiter given as an environment variable substitutes to an empty string.","commonSituations":"Delimiter field left blank in the dialog; ${DELIMITER} variable not defined; delimiter accidentally whitespace-only; metadata import dropped the setting.","solutions":["Enter a delimiter (e.g. tab, comma, '|') in the GPLoad step dialog.","Define any delimiter environment variables in kettle.properties or the job's variable scope before execution.","Avoid whitespace-only values; the trim check is designed to reject them.","Set meta.setDelimiter(\"\\t\") programmatically before the step runs."],"exampleFix":"// before\nmeta.setDelimiter(\"${DELIM}\"); // variable undefined -> empty -> throws\n// after\nmeta.setDelimiter(\"|\"); // or define DELIM=| in kettle.properties","handlingStrategy":"validation","validationCode":"String delim = meta.getDelimiter() == null ? null : meta.getDelimiter().trim();\nif (delim == null || delim.isEmpty()) {\n  throw new IllegalArgumentException(\"Delimiter must be set for GPLoad\");\n}","typeGuard":null,"tryCatchPattern":"try {\n  step.createControlFile(meta);\n} catch (KettleException e) {\n  if (e.getMessage().contains(\"DelimiterMissing\")) { /* set delimiter or define variable */ }\n  else throw e;\n}","preventionTips":["Choose an explicit delimiter (e.g. \\t, |) whenever configuring the step.","Define delimiter variables in kettle.properties so all environments resolve them.","Avoid whitespace-only delimiter values.","Validate with the dialog's YAML test before executing."],"tags":["kettle","gpload","greenplum","configuration","delimiter"],"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"}