Skip to content

Commit 1c0253d

Browse files
committed
mysqlnd: support ER_CLIENT_INTERACTION_TIMEOUT
1 parent a541b95 commit 1c0253d

File tree

3 files changed

+24
-2
lines changed

3 files changed

+24
-2
lines changed

ext/mysqlnd/mysqlnd_enum_n_def.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,7 @@
130130
#define CR_INVALID_PARAMETER_NO 2034
131131
#define CR_INVALID_BUFFER_USE 2035
132132
#define CR_LOAD_DATA_LOCAL_INFILE_REJECTED 2068
133+
#define ER_CLIENT_INTERACTION_TIMEOUT 4031
133134

134135
#define MYSQLND_EE_FILENOTFOUND 7890
135136

ext/mysqlnd/mysqlnd_result.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,7 @@ mysqlnd_query_read_result_set_header(MYSQLND_CONN_DATA * conn, MYSQLND_STMT * s)
183183
UPSERT_STATUS_SET_AFFECTED_ROWS_TO_ERROR(conn->upsert_status);
184184

185185
if (FAIL == (ret = PACKET_READ(conn, &rset_header))) {
186-
if (conn->error_info->error_no != CR_SERVER_GONE_ERROR) {
186+
if (conn->error_info->error_no != CR_SERVER_GONE_ERROR && conn->error_info->error_no != ER_CLIENT_INTERACTION_TIMEOUT) {
187187
php_error_docref(NULL, E_WARNING, "Error reading result set's header");
188188
}
189189
break;

ext/mysqlnd/mysqlnd_wireprotocol.c

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -267,6 +267,24 @@ mysqlnd_read_header(MYSQLND_PFC * pfc, MYSQLND_VIO * vio, MYSQLND_PACKET_HEADER
267267
pfc->data->packet_no++;
268268
DBG_RETURN(PASS);
269269
}
270+
// @see https://dev.mysql.com/worklog/task/?id=12999
271+
if (header->size > 0) {
272+
DBG_ERR_FMT("Logical link: try reap pending data. Packet size=%zu", header->size);
273+
zend_uchar *buf = emalloc(header->size);
274+
if ((PASS == pfc->data->m.receive(pfc, vio, buf, header->size, conn_stats, error_info)) && buf[0] == ERROR_MARKER) {
275+
php_mysqlnd_read_error_from_line(buf + 1, header->size - 1,
276+
error_info->error, sizeof(error_info->error),
277+
&error_info->error_no, error_info->sqlstate
278+
);
279+
if (error_info->error_no == ER_CLIENT_INTERACTION_TIMEOUT) {
280+
efree(buf);
281+
DBG_RETURN(FAIL);
282+
} else {
283+
error_info->error_no = 0;
284+
}
285+
}
286+
efree(buf);
287+
}
270288

271289
DBG_ERR_FMT("Logical link: packets out of order. Expected %u received %u. Packet size=%zu",
272290
pfc->data->packet_no, header->packet_no, header->size);
@@ -292,9 +310,12 @@ mysqlnd_read_packet_header_and_body(MYSQLND_PACKET_HEADER * packet_header,
292310
{
293311
DBG_ENTER("mysqlnd_read_packet_header_and_body");
294312
DBG_INF_FMT("buf=%p size=%zu", buf, buf_size);
313+
assert(error_info->error_no == 0);
295314
if (FAIL == mysqlnd_read_header(pfc, vio, packet_header, stats, error_info)) {
296315
SET_CONNECTION_STATE(connection_state, CONN_QUIT_SENT);
297-
SET_CLIENT_ERROR(error_info, CR_SERVER_GONE_ERROR, UNKNOWN_SQLSTATE, mysqlnd_server_gone);
316+
if (error_info->error_no == 0) {
317+
SET_CLIENT_ERROR(error_info, CR_SERVER_GONE_ERROR, UNKNOWN_SQLSTATE, mysqlnd_server_gone);
318+
}
298319
DBG_ERR_FMT("Can't read %s's header", packet_type_as_text);
299320
DBG_RETURN(FAIL);
300321
}

0 commit comments

Comments
 (0)