in core/src/main/java/com/alibaba/druid/sql/parser/Lexer.java [1527:1745]
private void scanOperator() {
switch (ch) {
case '+':
scanChar();
token = Token.PLUS;
break;
case '-':
scanChar();
if (ch == '>') {
scanChar();
if (ch == '>') {
scanChar();
token = Token.SUBGTGT;
} else {
token = Token.SUBGT;
}
} else {
token = Token.SUB;
}
break;
case '*':
scanChar();
token = Token.STAR;
break;
case '/':
scanChar();
token = Token.SLASH;
break;
case '&':
scanChar();
if (ch == '&') {
scanChar();
token = Token.AMPAMP;
} else {
token = Token.AMP;
}
break;
case '|':
scanChar();
if (ch == '|') {
scanChar();
if (ch == '/') {
if (charAt(pos + 1) == '*') {
token = Token.BARBAR;
break;
}
scanChar();
token = Token.BARBARSLASH;
} else {
token = Token.BARBAR;
}
} else if (ch == '/') {
scanChar();
token = Token.BARSLASH;
} else {
token = Token.BAR;
}
break;
case '^':
scanChar();
if (ch == '=') {
scanChar();
token = Token.CARETEQ;
} else {
token = Token.CARET;
}
break;
case '%':
scanChar();
token = Token.PERCENT;
break;
case '=':
scanChar();
if (ch == ' ') {
scanChar();
}
if (ch == '=') {
scanChar();
token = Token.EQEQ;
} else if (ch == '>') {
scanChar();
token = Token.EQGT;
} else {
token = Token.EQ;
}
break;
case '>':
scanChar();
if (ch == '=') {
scanChar();
token = Token.GTEQ;
} else if (ch == '>') {
scanChar();
if (ch == '>') {
scanChar();
token = Token.GTGTGT;
} else {
token = Token.GTGT;
}
} else {
token = Token.GT;
}
break;
case '<':
scanChar();
if (ch == '=') {
scanChar();
if (ch == '>') {
token = Token.LTEQGT;
scanChar();
} else {
token = Token.LTEQ;
}
} else if (ch == '>') {
scanChar();
token = Token.LTGT;
} else if (ch == '<') {
scanChar();
if (ch == '<') {
scanChar();
token = Token.LTLTLT;
} else {
token = Token.LTLT;
}
} else if (ch == '@') {
scanChar();
token = Token.LT_MONKEYS_AT;
} else if (ch == '-' && charAt(pos + 1) == '>') {
scanChar();
scanChar();
token = Token.LT_SUB_GT;
} else {
if (ch == ' ') {
char c1 = charAt(pos + 1);
if (c1 == '=') {
scanChar();
scanChar();
if (ch == '>') {
token = Token.LTEQGT;
scanChar();
} else {
token = Token.LTEQ;
}
} else if (c1 == '>') {
scanChar();
scanChar();
token = Token.LTGT;
} else if (c1 == '<') {
scanChar();
scanChar();
token = Token.LTLT;
} else if (c1 == '@') {
scanChar();
scanChar();
token = Token.LT_MONKEYS_AT;
} else if (c1 == '-' && charAt(pos + 2) == '>') {
scanChar();
scanChar();
scanChar();
token = Token.LT_SUB_GT;
} else {
token = Token.LT;
}
} else {
token = Token.LT;
}
}
break;
case '!':
scanChar();
while (isWhitespace(ch)) {
scanChar();
}
if (ch == '=') {
scanChar();
token = Token.BANGEQ;
} else if (ch == '>') {
scanChar();
token = Token.BANGGT;
} else if (ch == '<') {
scanChar();
token = Token.BANGLT;
} else if (ch == '!') {
scanChar();
token = Token.BANGBANG; // postsql
} else if (ch == '~') {
scanChar();
if (ch == '*') {
scanChar();
token = Token.BANG_TILDE_STAR; // postsql
} else {
token = Token.BANG_TILDE; // postsql
}
} else {
token = Token.BANG;
}
break;
case '?':
scanChar();
token = Token.QUES;
break;
case '~':
scanChar();
if (ch == '*') {
scanChar();
token = Token.TILDE_STAR;
} else if (ch == '=') {
scanChar();
token = Token.TILDE_EQ; // postsql
} else {
token = Token.TILDE;
}
break;
default:
throw new ParserException("TODO. " + info());
}
}