diff options
| author | vitalyisaev <[email protected]> | 2023-11-14 09:58:56 +0300 |
|---|---|---|
| committer | vitalyisaev <[email protected]> | 2023-11-14 10:20:20 +0300 |
| commit | c2b2dfd9827a400a8495e172a56343462e3ceb82 (patch) | |
| tree | cd4e4f597d01bede4c82dffeb2d780d0a9046bd0 /contrib/clickhouse/src/Core/MySQL/IMySQLReadPacket.cpp | |
| parent | d4ae8f119e67808cb0cf776ba6e0cf95296f2df7 (diff) | |
YQ Connector: move tests from yql to ydb (OSS)
Перенос папки с тестами на Коннектор из папки yql в папку ydb (синхронизируется с github).
Diffstat (limited to 'contrib/clickhouse/src/Core/MySQL/IMySQLReadPacket.cpp')
| -rw-r--r-- | contrib/clickhouse/src/Core/MySQL/IMySQLReadPacket.cpp | 91 |
1 files changed, 91 insertions, 0 deletions
diff --git a/contrib/clickhouse/src/Core/MySQL/IMySQLReadPacket.cpp b/contrib/clickhouse/src/Core/MySQL/IMySQLReadPacket.cpp new file mode 100644 index 00000000000..bb00444c6b3 --- /dev/null +++ b/contrib/clickhouse/src/Core/MySQL/IMySQLReadPacket.cpp @@ -0,0 +1,91 @@ +#include <Core/MySQL/IMySQLReadPacket.h> +#include <IO/MySQLPacketPayloadReadBuffer.h> +#include <IO/LimitReadBuffer.h> + +namespace DB +{ + +namespace ErrorCodes +{ + extern const int UNKNOWN_PACKET_FROM_CLIENT; +} + +namespace MySQLProtocol +{ + +void IMySQLReadPacket::readPayload(ReadBuffer & in, uint8_t & sequence_id) +{ + MySQLPacketPayloadReadBuffer payload(in, sequence_id); + payload.next(); + readPayloadImpl(payload); + if (!payload.eof()) + { + throw Exception(ErrorCodes::UNKNOWN_PACKET_FROM_CLIENT, + "Packet payload is not fully read. Stopped after {} bytes, while {} bytes are in buffer.", + payload.count(), payload.available()); + } +} + +void IMySQLReadPacket::readPayloadWithUnpacked(ReadBuffer & in) +{ + readPayloadImpl(in); +} + +void LimitedReadPacket::readPayload(ReadBuffer &in, uint8_t &sequence_id) +{ + LimitReadBuffer limited(in, 10000, /* trow_exception */ true, /* exact_limit */ {}, "too long MySQL packet."); + IMySQLReadPacket::readPayload(limited, sequence_id); +} + +void LimitedReadPacket::readPayloadWithUnpacked(ReadBuffer & in) +{ + LimitReadBuffer limited(in, 10000, /* trow_exception */ true, /* exact_limit */ {}, "too long MySQL packet."); + IMySQLReadPacket::readPayloadWithUnpacked(limited); +} + +uint64_t readLengthEncodedNumber(ReadBuffer & buffer, UInt16 & bytes_read) +{ + char c{}; + uint64_t buf = 0; + buffer.readStrict(c); + bytes_read = 1; + auto cc = static_cast<uint8_t>(c); + switch (cc) + { + /// NULL + case 0xfb: + break; + case 0xfc: + buffer.readStrict(reinterpret_cast<char *>(&buf), 2); + bytes_read += 2; + break; + case 0xfd: + buffer.readStrict(reinterpret_cast<char *>(&buf), 3); + bytes_read += 3; + break; + case 0xfe: + buffer.readStrict(reinterpret_cast<char *>(&buf), 8); + bytes_read += 8; + break; + default: + return cc; + } + return buf; +} + +uint64_t readLengthEncodedNumber(ReadBuffer & buffer) +{ + UInt16 bytes_read = 0; + return readLengthEncodedNumber(buffer, bytes_read); +} + +void readLengthEncodedString(String & s, ReadBuffer & buffer) +{ + uint64_t len = readLengthEncodedNumber(buffer); + s.resize(len); + buffer.readStrict(reinterpret_cast<char *>(s.data()), len); +} + +} + +} |
