diff --git a/query_classifier/qc_mysqlembedded/qc_mysqlembedded.cc b/query_classifier/qc_mysqlembedded/qc_mysqlembedded.cc index fb4e9f7d5..4353cbc99 100644 --- a/query_classifier/qc_mysqlembedded/qc_mysqlembedded.cc +++ b/query_classifier/qc_mysqlembedded/qc_mysqlembedded.cc @@ -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; diff --git a/query_classifier/qc_sqlite/qc_sqlite.cc b/query_classifier/qc_sqlite/qc_sqlite.cc index 3b871058d..177d3c031 100644 --- a/query_classifier/qc_sqlite/qc_sqlite.cc +++ b/query_classifier/qc_sqlite/qc_sqlite.cc @@ -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(); diff --git a/query_classifier/qc_sqlite/sqlite-src-3110100/src/parse.y b/query_classifier/qc_sqlite/sqlite-src-3110100/src/parse.y index 917b68f68..de0acfc91 100644 --- a/query_classifier/qc_sqlite/sqlite-src-3110100/src/parse.y +++ b/query_classifier/qc_sqlite/sqlite-src-3110100/src/parse.y @@ -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} diff --git a/query_classifier/qc_sqlite/sqlite-src-3110100/src/sqliteInt.h b/query_classifier/qc_sqlite/sqlite-src-3110100/src/sqliteInt.h index fdc3217a6..6bccf152a 100644 --- a/query_classifier/qc_sqlite/sqlite-src-3110100/src/sqliteInt.h +++ b/query_classifier/qc_sqlite/sqlite-src-3110100/src/sqliteInt.h @@ -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, diff --git a/query_classifier/qc_sqlite/sqlite-src-3110100/tool/mkkeywordhash.c b/query_classifier/qc_sqlite/sqlite-src-3110100/tool/mkkeywordhash.c index a8746a7df..b733f4a7e 100644 --- a/query_classifier/qc_sqlite/sqlite-src-3110100/tool/mkkeywordhash.c +++ b/query_classifier/qc_sqlite/sqlite-src-3110100/tool/mkkeywordhash.c @@ -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 },