mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-21 15:12:02 +00:00
fix MySQL COMM_FIELD_LIST response
This commit is contained in:
parent
dab2356833
commit
97f4c457ec
@ -259,6 +259,7 @@ function run_tests
|
|||||||
00929_multi_match_edit_distance
|
00929_multi_match_edit_distance
|
||||||
01681_hyperscan_debug_assertion
|
01681_hyperscan_debug_assertion
|
||||||
|
|
||||||
|
01176_mysql_client_interactive # requires mysql client
|
||||||
01031_mutations_interpreter_and_context
|
01031_mutations_interpreter_and_context
|
||||||
01053_ssd_dictionary # this test mistakenly requires acces to /var/lib/clickhouse -- can't run this locally, disabled
|
01053_ssd_dictionary # this test mistakenly requires acces to /var/lib/clickhouse -- can't run this locally, disabled
|
||||||
01083_expressions_in_engine_arguments
|
01083_expressions_in_engine_arguments
|
||||||
|
@ -23,7 +23,8 @@ RUN apt-get update -y \
|
|||||||
telnet \
|
telnet \
|
||||||
tree \
|
tree \
|
||||||
unixodbc \
|
unixodbc \
|
||||||
wget
|
wget \
|
||||||
|
mysql-client-5.7
|
||||||
|
|
||||||
RUN pip3 install numpy scipy pandas
|
RUN pip3 install numpy scipy pandas
|
||||||
|
|
||||||
|
@ -62,10 +62,10 @@ ColumnDefinition::ColumnDefinition()
|
|||||||
|
|
||||||
ColumnDefinition::ColumnDefinition(
|
ColumnDefinition::ColumnDefinition(
|
||||||
String schema_, String table_, String org_table_, String name_, String org_name_, uint16_t character_set_, uint32_t column_length_,
|
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_)
|
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_)),
|
: 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_),
|
org_name(std::move(org_name_)), character_set(character_set_), column_length(column_length_), column_type(column_type_),
|
||||||
flags(flags_), decimals(decimals_)
|
flags(flags_), decimals(decimals_), is_comm_field_list_response(with_defaults_)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -77,8 +77,15 @@ ColumnDefinition::ColumnDefinition(
|
|||||||
|
|
||||||
size_t ColumnDefinition::getPayloadSize() const
|
size_t ColumnDefinition::getPayloadSize() const
|
||||||
{
|
{
|
||||||
return 12 + getLengthEncodedStringSize("def") + getLengthEncodedStringSize(schema) + getLengthEncodedStringSize(table) + getLengthEncodedStringSize(org_table) + \
|
return 12 +
|
||||||
getLengthEncodedStringSize(name) + getLengthEncodedStringSize(org_name) + getLengthEncodedNumberSize(next_length);
|
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)
|
void ColumnDefinition::readPayloadImpl(ReadBuffer & payload)
|
||||||
@ -115,6 +122,13 @@ void ColumnDefinition::writePayloadImpl(WriteBuffer & buffer) const
|
|||||||
buffer.write(reinterpret_cast<const char *>(&flags), 2);
|
buffer.write(reinterpret_cast<const char *>(&flags), 2);
|
||||||
buffer.write(reinterpret_cast<const char *>(&decimals), 1);
|
buffer.write(reinterpret_cast<const char *>(&decimals), 1);
|
||||||
writeChar(0x0, 2, buffer);
|
writeChar(0x0, 2, buffer);
|
||||||
|
if (is_comm_field_list_response)
|
||||||
|
{
|
||||||
|
/// We should write length encoded int with string size
|
||||||
|
/// followed by string with some "default values" (possibly it's column defaults).
|
||||||
|
/// But we just send NULL for simplicity.
|
||||||
|
writeChar(0xfb, buffer);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ColumnDefinition getColumnDefinition(const String & column_name, const TypeIndex type_index)
|
ColumnDefinition getColumnDefinition(const String & column_name, const TypeIndex type_index)
|
||||||
|
@ -101,6 +101,9 @@ public:
|
|||||||
ColumnType column_type;
|
ColumnType column_type;
|
||||||
uint16_t flags;
|
uint16_t flags;
|
||||||
uint8_t decimals = 0x00;
|
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:
|
protected:
|
||||||
size_t getPayloadSize() const override;
|
size_t getPayloadSize() const override;
|
||||||
@ -114,7 +117,7 @@ public:
|
|||||||
|
|
||||||
ColumnDefinition(
|
ColumnDefinition(
|
||||||
String schema_, String table_, String org_table_, String name_, String org_name_, uint16_t character_set_, uint32_t column_length_,
|
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_);
|
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.
|
/// Should be used when column metadata (original name, table, original table, database) is unknown.
|
||||||
ColumnDefinition(
|
ColumnDefinition(
|
||||||
|
@ -289,7 +289,7 @@ void MySQLHandler::comFieldList(ReadBuffer & payload)
|
|||||||
for (const NameAndTypePair & column : metadata_snapshot->getColumns().getAll())
|
for (const NameAndTypePair & column : metadata_snapshot->getColumns().getAll())
|
||||||
{
|
{
|
||||||
ColumnDefinition column_definition(
|
ColumnDefinition column_definition(
|
||||||
database, packet.table, packet.table, column.name, column.name, CharacterSet::binary, 100, ColumnType::MYSQL_TYPE_STRING, 0, 0
|
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(column_definition);
|
||||||
}
|
}
|
||||||
|
26
tests/queries/0_stateless/01176_mysql_client_interactive.expect
Executable file
26
tests/queries/0_stateless/01176_mysql_client_interactive.expect
Executable file
@ -0,0 +1,26 @@
|
|||||||
|
#!/usr/bin/expect -f
|
||||||
|
|
||||||
|
log_user 0
|
||||||
|
set timeout 5
|
||||||
|
match_max 100000
|
||||||
|
# A default timeout action is to do nothing, change it to fail
|
||||||
|
expect_after {
|
||||||
|
timeout {
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
set basedir [file dirname $argv0]
|
||||||
|
spawn bash -c "source $basedir/../shell_config.sh ; \$MYSQL_CLIENT_BINARY \$MYSQL_CLIENT_OPT"
|
||||||
|
expect "mysql> "
|
||||||
|
|
||||||
|
send -- "USE system;\r"
|
||||||
|
expect "Database changed"
|
||||||
|
|
||||||
|
send -- "SELECT * FROM one;\r"
|
||||||
|
expect "| dummy |"
|
||||||
|
expect "| 0 |"
|
||||||
|
expect "1 row in set"
|
||||||
|
|
||||||
|
send -- "quit;\r"
|
||||||
|
expect eof
|
@ -54,6 +54,8 @@ export CLICKHOUSE_PORT_HTTP=${CLICKHOUSE_PORT_HTTP:="8123"}
|
|||||||
export CLICKHOUSE_PORT_HTTPS=${CLICKHOUSE_PORT_HTTPS:=$(${CLICKHOUSE_EXTRACT_CONFIG} --try --key=https_port 2>/dev/null)} 2>/dev/null
|
export CLICKHOUSE_PORT_HTTPS=${CLICKHOUSE_PORT_HTTPS:=$(${CLICKHOUSE_EXTRACT_CONFIG} --try --key=https_port 2>/dev/null)} 2>/dev/null
|
||||||
export CLICKHOUSE_PORT_HTTPS=${CLICKHOUSE_PORT_HTTPS:="8443"}
|
export CLICKHOUSE_PORT_HTTPS=${CLICKHOUSE_PORT_HTTPS:="8443"}
|
||||||
export CLICKHOUSE_PORT_HTTP_PROTO=${CLICKHOUSE_PORT_HTTP_PROTO:="http"}
|
export CLICKHOUSE_PORT_HTTP_PROTO=${CLICKHOUSE_PORT_HTTP_PROTO:="http"}
|
||||||
|
export CLICKHOUSE_PORT_MYSQL=${CLICKHOUSE_PORT_MYSQL:=$(${CLICKHOUSE_EXTRACT_CONFIG} --try --key=mysql_port 2>/dev/null)} 2>/dev/null
|
||||||
|
export CLICKHOUSE_PORT_MYSQL=${CLICKHOUSE_PORT_MYSQL:="9004"}
|
||||||
|
|
||||||
# Add database and log comment to url params
|
# Add database and log comment to url params
|
||||||
if [ -v CLICKHOUSE_URL_PARAMS ]
|
if [ -v CLICKHOUSE_URL_PARAMS ]
|
||||||
@ -87,6 +89,17 @@ export CLICKHOUSE_CURL=${CLICKHOUSE_CURL:="${CLICKHOUSE_CURL_COMMAND} -q -s --ma
|
|||||||
export CLICKHOUSE_TMP=${CLICKHOUSE_TMP:="."}
|
export CLICKHOUSE_TMP=${CLICKHOUSE_TMP:="."}
|
||||||
mkdir -p ${CLICKHOUSE_TMP}
|
mkdir -p ${CLICKHOUSE_TMP}
|
||||||
|
|
||||||
|
export MYSQL_CLIENT_BINARY=${MYSQL_CLIENT_BINARY:="mysql"}
|
||||||
|
export MYSQL_CLIENT_CLICKHOUSE_USER=${MYSQL_CLIENT_CLICKHOUSE_USER:="default"}
|
||||||
|
# Avoids "Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock'" when connecting to localhost
|
||||||
|
[ -v CLICKHOUSE_HOST ] && MYSQL_CLIENT_OPT0+=" --protocol tcp "
|
||||||
|
[ -v CLICKHOUSE_HOST ] && MYSQL_CLIENT_OPT0+=" --host ${CLICKHOUSE_HOST} "
|
||||||
|
[ -v CLICKHOUSE_PORT_MYSQL ] && MYSQL_CLIENT_OPT0+=" --port ${CLICKHOUSE_PORT_MYSQL} "
|
||||||
|
[ -v CLICKHOUSE_DATABASE ] && MYSQL_CLIENT_OPT0+=" --database ${CLICKHOUSE_DATABASE} "
|
||||||
|
MYSQL_CLIENT_OPT0+=" --user ${MYSQL_CLIENT_CLICKHOUSE_USER} "
|
||||||
|
export MYSQL_CLIENT_OPT="${MYSQL_CLIENT_OPT0:-} ${MYSQL_CLIENT_OPT:-}"
|
||||||
|
export MYSQL_CLIENT=${MYSQL_CLIENT:="$MYSQL_CLIENT_BINARY ${MYSQL_CLIENT_OPT:-}"}
|
||||||
|
|
||||||
function clickhouse_client_removed_host_parameter()
|
function clickhouse_client_removed_host_parameter()
|
||||||
{
|
{
|
||||||
# removing only `--host=value` and `--host value` (removing '-hvalue' feels to dangerous) with python regex.
|
# removing only `--host=value` and `--host value` (removing '-hvalue' feels to dangerous) with python regex.
|
||||||
|
Loading…
Reference in New Issue
Block a user