{"record":{"id":"3c5adcd0d41368e0","repo":"apache/cassandra","slug":"only-single-character-delimiters-supported-was-s","errorCode":null,"errorMessage":"Only single character delimiters supported, was %s","messagePattern":"Only single character delimiters supported, was (.+?)","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"src/java/org/apache/cassandra/index/sasi/analyzer/DelimiterTokenizingOptions.java","lineNumber":62,"sourceCode":"        public DelimiterTokenizingOptions build()\n        {\n            return new DelimiterTokenizingOptions(delimiter);\n        }\n    }\n\n    static DelimiterTokenizingOptions buildFromMap(Map<String, String> optionsMap)\n    {\n        OptionsBuilder optionsBuilder = new OptionsBuilder();\n\n        for (Map.Entry<String, String> entry : optionsMap.entrySet())\n        {\n            switch (entry.getKey())\n            {\n                case DELIMITER:\n                {\n                    String value = entry.getValue();\n                    if (1 != value.length())\n                        throw new IllegalArgumentException(String.format(\"Only single character delimiters supported, was %s\", value));\n\n                    optionsBuilder.delimiter = entry.getValue().charAt(0);\n                    break;\n                }\n            }\n        }\n        return optionsBuilder.build();\n    }\n}\n","sourceCodeStart":44,"sourceCodeEnd":72,"githubUrl":"https://github.com/apache/cassandra/blob/88fd0f6a0eaed8943f05ac9e8f947882b8ddc8f1/src/java/org/apache/cassandra/index/sasi/analyzer/DelimiterTokenizingOptions.java#L44-L72","documentation":"SASI's DelimiterTokenizingOptions requires the 'delimiter' option to be exactly one character, because the analyzer stores it as a Java char. When buildFromMap reads the DELIMITER entry from the options map and the string is empty or longer than one character, it throws this IllegalArgumentException.","triggerScenarios":"Creating a SASI index with an analyzer whose options map contains 'delimiter' set to a multi-character string (e.g. '||', ', ') or an empty string ''.","commonSituations":"Users specifying a multi-character separator like ', ' or '||' in CREATE CUSTOM INDEX OPTIONS, or templating that leaves delimiter empty.","solutions":["Pass a single-character delimiter string, e.g. 'delimiter': ','","Use a one-char proxy (e.g. ';' instead of '; ') and strip whitespace in a custom analyzer","Empty string: omit the delimiter option entirely or use a single non-delimiter placeholder char"],"exampleFix":"// before\n'options': {'analyzer_class': 'DelimiterAnalyzer', 'delimiter': ', '}\n// after\n'options': {'analyzer_class': 'DelimiterAnalyzer', 'delimiter': ','}","handlingStrategy":"validation","validationCode":"String delim = options.get(\"delimiter\");\nif (delim != null && delim.length() != 1) throw new IllegalArgumentException(\"delimiter must be a single character, was: \" + delim);","typeGuard":null,"tryCatchPattern":"try { createIndex(options); } catch (IllegalArgumentException e) { if (e.getMessage().contains(\"Only single character delimiters\")) { options.put(\"delimiter\", options.get(\"delimiter\").substring(0,1)); createIndex(options); } else throw e; }","preventionTips":["Always use single-character delimiters in SASI DelimiterAnalyzer options","Validate option maps before issuing CREATE CUSTOM INDEX"],"tags":["sasi","index-options","validation","java"],"backgroundTag":"invalid-argument-format","analyzedSha":"88fd0f6a0eaed8943f05ac9e8f947882b8ddc8f1","analyzedAt":"2026-09-10T07:29:22.284Z","contentChangedAt":"2026-09-10T07:29:22.284Z","schemaVersion":2},"datasetVersion":"2026-09-14T16:17:12.679Z"}