diff --git a/lexer/lexer.go b/lexer/lexer.go index 92e032b6a0..4f4be5c3ff 100644 --- a/lexer/lexer.go +++ b/lexer/lexer.go @@ -766,6 +766,22 @@ func (l *Lexer) readNumberOrIdent() Item { } } + // Check if directly followed by letter (identifier like 1alias1name1) + // Exclude exponent (e/E followed by digit/+/-) and base prefixes (0x, 0b, 0o) + if unicode.IsLetter(l.ch) { + val := sb.String() + isExponent := (l.ch == 'e' || l.ch == 'E') && (unicode.IsDigit(l.peekChar()) || l.peekChar() == '+' || l.peekChar() == '-') + isBasePrefix := val == "0" && (l.ch == 'x' || l.ch == 'X' || l.ch == 'b' || l.ch == 'B' || l.ch == 'o' || l.ch == 'O') + if !isExponent && !isBasePrefix { + // This is an identifier that starts with digits (e.g., 1alias1name1) + for isIdentChar(l.ch) { + sb.WriteRune(l.ch) + l.readChar() + } + return Item{Token: token.IDENT, Value: sb.String(), Pos: pos} + } + } + // Not an identifier, continue as number // But we already consumed the digits, so continue from here // Handle underscore separators in numbers (only if followed by a digit) diff --git a/parser/testdata/01460_allow_dollar_and_number_in_identifier/metadata.json b/parser/testdata/01460_allow_dollar_and_number_in_identifier/metadata.json index ef58f80315..0967ef424b 100644 --- a/parser/testdata/01460_allow_dollar_and_number_in_identifier/metadata.json +++ b/parser/testdata/01460_allow_dollar_and_number_in_identifier/metadata.json @@ -1,5 +1 @@ -{ - "explain_todo": { - "stmt2": true - } -} +{}