Skip to content

Commit 9f6e1b1

Browse files
committed
fix LT tokenizer edge cases
1 parent b3e176d commit 9f6e1b1

File tree

1 file changed

+61
-8
lines changed

1 file changed

+61
-8
lines changed

src/tokenizer.rs

Lines changed: 61 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1627,6 +1627,7 @@ impl<'a> Tokenizer<'a> {
16271627
chars.next();
16281628
match chars.peek() {
16291629
Some('>') => self.consume_for_binop(chars, "<=>", Token::Spaceship),
1630+
Some('-') => Ok(Some(Token::LtEq)),
16301631
_ => self.start_binop(chars, "<=", Token::LtEq),
16311632
}
16321633
}
@@ -1647,12 +1648,11 @@ impl<'a> Tokenizer<'a> {
16471648
}
16481649
Some('<') => self.consume_for_binop(chars, "<<", Token::ShiftLeft),
16491650
Some('-') if self.dialect.supports_geometric_types() => {
1650-
chars.next(); // consume
1651-
match chars.peek() {
1652-
Some('>') => {
1653-
self.consume_for_binop(chars, "<->", Token::TwoWayArrow)
1654-
}
1655-
_ => self.start_binop_opt(chars, "<-", None),
1651+
if chars.peekable.clone().nth(1) == Some('>') {
1652+
chars.next(); // consume
1653+
self.consume_for_binop(chars, "<->", Token::TwoWayArrow)
1654+
} else {
1655+
Ok(Some(Token::Lt))
16561656
}
16571657
}
16581658
Some('^') if self.dialect.supports_geometric_types() => {
@@ -2628,9 +2628,10 @@ fn take_char_from_hex_digits(
26282628
mod tests {
26292629
use super::*;
26302630
use crate::dialect::{
2631-
BigQueryDialect, ClickHouseDialect, HiveDialect, MsSqlDialect, MySqlDialect, SQLiteDialect,
2631+
BigQueryDialect, ClickHouseDialect, HiveDialect, MsSqlDialect, MySqlDialect,
2632+
PostgreSqlDialect, SQLiteDialect,
26322633
};
2633-
use crate::test_utils::{all_dialects_except, all_dialects_where};
2634+
use crate::test_utils::{all_dialects, all_dialects_except, all_dialects_where};
26342635
use core::fmt::Debug;
26352636

26362637
#[test]
@@ -4420,4 +4421,56 @@ mod tests {
44204421
tokens,
44214422
);
44224423
}
4424+
4425+
#[test]
4426+
fn tokenize_lt() {
4427+
all_dialects().tokenizes_to(
4428+
"select a <-50",
4429+
vec![
4430+
Token::make_keyword("select"),
4431+
Token::Whitespace(Whitespace::Space),
4432+
Token::make_word("a", None),
4433+
Token::Whitespace(Whitespace::Space),
4434+
Token::Lt,
4435+
Token::Minus,
4436+
Token::Number("50".to_string(), false),
4437+
],
4438+
);
4439+
all_dialects().tokenizes_to(
4440+
"select a <=-50",
4441+
vec![
4442+
Token::make_keyword("select"),
4443+
Token::Whitespace(Whitespace::Space),
4444+
Token::make_word("a", None),
4445+
Token::Whitespace(Whitespace::Space),
4446+
Token::LtEq,
4447+
Token::Minus,
4448+
Token::Number("50".to_string(), false),
4449+
],
4450+
);
4451+
all_dialects_where(|d| d.supports_geometric_types()).tokenizes_to(
4452+
"select a <->b",
4453+
vec![
4454+
Token::make_keyword("select"),
4455+
Token::Whitespace(Whitespace::Space),
4456+
Token::make_word("a", None),
4457+
Token::Whitespace(Whitespace::Space),
4458+
Token::TwoWayArrow,
4459+
Token::make_word("b", None),
4460+
],
4461+
);
4462+
4463+
all_dialects().tokenizes_to(
4464+
"select a <-b",
4465+
vec![
4466+
Token::make_keyword("select"),
4467+
Token::Whitespace(Whitespace::Space),
4468+
Token::make_word("a", None),
4469+
Token::Whitespace(Whitespace::Space),
4470+
Token::Lt,
4471+
Token::Minus,
4472+
Token::make_word("b", None),
4473+
],
4474+
);
4475+
}
44234476
}

0 commit comments

Comments
 (0)