示例#1
0
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;
}
示例#2
0
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;
}
示例#3
0
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;
}