From 0d47a11d0337cf0f032c223a6a6e5ccdb1e1364b Mon Sep 17 00:00:00 2001 From: Michelle Tilley Date: Thu, 6 Nov 2025 09:59:13 -0800 Subject: [PATCH] Add parse_sql_with_offsets to preserve original source text Introduces a new API method `Parser::parse_sql_with_offsets()` that returns parsed statements along with byte offsets into the original source string. This allows users to recover the exact original text for each statement, which is useful for preserving case-sensitive identifiers and type names that may be normalized in the AST. - Add `SourceOffset` type to track byte positions in source text - Add `Parser::parse_sql_with_offsets()` public API method - Add `Parser::parse_statements_with_offsets()` internal method - Add helper function to convert line/column to byte offsets - Add comprehensive tests covering single/multiple statements, case-sensitive type names, and multiline SQL This is particularly useful for dialects like ClickHouse where type names are case-sensitive (e.g., `Nullable(Float64)` vs `Nullable(FLOAT64)`). --- src/parser/mod.rs | 164 ++++++++++++++++++++++++++++++++++++++ src/tokenizer.rs | 45 ++++++++++- test_offsets | Bin 0 -> 8379488 bytes tests/sqlparser_common.rs | 42 ++++++++++ 4 files changed, 249 insertions(+), 2 deletions(-) create mode 100755 test_offsets diff --git a/src/parser/mod.rs b/src/parser/mod.rs index 9a01e510b..402d9eb4d 100644 --- a/src/parser/mod.rs +++ b/src/parser/mod.rs @@ -344,6 +344,44 @@ pub struct Parser<'a> { recursion_counter: RecursionCounter, } +/// Helper function to convert a Location (line, column) to a byte offset in the source string. +/// +/// Line and column numbers are 1-indexed as per the Location type. +fn span_to_byte_offset(sql: &str, location: Location) -> usize { + if location.line == 0 || location.column == 0 { + // Empty location + return 0; + } + + let mut byte_offset = 0; + let mut current_line = 1u64; + + for ch in sql.chars() { + if current_line == location.line { + // We're on the target line, now count columns + let mut current_col = 1u64; + let remaining = &sql[byte_offset..]; + for ch in remaining.chars() { + if current_col >= location.column { + return byte_offset; + } + if ch == '\n' { + // Don't go past the end of the line + return byte_offset; + } + byte_offset += ch.len_utf8(); + current_col += 1; + } + return byte_offset; + } + if ch == '\n' { + current_line += 1; + } + byte_offset += ch.len_utf8(); + } + byte_offset +} + impl<'a> Parser<'a> { /// Create a parser for a [`Dialect`] /// @@ -510,6 +548,101 @@ impl<'a> Parser<'a> { Ok(stmts) } + /// Parse multiple statements and return them with their byte offsets in the original source. + /// + /// Similar to [`Self::parse_statements`], but also returns [`crate::tokenizer::SourceOffset`] + /// for each statement indicating its position in the original SQL string. + pub fn parse_statements_with_offsets( + &mut self, + sql: &str, + ) -> Result, ParserError> { + let mut stmts = Vec::new(); + let mut expecting_statement_delimiter = false; + loop { + // ignore empty statements (between successive statement delimiters) + while self.consume_token(&Token::SemiColon) { + expecting_statement_delimiter = false; + } + + if !self.options.require_semicolon_stmt_delimiter { + expecting_statement_delimiter = false; + } + + match self.peek_token().token { + Token::EOF => break, + + // end of statement + Token::Word(word) => { + if expecting_statement_delimiter && word.keyword == Keyword::END { + break; + } + } + _ => {} + } + + if expecting_statement_delimiter { + return self.expected("end of statement", self.peek_token()); + } + + // Find the first non-whitespace token to get the actual start position + let mut start_index = self.index; + while start_index < self.tokens.len() { + if matches!(self.tokens[start_index].token, Token::Whitespace(_)) { + start_index += 1; + } else { + break; + } + } + + let statement = self.parse_statement()?; + + // Find the last non-whitespace token that was consumed + // We need to look backwards from the current position to skip any whitespace + let mut end_index = self.index.saturating_sub(1); + while end_index > start_index { + if matches!( + self.tokens.get(end_index).map(|t| &t.token), + Some(Token::Whitespace(_)) + ) { + end_index = end_index.saturating_sub(1); + } else { + break; + } + } + + // Check if the next non-whitespace token is a semicolon and include it in the range + let mut check_index = self.index; + while check_index < self.tokens.len() { + match &self.tokens[check_index].token { + Token::Whitespace(_) => check_index += 1, + Token::SemiColon => { + end_index = check_index; + break; + } + _ => break, + } + } + + // Calculate byte offsets from the token spans + let start_offset = if start_index < self.tokens.len() { + span_to_byte_offset(sql, self.tokens[start_index].span.start) + } else { + sql.len() + }; + + let end_offset = if end_index < self.tokens.len() { + span_to_byte_offset(sql, self.tokens[end_index].span.end) + } else { + sql.len() + }; + + let source_offset = crate::tokenizer::SourceOffset::new(start_offset, end_offset); + stmts.push((statement, source_offset)); + expecting_statement_delimiter = true; + } + Ok(stmts) + } + /// Convenience method to parse a string with one or more SQL /// statements into produce an Abstract Syntax Tree (AST). /// @@ -529,6 +662,37 @@ impl<'a> Parser<'a> { Parser::new(dialect).try_with_sql(sql)?.parse_statements() } + /// Convenience method to parse a string with one or more SQL statements and return + /// both the Abstract Syntax Tree (AST) and byte offsets into the original source string. + /// + /// This is useful when you need to preserve the original source text for each statement, + /// for example to maintain case-sensitive identifiers or type names that get normalized + /// in the AST. + /// + /// # Example + /// ``` + /// # use sqlparser::{parser::Parser, dialect::GenericDialect}; + /// # fn main() -> Result<(), sqlparser::parser::ParserError> { + /// let dialect = GenericDialect{}; + /// let sql = "SELECT * FROM foo; INSERT INTO bar VALUES (1);"; + /// let results = Parser::parse_sql_with_offsets(&dialect, sql)?; + /// + /// assert_eq!(results.len(), 2); + /// let (stmt, offset) = &results[0]; + /// let original_text = &sql[offset.start()..offset.end()]; + /// assert_eq!(original_text, "SELECT * FROM foo;"); + /// # Ok(()) + /// # } + /// ``` + pub fn parse_sql_with_offsets( + dialect: &dyn Dialect, + sql: &str, + ) -> Result, ParserError> { + Parser::new(dialect) + .try_with_sql(sql)? + .parse_statements_with_offsets(sql) + } + /// Parse a single top-level statement (such as SELECT, INSERT, CREATE, etc.), /// stopping before the statement separator, if any. pub fn parse_statement(&mut self) -> Result { diff --git a/src/tokenizer.rs b/src/tokenizer.rs index 54a158c1f..fe0e655cd 100644 --- a/src/tokenizer.rs +++ b/src/tokenizer.rs @@ -29,10 +29,9 @@ use alloc::{ vec, vec::Vec, }; -use core::iter::Peekable; -use core::num::NonZeroU8; use core::str::Chars; use core::{cmp, fmt}; +use core::{iter::Peekable, num::NonZeroU8, ops::Range}; #[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; @@ -651,6 +650,48 @@ impl Span { } } +/// Represents byte offsets into the original source string +/// +/// Unlike [`Span`] which tracks line and column numbers, `SourceOffset` tracks +/// byte positions which can be used to directly slice the original source string. +/// +/// # Examples +/// ``` +/// # use sqlparser::tokenizer::SourceOffset; +/// let sql = "SELECT * FROM users; INSERT INTO foo VALUES (1);"; +/// let offset = SourceOffset::new(0, 20); +/// assert_eq!(&sql[offset.start()..offset.end()], "SELECT * FROM users;"); +/// ``` +#[derive(Debug, Eq, PartialEq, Hash, Clone, Copy, Ord, PartialOrd)] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] +#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))] +pub struct SourceOffset { + start: usize, + end: usize, +} + +impl SourceOffset { + /// Create a new `SourceOffset` from start and end byte offsets + pub fn new(start: usize, end: usize) -> Self { + Self { start, end } + } + + /// Returns the starting byte offset + pub fn start(&self) -> usize { + self.start + } + + /// Returns the ending byte offset + pub fn end(&self) -> usize { + self.end + } + + /// Returns a range representing the byte offsets + pub fn range(&self) -> Range { + self.start..self.end + } +} + /// Backwards compatibility struct for [`TokenWithSpan`] #[deprecated(since = "0.53.0", note = "please use `TokenWithSpan` instead")] pub type TokenWithLocation = TokenWithSpan; diff --git a/test_offsets b/test_offsets new file mode 100755 index 0000000000000000000000000000000000000000..65a0d7c96819a9ad8c79f5611606674b32da42cd GIT binary patch literal 8379488 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