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:
Johan Wikman
2019-06-07 11:14:09 +03:00
parent e1b611aa06
commit b222a17ed9
2 changed files with 26 additions and 15 deletions

View File

@ -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);
}
}