public void scanNumber()

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;
    }