Skip parsing during LOAD DATA LOCAL INFILE

The code parsed queries even when a LOAD DATA LOCAL INFILE was in
progress. This caused the data to be misinterpreted as actual commands.
This commit is contained in:
Markus Mäkelä 2018-08-28 12:48:09 +03:00
parent e4fdaf0c50
commit e38e08089a
No known key found for this signature in database
GPG Key ID: 72D48FCE664F7B19

View File

@ -98,7 +98,7 @@ route_target_t get_target_type(RWSplitSession *rses, GWBUF *buffer,
route_target_t route_target = TARGET_MASTER;
bool in_read_only_trx = rses->target_node && session_trx_is_read_only(rses->client_dcb->session);
if (gwbuf_length(buffer) > MYSQL_HEADER_LEN)
if (gwbuf_length(buffer) > MYSQL_HEADER_LEN && rses->load_data_state != LOAD_DATA_ACTIVE)
{
*command = mxs_mysql_get_command(buffer);
@ -168,9 +168,10 @@ route_target_t get_target_type(RWSplitSession *rses, GWBUF *buffer,
route_target = get_route_target(rses, *command, *type, buffer->hint);
}
}
else if (rses->load_data_state == LOAD_DATA_ACTIVE)
else if (gwbuf_length(buffer) == MYSQL_HEADER_LEN && rses->load_data_state == LOAD_DATA_ACTIVE)
{
/** Empty packet signals end of LOAD DATA LOCAL INFILE, send it to master*/
ss_dassert(MYSQL_GET_PAYLOAD_LEN(GWBUF_DATA(buffer)) == 0);
rses->load_data_state = LOAD_DATA_END;
MXS_INFO("> LOAD DATA LOCAL INFILE finished: %lu bytes sent.",
rses->rses_load_data_sent + gwbuf_length(buffer));
@ -210,6 +211,7 @@ bool route_single_stmt(RWSplit *inst, RWSplitSession *rses, GWBUF *querybuf, con
if (TARGET_IS_ALL(route_target))
{
ss_dassert(rses->load_data_state != LOAD_DATA_ACTIVE);
// TODO: Handle payloads larger than (2^24 - 1) bytes that are routed to all servers
succp = handle_target_is_all(route_target, inst, rses, querybuf, command, qtype);
}