MXS-2512 Update error information in additional place
An error may be returned directly or as part of a result set. Both cases must be handled.
This commit is contained in:
@ -241,7 +241,7 @@ bool is_last_eof(Iter it)
|
||||
return (status & SERVER_MORE_RESULTS_EXIST) == 0;
|
||||
}
|
||||
|
||||
void RWBackend::process_reply_start(Iter it)
|
||||
void RWBackend::process_reply_start(Iter it, uint32_t len)
|
||||
{
|
||||
uint8_t cmd = *it;
|
||||
m_local_infile_requested = false;
|
||||
@ -263,6 +263,8 @@ void RWBackend::process_reply_start(Iter it)
|
||||
|
||||
case MYSQL_REPLY_ERR:
|
||||
// Nothing ever follows an error packet
|
||||
++it;
|
||||
update_error(it, len);
|
||||
set_reply_state(REPLY_STATE_DONE);
|
||||
break;
|
||||
|
||||
@ -319,7 +321,7 @@ void RWBackend::process_packets(GWBUF* result)
|
||||
switch (m_reply_state)
|
||||
{
|
||||
case REPLY_STATE_START:
|
||||
process_reply_start(it);
|
||||
process_reply_start(it, len);
|
||||
break;
|
||||
|
||||
case REPLY_STATE_DONE:
|
||||
@ -359,18 +361,7 @@ void RWBackend::process_packets(GWBUF* result)
|
||||
else if (cmd == MYSQL_REPLY_ERR)
|
||||
{
|
||||
++it;
|
||||
uint16_t code = 0;
|
||||
code |= (*it++);
|
||||
code |= (*it++) << 8;
|
||||
++it;
|
||||
auto sql_state_begin = it;
|
||||
it.advance(5);
|
||||
auto sql_state_end = it;
|
||||
auto message_begin = it;
|
||||
it.advance(len - (1 + 2 + 1 + 5));
|
||||
auto message_end = it;
|
||||
|
||||
m_error.set(code, sql_state_begin, sql_state_end, message_begin, message_end);
|
||||
update_error(it, len);
|
||||
set_reply_state(REPLY_STATE_DONE);
|
||||
}
|
||||
break;
|
||||
@ -462,4 +453,21 @@ mxs::SRWBackends RWBackend::from_servers(SERVER_REF* servers)
|
||||
|
||||
return backends;
|
||||
}
|
||||
|
||||
void RWBackend::update_error(mxs::Buffer::iterator it, uint32_t len)
|
||||
{
|
||||
uint16_t code = 0;
|
||||
code |= (*it++);
|
||||
code |= (*it++) << 8;
|
||||
++it;
|
||||
auto sql_state_begin = it;
|
||||
it.advance(5);
|
||||
auto sql_state_end = it;
|
||||
auto message_begin = it;
|
||||
it.advance(len - (1 + 2 + 1 + 5));
|
||||
auto message_end = it;
|
||||
|
||||
m_error.set(code, sql_state_begin, sql_state_end, message_begin, message_end);
|
||||
}
|
||||
|
||||
}
|
||||
|
Reference in New Issue
Block a user