Skip to content

Commit 63245f6

Browse files
committed
fix tokenize number as part of ObjectName
1 parent 5de5312 commit 63245f6

File tree

1 file changed

+38
-7
lines changed

1 file changed

+38
-7
lines changed

src/tokenizer.rs

Lines changed: 38 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1108,15 +1108,29 @@ impl<'a> Tokenizer<'a> {
11081108

11091109
// match one period
11101110
if let Some('.') = chars.peek() {
1111-
s.push('.');
1112-
chars.next();
1111+
// Check if this actually is a float point number
1112+
let mut char_clone = chars.peekable.clone();
1113+
char_clone.next();
1114+
// Next char should be a digit, otherwise, it is not a float point number
1115+
if char_clone
1116+
.peek()
1117+
.map(|c| c.is_ascii_digit())
1118+
.unwrap_or(false)
1119+
{
1120+
s.push('.');
1121+
chars.next();
1122+
} else if s.is_empty() {
1123+
// Number might be part of period separated construct. Keep the period for next token
1124+
// e.g. a-12.b
1125+
return Ok(Some(Token::Number(s, false)));
1126+
} else {
1127+
// No number -> Token::Period
1128+
chars.next();
1129+
return Ok(Some(Token::Period));
1130+
}
11131131
}
1114-
s += &peeking_take_while(chars, |ch| ch.is_ascii_digit());
11151132

1116-
// No number -> Token::Period
1117-
if s == "." {
1118-
return Ok(Some(Token::Period));
1119-
}
1133+
s += &peeking_take_while(chars, |ch| ch.is_ascii_digit());
11201134

11211135
let mut exponent_part = String::new();
11221136
// Parse exponent as number
@@ -2128,6 +2142,23 @@ mod tests {
21282142
compare(expected, tokens);
21292143
}
21302144

2145+
#[test]
2146+
fn tokenize_select_float_hyphenated_identifier() {
2147+
let sql = String::from("SELECT a-12.b");
2148+
let dialect = GenericDialect {};
2149+
let tokens = Tokenizer::new(&dialect, &sql).tokenize().unwrap();
2150+
let expected = vec![
2151+
Token::make_keyword("SELECT"),
2152+
Token::Whitespace(Whitespace::Space),
2153+
Token::make_word("a", None),
2154+
Token::Minus,
2155+
Token::Number(String::from("12"), false),
2156+
Token::Period,
2157+
Token::make_word("b", None),
2158+
];
2159+
compare(expected, tokens);
2160+
}
2161+
21312162
#[test]
21322163
fn tokenize_clickhouse_double_equal() {
21332164
let sql = String::from("SELECT foo=='1'");

0 commit comments

Comments
 (0)