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
This commit is contained in:
@ -37,7 +37,8 @@
|
|||||||
#include <maxscale/utils.h>
|
#include <maxscale/utils.h>
|
||||||
#include <maxscale/worker.h>
|
#include <maxscale/worker.h>
|
||||||
|
|
||||||
#include "setsqlmodeparser.hh"
|
#include "setparser.hh"
|
||||||
|
#include "sqlmodeparser.hh"
|
||||||
|
|
||||||
/** Return type of process_special_commands() */
|
/** Return type of process_special_commands() */
|
||||||
typedef enum spec_com_res_t
|
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 session The session for which the query classifier mode is adjusted.
|
||||||
* @param read_buffer Pointer to a buffer, assumed to contain a statement.
|
* @param read_buffer Pointer to a buffer, assumed to contain a statement.
|
||||||
* May be reallocated if not contiguous.
|
* 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;
|
SetParser set_parser;
|
||||||
SetSqlModeParser::sql_mode_t sql_mode;
|
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.
|
// In practice only OOM.
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SetSqlModeParser::IS_SET_SQL_MODE:
|
case SetParser::IS_SET_SQL_MODE:
|
||||||
switch (sql_mode)
|
|
||||||
{
|
{
|
||||||
case SetSqlModeParser::ORACLE:
|
SqlModeParser sql_mode_parser;
|
||||||
session_set_autocommit(session, false);
|
|
||||||
session->client_protocol_data = QC_SQL_MODE_ORACLE;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SetSqlModeParser::DEFAULT:
|
switch (sql_mode_parser.get_sql_mode(result.value_begin(), result.value_end()))
|
||||||
session_set_autocommit(session, true);
|
{
|
||||||
session->client_protocol_data = QC_SQL_MODE_DEFAULT;
|
case SqlModeParser::ORACLE:
|
||||||
break;
|
session_set_autocommit(session, false);
|
||||||
|
session->client_protocol_data = QC_SQL_MODE_ORACLE;
|
||||||
|
break;
|
||||||
|
|
||||||
case SetSqlModeParser::SOMETHING:
|
case SqlModeParser::DEFAULT:
|
||||||
break;
|
session_set_autocommit(session, true);
|
||||||
|
session->client_protocol_data = QC_SQL_MODE_DEFAULT;
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
case SqlModeParser::SOMETHING:
|
||||||
ss_dassert(!true);
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
ss_dassert(!true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SetSqlModeParser::NOT_SET_SQL_MODE:
|
case SetParser::IS_SET_MAXSCALE:
|
||||||
|
// TODO: Handle "set @MAXSCALE...=...";
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SetParser::NOT_RELEVANT:
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
ss_dassert(!true);
|
ss_dassert(!true);
|
||||||
}
|
}
|
||||||
|
|
||||||
qc_set_sql_mode(static_cast<qc_sql_mode_t>(session->client_protocol_data));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -976,7 +983,10 @@ gw_read_normal_data(DCB *dcb, GWBUF *read_buffer, int nbytes_read)
|
|||||||
return 0;
|
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<qc_sql_mode_t>(session->client_protocol_data));
|
||||||
}
|
}
|
||||||
/** Update the current protocol command being executed */
|
/** Update the current protocol command being executed */
|
||||||
else if (!process_client_commands(dcb, nbytes_read, &read_buffer))
|
else if (!process_client_commands(dcb, nbytes_read, &read_buffer))
|
||||||
|
Reference in New Issue
Block a user