private void ParseOpaque(ref PacketReader reader) { var customType = (ColumnType)reader.ReadByte(); int length = ReadDataLength(ref reader); // In JSON fractional seconds part always has 3 bytes // Format is the same as ParseDateTime2 but data is in little-endian order // TIMESTAMP is converted to DATETIME by the server // DATETIME2 dates have ColumnType.DATETIME marker which is confusing switch (customType) { case ColumnType.DECIMAL: case ColumnType.NEWDECIMAL: int metadata = reader.ReadUInt16LittleEndian(); var number = ColumnParser.ParseNewDecimal(ref reader, metadata); _writer.WriteValue((string)number); break; case ColumnType.DATE: _writer.WriteDate(ReadDateTime(ref reader)); break; case ColumnType.TIME: case ColumnType.TIME2: _writer.WriteTime(ReadTime(ref reader)); break; case ColumnType.DATETIME: case ColumnType.DATETIME2: case ColumnType.TIMESTAMP: case ColumnType.TIMESTAMP2: _writer.WriteDateTime(ReadDateTime(ref reader)); break; default: var opaque = reader.ReadByteArraySlow(length); _writer.WriteOpaque(customType, opaque); break; } }