{"record":{"id":"29b80eedb108c25a","repo":"apache/cassandra","slug":"maptype-takes-exactly-2-type-parameters","errorCode":null,"errorMessage":"MapType takes exactly 2 type parameters","messagePattern":"MapType takes exactly 2 type parameters","errorType":"exception","errorClass":"ConfigurationException","httpStatus":null,"severity":"error","filePath":"src/java/org/apache/cassandra/db/marshal/MapType.java","lineNumber":69,"sourceCode":"import org.apache.cassandra.utils.bytecomparable.ByteSource;\nimport org.apache.cassandra.utils.bytecomparable.ByteSourceInverse;\n\npublic class MapType<K, V> extends CollectionType<Map<K, V>>\n{\n    // interning instances\n    private static final ConcurrentHashMap<Pair<AbstractType<?>, AbstractType<?>>, MapType> instances = new ConcurrentHashMap<>();\n    private static final ConcurrentHashMap<Pair<AbstractType<?>, AbstractType<?>>, MapType> frozenInstances = new ConcurrentHashMap<>();\n\n    private final AbstractType<K> keys;\n    private final AbstractType<V> values;\n    private final MapSerializer<K, V> serializer;\n    private final boolean isMultiCell;\n\n    public static MapType<?, ?> getInstance(TypeParser parser) throws ConfigurationException, SyntaxException\n    {\n        List<AbstractType<?>> l = parser.getTypeParameters();\n        if (l.size() != 2)\n            throw new ConfigurationException(\"MapType takes exactly 2 type parameters\");\n\n        return getInstance(l.get(0).freeze(), l.get(1).freeze(), true);\n    }\n\n    public static <K, V> MapType<K, V> getInstance(AbstractType<K> keys, AbstractType<V> values, boolean isMultiCell)\n    {\n        ConcurrentHashMap<Pair<AbstractType<?>, AbstractType<?>>, MapType> internMap = isMultiCell ? instances : frozenInstances;\n        Pair<AbstractType<?>, AbstractType<?>> p = Pair.create(keys, values);\n        MapType<K, V> t = internMap.get(p);\n        return null == t\n             ? internMap.computeIfAbsent(p, k -> new MapType<>(k.left, k.right, isMultiCell))\n             : t;\n    }\n\n    private MapType(AbstractType<K> keys, AbstractType<V> values, boolean isMultiCell)\n    {\n        super(ComparisonType.CUSTOM, Kind.MAP);\n        this.keys = keys;","sourceCodeStart":51,"sourceCodeEnd":87,"githubUrl":"https://github.com/apache/cassandra/blob/88fd0f6a0eaed8943f05ac9e8f947882b8ddc8f1/src/java/org/apache/cassandra/db/marshal/MapType.java#L51-L87","documentation":"MapType.getInstance(TypeParser) builds a MapType from parsed type parameters, e.g. map<keyType, valueType>. It throws ConfigurationException when the parser did not supply exactly two type parameters, since a map needs both a key type and a value type.","triggerScenarios":"Invoking TypeParser.parse() on a comparator/validation string like 'org.apache.cassandra.db.marshal.MapType' with zero, one, or three-plus type parameters, or a type string such as map<int> reaching MapType.getInstance(parser).","commonSituations":"Hand-written comparator strings in cassandra.yaml or schema definitions with a malformed map type; programmatic type parsing from user-supplied schema strings; typos dropping one of the two map type arguments.","solutions":["Supply exactly two type parameters: e.g. map<org.apache.cassandra.db.marshal.Int32Type,org.apache.cassandra.db.marshal.UTF8Type>.","Validate the type string before parsing with TypeParser; count the '<...>' parameters for map types.","Catch ConfigurationException around TypeParser.parse()/getInstance and surface a clear schema-definition message to the user."],"exampleFix":"// before\nTypeParser.parse(\"org.apache.cassandra.db.marshal.MapType(org.apache.cassandra.db.marshal.Int32Type)\");\n// after\nTypeParser.parse(\"org.apache.cassandra.db.marshal.MapType(org.apache.cassandra.db.marshal.Int32Type,org.apache.cassandra.db.marshal.UTF8Type)\");","handlingStrategy":"validation","validationCode":"List<AbstractType<?>> params = parser.getTypeParameters();\nif (params.size() != 2)\n    throw new ConfigurationException(\"map type requires exactly 2 parameters, got \" + params.size());","typeGuard":null,"tryCatchPattern":"try {\n    MapType<?, ?> mt = MapType.getInstance(parser);\n} catch (ConfigurationException e) {\n    // report malformed map type definition to user\n} catch (SyntaxException e) {\n    // report unparseable type string\n}","preventionTips":["Always write map types with two parameters: map<k,v>","Use server-generated comparator strings as templates","Validate user-supplied type strings before TypeParser.parse()"],"tags":["cassandra","type-parser","schema","configuration"],"backgroundTag":"missing-required-argument","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"}