bool SqlParser::parseTableNameAndAlias(int start, int end, StringVector &tables, StringVector &aliases) const { for (int i = start; i < end;) { // Assume ',' separated mutiple table list // this is not always true // find the first table part int keyIds[] = {TK_SQL_INNER, TK_SQL_CROSS, TK_SQL_STRAIGHT_JOIN, TK_SQL_LEFT, TK_SQL_RIGHT, TK_SQL_NATURAL, TK_SQL_JOIN, TK_COMMA}; int table0End; if (findTokens(i, end, keyIds, sizeof (keyIds) / sizeof (int), &table0End)) { if (!parseSimpleTableNameAndAlias(i, table0End, tables, aliases)) return false; if (getTokenId(table0End) == TK_COMMA) { i = table0End + 1; continue; } } else { return parseSimpleTableNameAndAlias(i, table0End, tables, aliases); } bool firstJoin = true; while (1) { // find the second table in join int joinKw[] = {TK_SQL_JOIN, TK_SQL_STRAIGHT_JOIN}; int table1Start; if (!findTokens(table0End, end, joinKw, sizeof (joinKw) / sizeof (int), &table1Start)) return !firstJoin; table1Start++; int table1End; int condKw[] = {TK_SQL_ON, TK_SQL_USING, TK_COMMA}; bool found = findTokens(table1Start, end, condKw, sizeof (condKw) / sizeof (int), &table1End); if (!parseSimpleTableNameAndAlias(table1Start, table1End, tables, aliases)) return false; i = table1End + 1; table0End = i; firstJoin = false; if (found && getTokenId(table1End) == TK_COMMA) break; else if (found) continue; else return true; } } return true; }
Line* Tokenizer::tokenizeLine(int linenum, std::string linetext, FileStructure fstruc) { Line* line = new Line; auto tokenMaps = findTokens(linetext); line->lnum = linenum; line->lblock = fstruc.findBlockContainingLine(linenum); line->lkeys = tokenMaps[0]; line->lvars = tokenMaps[1]; line->lops = tokenMaps[2]; line->llits = tokenMaps[3]; line->ltype = findType(line); return line; }
bool SqlParser::getSqlWhere(int begin, int *start, int *end) const { if (!findToken(begin, tokens->len, TK_SQL_WHERE, start)) return false; (*start)++; int ids[] = {TK_SQL_GROUP, TK_SQL_HAVING, TK_SQL_ORDER, TK_SQL_LIMIT, TK_SQL_PROCEDURE, TK_SQL_INTO, TK_SQL_FOR, TK_SQL_LOCK}; findTokens(*start, tokens->len, ids, sizeof (ids) / sizeof (int), end); return true; }