From 5dfa0c1226b9190552c07afb86a43efd3ba85e01 Mon Sep 17 00:00:00 2001 From: Johan Wikman Date: Sun, 25 Feb 2018 22:06:17 +0200 Subject: [PATCH] MXS-1475 Take SetParser and SqlModeParser into use These changes are the first in the route toward supporting MaxScale specific variables such as set @MAXSCALE.CACHE.ENABLED=TRUE --- .../MySQL/mariadbclient/mysql_client.cc | 60 +++++++++++-------- 1 file changed, 35 insertions(+), 25 deletions(-) diff --git a/server/modules/protocol/MySQL/mariadbclient/mysql_client.cc b/server/modules/protocol/MySQL/mariadbclient/mysql_client.cc index 5e8d19ee1..c76a41f65 100644 --- a/server/modules/protocol/MySQL/mariadbclient/mysql_client.cc +++ b/server/modules/protocol/MySQL/mariadbclient/mysql_client.cc @@ -37,7 +37,8 @@ #include #include -#include "setsqlmodeparser.hh" +#include "setparser.hh" +#include "sqlmodeparser.hh" /** Return type of process_special_commands() */ typedef enum spec_com_res_t @@ -873,52 +874,58 @@ static bool process_client_commands(DCB* dcb, int bytes_available, GWBUF** buffe } /** - * Sets the query classifier mode. + * Handle relevant variables * * @param session The session for which the query classifier mode is adjusted. * @param read_buffer Pointer to a buffer, assumed to contain a statement. * May be reallocated if not contiguous. */ -void set_qc_mode(MXS_SESSION* session, GWBUF** read_buffer) +void handle_variables(MXS_SESSION* session, GWBUF** read_buffer) { - SetSqlModeParser parser; - SetSqlModeParser::sql_mode_t sql_mode; + SetParser set_parser; + SetParser::Result result; - switch (parser.get_sql_mode(read_buffer, &sql_mode)) + switch (set_parser.check(read_buffer, &result)) { - case SetSqlModeParser::ERROR: + case SetParser::ERROR: // In practice only OOM. break; - case SetSqlModeParser::IS_SET_SQL_MODE: - switch (sql_mode) + case SetParser::IS_SET_SQL_MODE: { - case SetSqlModeParser::ORACLE: - session_set_autocommit(session, false); - session->client_protocol_data = QC_SQL_MODE_ORACLE; - break; + SqlModeParser sql_mode_parser; - case SetSqlModeParser::DEFAULT: - session_set_autocommit(session, true); - session->client_protocol_data = QC_SQL_MODE_DEFAULT; - break; + switch (sql_mode_parser.get_sql_mode(result.value_begin(), result.value_end())) + { + case SqlModeParser::ORACLE: + session_set_autocommit(session, false); + session->client_protocol_data = QC_SQL_MODE_ORACLE; + break; - case SetSqlModeParser::SOMETHING: - break; + case SqlModeParser::DEFAULT: + session_set_autocommit(session, true); + session->client_protocol_data = QC_SQL_MODE_DEFAULT; + break; - default: - ss_dassert(!true); + case SqlModeParser::SOMETHING: + break; + + default: + ss_dassert(!true); + } } break; - case SetSqlModeParser::NOT_SET_SQL_MODE: + case SetParser::IS_SET_MAXSCALE: + // TODO: Handle "set @MAXSCALE...=..."; + break; + + case SetParser::NOT_RELEVANT: break; default: ss_dassert(!true); } - - qc_set_sql_mode(static_cast(session->client_protocol_data)); } /** @@ -976,7 +983,10 @@ gw_read_normal_data(DCB *dcb, GWBUF *read_buffer, int nbytes_read) return 0; } - set_qc_mode(session, &read_buffer); + handle_variables(session, &read_buffer); + // Must be done whether or not there were any changes, as the query classifier + // is thread and not session specific. + qc_set_sql_mode(static_cast(session->client_protocol_data)); } /** Update the current protocol command being executed */ else if (!process_client_commands(dcb, nbytes_read, &read_buffer))