MXS-2432 Recognize RESET

RESET QUERY CACHE is reported to be a session command, which will
cause it to be sent to all servers. RESET [MASTER|SLAVE] are
classified as write, which will cause them to be sent to the master.

It could be argued that RESET [MASTER|SLAVE] should cause an error
to be sent to the client.
This commit is contained in:
Johan Wikman 2019-04-12 14:27:06 +03:00
parent 3127aa85c5
commit d2c71472b0
5 changed files with 66 additions and 4 deletions

View File

@ -999,6 +999,17 @@ static uint32_t resolve_query_type(parsing_info_t* pi, THD* thd)
goto return_qtype;
break;
case SQLCOM_RESET:
if (lex->type & REFRESH_QUERY_CACHE)
{
type |= QUERY_TYPE_SESSION_WRITE;
}
else
{
type |= QUERY_TYPE_WRITE;
}
break;
default:
type |= QUERY_TYPE_WRITE;
break;

View File

@ -2602,6 +2602,11 @@ public:
m_operation = QUERY_OP_REVOKE;
break;
case TK_RESET:
m_status = QC_QUERY_TOKENIZED;
m_type_mask = (QUERY_TYPE_WRITE | QUERY_TYPE_COMMIT);
break;
case TK_SELECT:
m_status = QC_QUERY_TOKENIZED;
m_type_mask = QUERY_TYPE_READ;
@ -2838,6 +2843,23 @@ public:
}
}
void maxscaleReset(Parse* pParse, int what)
{
mxb_assert(this_thread.initialized);
m_status = QC_QUERY_PARSED;
switch (what)
{
case MXS_RESET_QUERY_CACHE:
m_type_mask = (QUERY_TYPE_SESSION_WRITE | QUERY_TYPE_COMMIT);
break;
default:
mxb_assert(!true);
}
}
void maxscaleSet(Parse* pParse, int scope, mxs_set_t kind, ExprList* pList)
{
mxb_assert(this_thread.initialized);
@ -3448,6 +3470,7 @@ extern "C"
extern void maxscalePrepare(Parse*, Token* pName, Expr* pStmt);
extern void maxscalePrivileges(Parse*, int kind);
extern void maxscaleRenameTable(Parse*, SrcList* pTables);
extern void maxscaleReset(Parse*, int what);
extern void maxscaleSet(Parse*, int scope, mxs_set_t kind, ExprList*);
extern void maxscaleShow(Parse*, MxsShow* pShow);
extern void maxscaleTruncate(Parse*, Token* pDatabase, Token* pName);
@ -4488,6 +4511,16 @@ void maxscalePrivileges(Parse* pParse, int kind)
QC_EXCEPTION_GUARD(pInfo->maxscalePrivileges(pParse, kind));
}
void maxscaleReset(Parse* pParse, int what)
{
QC_TRACE();
QcSqliteInfo* pInfo = this_thread.pInfo;
mxb_assert(pInfo);
QC_EXCEPTION_GUARD(pInfo->maxscaleReset(pParse, what));
}
void maxscaleSet(Parse* pParse, int scope, mxs_set_t kind, ExprList* pList)
{
QC_TRACE();

View File

@ -125,6 +125,7 @@ extern void maxscaleLock(Parse*, mxs_lock_t, SrcList*);
extern void maxscalePrepare(Parse*, Token* pName, Expr* pStmt);
extern void maxscalePrivileges(Parse*, int kind);
extern void maxscaleRenameTable(Parse*, SrcList* pTables);
extern void maxscaleReset(Parse*, int what);
extern void maxscaleSet(Parse*, int scope, mxs_set_t kind, ExprList*);
extern void maxscaleShow(Parse*, MxsShow* pShow);
extern void maxscaleTruncate(Parse*, Token* pDatabase, Token* pName);
@ -614,7 +615,7 @@ columnid(A) ::= nm(X). {
// TODO: BINARY is a reserved word and should not automatically convert into an identifer.
// TODO: However, if not here then rules such as CAST need to be modified.
BINARY
/*CASCADE*/ CAST CLOSE COLUMNKW COLUMNS COMMENT CONCURRENT /*CONFLICT*/
CACHE /*CASCADE*/ CAST CLOSE COLUMNKW COLUMNS COMMENT CONCURRENT /*CONFLICT*/
DATA DATABASE DEALLOCATE DEFERRED /*DESC*/ /*DETACH*/ DUMPFILE
/*EACH*/ END ENGINE ENUM EXCLUSIVE /*EXPLAIN*/
FIRST FLUSH /*FOR*/ FORMAT
@ -628,8 +629,8 @@ columnid(A) ::= nm(X). {
NO
OF OFFSET OPEN
PREVIOUS
QUICK
RAISE RECURSIVE /*REINDEX*/ RELEASE /*RENAME*/ /*REPLACE*/ RESTRICT ROLLBACK ROLLUP ROW
QUERY QUICK
RAISE RECURSIVE /*REINDEX*/ RELEASE /*RENAME*/ /*REPLACE*/ RESET RESTRICT ROLLBACK ROLLUP ROW
SAVEPOINT SELECT_OPTIONS_KW /*SEQUENCE*/ SLAVE /*START*/ STATEMENT STATUS
TABLES TEMP TEMPTABLE /*TRIGGER*/
/*TRUNCATE*/
@ -3079,6 +3080,12 @@ rename ::= RENAME TABLE tables_to_rename(X). {
maxscaleRenameTable(pParse, X);
}
//////////////////////// The RESET statement ////////////////////////////////////
//
cmd ::= RESET QUERY CACHE. {
maxscaleReset(pParse, MXS_RESET_QUERY_CACHE);
}
//////////////////////// The SET statement ////////////////////////////////////
//
%type set_scope {int}

View File

@ -4099,6 +4099,11 @@ typedef enum mxs_drop
MXS_DROP_SEQUENCE,
} mxs_drop_t;
typedef enum mxs_reset
{
MXS_RESET_QUERY_CACHE
} mxs_reset_t;
typedef enum mxs_set
{
MXS_SET_VARIABLES,

View File

@ -180,6 +180,7 @@ static Keyword aKeywordTable[] = {
{ "BY", "TK_BY", ALWAYS },
#ifdef MAXSCALE
{ "CALL", "TK_CALL", ALWAYS },
{ "CACHE", "TK_CACHE", ALWAYS },
#endif
{ "CASCADE", "TK_CASCADE", FKEY },
{ "CASE", "TK_CASE", ALWAYS },
@ -391,7 +392,9 @@ static Keyword aKeywordTable[] = {
#ifdef MAXSCALE
{ "PROCEDURE", "TK_FUNCTION_KW", ALWAYS },
#endif
#ifndef MAXSCALE
#ifdef MAXSCALE
{ "QUERY", "TK_QUERY", ALWAYS },
#else
{ "QUERY", "TK_QUERY", EXPLAIN },
#endif
#ifdef MAXSCALE
@ -409,6 +412,9 @@ static Keyword aKeywordTable[] = {
{ "RELEASE", "TK_RELEASE", ALWAYS },
{ "RENAME", "TK_RENAME", ALTER },
{ "REPLACE", "TK_REPLACE", CONFLICT },
#ifdef MAXSCALE
{ "RESET", "TK_RESET", ALWAYS },
#endif
{ "RESTRICT", "TK_RESTRICT", FKEY },
#ifdef MAXSCALE
{ "REVOKE", "TK_REVOKE", ALWAYS },