MXS-1364 Factor out field name extraction

Will be used when function field usage is collected.
This commit is contained in:
Johan Wikman
2017-08-18 10:15:46 +03:00
parent 365371e7b5
commit 65bf471bd7

View File

@ -994,21 +994,27 @@ public:
} }
} }
void update_field_infos_from_expr(QcAliases* pAliases, static bool get_field_name(const Expr* pExpr,
const Expr* pExpr, const char** pzDatabase,
uint32_t usage, const char** pzTable,
const ExprList* pExclude) 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) if (pExpr->op == TK_ASTERISK)
{ {
item.column = (char*)"*"; zColumn = (char*)"*";
} }
else if (pExpr->op == TK_ID) else if (pExpr->op == TK_ID)
{ {
// select a from... // select a from...
item.column = pExpr->u.zToken; zColumn = pExpr->u.zToken;
} }
else if (pExpr->op == TK_DOT) else if (pExpr->op == TK_DOT)
{ {
@ -1016,14 +1022,14 @@ public:
(pExpr->pRight->op == TK_ID || pExpr->pRight->op == TK_ASTERISK)) (pExpr->pRight->op == TK_ID || pExpr->pRight->op == TK_ASTERISK))
{ {
// select a.b from... // select a.b from...
item.table = pExpr->pLeft->u.zToken; zTable = pExpr->pLeft->u.zToken;
if (pExpr->pRight->op == TK_ID) if (pExpr->pRight->op == TK_ID)
{ {
item.column = pExpr->pRight->u.zToken; zColumn = pExpr->pRight->u.zToken;
} }
else else
{ {
item.column = (char*)"*"; zColumn = (char*)"*";
} }
} }
else if (pExpr->pLeft->op == TK_ID && else if (pExpr->pLeft->op == TK_ID &&
@ -1032,35 +1038,51 @@ public:
(pExpr->pRight->pRight->op == TK_ID || pExpr->pRight->pRight->op == TK_ASTERISK)) (pExpr->pRight->pRight->op == TK_ID || pExpr->pRight->pRight->op == TK_ASTERISK))
{ {
// select a.b.c from... // select a.b.c from...
item.database = pExpr->pLeft->u.zToken; zDatabase = pExpr->pLeft->u.zToken;
item.table = pExpr->pRight->pLeft->u.zToken; zTable = pExpr->pRight->pLeft->u.zToken;
if (pExpr->pRight->pRight->op == TK_ID) if (pExpr->pRight->pRight->op == TK_ID)
{ {
item.column = pExpr->pRight->pRight->u.zToken; zColumn = pExpr->pRight->pRight->u.zToken;
} }
else 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; update_field_info(pAliases, zDatabase, zTable, zColumn, usage, pExclude);
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);
}
} }
} }