diff --git a/include/maxscale/protocol/mysql.h b/include/maxscale/protocol/mysql.h index b97c30883..67837451e 100644 --- a/include/maxscale/protocol/mysql.h +++ b/include/maxscale/protocol/mysql.h @@ -307,6 +307,7 @@ typedef enum MXS_COM_STMT_RESET = 26, MXS_COM_SET_OPTION = 27, MXS_COM_STMT_FETCH = 28, + MXS_COM_STMT_BULK_EXECUTE = 0xfa, MXS_COM_DAEMON, MXS_COM_END } mxs_mysql_cmd_t; diff --git a/maxscale-system-test/CMakeLists.txt b/maxscale-system-test/CMakeLists.txt index e3515b754..047589f63 100644 --- a/maxscale-system-test/CMakeLists.txt +++ b/maxscale-system-test/CMakeLists.txt @@ -703,6 +703,10 @@ add_test_executable(mxs1828_double_local_infile.cpp mxs1828_double_local_infile # https://jira.mariadb.org/browse/MXS-1831 add_test_executable(mxs1831_unknown_param.cpp mxs1831_unknown_param replication LABELS REPL_BACKEND) +# MXS-1873: Large session commands cause errors +# https://jira.mariadb.org/browse/MXS-1873 +add_test_executable(mxs1873_large_sescmd.cpp mxs1873_large_sescmd replication LABELS readwritesplit REPL_BACKEND) + # 'namedserverfilter' test add_test_executable(namedserverfilter.cpp namedserverfilter namedserverfilter LABELS namedserverfilter LIGHT REPL_BACKEND) diff --git a/maxscale-system-test/mxs1873_large_sescmd.cpp b/maxscale-system-test/mxs1873_large_sescmd.cpp new file mode 100644 index 000000000..bd6285919 --- /dev/null +++ b/maxscale-system-test/mxs1873_large_sescmd.cpp @@ -0,0 +1,20 @@ +/** + * MXS-1873: Large session commands cause errors + * + * https://jira.mariadb.org/browse/MXS-1873 + */ + +#include "testconnections.h" + +int main(int argc, char** argv) +{ + TestConnections test(argc, argv); + + test.maxscales->connect(); + test.try_query(test.maxscales->conn_rwsplit[0], + "SET STATEMENT max_statement_time=30 FOR SELECT seq FROM seq_0_to_100000"); + test.try_query(test.maxscales->conn_rwsplit[0], "SELECT 1"); + test.maxscales->disconnect(); + + return test.global_result; +} diff --git a/server/core/queryclassifier.cc b/server/core/queryclassifier.cc index 7480df86d..89a3c1ae3 100644 --- a/server/core/queryclassifier.cc +++ b/server/core/queryclassifier.cc @@ -38,6 +38,7 @@ const char* qc_mysql_get_current_db(MXS_SESSION* session) bool qc_mysql_is_ps_command(uint8_t cmd) { return cmd == MXS_COM_STMT_EXECUTE || + cmd == MXS_COM_STMT_BULK_EXECUTE || cmd == MXS_COM_STMT_SEND_LONG_DATA || cmd == MXS_COM_STMT_CLOSE || cmd == MXS_COM_STMT_FETCH || diff --git a/server/modules/protocol/MySQL/mysql_common.cc b/server/modules/protocol/MySQL/mysql_common.cc index 8abe07763..01560c915 100644 --- a/server/modules/protocol/MySQL/mysql_common.cc +++ b/server/modules/protocol/MySQL/mysql_common.cc @@ -1606,6 +1606,7 @@ bool mxs_mysql_is_prep_stmt_ok(GWBUF *buffer) bool mxs_mysql_is_ps_command(uint8_t cmd) { return cmd == MXS_COM_STMT_EXECUTE || + cmd == MXS_COM_STMT_BULK_EXECUTE || cmd == MXS_COM_STMT_SEND_LONG_DATA || cmd == MXS_COM_STMT_CLOSE || cmd == MXS_COM_STMT_FETCH || diff --git a/server/modules/routing/readwritesplit/rwsplit_route_stmt.cc b/server/modules/routing/readwritesplit/rwsplit_route_stmt.cc index 1718eae2b..e88d32e0c 100644 --- a/server/modules/routing/readwritesplit/rwsplit_route_stmt.cc +++ b/server/modules/routing/readwritesplit/rwsplit_route_stmt.cc @@ -349,11 +349,11 @@ bool RWSplitSession::route_session_write(GWBUF *querybuf, uint8_t command, uint3 bool expecting_response = mxs_mysql_command_will_respond(command); int nsucc = 0; uint64_t lowest_pos = id; + gwbuf_set_type(querybuf, GWBUF_TYPE_COLLECT_RESULT); if (qc_query_is_type(type, QUERY_TYPE_PREPARE_NAMED_STMT) || qc_query_is_type(type, QUERY_TYPE_PREPARE_STMT)) { - gwbuf_set_type(querybuf, GWBUF_TYPE_COLLECT_RESULT); m_qc.ps_store(querybuf, id); }