Search in sources :

Example 6 with Token

use of com.alibaba.druid.sql.parser.Token in project druid by alibaba.

the class MySqlLexer method scanIdentifier.

public void scanIdentifier() {
    final char first = ch;
    if (ch == '`') {
        mark = pos;
        bufPos = 1;
        char ch;
        for (; ; ) {
            ch = charAt(++pos);
            if (ch == '`') {
                bufPos++;
                ch = charAt(++pos);
                break;
            } else if (ch == EOI) {
                throw new ParserException("illegal identifier");
            }
            bufPos++;
            continue;
        }
        this.ch = charAt(pos);
        stringVal = subString(mark, bufPos);
        Token tok = keywods.getKeyword(stringVal);
        if (tok != null) {
            token = tok;
        } else {
            token = Token.IDENTIFIER;
        }
    } else {
        final boolean firstFlag = isFirstIdentifierChar(first);
        if (!firstFlag) {
            throw new ParserException("illegal identifier");
        }
        mark = pos;
        bufPos = 1;
        char ch = '\0', last_ch;
        for (; ; ) {
            last_ch = ch;
            ch = charAt(++pos);
            if (!isIdentifierChar(ch)) {
                if (ch == '-' && pos < text.length() - 1) {
                    if (mark > 0 && text.charAt(mark - 1) == '.') {
                        break;
                    }
                    char next_char = text.charAt(pos + 1);
                    if (isIdentifierChar(next_char)) {
                        bufPos++;
                        continue;
                    }
                }
                if (last_ch == '-' && charAt(pos - 2) != '-') {
                    ch = last_ch;
                    bufPos--;
                    pos--;
                }
                break;
            }
            bufPos++;
            continue;
        }
        this.ch = charAt(pos);
        stringVal = addSymbol();
        Token tok = keywods.getKeyword(stringVal);
        if (tok != null) {
            token = tok;
        } else {
            token = Token.IDENTIFIER;
        }
    }
}
Also used : ParserException(com.alibaba.druid.sql.parser.ParserException) Token(com.alibaba.druid.sql.parser.Token)

Example 7 with Token

use of com.alibaba.druid.sql.parser.Token in project druid by alibaba.

the class MySqlLexer method scanSharp.

public void scanSharp() {
    if (ch != '#') {
        throw new ParserException("illegal stat");
    }
    if (charAt(pos + 1) == '{') {
        scanVariable();
        return;
    }
    Token lastToken = this.token;
    scanChar();
    mark = pos;
    bufPos = 0;
    for (; ; ) {
        if (ch == '\r') {
            if (charAt(pos + 1) == '\n') {
                bufPos += 2;
                scanChar();
                break;
            }
            bufPos++;
            break;
        } else if (ch == EOI) {
            break;
        }
        if (ch == '\n') {
            scanChar();
            bufPos++;
            break;
        }
        scanChar();
        bufPos++;
    }
    stringVal = subString(mark - 1, bufPos + 1);
    token = Token.LINE_COMMENT;
    commentCount++;
    if (keepComments) {
        addComment(stringVal);
    }
    if (commentHandler != null && commentHandler.handle(lastToken, stringVal)) {
        return;
    }
    endOfComment = isEOF();
    if (!isAllowComment() && (isEOF() || !isSafeComment(stringVal))) {
        throw new NotAllowCommentException();
    }
}
Also used : ParserException(com.alibaba.druid.sql.parser.ParserException) NotAllowCommentException(com.alibaba.druid.sql.parser.NotAllowCommentException) Token(com.alibaba.druid.sql.parser.Token)

Example 8 with Token

use of com.alibaba.druid.sql.parser.Token in project druid by alibaba.

the class OdpsLexer method scanIdentifier.

public void scanIdentifier() {
    final char first = ch;
    if (first == '`') {
        mark = pos;
        bufPos = 1;
        char ch;
        for (; ; ) {
            ch = charAt(++pos);
            if (ch == '`') {
                bufPos++;
                ch = charAt(++pos);
                break;
            } else if (ch == EOI) {
                throw new ParserException("illegal identifier");
            }
            bufPos++;
            continue;
        }
        this.ch = charAt(pos);
        stringVal = subString(mark, bufPos);
        token = Token.IDENTIFIER;
        return;
    }
    final boolean firstFlag = isFirstIdentifierChar(first);
    if (!firstFlag) {
        throw new ParserException("illegal identifier");
    }
    mark = pos;
    bufPos = 1;
    char ch;
    for (; ; ) {
        ch = charAt(++pos);
        if (!isIdentifierChar(ch)) {
            break;
        }
        bufPos++;
        continue;
    }
    this.ch = charAt(pos);
    if (ch == '@') {
        // for user identifier, like email, xx@alibaba-inc.com
        bufPos++;
        for (; ; ) {
            ch = charAt(++pos);
            if (ch != '-' && ch != '.' && !isIdentifierChar(ch)) {
                break;
            }
            bufPos++;
            continue;
        }
    }
    this.ch = charAt(pos);
    stringVal = addSymbol();
    Token tok = keywods.getKeyword(stringVal);
    if (tok != null) {
        token = tok;
    } else {
        token = Token.IDENTIFIER;
    }
}
Also used : ParserException(com.alibaba.druid.sql.parser.ParserException) Token(com.alibaba.druid.sql.parser.Token)

Example 9 with Token

use of com.alibaba.druid.sql.parser.Token in project druid by alibaba.

the class OdpsLexer method scanComment.

public void scanComment() {
    if (ch != '/' && ch != '-') {
        throw new IllegalStateException();
    }
    Token lastToken = this.token;
    mark = pos;
    bufPos = 0;
    scanChar();
    // /*+ */
    if (ch == '*') {
        scanChar();
        bufPos++;
        while (ch == ' ') {
            scanChar();
            bufPos++;
        }
        boolean isHint = false;
        int startHintSp = bufPos + 1;
        if (ch == '+') {
            isHint = true;
            scanChar();
            bufPos++;
        }
        for (; ; ) {
            if (ch == '*' && charAt(pos + 1) == '/') {
                bufPos += 2;
                scanChar();
                scanChar();
                break;
            }
            scanChar();
            bufPos++;
        }
        if (isHint) {
            stringVal = subString(mark + startHintSp, (bufPos - startHintSp) - 1);
            token = Token.HINT;
        } else {
            stringVal = subString(mark, bufPos + 1);
            token = Token.MULTI_LINE_COMMENT;
            commentCount++;
            if (keepComments) {
                addComment(stringVal);
            }
        }
        if (commentHandler != null && commentHandler.handle(lastToken, stringVal)) {
            return;
        }
        if (token != Token.HINT && !isAllowComment()) {
            throw new NotAllowCommentException();
        }
        return;
    }
    if (!isAllowComment()) {
        throw new NotAllowCommentException();
    }
    if (ch == '/' || ch == '-') {
        scanChar();
        bufPos++;
        for (; ; ) {
            if (ch == '\r') {
                if (charAt(pos + 1) == '\n') {
                    line++;
                    bufPos += 2;
                    scanChar();
                    break;
                }
                bufPos++;
                break;
            } else if (ch == EOI) {
                break;
            }
            if (ch == '\n') {
                line++;
                scanChar();
                bufPos++;
                break;
            }
            scanChar();
            bufPos++;
        }
        stringVal = subString(mark, ch != EOI ? bufPos : bufPos + 1);
        token = Token.LINE_COMMENT;
        commentCount++;
        if (keepComments) {
            addComment(stringVal);
        }
        endOfComment = isEOF();
        if (commentHandler != null && commentHandler.handle(lastToken, stringVal)) {
            return;
        }
        return;
    }
}
Also used : NotAllowCommentException(com.alibaba.druid.sql.parser.NotAllowCommentException) Token(com.alibaba.druid.sql.parser.Token)

Example 10 with Token

use of com.alibaba.druid.sql.parser.Token in project druid by alibaba.

the class OracleLexer method scanVariable.

public void scanVariable() {
    if (ch == '@') {
        scanChar();
        token = Token.MONKEYS_AT;
        return;
    }
    if (ch != ':' && ch != '#' && ch != '$') {
        throw new ParserException("illegal variable");
    }
    mark = pos;
    bufPos = 1;
    char ch;
    boolean quoteFlag = false;
    boolean mybatisFlag = false;
    if (charAt(pos + 1) == '"') {
        pos++;
        bufPos++;
        quoteFlag = true;
    } else if (charAt(pos + 1) == '{') {
        pos++;
        bufPos++;
        mybatisFlag = true;
    }
    for (; ; ) {
        ch = charAt(++pos);
        if (!isIdentifierChar(ch)) {
            break;
        }
        bufPos++;
        continue;
    }
    if (quoteFlag) {
        if (ch != '"') {
            throw new ParserException("syntax error");
        }
        ++pos;
        bufPos++;
    } else if (mybatisFlag) {
        if (ch != '}') {
            throw new ParserException("syntax error");
        }
        ++pos;
        bufPos++;
    }
    this.ch = charAt(pos);
    stringVal = addSymbol();
    Token tok = keywods.getKeyword(stringVal);
    if (tok != null) {
        token = tok;
    } else {
        token = Token.VARIANT;
    }
}
Also used : ParserException(com.alibaba.druid.sql.parser.ParserException) Token(com.alibaba.druid.sql.parser.Token)

Aggregations

Token (com.alibaba.druid.sql.parser.Token)11 ParserException (com.alibaba.druid.sql.parser.ParserException)7 NotAllowCommentException (com.alibaba.druid.sql.parser.NotAllowCommentException)4 SQLExpr (com.alibaba.druid.sql.ast.SQLExpr)3 SQLIdentifierExpr (com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr)2 SQLUnaryExpr (com.alibaba.druid.sql.ast.expr.SQLUnaryExpr)2 SQLVariantRefExpr (com.alibaba.druid.sql.ast.expr.SQLVariantRefExpr)2 SQLStatement (com.alibaba.druid.sql.ast.SQLStatement)1 SQLBinaryOpExpr (com.alibaba.druid.sql.ast.expr.SQLBinaryOpExpr)1 SQLCharExpr (com.alibaba.druid.sql.ast.expr.SQLCharExpr)1 SQLIntegerExpr (com.alibaba.druid.sql.ast.expr.SQLIntegerExpr)1 SQLNumberExpr (com.alibaba.druid.sql.ast.expr.SQLNumberExpr)1 SQLForeignKeyConstraint (com.alibaba.druid.sql.ast.statement.SQLForeignKeyConstraint)1 MySqlOutFileExpr (com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlOutFileExpr)1 MySqlHintStatement (com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlHintStatement)1 OracleBinaryDoubleExpr (com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleBinaryDoubleExpr)1 OracleBinaryFloatExpr (com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleBinaryFloatExpr)1 OracleCursorExpr (com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleCursorExpr)1 OracleSysdateExpr (com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleSysdateExpr)1 OracleConstraint (com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleConstraint)1