{"record":{"id":"ec89eebc0a3c886e","repo":"apache/beam","slug":"returnlength-cannot-be-0-or-pattern-cannot-be-empty","errorCode":null,"errorMessage":"returnLength cannot be 0 or pattern cannot be empty.","messagePattern":"returnLength cannot be 0 or pattern cannot be empty\\.","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"sdks/java/extensions/sql/src/main/java/org/apache/beam/sdk/extensions/sql/impl/udf/BuiltinStringFunctions.java","lineNumber":129,"sourceCode":"  }\n\n  @UDF(\n      funcName = \"LPAD\",\n      parameterArray = {TypeName.STRING, TypeName.INT64},\n      returnType = TypeName.STRING)\n  @Strict\n  public String lpad(String originalValue, Long returnLength) {\n    return lpad(originalValue, returnLength, \" \");\n  }\n\n  @UDF(\n      funcName = \"LPAD\",\n      parameterArray = {TypeName.STRING, TypeName.INT64, TypeName.STRING},\n      returnType = TypeName.STRING)\n  @Strict\n  public String lpad(String originalValue, Long returnLength, String pattern) {\n    if (returnLength < -1 || pattern.isEmpty()) {\n      throw new IllegalArgumentException(\"returnLength cannot be 0 or pattern cannot be empty.\");\n    }\n\n    if (originalValue.length() == returnLength) {\n      return originalValue;\n    } else if (originalValue.length() < returnLength) { // add padding to left\n      return StringUtils.leftPad(originalValue, Math.toIntExact(returnLength), pattern);\n    } else { // truncating string by str.substring\n      // Java String can only hold a string with Integer.MAX_VALUE as longest length.\n      return originalValue.substring(0, Math.toIntExact(returnLength));\n    }\n  }\n\n  @UDF(\n      funcName = \"LPAD\",\n      parameterArray = {TypeName.BYTES, TypeName.INT64},\n      returnType = TypeName.BYTES)\n  @Strict\n  public byte[] lpad(byte[] originalValue, Long returnLength) {","sourceCodeStart":111,"sourceCodeEnd":147,"githubUrl":"https://github.com/apache/beam/blob/12126d8942aaf848030c478b4c6a28c6af861c66/sdks/java/extensions/sql/src/main/java/org/apache/beam/sdk/extensions/sql/impl/udf/BuiltinStringFunctions.java#L111-L147","documentation":"The LPAD UDF for STRING inputs validates that returnLength is at least -1 and that the pattern is non-empty; otherwise it throws IllegalArgumentException. (The check returnLength < -1 corresponds to the documented contract; null returnLength would NPE earlier.)","triggerScenarios":"Calling LPAD(value, 0, 'x') is allowed by this check but LPAD with pattern '' (empty string) throws; also any returnLength below -1. Note the message text is misleading — it is raised for empty pattern or returnLength < -1, not for 0.","commonSituations":"Dynamic SQL building where the pattern parameter is computed and comes back empty; passing negative lengths from user input; porting queries from other engines with different padding semantics.","solutions":["Provide a non-empty pattern string to LPAD","Ensure returnLength is >= -1 (typically >= 0)","Coalesce NULL/empty pattern inputs to a default pad character (e.g. ' ')","Validate parameters in application code before issuing the SQL"],"exampleFix":"// before\nSELECT LPAD(name, 10, '') FROM users;\n// after\nSELECT LPAD(name, 10, ' ') FROM users;","handlingStrategy":"validation","validationCode":"static boolean isValidLpadParams(String value, Long returnLength, String pattern) {\n  return returnLength != null && returnLength >= -1\n      && pattern != null && !pattern.isEmpty()\n      && value != null;\n}","typeGuard":"static boolean canLpad(Long returnLength, String pattern) {\n  return returnLength != null && returnLength >= -1 && pattern != null && !pattern.isEmpty();\n}","tryCatchPattern":"try {\n  return udf.lpad(value, len, pattern);\n} catch (IllegalArgumentException e) {\n  if (e.getMessage().contains(\"returnLength\") || e.getMessage().contains(\"pattern\")) {\n    return udf.lpad(value, len, DEFAULT_PAD);\n  }\n  throw e;\n}","preventionTips":["Never pass empty pattern strings to LPAD/RPAD","Coalesce NULL/empty patterns to a default pad character","Clamp computed lengths to >= 0 before the query","Validate padding parameters in application code"],"tags":["java","apache-beam","sql","udf","string-functions","argument-validation"],"backgroundTag":"invalid-argument-value","analyzedSha":"12126d8942aaf848030c478b4c6a28c6af861c66","analyzedAt":"2026-09-13T01:50:10.254Z","contentChangedAt":"2026-09-13T01:50:10.254Z","schemaVersion":2},"datasetVersion":"2026-09-14T16:17:12.679Z"}