{"record":{"id":"31639206a82914d4","repo":"pentaho/pentaho-kettle","slug":"the-function-call-substr-requires-2-or-3-arguments-316392","errorCode":null,"errorMessage":"The function call substr requires 2 or 3 arguments.","messagePattern":"The function call substr requires 2 or 3 arguments\\.","errorType":"exception","errorClass":"RhinoRuntimeError","httpStatus":null,"severity":"error","filePath":"engine/src/main/java/org/pentaho/di/trans/steps/scriptvalues_mod/ScriptValuesAddedFunctions.java","lineNumber":1703,"sourceCode":"\n        if ( from < 0 ) {\n          throw Context.reportRuntimeError( \"start smaller than 0\" );\n        }\n        if ( len < 0 ) {\n          len = 0; // Make it compatible with Javascript substr\n        }\n\n        to = from + len;\n        strLen = sRC.length();\n        if ( to > strLen ) {\n          to = strLen;\n        }\n        sRC = sRC.substring( from, to );\n      } catch ( Exception e ) {\n        throw Context.reportRuntimeError( \"The function call substr is not valid : \" + e.getMessage() );\n      }\n    } else {\n      throw Context.reportRuntimeError( \"The function call substr requires 2 or 3 arguments.\" );\n    }\n    return sRC;\n  }\n\n  // Resolve an IP address\n  public static String resolveIP( Context actualContext, Scriptable actualObject, Object[] ArgList,\n    Function FunctionContext ) {\n    String sRC;\n    if ( ArgList.length == 2 ) {\n      try {\n        InetAddress address = InetAddress.getByName( Context.toString( ArgList[0] ) );\n        if ( Context.toString( ArgList[1] ).equals( \"IP\" ) ) {\n          sRC = address.getHostName();\n        } else {\n          sRC = address.getHostAddress();\n        }\n        if ( sRC.equals( Context.toString( ArgList[0] ) ) ) {\n          sRC = \"-\";","sourceCodeStart":1685,"sourceCodeEnd":1721,"githubUrl":"https://github.com/pentaho/pentaho-kettle/blob/f3058517a153da500bf4551f46d79b91bf8ec552/engine/src/main/java/org/pentaho/di/trans/steps/scriptvalues_mod/ScriptValuesAddedFunctions.java#L1685-L1721","documentation":"Argument-count guard in ScriptValuesAddedFunctions.substr, which extracts a substring JavaScript-style (start index, optional length; negative lengths clamped to 0 and out-of-range ends clamped to string length). It fires when the script calls substr with fewer than 2 or more than 3 arguments; Rhino raises a runtime error. Fix by calling substr with a string plus a start index, optionally a length, e.g. substr(s, 0, 5).","triggerScenarios":"Thrown at engine/src/main/java/org/pentaho/di/trans/steps/scriptvalues_mod/ScriptValuesAddedFunctions.java:1703 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Call substr(string, start) or substr(string, start, length)"],"exampleFix":null,"handlingStrategy":"validation","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"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"}