in core/src/main/java/com/alibaba/druid/sql/parser/Lexer.java [2876:3028]
public void scanNumber() {
mark = pos;
numberSale = 0;
numberExp = false;
bufPos = 0;
if (ch == '0' && charAt(pos + 1) == 'b' && dialectFeatureEnabled(ScanNumberPrefixB)) {
int i = 2;
int mark = pos + 2;
for (; ; ++i) {
char ch = charAt(pos + i);
if (ch == '0' || ch == '1') {
continue;
} else if (ch >= '2' && ch <= '9') {
break;
} else {
bufPos += i;
pos += i;
stringVal = subString(mark, i - 2);
this.ch = charAt(pos);
token = Token.BITS;
return;
}
}
}
if (ch == '-') {
bufPos++;
ch = charAt(++pos);
}
for (; ; ) {
if (ch >= '0' && ch <= '9') {
bufPos++;
} else {
break;
}
ch = charAt(++pos);
}
if (ch == '.') {
if (charAt(pos + 1) == '.') {
token = Token.LITERAL_INT;
return;
}
bufPos++;
ch = charAt(++pos);
for (numberSale = 0; ; numberSale++) {
if (ch >= '0' && ch <= '9') {
bufPos++;
} else {
break;
}
ch = charAt(++pos);
}
numberExp = true;
}
if ((ch == 'e' || ch == 'E')
&& (isDigit(charAt(pos + 1)) || (isDigit2(charAt(pos + 1)) && isDigit2(charAt(pos + 2))))) {
numberExp = true;
bufPos++;
ch = charAt(++pos);
if (ch == '+' || ch == '-') {
bufPos++;
ch = charAt(++pos);
}
for (; ; ) {
if (ch >= '0' && ch <= '9') {
bufPos++;
} else {
break;
}
ch = charAt(++pos);
}
if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z')) {
numberExp = false;
}
} else if (ch == 'd' || ch == 'D') {
if (!isIdentifierChar(charAt(pos + 1))) {
ch = charAt(++pos);
token = Token.LITERAL_FLOAT;
return;
}
}
if (numberSale > 0 || numberExp) {
if (text.charAt(mark) == '.' && isIdentifierChar(ch)) {
pos = mark + 1;
ch = charAt(pos);
token = Token.DOT;
return;
}
token = Token.LITERAL_FLOAT;
return;
}
if (ch != '`') {
if (isFirstIdentifierChar(ch)
&& ch != ')'
&& !(ch == 'b' && bufPos == 1 && charAt(pos - 1) == '0' && dialectFeatureEnabled(
ScanNumberCommonProcess))
) {
bufPos++;
boolean brace = false;
for (; ; ) {
char c0 = ch;
ch = charAt(++pos);
if (isEOF()) {
break;
}
if (!isIdentifierChar(ch)) {
if (ch == '{' && charAt(pos - 1) == '$' && !brace) {
bufPos++;
brace = true;
continue;
}
if (ch == '}' && brace) {
bufPos++;
brace = false;
continue;
}
if ((ch == '(' || ch == ')')
&& c0 > 256) {
bufPos++;
continue;
}
break;
}
bufPos++;
continue;
}
stringVal = addSymbol();
hashLCase = FnvHash.hashCode64(stringVal);
token = Token.IDENTIFIER;
return;
}
}
token = Token.LITERAL_INT;
}