Source:
<code>static DataType decode(ByteBuf buffer, ProtocolVersion protocolVersion, CodecRegistry codecRegistry) { Name name = Name.fromProtocolId(buffer.readUnsignedShort()); switch (name) { case CUSTOM: String className = CBUtil.readString(buffer); if (DataTypeClassNameParser.isDuration(className)) { return DataType.duration(); } else if (DataTypeClassNameParser.isUserType(className) || DataTypeClassNameParser.isTupleType(className)) { return DataTypeClassNameParser.parseOne(className, protocolVersion, codecRegistry); } else { return custom(className); } case LIST: return list(decode(buffer, protocolVersion, codecRegistry)); case SET: return set(decode(buffer, protocolVersion, codecRegistry)); case MAP: DataType keys = decode(buffer, protocolVersion, codecRegistry); DataType values = decode(buffer, protocolVersion, codecRegistry); return map(keys, values); case UDT: String keyspace = CBUtil.readString(buffer); String type = CBUtil.readString(buffer); int nFields = buffer.readShort() & 0xffff; List<UserType.Field> fields = new ArrayList<UserType.Field>(nFields); for (int i = 0; i < nFields; i++) { String fieldName = CBUtil.readString(buffer); DataType fieldType = decode(buffer, protocolVersion, codecRegistry); fields.add(new UserType.Field(fieldName, fieldType)); } <START> return new UserType(keyspace, type, true, fields, protocolVersion, codecRegistry); <END> case TUPLE: nFields = buffer.readShort() & 0xffff; List<DataType> types = new ArrayList<DataType>(nFields); for (int i = 0; i < nFields; i++) { types.add(decode(buffer, protocolVersion, codecRegistry)); } return new TupleType(types, protocolVersion, codecRegistry); default: return primitiveTypeMap.get(name); } }</code><technical_language>If default frozenness is false, setting true reading resultset metadata? I matter in this context, for consistency I if consider user types non-frozen reading metadata a result response</technical_language>

Target:
static DataType decode(ByteBuf buffer, ProtocolVersion protocolVersion, CodecRegistry codecRegistry) { Name name = Name.fromProtocolId(buffer.readUnsignedShort()); switch (name) { case CUSTOM: String className = CBUtil.readString(buffer); if (DataTypeClassNameParser.isDuration(className)) { return DataType.duration(); } else if (DataTypeClassNameParser.isUserType(className) || DataTypeClassNameParser.isTupleType(className)) { return DataTypeClassNameParser.parseOne(className, protocolVersion, codecRegistry); } else { return custom(className); } case LIST: return list(decode(buffer, protocolVersion, codecRegistry)); case SET: return set(decode(buffer, protocolVersion, codecRegistry)); case MAP: DataType keys = decode(buffer, protocolVersion, codecRegistry); DataType values = decode(buffer, protocolVersion, codecRegistry); return map(keys, values); case UDT: String keyspace = CBUtil.readString(buffer); String type = CBUtil.readString(buffer); int nFields = buffer.readShort() & 0xffff; List<UserType.Field> fields = new ArrayList<UserType.Field>(nFields); for (int i = 0; i < nFields; i++) { String fieldName = CBUtil.readString(buffer); DataType fieldType = decode(buffer, protocolVersion, codecRegistry); fields.add(new UserType.Field(fieldName, fieldType)); } return new UserType(keyspace, type, false, fields, protocolVersion, codecRegistry); case TUPLE: nFields = buffer.readShort() & 0xffff; List<DataType> types = new ArrayList<DataType>(nFields); for (int i = 0; i < nFields; i++) { types.add(decode(buffer, protocolVersion, codecRegistry)); } return new TupleType(types, protocolVersion, codecRegistry); default: return primitiveTypeMap.get(name); } }