{"record":{"id":"01c7fc45ea0bf0b5","repo":"brettwooldridge/HikariCP","slug":"unterminated-escape-sequence-in-property-value-s","errorCode":null,"errorMessage":"Unterminated escape sequence in property value: %s","messagePattern":"Unterminated escape sequence in property value: (.+?)","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"src/main/java/com/zaxxer/hikari/util/PropertyElf.java","lineNumber":239,"sourceCode":"      for (var c : value.toCharArray())\n      {\n         if (inEscape) {\n            currentField.append(c);\n            inEscape = false;\n         }\n         else if (c == ESCAPE_CHAR) {\n            inEscape = true;\n         } else if (c == SEPARATOR_CHAR) {\n            resultList.add(currentField.toString());\n            currentField.setLength(0);\n         }\n         else {\n            currentField.append(c);\n         }\n      }\n\n      if (inEscape) {\n         throw new IllegalArgumentException(String.format(\"Unterminated escape sequence in property value: %s\", value));\n      }\n\n      resultList.add(currentField.toString());\n      return resultList.toArray(new String[0]);\n   }\n\n   private static Optional<Duration> parseDuration(String value)\n   {\n      var matcher = DURATION_PATTERN.matcher(value);\n      if (matcher.matches()) {\n         var number = Long.parseLong(matcher.group(\"number\"));\n         var unit = matcher.group(\"unit\");\n         switch (unit) {\n            case \"ms\":\n               return Optional.of(Duration.ofMillis(number));\n            case \"s\":\n               return Optional.of(Duration.ofSeconds(number));\n            case \"m\":","sourceCodeStart":221,"sourceCodeEnd":257,"githubUrl":"https://github.com/brettwooldridge/HikariCP/blob/a4d93f4f85517f90e632b795486d7102e933d7ff/src/main/java/com/zaxxer/hikari/util/PropertyElf.java#L221-L257","documentation":"PropertyElf's property splitter supports escaped separators/escape characters in comma-separated values (e.g. data source property lists). If a value ends while an escape is still open (trailing backslash), the unterminated escape throws IllegalArgumentException.","triggerScenarios":"A properties value ending with a lone backslash before the closing state, e.g. dataSourceProperties with a Windows path or regex ending in \\\\; doubling of a separator escaped at value end; hand-edited property files with trailing escape characters.","commonSituations":"Windows file paths in dataSourceProperties values, regex or glob patterns as property values, escaping mistakes when programmatically building property strings.","solutions":["Terminate or remove the trailing escape character in the offending property value","Escape backslashes properly (use \\\\\\\\ for a literal backslash where the format expects doubling)","For filesystem paths prefer forward slashes or pass them via dataSourceProperties map in code rather than flat properties","Validate property values before feeding them to HikariConfig(Properties)"],"exampleFix":"# before\ndataSourceProperties.serverName=myhost\\\\\n\n# after\ndataSourceProperties.serverName=myhost","handlingStrategy":"validation","validationCode":"static boolean hasUnterminatedEscape(String v) {\n    boolean esc = false;\n    for (char c : v.toCharArray()) {\n        esc = (esc && c != PropertyElf.ESCAPE_CHAR) ? false : (c == PropertyElf.ESCAPE_CHAR && !esc);\n        // simplified parity check\n    }\n    return false;\n}\n// simpler: reject values ending in a single backslash\nboolean bad = value.endsWith(\"\\\\\") && !value.endsWith(\"\\\\\\\\\");","typeGuard":null,"tryCatchPattern":"try { new HikariConfig(props); }\ncatch (IllegalArgumentException e) {\n    if (e.getMessage().contains(\"Unterminated escape sequence\")) { /* fix trailing backslash in value */ }\n    throw e;\n}","preventionTips":["Never end property values with a lone backslash","Double-escape literal backslashes","Pass complex values via maps in code, not flat properties"],"tags":["hikaricp","properties","escaping","configuration"],"backgroundTag":null,"analyzedSha":"a4d93f4f85517f90e632b795486d7102e933d7ff","analyzedAt":"2026-08-14T12:11:37.292Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}