{"record":{"id":"c37c6cd2dcb0ba32","repo":"apache/cassandra","slug":"reversedtype-takes-exactly-one-argument-types","errorCode":null,"errorMessage":"ReversedType takes exactly one argument, \" + types.size() + \" given","messagePattern":"ReversedType takes exactly one argument, \" \\+ types\\.size\\(\\) \\+ \" given","errorType":"exception","errorClass":"ConfigurationException","httpStatus":null,"severity":"error","filePath":"src/java/org/apache/cassandra/db/marshal/ReversedType.java","lineNumber":46,"sourceCode":"import org.apache.cassandra.exceptions.ConfigurationException;\nimport org.apache.cassandra.serializers.MarshalException;\nimport org.apache.cassandra.serializers.TypeSerializer;\nimport org.apache.cassandra.transport.ProtocolVersion;\nimport org.apache.cassandra.utils.bytecomparable.ByteComparable;\nimport org.apache.cassandra.utils.bytecomparable.ByteSource;\n\npublic class ReversedType<T> extends AbstractType<T>\n{\n    // interning instances\n    private static final Map<AbstractType<?>, ReversedType> instances = new ConcurrentHashMap<>();\n\n    public final AbstractType<T> baseType;\n\n    public static <T> ReversedType<T> getInstance(TypeParser parser)\n    {\n        List<AbstractType<?>> types = parser.getTypeParameters();\n        if (types.size() != 1)\n            throw new ConfigurationException(\"ReversedType takes exactly one argument, \" + types.size() + \" given\");\n        return getInstance((AbstractType<T>) types.get(0));\n    }\n\n    public static <T> ReversedType<T> getInstance(AbstractType<T> baseType)\n    {\n        ReversedType<T> t = instances.get(baseType);\n        return null == t\n             ? instances.computeIfAbsent(baseType, ReversedType::new)\n             : t;\n    }\n\n    private ReversedType(AbstractType<T> baseType)\n    {\n        super(ComparisonType.CUSTOM, baseType.valueLengthIfFixed());\n        this.baseType = baseType;\n    }\n\n    public boolean isEmptyValueMeaningless()","sourceCodeStart":28,"sourceCodeEnd":64,"githubUrl":"https://github.com/apache/cassandra/blob/88fd0f6a0eaed8943f05ac9e8f947882b8ddc8f1/src/java/org/apache/cassandra/db/marshal/ReversedType.java#L28-L64","documentation":"ReversedType.getInstance(TypeParser) wraps a base type with reversed comparator order, e.g. ReversedType(Int32Type). It throws ConfigurationException when the parser supplies a number of type parameters other than exactly one, since ReversedType takes a single base type argument.","triggerScenarios":"Parsing a type string like 'org.apache.cassandra.db.marshal.ReversedType' with zero parameters or with two or more parameters (e.g. ReversedType(Int32Type,UTF8Type)) into ReversedType.getInstance.","commonSituations":"Hand-edited comparator strings in schema definitions or cassandra.yaml; accidental duplication of the inner type; tooling that concatenates type parameters incorrectly.","solutions":["Supply exactly one type parameter: ReversedType(org.apache.cassandra.db.marshal.Int32Type).","Verify the type string parameter count before parsing; use the server-generated comparator string as a template.","Catch ConfigurationException around TypeParser.parse() and report the malformed reversed type definition."],"exampleFix":"// before\nTypeParser.parse(\"ReversedType(Int32Type, UTF8Type)\");\n// after\nTypeParser.parse(\"ReversedType(Int32Type)\");","handlingStrategy":"validation","validationCode":"List<AbstractType<?>> types = parser.getTypeParameters();\nif (types.size() != 1)\n    throw new ConfigurationException(\"ReversedType requires exactly 1 parameter, got \" + types.size());","typeGuard":null,"tryCatchPattern":"try {\n    ReversedType<?> rt = ReversedType.getInstance(parser);\n} catch (ConfigurationException e) {\n    // report malformed reversed type definition\n}","preventionTips":["Write ReversedType with exactly one inner type: ReversedType(Int32Type)","Copy comparator strings from system_schema tables instead of hand-writing them","Validate type strings with TypeParser before schema application"],"tags":["cassandra","type-parser","reversed","configuration"],"backgroundTag":"invalid-argument-value","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"}