mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-10 01:25:21 +00:00
Revert format changes
This commit is contained in:
parent
2245a8df9d
commit
bb0eff9669
@ -29,7 +29,7 @@ OKPacket::OKPacket(
|
||||
uint8_t header_, uint32_t capabilities_, uint64_t affected_rows_, uint32_t status_flags_, int16_t warnings_,
|
||||
String session_state_changes_, String info_)
|
||||
: header(header_), capabilities(capabilities_), affected_rows(affected_rows_), last_insert_id(0), warnings(warnings_),
|
||||
status_flags(status_flags_), session_state_changes(std::move(session_state_changes_)), info(std::move(info_))
|
||||
status_flags(status_flags_), session_state_changes(std::move(session_state_changes_)), info(std::move(info_))
|
||||
{
|
||||
}
|
||||
|
||||
@ -124,7 +124,8 @@ EOFPacket::EOFPacket() : warnings(0x00), status_flags(0x00)
|
||||
{
|
||||
}
|
||||
|
||||
EOFPacket::EOFPacket(int warnings_, int status_flags_) : warnings(warnings_), status_flags(status_flags_)
|
||||
EOFPacket::EOFPacket(int warnings_, int status_flags_)
|
||||
: warnings(warnings_), status_flags(status_flags_)
|
||||
{
|
||||
}
|
||||
|
||||
@ -196,7 +197,8 @@ void ERRPacket::writePayloadImpl(WriteBuffer & buffer) const
|
||||
buffer.write(error_message.data(), std::min(error_message.length(), MYSQL_ERRMSG_SIZE));
|
||||
}
|
||||
|
||||
ResponsePacket::ResponsePacket(UInt32 server_capability_flags_) : ok(OKPacket(server_capability_flags_))
|
||||
ResponsePacket::ResponsePacket(UInt32 server_capability_flags_)
|
||||
: ok(OKPacket(server_capability_flags_))
|
||||
{
|
||||
}
|
||||
|
||||
|
@ -58,33 +58,17 @@ void ComFieldList::readPayloadImpl(ReadBuffer & payload)
|
||||
readStringUntilEOF(field_wildcard, payload);
|
||||
}
|
||||
|
||||
ColumnDefinition::ColumnDefinition() : character_set(0x00), column_length(0), column_type(MYSQL_TYPE_DECIMAL), flags(0x00)
|
||||
ColumnDefinition::ColumnDefinition()
|
||||
: character_set(0x00), column_length(0), column_type(MYSQL_TYPE_DECIMAL), flags(0x00)
|
||||
{
|
||||
}
|
||||
|
||||
ColumnDefinition::ColumnDefinition(
|
||||
String schema_,
|
||||
String table_,
|
||||
String org_table_,
|
||||
String name_,
|
||||
String org_name_,
|
||||
uint16_t character_set_,
|
||||
uint32_t column_length_,
|
||||
ColumnType column_type_,
|
||||
uint16_t flags_,
|
||||
uint8_t decimals_,
|
||||
bool with_defaults_)
|
||||
: schema(std::move(schema_))
|
||||
, table(std::move(table_))
|
||||
, org_table(std::move(org_table_))
|
||||
, name(std::move(name_))
|
||||
, org_name(std::move(org_name_))
|
||||
, character_set(character_set_)
|
||||
, column_length(column_length_)
|
||||
, column_type(column_type_)
|
||||
, flags(flags_)
|
||||
, decimals(decimals_)
|
||||
, is_comm_field_list_response(with_defaults_)
|
||||
String schema_, String table_, String org_table_, String name_, String org_name_, uint16_t character_set_, uint32_t column_length_,
|
||||
ColumnType column_type_, uint16_t flags_, uint8_t decimals_, bool with_defaults_)
|
||||
: schema(std::move(schema_)), table(std::move(table_)), org_table(std::move(org_table_)), name(std::move(name_)),
|
||||
org_name(std::move(org_name_)), character_set(character_set_), column_length(column_length_), column_type(column_type_),
|
||||
flags(flags_), decimals(decimals_), is_comm_field_list_response(with_defaults_)
|
||||
{
|
||||
}
|
||||
|
||||
@ -96,9 +80,15 @@ ColumnDefinition::ColumnDefinition(
|
||||
|
||||
size_t ColumnDefinition::getPayloadSize() const
|
||||
{
|
||||
return 12 + getLengthEncodedStringSize("def") + getLengthEncodedStringSize(schema) + getLengthEncodedStringSize(table)
|
||||
+ getLengthEncodedStringSize(org_table) + getLengthEncodedStringSize(name) + getLengthEncodedStringSize(org_name)
|
||||
+ getLengthEncodedNumberSize(next_length) + is_comm_field_list_response;
|
||||
return 12 +
|
||||
getLengthEncodedStringSize("def") +
|
||||
getLengthEncodedStringSize(schema) +
|
||||
getLengthEncodedStringSize(table) +
|
||||
getLengthEncodedStringSize(org_table) +
|
||||
getLengthEncodedStringSize(name) +
|
||||
getLengthEncodedStringSize(org_name) +
|
||||
getLengthEncodedNumberSize(next_length) +
|
||||
is_comm_field_list_response;
|
||||
}
|
||||
|
||||
void ColumnDefinition::readPayloadImpl(ReadBuffer & payload)
|
||||
|
@ -12,135 +12,135 @@ namespace DB
|
||||
namespace MySQLProtocol
|
||||
{
|
||||
|
||||
namespace ProtocolText
|
||||
{
|
||||
namespace ProtocolText
|
||||
{
|
||||
|
||||
enum CharacterSet
|
||||
{
|
||||
utf8_general_ci = 33,
|
||||
binary = 63
|
||||
};
|
||||
enum CharacterSet
|
||||
{
|
||||
utf8_general_ci = 33,
|
||||
binary = 63
|
||||
};
|
||||
|
||||
// https://dev.mysql.com/doc/dev/mysql-server/latest/group__group__cs__column__definition__flags.html
|
||||
enum ColumnDefinitionFlags
|
||||
{
|
||||
UNSIGNED_FLAG = 32,
|
||||
BINARY_FLAG = 128
|
||||
};
|
||||
// https://dev.mysql.com/doc/dev/mysql-server/latest/group__group__cs__column__definition__flags.html
|
||||
enum ColumnDefinitionFlags
|
||||
{
|
||||
UNSIGNED_FLAG = 32,
|
||||
BINARY_FLAG = 128
|
||||
};
|
||||
|
||||
enum ColumnType
|
||||
{
|
||||
MYSQL_TYPE_DECIMAL = 0x00,
|
||||
MYSQL_TYPE_TINY = 0x01,
|
||||
MYSQL_TYPE_SHORT = 0x02,
|
||||
MYSQL_TYPE_LONG = 0x03,
|
||||
MYSQL_TYPE_FLOAT = 0x04,
|
||||
MYSQL_TYPE_DOUBLE = 0x05,
|
||||
MYSQL_TYPE_NULL = 0x06,
|
||||
MYSQL_TYPE_TIMESTAMP = 0x07,
|
||||
MYSQL_TYPE_LONGLONG = 0x08,
|
||||
MYSQL_TYPE_INT24 = 0x09,
|
||||
MYSQL_TYPE_DATE = 0x0a,
|
||||
MYSQL_TYPE_TIME = 0x0b,
|
||||
MYSQL_TYPE_DATETIME = 0x0c,
|
||||
MYSQL_TYPE_YEAR = 0x0d,
|
||||
MYSQL_TYPE_NEWDATE = 0x0e,
|
||||
MYSQL_TYPE_VARCHAR = 0x0f,
|
||||
MYSQL_TYPE_BIT = 0x10,
|
||||
MYSQL_TYPE_TIMESTAMP2 = 0x11,
|
||||
MYSQL_TYPE_DATETIME2 = 0x12,
|
||||
MYSQL_TYPE_TIME2 = 0x13,
|
||||
MYSQL_TYPE_JSON = 0xf5,
|
||||
MYSQL_TYPE_NEWDECIMAL = 0xf6,
|
||||
MYSQL_TYPE_ENUM = 0xf7,
|
||||
MYSQL_TYPE_SET = 0xf8,
|
||||
MYSQL_TYPE_TINY_BLOB = 0xf9,
|
||||
MYSQL_TYPE_MEDIUM_BLOB = 0xfa,
|
||||
MYSQL_TYPE_LONG_BLOB = 0xfb,
|
||||
MYSQL_TYPE_BLOB = 0xfc,
|
||||
MYSQL_TYPE_VAR_STRING = 0xfd,
|
||||
MYSQL_TYPE_STRING = 0xfe,
|
||||
MYSQL_TYPE_GEOMETRY = 0xff
|
||||
};
|
||||
enum ColumnType
|
||||
{
|
||||
MYSQL_TYPE_DECIMAL = 0x00,
|
||||
MYSQL_TYPE_TINY = 0x01,
|
||||
MYSQL_TYPE_SHORT = 0x02,
|
||||
MYSQL_TYPE_LONG = 0x03,
|
||||
MYSQL_TYPE_FLOAT = 0x04,
|
||||
MYSQL_TYPE_DOUBLE = 0x05,
|
||||
MYSQL_TYPE_NULL = 0x06,
|
||||
MYSQL_TYPE_TIMESTAMP = 0x07,
|
||||
MYSQL_TYPE_LONGLONG = 0x08,
|
||||
MYSQL_TYPE_INT24 = 0x09,
|
||||
MYSQL_TYPE_DATE = 0x0a,
|
||||
MYSQL_TYPE_TIME = 0x0b,
|
||||
MYSQL_TYPE_DATETIME = 0x0c,
|
||||
MYSQL_TYPE_YEAR = 0x0d,
|
||||
MYSQL_TYPE_NEWDATE = 0x0e,
|
||||
MYSQL_TYPE_VARCHAR = 0x0f,
|
||||
MYSQL_TYPE_BIT = 0x10,
|
||||
MYSQL_TYPE_TIMESTAMP2 = 0x11,
|
||||
MYSQL_TYPE_DATETIME2 = 0x12,
|
||||
MYSQL_TYPE_TIME2 = 0x13,
|
||||
MYSQL_TYPE_JSON = 0xf5,
|
||||
MYSQL_TYPE_NEWDECIMAL = 0xf6,
|
||||
MYSQL_TYPE_ENUM = 0xf7,
|
||||
MYSQL_TYPE_SET = 0xf8,
|
||||
MYSQL_TYPE_TINY_BLOB = 0xf9,
|
||||
MYSQL_TYPE_MEDIUM_BLOB = 0xfa,
|
||||
MYSQL_TYPE_LONG_BLOB = 0xfb,
|
||||
MYSQL_TYPE_BLOB = 0xfc,
|
||||
MYSQL_TYPE_VAR_STRING = 0xfd,
|
||||
MYSQL_TYPE_STRING = 0xfe,
|
||||
MYSQL_TYPE_GEOMETRY = 0xff
|
||||
};
|
||||
|
||||
class ResultSetRow : public IMySQLWritePacket
|
||||
{
|
||||
protected:
|
||||
const Columns & columns;
|
||||
int row_num;
|
||||
size_t payload_size = 0;
|
||||
std::vector<String> serialized;
|
||||
class ResultSetRow : public IMySQLWritePacket
|
||||
{
|
||||
protected:
|
||||
const Columns & columns;
|
||||
int row_num;
|
||||
size_t payload_size = 0;
|
||||
std::vector<String> serialized;
|
||||
|
||||
size_t getPayloadSize() const override;
|
||||
size_t getPayloadSize() const override;
|
||||
|
||||
void writePayloadImpl(WriteBuffer & buffer) const override;
|
||||
void writePayloadImpl(WriteBuffer & buffer) const override;
|
||||
|
||||
public:
|
||||
ResultSetRow(const Serializations & serializations, const Columns & columns_, int row_num_);
|
||||
};
|
||||
public:
|
||||
ResultSetRow(const Serializations & serializations, const Columns & columns_, int row_num_);
|
||||
};
|
||||
|
||||
class ComFieldList : public LimitedReadPacket
|
||||
{
|
||||
public:
|
||||
String table, field_wildcard;
|
||||
class ComFieldList : public LimitedReadPacket
|
||||
{
|
||||
public:
|
||||
String table, field_wildcard;
|
||||
|
||||
void readPayloadImpl(ReadBuffer & payload) override;
|
||||
};
|
||||
void readPayloadImpl(ReadBuffer & payload) override;
|
||||
};
|
||||
|
||||
class ColumnDefinition : public IMySQLWritePacket, public IMySQLReadPacket
|
||||
{
|
||||
public:
|
||||
String schema;
|
||||
String table;
|
||||
String org_table;
|
||||
String name;
|
||||
String org_name;
|
||||
size_t next_length = 0x0c;
|
||||
uint16_t character_set;
|
||||
uint32_t column_length;
|
||||
ColumnType column_type;
|
||||
uint16_t flags;
|
||||
uint8_t decimals = 0x00;
|
||||
/// https://dev.mysql.com/doc/internals/en/com-query-response.html#column-definition
|
||||
/// There are extra fields in the packet for column defaults
|
||||
bool is_comm_field_list_response = false;
|
||||
class ColumnDefinition : public IMySQLWritePacket, public IMySQLReadPacket
|
||||
{
|
||||
public:
|
||||
String schema;
|
||||
String table;
|
||||
String org_table;
|
||||
String name;
|
||||
String org_name;
|
||||
size_t next_length = 0x0c;
|
||||
uint16_t character_set;
|
||||
uint32_t column_length;
|
||||
ColumnType column_type;
|
||||
uint16_t flags;
|
||||
uint8_t decimals = 0x00;
|
||||
/// https://dev.mysql.com/doc/internals/en/com-query-response.html#column-definition
|
||||
/// There are extra fields in the packet for column defaults
|
||||
bool is_comm_field_list_response = false;
|
||||
|
||||
protected:
|
||||
size_t getPayloadSize() const override;
|
||||
protected:
|
||||
size_t getPayloadSize() const override;
|
||||
|
||||
void readPayloadImpl(ReadBuffer & payload) override;
|
||||
void readPayloadImpl(ReadBuffer & payload) override;
|
||||
|
||||
void writePayloadImpl(WriteBuffer & buffer) const override;
|
||||
void writePayloadImpl(WriteBuffer & buffer) const override;
|
||||
|
||||
public:
|
||||
ColumnDefinition();
|
||||
public:
|
||||
ColumnDefinition();
|
||||
|
||||
ColumnDefinition(
|
||||
String schema_,
|
||||
String table_,
|
||||
String org_table_,
|
||||
String name_,
|
||||
String org_name_,
|
||||
uint16_t character_set_,
|
||||
uint32_t column_length_,
|
||||
ColumnType column_type_,
|
||||
uint16_t flags_,
|
||||
uint8_t decimals_,
|
||||
bool with_defaults_ = false);
|
||||
ColumnDefinition(
|
||||
String schema_,
|
||||
String table_,
|
||||
String org_table_,
|
||||
String name_,
|
||||
String org_name_,
|
||||
uint16_t character_set_,
|
||||
uint32_t column_length_,
|
||||
ColumnType column_type_,
|
||||
uint16_t flags_,
|
||||
uint8_t decimals_,
|
||||
bool with_defaults_ = false);
|
||||
|
||||
/// Should be used when column metadata (original name, table, original table, database) is unknown.
|
||||
ColumnDefinition(
|
||||
String name_,
|
||||
uint16_t character_set_,
|
||||
uint32_t column_length_,
|
||||
ColumnType column_type_,
|
||||
uint16_t flags_,
|
||||
uint8_t decimals_);
|
||||
};
|
||||
/// Should be used when column metadata (original name, table, original table, database) is unknown.
|
||||
ColumnDefinition(
|
||||
String name_,
|
||||
uint16_t character_set_,
|
||||
uint32_t column_length_,
|
||||
ColumnType column_type_,
|
||||
uint16_t flags_,
|
||||
uint8_t decimals_);
|
||||
};
|
||||
|
||||
ColumnDefinition getColumnDefinition(const String & column_name, const DataTypePtr & data_type);
|
||||
|
||||
}
|
||||
ColumnDefinition getColumnDefinition(const String & column_name, const DataTypePtr & data_type);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
@ -1,13 +1,13 @@
|
||||
#include <DataTypes/DataTypesDecimal.h>
|
||||
#include <DataTypes/Serializations/SerializationDecimal.h>
|
||||
|
||||
#include <Common/typeid_cast.h>
|
||||
#include <Core/DecimalFunctions.h>
|
||||
#include <DataTypes/DataTypeFactory.h>
|
||||
#include <IO/ReadHelpers.h>
|
||||
#include <IO/WriteHelpers.h>
|
||||
#include <IO/readDecimalText.h>
|
||||
#include <Parsers/ASTLiteral.h>
|
||||
#include <Common/typeid_cast.h>
|
||||
|
||||
#include <type_traits>
|
||||
|
||||
|
@ -28,14 +28,12 @@ void SerializationDate32::deserializeTextEscaped(IColumn & column, ReadBuffer &
|
||||
assert_cast<ColumnInt32 &>(column).getData().push_back(x);
|
||||
}
|
||||
|
||||
void SerializationDate32::serializeTextEscaped(
|
||||
const IColumn & column, size_t row_num, WriteBuffer & ostr, const FormatSettings & settings) const
|
||||
void SerializationDate32::serializeTextEscaped(const IColumn & column, size_t row_num, WriteBuffer & ostr, const FormatSettings & settings) const
|
||||
{
|
||||
serializeText(column, row_num, ostr, settings);
|
||||
}
|
||||
|
||||
void SerializationDate32::serializeTextQuoted(
|
||||
const IColumn & column, size_t row_num, WriteBuffer & ostr, const FormatSettings & settings) const
|
||||
void SerializationDate32::serializeTextQuoted(const IColumn & column, size_t row_num, WriteBuffer & ostr, const FormatSettings & settings) const
|
||||
{
|
||||
writeChar('\'', ostr);
|
||||
serializeText(column, row_num, ostr, settings);
|
||||
@ -48,11 +46,10 @@ void SerializationDate32::deserializeTextQuoted(IColumn & column, ReadBuffer & i
|
||||
assertChar('\'', istr);
|
||||
readDateText(x, istr, time_zone);
|
||||
assertChar('\'', istr);
|
||||
assert_cast<ColumnInt32 &>(column).getData().push_back(x); /// It's important to do this at the end - for exception safety.
|
||||
assert_cast<ColumnInt32 &>(column).getData().push_back(x); /// It's important to do this at the end - for exception safety.
|
||||
}
|
||||
|
||||
void SerializationDate32::serializeTextJSON(
|
||||
const IColumn & column, size_t row_num, WriteBuffer & ostr, const FormatSettings & settings) const
|
||||
void SerializationDate32::serializeTextJSON(const IColumn & column, size_t row_num, WriteBuffer & ostr, const FormatSettings & settings) const
|
||||
{
|
||||
writeChar('"', ostr);
|
||||
serializeText(column, row_num, ostr, settings);
|
||||
@ -68,8 +65,7 @@ void SerializationDate32::deserializeTextJSON(IColumn & column, ReadBuffer & ist
|
||||
assert_cast<ColumnInt32 &>(column).getData().push_back(x);
|
||||
}
|
||||
|
||||
void SerializationDate32::serializeTextCSV(
|
||||
const IColumn & column, size_t row_num, WriteBuffer & ostr, const FormatSettings & settings) const
|
||||
void SerializationDate32::serializeTextCSV(const IColumn & column, size_t row_num, WriteBuffer & ostr, const FormatSettings & settings) const
|
||||
{
|
||||
writeChar('"', ostr);
|
||||
serializeText(column, row_num, ostr, settings);
|
||||
|
@ -1,7 +1,7 @@
|
||||
#pragma once
|
||||
|
||||
#include <Core/Defines.h>
|
||||
#include <Core/Names.h>
|
||||
#include <Core/Defines.h>
|
||||
#include <base/types.h>
|
||||
#include <base/unit.h>
|
||||
|
||||
@ -48,9 +48,9 @@ struct FormatSettings
|
||||
|
||||
enum class DateTimeInputFormat
|
||||
{
|
||||
Basic, /// Default format for fast parsing: YYYY-MM-DD hh:mm:ss (ISO-8601 without fractional part and timezone) or NNNNNNNNNN unix timestamp.
|
||||
BestEffort, /// Use sophisticated rules to parse whatever possible.
|
||||
BestEffortUS /// Use sophisticated rules to parse American style: mm/dd/yyyy
|
||||
Basic, /// Default format for fast parsing: YYYY-MM-DD hh:mm:ss (ISO-8601 without fractional part and timezone) or NNNNNNNNNN unix timestamp.
|
||||
BestEffort, /// Use sophisticated rules to parse whatever possible.
|
||||
BestEffortUS /// Use sophisticated rules to parse American style: mm/dd/yyyy
|
||||
};
|
||||
|
||||
DateTimeInputFormat date_time_input_format = DateTimeInputFormat::Basic;
|
||||
|
@ -17,7 +17,8 @@ using namespace MySQLProtocol::ProtocolText;
|
||||
using namespace MySQLProtocol::ProtocolBinary;
|
||||
|
||||
MySQLOutputFormat::MySQLOutputFormat(WriteBuffer & out_, const Block & header_, const FormatSettings & settings_)
|
||||
: IOutputFormat(header_, out_), client_capabilities(settings_.mysql_wire.client_capabilities)
|
||||
: IOutputFormat(header_, out_)
|
||||
, client_capabilities(settings_.mysql_wire.client_capabilities)
|
||||
{
|
||||
/// MySQlWire is a special format that is usually used as output format for MySQL protocol connections.
|
||||
/// In this case we have a correct `sequence_id` stored in `settings_.mysql_wire`.
|
||||
@ -137,8 +138,9 @@ void registerOutputFormatMySQLWire(FormatFactory & factory)
|
||||
{
|
||||
factory.registerOutputFormat(
|
||||
"MySQLWire",
|
||||
[](WriteBuffer & buf, const Block & sample, const FormatSettings & settings)
|
||||
{ return std::make_shared<MySQLOutputFormat>(buf, sample, settings); });
|
||||
[](WriteBuffer & buf,
|
||||
const Block & sample,
|
||||
const FormatSettings & settings) { return std::make_shared<MySQLOutputFormat>(buf, sample, settings); });
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -67,7 +67,10 @@ static String killConnectionIdReplacementQuery(const String & query);
|
||||
static String selectLimitReplacementQuery(const String & query);
|
||||
|
||||
MySQLHandler::MySQLHandler(
|
||||
IServer & server_, TCPServer & tcp_server_, const Poco::Net::StreamSocket & socket_, bool ssl_enabled, uint32_t connection_id_)
|
||||
IServer & server_,
|
||||
TCPServer & tcp_server_,
|
||||
const Poco::Net::StreamSocket & socket_,
|
||||
bool ssl_enabled, uint32_t connection_id_)
|
||||
: Poco::Net::TCPServerConnection(socket_)
|
||||
, server(server_)
|
||||
, tcp_server(tcp_server_)
|
||||
@ -75,8 +78,7 @@ MySQLHandler::MySQLHandler(
|
||||
, connection_id(connection_id_)
|
||||
, auth_plugin(new MySQLProtocol::Authentication::Native41())
|
||||
{
|
||||
server_capabilities = CLIENT_PROTOCOL_41 | CLIENT_SECURE_CONNECTION | CLIENT_PLUGIN_AUTH | CLIENT_PLUGIN_AUTH_LENENC_CLIENT_DATA
|
||||
| CLIENT_CONNECT_WITH_DB | CLIENT_DEPRECATE_EOF;
|
||||
server_capabilities = CLIENT_PROTOCOL_41 | CLIENT_SECURE_CONNECTION | CLIENT_PLUGIN_AUTH | CLIENT_PLUGIN_AUTH_LENENC_CLIENT_DATA | CLIENT_CONNECT_WITH_DB | CLIENT_DEPRECATE_EOF;
|
||||
if (ssl_enabled)
|
||||
server_capabilities |= CLIENT_SSL;
|
||||
|
||||
@ -102,13 +104,8 @@ void MySQLHandler::run()
|
||||
|
||||
try
|
||||
{
|
||||
Handshake handshake(
|
||||
server_capabilities,
|
||||
connection_id,
|
||||
VERSION_STRING + String("-") + VERSION_NAME,
|
||||
auth_plugin->getName(),
|
||||
auth_plugin->getAuthPluginData(),
|
||||
CharacterSet::utf8_general_ci);
|
||||
Handshake handshake(server_capabilities, connection_id, VERSION_STRING + String("-") + VERSION_NAME,
|
||||
auth_plugin->getName(), auth_plugin->getAuthPluginData(), CharacterSet::utf8_general_ci);
|
||||
packet_endpoint->sendPacket<Handshake>(handshake, true);
|
||||
|
||||
LOG_TRACE(log, "Sent handshake");
|
||||
@ -118,10 +115,8 @@ void MySQLHandler::run()
|
||||
client_capabilities = handshake_response.capability_flags;
|
||||
max_packet_size = handshake_response.max_packet_size ? handshake_response.max_packet_size : MAX_PACKET_LENGTH;
|
||||
|
||||
LOG_TRACE(
|
||||
log,
|
||||
"Capabilities: {}, max_packet_size: {}, character_set: {}, user: {}, auth_response length: {}, database: {}, auth_plugin_name: "
|
||||
"{}",
|
||||
LOG_TRACE(log,
|
||||
"Capabilities: {}, max_packet_size: {}, character_set: {}, user: {}, auth_response length: {}, database: {}, auth_plugin_name: {}",
|
||||
handshake_response.capability_flags,
|
||||
handshake_response.max_packet_size,
|
||||
static_cast<int>(handshake_response.character_set),
|
||||
@ -165,8 +160,8 @@ void MySQLHandler::run()
|
||||
// For commands which are executed without MemoryTracker.
|
||||
LimitReadBuffer limited_payload(payload, 10000, /* trow_exception */ true, /* exact_limit */ {}, "too long MySQL packet.");
|
||||
|
||||
LOG_DEBUG(
|
||||
log, "Received command: {}. Connection id: {}.", static_cast<int>(static_cast<unsigned char>(command)), connection_id);
|
||||
LOG_DEBUG(log, "Received command: {}. Connection id: {}.",
|
||||
static_cast<int>(static_cast<unsigned char>(command)), connection_id);
|
||||
|
||||
if (!tcp_server.isOpen())
|
||||
return;
|
||||
@ -232,15 +227,13 @@ void MySQLHandler::finishHandshake(MySQLProtocol::ConnectionPhase::HandshakeResp
|
||||
size_t pos = 0;
|
||||
|
||||
/// Reads at least count and at most packet_size bytes.
|
||||
auto read_bytes = [this, &buf, &pos, &packet_size](size_t count) -> void
|
||||
{
|
||||
auto read_bytes = [this, &buf, &pos, &packet_size](size_t count) -> void {
|
||||
while (pos < count)
|
||||
{
|
||||
int ret = socket().receiveBytes(buf + pos, static_cast<uint32_t>(packet_size - pos));
|
||||
if (ret == 0)
|
||||
{
|
||||
throw Exception(
|
||||
ErrorCodes::CANNOT_READ_ALL_DATA, "Cannot read all data. Bytes read: {}. Bytes expected: 3", std::to_string(pos));
|
||||
throw Exception(ErrorCodes::CANNOT_READ_ALL_DATA, "Cannot read all data. Bytes read: {}. Bytes expected: 3", std::to_string(pos));
|
||||
}
|
||||
pos += ret;
|
||||
}
|
||||
@ -279,8 +272,7 @@ void MySQLHandler::authenticate(const String & user_name, const String & auth_pl
|
||||
authPluginSSL();
|
||||
}
|
||||
|
||||
std::optional<String> auth_response
|
||||
= auth_plugin_name == auth_plugin->getName() ? std::make_optional<String>(initial_auth_response) : std::nullopt;
|
||||
std::optional<String> auth_response = auth_plugin_name == auth_plugin->getName() ? std::make_optional<String>(initial_auth_response) : std::nullopt;
|
||||
auth_plugin->authenticate(user_name, *session, auth_response, packet_endpoint, secure_connection, socket().peerAddress());
|
||||
}
|
||||
catch (const Exception & exc)
|
||||
@ -312,17 +304,8 @@ void MySQLHandler::comFieldList(ReadBuffer & payload)
|
||||
for (const NameAndTypePair & column : metadata_snapshot->getColumns().getAll())
|
||||
{
|
||||
ColumnDefinition column_definition(
|
||||
database,
|
||||
packet.table,
|
||||
packet.table,
|
||||
column.name,
|
||||
column.name,
|
||||
CharacterSet::binary,
|
||||
100,
|
||||
ColumnType::MYSQL_TYPE_STRING,
|
||||
0,
|
||||
0,
|
||||
true);
|
||||
database, packet.table, packet.table, column.name, column.name, CharacterSet::binary, 100, ColumnType::MYSQL_TYPE_STRING, 0, 0, true
|
||||
);
|
||||
packet_endpoint->sendPacket(column_definition);
|
||||
}
|
||||
packet_endpoint->sendPacket(OKPacket(0xfe, client_capabilities, 0, 0, 0), true);
|
||||
@ -367,16 +350,15 @@ void MySQLHandler::comQuery(ReadBuffer & payload, bool use_binary_protocol_resul
|
||||
query_context->setCurrentQueryId(fmt::format("mysql:{}:{}", connection_id, toString(UUIDHelpers::generateV4())));
|
||||
CurrentThread::QueryScope query_scope{query_context};
|
||||
|
||||
std::atomic<size_t> affected_rows{0};
|
||||
std::atomic<size_t> affected_rows {0};
|
||||
auto prev = query_context->getProgressCallback();
|
||||
query_context->setProgressCallback(
|
||||
[&, my_prev = prev](const Progress & progress)
|
||||
{
|
||||
if (my_prev)
|
||||
my_prev(progress);
|
||||
query_context->setProgressCallback([&, my_prev = prev](const Progress & progress)
|
||||
{
|
||||
if (my_prev)
|
||||
my_prev(progress);
|
||||
|
||||
affected_rows += progress.written_rows;
|
||||
});
|
||||
affected_rows += progress.written_rows;
|
||||
});
|
||||
|
||||
FormatSettings format_settings;
|
||||
format_settings.mysql_wire.client_capabilities = client_capabilities;
|
||||
@ -475,17 +457,13 @@ void MySQLHandler::comStmtClose(ReadBuffer & payload)
|
||||
|
||||
void MySQLHandler::authPluginSSL()
|
||||
{
|
||||
throw Exception(
|
||||
ErrorCodes::SUPPORT_IS_DISABLED,
|
||||
"ClickHouse was built without SSL support. Try specifying password using double SHA1 in users.xml.");
|
||||
throw Exception(ErrorCodes::SUPPORT_IS_DISABLED,
|
||||
"ClickHouse was built without SSL support. Try specifying password using double SHA1 in users.xml.");
|
||||
}
|
||||
|
||||
void MySQLHandler::finishHandshakeSSL(
|
||||
[[maybe_unused]] size_t packet_size,
|
||||
[[maybe_unused]] char * buf,
|
||||
[[maybe_unused]] size_t pos,
|
||||
[[maybe_unused]] std::function<void(size_t)> read_bytes,
|
||||
[[maybe_unused]] MySQLProtocol::ConnectionPhase::HandshakeResponse & packet)
|
||||
[[maybe_unused]] size_t packet_size, [[maybe_unused]] char * buf, [[maybe_unused]] size_t pos,
|
||||
[[maybe_unused]] std::function<void(size_t)> read_bytes, [[maybe_unused]] MySQLProtocol::ConnectionPhase::HandshakeResponse & packet)
|
||||
{
|
||||
throw Exception(ErrorCodes::SUPPORT_IS_DISABLED, "Client requested SSL, while it is disabled.");
|
||||
}
|
||||
@ -499,9 +477,10 @@ MySQLHandlerSSL::MySQLHandlerSSL(
|
||||
uint32_t connection_id_,
|
||||
RSA & public_key_,
|
||||
RSA & private_key_)
|
||||
: MySQLHandler(server_, tcp_server_, socket_, ssl_enabled, connection_id_), public_key(public_key_), private_key(private_key_)
|
||||
{
|
||||
}
|
||||
: MySQLHandler(server_, tcp_server_, socket_, ssl_enabled, connection_id_)
|
||||
, public_key(public_key_)
|
||||
, private_key(private_key_)
|
||||
{}
|
||||
|
||||
void MySQLHandlerSSL::authPluginSSL()
|
||||
{
|
||||
@ -509,10 +488,7 @@ void MySQLHandlerSSL::authPluginSSL()
|
||||
}
|
||||
|
||||
void MySQLHandlerSSL::finishHandshakeSSL(
|
||||
size_t packet_size,
|
||||
char * buf,
|
||||
size_t pos,
|
||||
std::function<void(size_t)> read_bytes,
|
||||
size_t packet_size, char *buf, size_t pos, std::function<void(size_t)> read_bytes,
|
||||
MySQLProtocol::ConnectionPhase::HandshakeResponse & packet)
|
||||
{
|
||||
read_bytes(packet_size); /// Reading rest SSLRequest.
|
||||
@ -542,8 +518,8 @@ static bool isFederatedServerSetupSetCommand(const String & query)
|
||||
"|(^(SET AUTOCOMMIT(.*)))"
|
||||
"|(^(SET sql_mode(.*)))"
|
||||
"|(^(SET @@(.*)))"
|
||||
"|(^(SET SESSION TRANSACTION ISOLATION LEVEL(.*)))",
|
||||
std::regex::icase};
|
||||
"|(^(SET SESSION TRANSACTION ISOLATION LEVEL(.*)))"
|
||||
, std::regex::icase};
|
||||
return 1 == std::regex_match(query, expr);
|
||||
}
|
||||
|
||||
|
@ -19,7 +19,7 @@
|
||||
|
||||
namespace CurrentMetrics
|
||||
{
|
||||
extern const Metric MySQLConnection;
|
||||
extern const Metric MySQLConnection;
|
||||
}
|
||||
|
||||
namespace DB
|
||||
@ -32,7 +32,11 @@ class MySQLHandler : public Poco::Net::TCPServerConnection
|
||||
{
|
||||
public:
|
||||
MySQLHandler(
|
||||
IServer & server_, TCPServer & tcp_server_, const Poco::Net::StreamSocket & socket_, bool ssl_enabled, uint32_t connection_id_);
|
||||
IServer & server_,
|
||||
TCPServer & tcp_server_,
|
||||
const Poco::Net::StreamSocket & socket_,
|
||||
bool ssl_enabled,
|
||||
uint32_t connection_id_);
|
||||
|
||||
void run() final;
|
||||
|
||||
@ -59,12 +63,7 @@ protected:
|
||||
void comStmtClose(ReadBuffer & payload);
|
||||
|
||||
virtual void authPluginSSL();
|
||||
virtual void finishHandshakeSSL(
|
||||
size_t packet_size,
|
||||
char * buf,
|
||||
size_t pos,
|
||||
std::function<void(size_t)> read_bytes,
|
||||
MySQLProtocol::ConnectionPhase::HandshakeResponse & packet);
|
||||
virtual void finishHandshakeSSL(size_t packet_size, char * buf, size_t pos, std::function<void(size_t)> read_bytes, MySQLProtocol::ConnectionPhase::HandshakeResponse & packet);
|
||||
|
||||
IServer & server;
|
||||
TCPServer & tcp_server;
|
||||
@ -110,11 +109,8 @@ private:
|
||||
void authPluginSSL() override;
|
||||
|
||||
void finishHandshakeSSL(
|
||||
size_t packet_size,
|
||||
char * buf,
|
||||
size_t pos,
|
||||
std::function<void(size_t)> read_bytes,
|
||||
MySQLProtocol::ConnectionPhase::HandshakeResponse & packet) override;
|
||||
size_t packet_size, char * buf, size_t pos,
|
||||
std::function<void(size_t)> read_bytes, MySQLProtocol::ConnectionPhase::HandshakeResponse & packet) override;
|
||||
|
||||
RSA & public_key;
|
||||
RSA & private_key;
|
||||
|
Loading…
Reference in New Issue
Block a user