Skip to content

Commit 4b49428

Browse files
authored
feat(parser): report nearby tokens when parse failed (risingwavelabs#8465)
Signed-off-by: TennyZhuang <[email protected]>
1 parent 00ea62a commit 4b49428

File tree

7 files changed

+145
-208
lines changed

7 files changed

+145
-208
lines changed

src/sqlparser/src/parser.rs

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1475,7 +1475,24 @@ impl Parser {
14751475

14761476
/// Report unexpected token
14771477
pub fn expected<T>(&self, expected: &str, found: Token) -> Result<T, ParserError> {
1478-
parser_err!(format!("Expected {}, found: {}", expected, found))
1478+
let start_off = self.index.saturating_sub(10);
1479+
let end_off = self.index.min(self.tokens.len());
1480+
let near_tokens = &self.tokens[start_off..end_off];
1481+
struct TokensDisplay<'a>(&'a [Token]);
1482+
impl<'a> fmt::Display for TokensDisplay<'a> {
1483+
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1484+
for token in self.0 {
1485+
write!(f, "{}", token)?;
1486+
}
1487+
Ok(())
1488+
}
1489+
}
1490+
parser_err!(format!(
1491+
"Expected {}, found: {}\nNear \"{}\"",
1492+
expected,
1493+
found,
1494+
TokensDisplay(near_tokens),
1495+
))
14791496
}
14801497

14811498
/// Look for an expected keyword and consume it if it exists

0 commit comments

Comments
 (0)