Skip to content

Commit 3a6f0e1

Browse files
committed
fix LT tokenizer edge cases
1 parent b3e176d commit 3a6f0e1

File tree

1 file changed

+99
-8
lines changed

1 file changed

+99
-8
lines changed

src/tokenizer.rs

Lines changed: 99 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1627,6 +1627,8 @@ 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)),
1631+
Some('-') => Ok(Some(Token::LtEq)),
16301632
_ => self.start_binop(chars, "<=", Token::LtEq),
16311633
}
16321634
}
@@ -1646,13 +1648,13 @@ impl<'a> Tokenizer<'a> {
16461648
}
16471649
}
16481650
Some('<') => self.consume_for_binop(chars, "<<", Token::ShiftLeft),
1651+
Some('+') => Ok(Some(Token::Lt)),
16491652
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),
1653+
if chars.peekable.clone().nth(1) == Some('>') {
1654+
chars.next(); // consume
1655+
self.consume_for_binop(chars, "<->", Token::TwoWayArrow)
1656+
} else {
1657+
Ok(Some(Token::Lt))
16561658
}
16571659
}
16581660
Some('^') if self.dialect.supports_geometric_types() => {
@@ -2628,9 +2630,10 @@ fn take_char_from_hex_digits(
26282630
mod tests {
26292631
use super::*;
26302632
use crate::dialect::{
2631-
BigQueryDialect, ClickHouseDialect, HiveDialect, MsSqlDialect, MySqlDialect, SQLiteDialect,
2633+
BigQueryDialect, ClickHouseDialect, HiveDialect, MsSqlDialect, MySqlDialect,
2634+
PostgreSqlDialect, SQLiteDialect,
26322635
};
2633-
use crate::test_utils::{all_dialects_except, all_dialects_where};
2636+
use crate::test_utils::{all_dialects, all_dialects_except, all_dialects_where};
26342637
use core::fmt::Debug;
26352638

26362639
#[test]
@@ -4420,4 +4423,92 @@ mod tests {
44204423
tokens,
44214424
);
44224425
}
4426+
4427+
#[test]
4428+
fn tokenize_lt() {
4429+
all_dialects().tokenizes_to(
4430+
"select a <-50",
4431+
vec![
4432+
Token::make_keyword("select"),
4433+
Token::Whitespace(Whitespace::Space),
4434+
Token::make_word("a", None),
4435+
Token::Whitespace(Whitespace::Space),
4436+
Token::Lt,
4437+
Token::Minus,
4438+
Token::Number("50".to_string(), false),
4439+
],
4440+
);
4441+
all_dialects().tokenizes_to(
4442+
"select a <+50",
4443+
vec![
4444+
Token::make_keyword("select"),
4445+
Token::Whitespace(Whitespace::Space),
4446+
Token::make_word("a", None),
4447+
Token::Whitespace(Whitespace::Space),
4448+
Token::Lt,
4449+
Token::Plus,
4450+
Token::Number("50".to_string(), false),
4451+
],
4452+
);
4453+
all_dialects().tokenizes_to(
4454+
"select a <=-50",
4455+
vec![
4456+
Token::make_keyword("select"),
4457+
Token::Whitespace(Whitespace::Space),
4458+
Token::make_word("a", None),
4459+
Token::Whitespace(Whitespace::Space),
4460+
Token::LtEq,
4461+
Token::Minus,
4462+
Token::Number("50".to_string(), false),
4463+
],
4464+
);
4465+
all_dialects().tokenizes_to(
4466+
"select a <=+50",
4467+
vec![
4468+
Token::make_keyword("select"),
4469+
Token::Whitespace(Whitespace::Space),
4470+
Token::make_word("a", None),
4471+
Token::Whitespace(Whitespace::Space),
4472+
Token::LtEq,
4473+
Token::Plus,
4474+
Token::Number("50".to_string(), false),
4475+
],
4476+
);
4477+
all_dialects_where(|d| d.supports_geometric_types()).tokenizes_to(
4478+
"select a <->b",
4479+
vec![
4480+
Token::make_keyword("select"),
4481+
Token::Whitespace(Whitespace::Space),
4482+
Token::make_word("a", None),
4483+
Token::Whitespace(Whitespace::Space),
4484+
Token::TwoWayArrow,
4485+
Token::make_word("b", None),
4486+
],
4487+
);
4488+
4489+
all_dialects().tokenizes_to(
4490+
"select a <-b",
4491+
vec![
4492+
Token::make_keyword("select"),
4493+
Token::Whitespace(Whitespace::Space),
4494+
Token::make_word("a", None),
4495+
Token::Whitespace(Whitespace::Space),
4496+
Token::Lt,
4497+
Token::Minus,
4498+
Token::make_word("b", None),
4499+
],
4500+
);
4501+
all_dialects().tokenizes_to(
4502+
"select a <+b",
4503+
vec![
4504+
Token::make_keyword("select"),
4505+
Token::Whitespace(Whitespace::Space),
4506+
Token::make_word("a", None),
4507+
Token::Whitespace(Whitespace::Space),
4508+
Token::Lt,
4509+
Token::Plus,
4510+
Token::make_word("b", None),
4511+
],
4512+
);
4513+
}
44234514
}

0 commit comments

Comments
 (0)