From 62a64cba31a066edc21e3c77eb748346884ddf47 Mon Sep 17 00:00:00 2001 From: Johan Wikman Date: Tue, 2 May 2017 15:59:43 +0300 Subject: [PATCH] MXS-1196: Report user var read when prepared statements --- query_classifier/qc_sqlite/qc_sqlite.c | 4 ++-- .../qc_sqlite/sqlite-src-3110100/src/parse.y | 14 +++++++++----- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/query_classifier/qc_sqlite/qc_sqlite.c b/query_classifier/qc_sqlite/qc_sqlite.c index e5cbe0bfc..3a3d97ff2 100644 --- a/query_classifier/qc_sqlite/qc_sqlite.c +++ b/query_classifier/qc_sqlite/qc_sqlite.c @@ -2038,7 +2038,7 @@ void maxscaleDrop(Parse* pParse, MxsDrop* pDrop) info->operation = QUERY_OP_DROP; } -void maxscaleExecute(Parse* pParse, Token* pName) +void maxscaleExecute(Parse* pParse, Token* pName, int type_mask) { QC_TRACE(); @@ -2046,7 +2046,7 @@ void maxscaleExecute(Parse* pParse, Token* pName) ss_dassert(info); info->status = QC_QUERY_PARSED; - info->type_mask = QUERY_TYPE_WRITE; + info->type_mask = (QUERY_TYPE_WRITE | type_mask); // If information is collected in several passes, then we may // this information already. 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 04893a5f6..407290fa8 100644 --- a/query_classifier/qc_sqlite/sqlite-src-3110100/src/parse.y +++ b/query_classifier/qc_sqlite/sqlite-src-3110100/src/parse.y @@ -64,6 +64,7 @@ enum { QUERY_TYPE_READ = 0x000002, /*< Read database data:any */ QUERY_TYPE_WRITE = 0x000004, /*< Master data will be modified:master */ + QUERY_TYPE_USERVAR_READ = 0x000040, /*< Read a user variable:master or any */ }; typedef enum qc_field_usage @@ -112,7 +113,8 @@ extern void maxscaleCheckTable(Parse*, SrcList* pTables); extern void maxscaleDeallocate(Parse*, Token* pName); extern void maxscaleDo(Parse*, ExprList* pEList); extern void maxscaleDrop(Parse*, MxsDrop* pDrop); -extern void maxscaleExecute(Parse*, Token* pName); +extern void maxscaleExecute(Parse*, Token* pName, int type_mask); +extern void maxscaleExplain(Parse*, SrcList* pName); extern void maxscaleExplain(Parse*, Token* pNext); extern void maxscaleFlush(Parse*, Token* pWhat); extern void maxscaleHandler(Parse*, mxs_handler_t, SrcList* pFullName, Token* pName); @@ -2848,11 +2850,13 @@ prepare ::= PREPARE nm(X) FROM STRING(Y). execute_variables ::= VARIABLE. execute_variables ::= execute_variables COMMA VARIABLE. -execute_variables_opt ::= . -execute_variables_opt ::= USING execute_variables. +%type execute_variables_opt {int} -execute ::= EXECUTE nm(X) execute_variables_opt. { - maxscaleExecute(pParse, &X); +execute_variables_opt(A) ::= . { A = 0; } +execute_variables_opt(A) ::= USING execute_variables. { A = QUERY_TYPE_USERVAR_READ; } + +execute ::= EXECUTE nm(X) execute_variables_opt(Y). { + maxscaleExecute(pParse, &X, Y); } dod ::= DEALLOCATE.