{"record":{"id":"ff3236c8ef122877","repo":"apache/cassandra","slug":"unsupported-expression","errorCode":null,"errorMessage":"Unsupported expression: ","messagePattern":"Unsupported expression: ","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"src/java/org/apache/cassandra/index/sai/disk/v1/segment/LiteralIndexSegmentSearcher.java","lineNumber":86,"sourceCode":"\n        reader = new LiteralIndexSegmentTermsReader(index.identifier(), indexFiles.termsData(), indexFiles.postingLists(), root, footerPointer);\n    }\n\n    @Override\n    public long indexFileCacheSize()\n    {\n        // trie has no pre-allocated memory.\n        return 0;\n    }\n\n    @Override\n    public KeyRangeIterator search(Expression expression, AbstractBounds<PartitionPosition> keyRange, QueryContext queryContext) throws IOException\n    {\n        if (logger.isTraceEnabled())\n            logger.trace(index.identifier().logMessage(\"Searching on expression '{}'...\"), expression);\n\n        if (!expression.getIndexOperator().isEquality())\n            throw new IllegalArgumentException(index.identifier().logMessage(\"Unsupported expression: \" + expression));\n\n        ByteComparable term = v -> index.termType().asComparableBytes(expression.lower().value.encoded, v);\n        QueryEventListener.TrieIndexEventListener listener = MulticastQueryEventListeners.of(queryContext, perColumnEventListener);\n        return toPrimaryKeyIterator(reader.exactMatch(term, listener, queryContext), queryContext);\n    }\n\n    @Override\n    public String toString()\n    {\n        return MoreObjects.toStringHelper(this).add(\"index\", index).toString();\n    }\n\n    @Override\n    public void close()\n    {\n        reader.close();\n    }\n}","sourceCodeStart":68,"sourceCodeEnd":104,"githubUrl":"https://github.com/apache/cassandra/blob/88fd0f6a0eaed8943f05ac9e8f947882b8ddc8f1/src/java/org/apache/cassandra/index/sai/disk/v1/segment/LiteralIndexSegmentSearcher.java#L68-L104","documentation":"LiteralIndexSegmentSearcher.search() only supports equality matching on literal SAI segments; expressions with other index operators (LIKE prefix/suffix/s contains, CONTAINS KEY, ranges) are rejected by the segment-level trie searcher, which implements only exactMatch. The IllegalArgumentException is annotated with the index identifier for context.","triggerScenarios":"Executing a query whose expression reaches a v1 LiteralIndexSegmentSearcher with getIndexOperator() != equality — e.g. a LIKE '%foo' suffix query routed to a segment searcher that only handles exact terms.","commonSituations":"Running text queries (LIKE with wildcards, CONTAINS) against an index/segment implementation that doesn't support that operation, or version-skew where an operator was added before segment searchers supported it.","solutions":["Restructure the query to use equality on the indexed literal column, or add a text analyzer index supporting the operator (e.g. SAI text indexes for LIKE).","Check the Cassandra version — upgrade if the needed operator (e.g. LIKE) is unsupported on your SAI format version.","If the operator should be supported, it's a query-planning bug: it routed a non-equality expression to the exact-match searcher; report with the query and version."],"exampleFix":"// before\nSELECT * FROM t WHERE c LIKE '%foo'; // unsupported on this searcher\n// after\nSELECT * FROM t WHERE c = 'foo';","handlingStrategy":"validation","validationCode":"if (expression.getIndexOperator() == null || !expression.getIndexOperator().isEquality())\n  throw new IllegalArgumentException(\"Only equality supported on this segment searcher\");","typeGuard":"boolean isEquality(Expression e) { return e.getIndexOperator() != null && e.getIndexOperator().isEquality(); }","tryCatchPattern":"try { return searcher.search(expr, range, ctx); } catch (IllegalArgumentException e) { log.warn(\"Unsupported operator for SAI segment\", e); return KeyRangeIterator.empty(); }","preventionTips":["Check operator support before planning a query against a SAI index version.","Use the analyzer-backed text index for LIKE/CONTAINS queries."],"tags":["cassandra","sai","query","unsupported-operator"],"backgroundTag":"unsupported-operation","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"}