{"record":{"id":"dfc1b020cb8d4c3d","repo":"pinpoint-apm/pinpoint","slug":"unsupported-token-ch","errorCode":null,"errorMessage":"unsupported token:<ch>","messagePattern":"unsupported token:<ch>","errorType":"validation","errorClass":"OracleConnectionStringException","httpStatus":null,"severity":"error","filePath":"agent-module/plugins/oracle-jdbc/src/main/java/com/navercorp/pinpoint/plugin/jdbc/oracle/parser/OracleNetConnectionDescriptorTokenizer.java","lineNumber":88,"sourceCode":"            }\n\n            switch (ch) {\n                case TOKEN_KEY_START:\n                    this.tokenList.add(TOKEN_KEY_START_OBJECT);\n                    break;\n                case TOKEN_EQUAL:\n                    this.tokenList.add(TOKEN_EQUAL_OBJECT);\n                    break;\n                case TOKEN_KEY_END:\n                    this.tokenList.add(TOKEN_KEY_END_OBJECT);\n                    break;\n                case TOKEN_COMMA:\n                case TOKEN_BKSLASH:\n                case TOKEN_DQUOTE:\n                case TOKEN_SQUOTE:\n                    // TODO handle these tokens.\n                    // Need to study how these tokens are used.\n                    throw new OracleConnectionStringException(\"unsupported token:\" + ch);\n                default:\n                    String literal = parseLiteral();\n                    addToken(literal, TYPE_LITERAL);\n            }\n        }\n        this.tokenList.add(TOKEN_EOF_OBJECT);\n    }\n\n    String parseLiteral() {\n        int start = trimLeft();\n\n        for (position = start; position < connectionString.length(); position++) {\n            final char ch = connectionString.charAt(position);\n            switch (ch) {\n                case TOKEN_EQUAL:\n                case TOKEN_KEY_START:\n                case TOKEN_KEY_END:\n                    int end = trimRight(position);","sourceCodeStart":70,"sourceCodeEnd":106,"githubUrl":"https://github.com/pinpoint-apm/pinpoint/blob/744c3d3075e595656abb1ae331ad2c0e4c9eb996/agent-module/plugins/oracle-jdbc/src/main/java/com/navercorp/pinpoint/plugin/jdbc/oracle/parser/OracleNetConnectionDescriptorTokenizer.java#L70-L106","documentation":"OracleNetConnectionDescriptorTokenizer.parse() tokenizes the descriptor character by character; characters classified as comma, backslash, double quote or single quote have no handling and immediately throw 'unsupported token:<ch>'. The tokenizer deliberately rejects punctuation it doesn't understand rather than guessing.","triggerScenarios":"A connection descriptor containing a comma (e.g. ADDRESS_LIST entries separated by ',' instead of nested (ADDRESS_LIST=...)), or quotes/backslashes anywhere in the URL passed through the tokenizer.","commonSituations":"Writing multi-address lists with commas copied from other formats; surrounding values with quotes in config; passwords containing quotes/backslashes embedded directly in the descriptor; Windows-style escaped paths.","solutions":["Replace comma-separated address lists with nested parentheses: (ADDRESS_LIST=(ADDRESS=...)(ADDRESS=...))","Remove quotes around values — descriptor values are bare literals","If a password or value contains quotes/backslashes, pass it via a separate connection property instead of embedding it in the URL","Sanitize/normalize the descriptor (strip whitespace, quotes) before handing it to the parser"],"exampleFix":"// before\nString url = \"jdbc:oracle:thin:@(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=a)(PORT=1521)),(ADDRESS=(PROTOCOL=TCP)(HOST=b)(PORT=1521)))\";\n// after\nString url = \"jdbc:oracle:thin:@(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=a)(PORT=1521))(ADDRESS=(PROTOCOL=TCP)(HOST=b)(PORT=1521)))\";","handlingStrategy":"validation","validationCode":"static boolean hasUnsupportedChars(String descriptor) {\n    for (char c : descriptor.toCharArray()) {\n        if (c == ',' || c == '\\\\' || c == '\"' || c == '\\'') return true;\n    }\n    return false;\n}\n// reject/normalize before parsing","typeGuard":null,"tryCatchPattern":"try {\n    parser.parse(url);\n} catch (OracleConnectionStringException e) {\n    log.error(\"Oracle descriptor contains unsupported character (comma/quote/backslash): {}\", url, e);\n    throw new ConfigurationException(\"Unsupported character in descriptor\", e);\n}","preventionTips":["Express address lists with nested parentheses, never commas","Do not quote values in descriptors; move secrets to connection properties","Normalize/strip quotes and backslashes from config values before building the URL"],"tags":["jdbc","oracle","tokenizer","unsupported-characters"],"backgroundTag":"invalid-url-format","analyzedSha":"744c3d3075e595656abb1ae331ad2c0e4c9eb996","analyzedAt":"2026-09-07T18:48:45.289Z","contentChangedAt":"2026-09-07T18:48:45.289Z","schemaVersion":2},"datasetVersion":"2026-09-17T15:17:12.973Z"}