@@ -1108,15 +1108,29 @@ impl<'a> Tokenizer<'a> {
1108
1108
1109
1109
// match one period
1110
1110
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
+ }
1113
1131
}
1114
- s += & peeking_take_while ( chars, |ch| ch. is_ascii_digit ( ) ) ;
1115
1132
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 ( ) ) ;
1120
1134
1121
1135
let mut exponent_part = String :: new ( ) ;
1122
1136
// Parse exponent as number
@@ -2128,6 +2142,23 @@ mod tests {
2128
2142
compare ( expected, tokens) ;
2129
2143
}
2130
2144
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
+
2131
2162
#[ test]
2132
2163
fn tokenize_clickhouse_double_equal ( ) {
2133
2164
let sql = String :: from ( "SELECT foo=='1'" ) ;
0 commit comments