From 65bf471bd72dce9287e74c2a7eec639a1035ed27 Mon Sep 17 00:00:00 2001 From: Johan Wikman Date: Fri, 18 Aug 2017 10:15:46 +0300 Subject: [PATCH] MXS-1364 Factor out field name extraction Will be used when function field usage is collected. --- query_classifier/qc_sqlite/qc_sqlite.cc | 80 ++++++++++++++++--------- 1 file changed, 51 insertions(+), 29 deletions(-) diff --git a/query_classifier/qc_sqlite/qc_sqlite.cc b/query_classifier/qc_sqlite/qc_sqlite.cc index 0722eaff6..7fa3442f2 100644 --- a/query_classifier/qc_sqlite/qc_sqlite.cc +++ b/query_classifier/qc_sqlite/qc_sqlite.cc @@ -994,21 +994,27 @@ public: } } - void update_field_infos_from_expr(QcAliases* pAliases, - const Expr* pExpr, - uint32_t usage, - const ExprList* pExclude) + static bool get_field_name(const Expr* pExpr, + const char** pzDatabase, + const char** pzTable, + const char** pzColumn) { - QC_FIELD_INFO item = {}; + const char*& zDatabase = *pzDatabase; + const char*& zTable = *pzTable; + const char*& zColumn = *pzColumn; + + zDatabase = NULL; + zTable = NULL; + zColumn = NULL; if (pExpr->op == TK_ASTERISK) { - item.column = (char*)"*"; + zColumn = (char*)"*"; } else if (pExpr->op == TK_ID) { // select a from... - item.column = pExpr->u.zToken; + zColumn = pExpr->u.zToken; } else if (pExpr->op == TK_DOT) { @@ -1016,14 +1022,14 @@ public: (pExpr->pRight->op == TK_ID || pExpr->pRight->op == TK_ASTERISK)) { // select a.b from... - item.table = pExpr->pLeft->u.zToken; + zTable = pExpr->pLeft->u.zToken; if (pExpr->pRight->op == TK_ID) { - item.column = pExpr->pRight->u.zToken; + zColumn = pExpr->pRight->u.zToken; } else { - item.column = (char*)"*"; + zColumn = (char*)"*"; } } else if (pExpr->pLeft->op == TK_ID && @@ -1032,35 +1038,51 @@ public: (pExpr->pRight->pRight->op == TK_ID || pExpr->pRight->pRight->op == TK_ASTERISK)) { // select a.b.c from... - item.database = pExpr->pLeft->u.zToken; - item.table = pExpr->pRight->pLeft->u.zToken; + zDatabase = pExpr->pLeft->u.zToken; + zTable = pExpr->pRight->pLeft->u.zToken; if (pExpr->pRight->pRight->op == TK_ID) { - item.column = pExpr->pRight->pRight->u.zToken; + zColumn = pExpr->pRight->pRight->u.zToken; } else { - item.column = (char*)"*"; + zColumn = (char*)"*"; + } + } + } + else + { + ss_dassert(!true); + } + + if (zColumn) + { + if ((pExpr->flags & EP_DblQuoted) == 0) + { + if ((strcasecmp(zColumn, "true") == 0) || (strcasecmp(zColumn, "false") == 0)) + { + zDatabase = NULL; + zTable = NULL; + zColumn = NULL; } } } - if (item.column) + return zColumn != NULL; + } + + void update_field_infos_from_expr(QcAliases* pAliases, + const Expr* pExpr, + uint32_t usage, + const ExprList* pExclude) + { + const char* zDatabase; + const char* zTable; + const char* zColumn; + + if (get_field_name(pExpr, &zDatabase, &zTable, &zColumn)) { - bool should_update = true; - - if ((pExpr->flags & EP_DblQuoted) == 0) - { - if ((strcasecmp(item.column, "true") == 0) || (strcasecmp(item.column, "false") == 0)) - { - should_update = false; - } - } - - if (should_update) - { - update_field_info(pAliases, item.database, item.table, item.column, usage, pExclude); - } + update_field_info(pAliases, zDatabase, zTable, zColumn, usage, pExclude); } }