{"record":{"id":"4d4a072721987dec","repo":"apache/cassandra","slug":"map-entry-predicates-on-frozen-map-column-s-are-n-4d4a07","errorCode":null,"errorMessage":"Map-entry predicates on frozen map column %s are not supported","messagePattern":"Map-entry predicates on frozen map column (.+?) are not supported","errorType":"validation","errorClass":"InvalidRequestException","httpStatus":null,"severity":"error","filePath":"src/java/org/apache/cassandra/cql3/restrictions/SimpleRestriction.java","lineNumber":449,"sourceCode":"                        throw invalidRequest(\"Multicolumn IN filters are not supported\");\n                    }\n                }\n                break;\n            case ELEMENT:\n                // TODO only map elements supported for now\n                if (columnsExpression.isMapElementExpression())\n                {\n                    // For frozen maps, check if any index on the column can support map entry predicates\n                    // either directly or via filtering. If not, throw an error.\n                    if (column.type.isFrozenCollection())\n                    {\n                        for (Index index : indexRegistry.listIndexes())\n                        {\n                            if (index.dependsOn(column)\n                                && !index.supportsMapElementExpression()\n                                && !index.supportsFilteringOnMapElementExpression())\n                            {\n                                throw invalidRequest(Relation.FROZEN_MAP_ENTRY_PREDICATES_NOT_SUPPORTED, column.name);\n                            }\n                        }\n                    }\n\n                    ByteBuffer key = columnsExpression.element(context);\n                    if (key == null)\n                        throw invalidRequest(\"Invalid null map key for column %s\", column.name.toCQLString());\n                    if (key == ByteBufferUtil.UNSET_BYTE_BUFFER)\n                        throw invalidRequest(\"Invalid unset map key for column %s\", column.name.toCQLString());\n                    List<ByteBuffer> values = bindAndGet(context);\n                    filter.addMapEquality(column, key, operator, values.get(0));\n                }\n                break;\n            default: throw new UnsupportedOperationException();\n        }\n    }\n\n    private static ByteBuffer multiInputOperatorValues(ColumnMetadata column, List<ByteBuffer> values)","sourceCodeStart":431,"sourceCodeEnd":467,"githubUrl":"https://github.com/apache/cassandra/blob/88fd0f6a0eaed8943f05ac9e8f947882b8ddc8f1/src/java/org/apache/cassandra/cql3/restrictions/SimpleRestriction.java#L431-L467","documentation":"Map-entry predicates (map[key] = value style) are not supported on frozen map columns. During addToRowFilter, if any index depends on the frozen map column but supports neither map element expressions nor filtering on them, Cassandra throws this error naming the column.","triggerScenarios":"Query like 'WHERE frozen_map_col[?] = ?' (entry/element predicate) against a column declared FROZEN<map<..>>, with an index depending on that column that lacks entry-expression support.","commonSituations":"Declaring a map as frozen for schema convenience then attempting key/value entry lookups; confusing frozen vs non-frozen index capabilities (SAI supports element expressions on non-frozen collections only).","solutions":["Remove FROZEN from the map column so element/entry expressions are supported by the index (requires data migration)","Rewrite the predicate to filter on the whole frozen map value with equality","Filter map entries client-side after retrieving the rows"],"exampleFix":"// before\nCREATE TABLE t (m FROZEN<MAP<text, int>>);\nSELECT * FROM t WHERE m['k'] = 1;\n// after\nCREATE TABLE t (m MAP<text, int>);\nCREATE INDEX t_m_idx ON t (ENTRIES(m));\nSELECT * FROM t WHERE m['k'] = 1;","handlingStrategy":"validation","validationCode":"if (column.isFrozen() && predicate.isMapEntry()) throw new IllegalArgumentException(\"entry predicates need non-frozen map\");","typeGuard":"boolean supportsEntryPredicate(ColumnMetadata c) { return c.type instanceof MapType && !c.isFrozen(); }","tryCatchPattern":"catch (InvalidRequestException e) { if (e.getMessage().contains(\"frozen map\")) rewriteToFrozenEqualityQuery(); }","preventionTips":["Keep map columns non-frozen when entry lookups are planned","Check index capabilities (supportsMapElementExpression) in query planning","Add schema-lint tests that flag frozen collections queried with entry predicates"],"tags":["cql","frozen-collection","map-entry","secondary-index"],"backgroundTag":"unsupported-operation","analyzedSha":"88fd0f6a0eaed8943f05ac9e8f947882b8ddc8f1","analyzedAt":"2026-09-10T07:29:22.284Z","contentChangedAt":"2026-09-10T07:29:22.284Z","schemaVersion":2},"datasetVersion":"2026-09-17T15:17:12.973Z"}