{"record":{"id":"dfb7e3b6322d53da","repo":"apache/cassandra","slug":"frozentype-only-accepts-one-parameter","errorCode":null,"errorMessage":"FrozenType() only accepts one parameter","messagePattern":"FrozenType\\(\\) only accepts one parameter","errorType":"validation","errorClass":"SyntaxException","httpStatus":null,"severity":"error","filePath":"src/java/org/apache/cassandra/db/marshal/FrozenType.java","lineNumber":45,"sourceCode":"import org.apache.cassandra.serializers.MarshalException;\nimport org.apache.cassandra.serializers.TypeSerializer;\nimport org.apache.cassandra.transport.ProtocolVersion;\n\n/**\n * A fake type that is only used for parsing type strings that include frozen types.\n */\npublic class FrozenType extends AbstractType<Void>\n{\n    protected FrozenType()\n    {\n        super(ComparisonType.NOT_COMPARABLE);\n    }\n\n    public static AbstractType<?> getInstance(TypeParser parser) throws ConfigurationException, SyntaxException\n    {\n        List<AbstractType<?>> innerTypes = parser.getTypeParameters();\n        if (innerTypes.size() != 1)\n            throw new SyntaxException(\"FrozenType() only accepts one parameter\");\n\n        AbstractType<?> innerType = innerTypes.get(0);\n        return innerType.freeze();\n    }\n\n    public <V> String getString(V value, ValueAccessor<V> accessor)\n    {\n        throw new UnsupportedOperationException();\n    }\n\n    public ByteBuffer fromString(String source) throws MarshalException\n    {\n        throw new UnsupportedOperationException();\n    }\n\n    public Term fromJSONObject(Object parsed) throws MarshalException\n    {\n        throw new UnsupportedOperationException();","sourceCodeStart":27,"sourceCodeEnd":63,"githubUrl":"https://github.com/apache/cassandra/blob/88fd0f6a0eaed8943f05ac9e8f947882b8ddc8f1/src/java/org/apache/cassandra/db/marshal/FrozenType.java#L27-L63","documentation":"FrozenType.getInstance() parses a CQL type specification via TypeParser and requires exactly one nested type parameter, because frozen<T> wraps a single inner type. When the parser returns zero or multiple parameters (e.g. 'FrozenType()' or 'frozen<int, text>'), a SyntaxException with this message is thrown. It is a type-specification grammar error, not a data error.","triggerScenarios":"Parsing a type string like 'FrozenType()' or 'frozen<a, b>' via TypeParser.parse (e.g. in CREATE TABLE / ALTER TYPE parsing or AbstractType.parse) where getTypeParameters() does not yield exactly one inner type.","commonSituations":"Typos in CQL schema definitions (empty frozen<>); hand-written type strings in yaml or tools that build types programmatically; copy-paste of multi-arg generic syntax like frozen<map<text,int>> written as frozen<map<text,int>, something>.","solutions":["Provide exactly one inner type: frozen<map<text, int>>, frozen<list<int>>, etc.","Remove empty or extra type arguments from the type string","For a collection, freeze the whole collection (frozen<map<..>>) rather than passing multiple parameters","Wrap TypeParser.parse calls in try-catch for SyntaxException and surface the offending type string"],"exampleFix":"// before\nCREATE TABLE t (k int PRIMARY KEY, v frozen<int, text>);\n// after\nCREATE TABLE t (k int PRIMARY KEY, v frozen<tuple<int, text>>);","handlingStrategy":"validation","validationCode":"List<AbstractType<?>> params = parser.getTypeParameters();\nif (params.size() != 1) throw new IllegalArgumentException(\"frozen<> requires exactly one type parameter\");","typeGuard":"static boolean isWellFormedFrozenSpec(String typeSpec) { return typeSpec.matches(\"(?i)frozen\\\\s*<[^<>]+>\"); }","tryCatchPattern":"try { AbstractType<?> t = FrozenType.getInstance(parser); } catch (SyntaxException e) { /* fix the type string: exactly one inner type */ }","preventionTips":["Always write frozen<single-inner-type> in CQL schema","Freeze the whole collection (frozen<map<..>>), not multiple args","Use tuple<..> for multi-part types instead of misusing frozen","Lint CQL DDL for frozen<> arity before applying migrations"],"tags":["cassandra","cql","type-parser","syntax"],"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"}