This is an automated email from the ASF dual-hosted git repository.

github-bot pushed a commit to branch 
gh-readonly-queue/main/pr-2225-15dc6a22a99131072f05b94f59f1532852209cc6
in repository https://gitbox.apache.org/repos/asf/datafusion-sqlparser-rs.git

commit bfd944c6ceb34e0a201e64e0d6ba6a8483f8d5f2
Author: Alexander Beedie <[email protected]>
AuthorDate: Fri Feb 20 18:26:20 2026 +0400

    Prefer use of `peek_token_ref` over `peek_token` where valid (#2225)
    
    Co-authored-by: Alexander Beedie <[email protected]>
---
 src/dialect/mod.rs        |  54 ++---
 src/dialect/mssql.rs      |   6 +-
 src/dialect/mysql.rs      |   2 +-
 src/dialect/oracle.rs     |   4 +-
 src/dialect/postgresql.rs |   4 +-
 src/dialect/snowflake.rs  |  40 ++--
 src/parser/alter.rs       |  20 +-
 src/parser/mod.rs         | 513 ++++++++++++++++++++++++----------------------
 8 files changed, 337 insertions(+), 306 deletions(-)

diff --git a/src/dialect/mod.rs b/src/dialect/mod.rs
index 6e374d3d..b1be1590 100644
--- a/src/dialect/mod.rs
+++ b/src/dialect/mod.rs
@@ -756,17 +756,17 @@ pub trait Dialect: Debug + Any {
             };
         }
 
-        let token = parser.peek_token();
+        let token = parser.peek_token_ref();
         debug!("get_next_precedence_full() {token:?}");
-        match token.token {
+        match &token.token {
             Token::Word(w) if w.keyword == Keyword::OR => Ok(p!(Or)),
             Token::Word(w) if w.keyword == Keyword::AND => Ok(p!(And)),
             Token::Word(w) if w.keyword == Keyword::XOR => Ok(p!(Xor)),
 
             Token::Word(w) if w.keyword == Keyword::AT => {
                 match (
-                    parser.peek_nth_token(1).token,
-                    parser.peek_nth_token(2).token,
+                    &parser.peek_nth_token_ref(1).token,
+                    &parser.peek_nth_token_ref(2).token,
                 ) {
                     (Token::Word(w), Token::Word(w2))
                         if w.keyword == Keyword::TIME && w2.keyword == 
Keyword::ZONE =>
@@ -777,28 +777,30 @@ pub trait Dialect: Debug + Any {
                 }
             }
 
-            Token::Word(w) if w.keyword == Keyword::NOT => match 
parser.peek_nth_token(1).token {
-                // The precedence of NOT varies depending on keyword that
-                // follows it. If it is followed by IN, BETWEEN, or LIKE,
-                // it takes on the precedence of those tokens. Otherwise, it
-                // is not an infix operator, and therefore has zero
-                // precedence.
-                Token::Word(w) if w.keyword == Keyword::IN => Ok(p!(Between)),
-                Token::Word(w) if w.keyword == Keyword::BETWEEN => 
Ok(p!(Between)),
-                Token::Word(w) if w.keyword == Keyword::LIKE => Ok(p!(Like)),
-                Token::Word(w) if w.keyword == Keyword::ILIKE => Ok(p!(Like)),
-                Token::Word(w) if w.keyword == Keyword::RLIKE => Ok(p!(Like)),
-                Token::Word(w) if w.keyword == Keyword::REGEXP => Ok(p!(Like)),
-                Token::Word(w) if w.keyword == Keyword::MATCH => Ok(p!(Like)),
-                Token::Word(w) if w.keyword == Keyword::SIMILAR => 
Ok(p!(Like)),
-                Token::Word(w) if w.keyword == Keyword::MEMBER => Ok(p!(Like)),
-                Token::Word(w)
-                    if w.keyword == Keyword::NULL && 
!parser.in_column_definition_state() =>
-                {
-                    Ok(p!(Is))
+            Token::Word(w) if w.keyword == Keyword::NOT => {
+                match &parser.peek_nth_token_ref(1).token {
+                    // The precedence of NOT varies depending on keyword that
+                    // follows it. If it is followed by IN, BETWEEN, or LIKE,
+                    // it takes on the precedence of those tokens. Otherwise, 
it
+                    // is not an infix operator, and therefore has zero
+                    // precedence.
+                    Token::Word(w) if w.keyword == Keyword::IN => 
Ok(p!(Between)),
+                    Token::Word(w) if w.keyword == Keyword::BETWEEN => 
Ok(p!(Between)),
+                    Token::Word(w) if w.keyword == Keyword::LIKE => 
Ok(p!(Like)),
+                    Token::Word(w) if w.keyword == Keyword::ILIKE => 
Ok(p!(Like)),
+                    Token::Word(w) if w.keyword == Keyword::RLIKE => 
Ok(p!(Like)),
+                    Token::Word(w) if w.keyword == Keyword::REGEXP => 
Ok(p!(Like)),
+                    Token::Word(w) if w.keyword == Keyword::MATCH => 
Ok(p!(Like)),
+                    Token::Word(w) if w.keyword == Keyword::SIMILAR => 
Ok(p!(Like)),
+                    Token::Word(w) if w.keyword == Keyword::MEMBER => 
Ok(p!(Like)),
+                    Token::Word(w)
+                        if w.keyword == Keyword::NULL && 
!parser.in_column_definition_state() =>
+                    {
+                        Ok(p!(Is))
+                    }
+                    _ => Ok(self.prec_unknown()),
                 }
-                _ => Ok(self.prec_unknown()),
-            },
+            }
             Token::Word(w) if w.keyword == Keyword::NOTNULL && 
self.supports_notnull_operator() => {
                 Ok(p!(Is))
             }
@@ -861,7 +863,7 @@ pub trait Dialect: Debug + Any {
             Token::DoubleColon | Token::ExclamationMark | Token::LBracket | 
Token::CaretAt => {
                 Ok(p!(DoubleColon))
             }
-            Token::Colon => match parser.peek_nth_token(1).token {
+            Token::Colon => match &parser.peek_nth_token_ref(1).token {
                 // When colon is followed by a string or a number, it's 
usually in MAP syntax.
                 Token::SingleQuotedString(_) | Token::Number(_, _) => 
Ok(self.prec_unknown()),
                 // In other cases, it's used in semi-structured data traversal 
like in variant or JSON
diff --git a/src/dialect/mssql.rs b/src/dialect/mssql.rs
index a2127f0d..42e05858 100644
--- a/src/dialect/mssql.rs
+++ b/src/dialect/mssql.rs
@@ -159,7 +159,7 @@ impl Dialect for MsSqlDialect {
                         .is_some()
                         || matches!(p.peek_token_ref().token, Token::SemiColon 
| Token::EOF)
                     {
-                        p.expected("statement", p.peek_token())
+                        p.expected_ref("statement", p.peek_token_ref())
                     } else {
                         Ok(())
                     }
@@ -189,8 +189,8 @@ impl Dialect for MsSqlDialect {
     }
 
     fn get_next_precedence(&self, parser: &Parser) -> Option<Result<u8, 
ParserError>> {
-        let token = parser.peek_token();
-        match token.token {
+        let token = parser.peek_token_ref();
+        match &token.token {
             // lowest prec to prevent it from turning into a binary op
             Token::Colon => Some(Ok(self.prec_unknown())),
             _ => None,
diff --git a/src/dialect/mysql.rs b/src/dialect/mysql.rs
index b31a2310..bdced482 100644
--- a/src/dialect/mysql.rs
+++ b/src/dialect/mysql.rs
@@ -244,7 +244,7 @@ fn parse_lock_tables_type(parser: &mut Parser) -> 
Result<LockTableType, ParserEr
     } else if parser.parse_keywords(&[Keyword::LOW_PRIORITY, Keyword::WRITE]) {
         Ok(LockTableType::Write { low_priority: true })
     } else {
-        parser.expected("an lock type in LOCK TABLES", parser.peek_token())
+        parser.expected_ref("an lock type in LOCK TABLES", 
parser.peek_token_ref())
     }
 }
 
diff --git a/src/dialect/oracle.rs b/src/dialect/oracle.rs
index deb7beac..c2147eae 100644
--- a/src/dialect/oracle.rs
+++ b/src/dialect/oracle.rs
@@ -86,10 +86,10 @@ impl Dialect for OracleDialect {
     }
 
     fn get_next_precedence(&self, parser: &Parser) -> Option<Result<u8, 
ParserError>> {
-        let t = parser.peek_token();
+        let t = parser.peek_token_ref();
         debug!("get_next_precedence() {t:?}");
 
-        match t.token {
+        match &t.token {
             Token::StringConcat => 
Some(Ok(self.prec_value(Precedence::PlusMinus))),
             _ => None,
         }
diff --git a/src/dialect/postgresql.rs b/src/dialect/postgresql.rs
index 8e4d78a4..b0511f6d 100644
--- a/src/dialect/postgresql.rs
+++ b/src/dialect/postgresql.rs
@@ -105,12 +105,12 @@ impl Dialect for PostgreSqlDialect {
     }
 
     fn get_next_precedence(&self, parser: &Parser) -> Option<Result<u8, 
ParserError>> {
-        let token = parser.peek_token();
+        let token = parser.peek_token_ref();
         debug!("get_next_precedence() {token:?}");
 
         // we only return some custom value here when the behaviour (not 
merely the numeric value) differs
         // from the default implementation
-        match token.token {
+        match &token.token {
             Token::Word(w)
                 if w.keyword == Keyword::COLLATE && 
!parser.in_column_definition_state() =>
             {
diff --git a/src/dialect/snowflake.rs b/src/dialect/snowflake.rs
index 31a17225..8af1367f 100644
--- a/src/dialect/snowflake.rs
+++ b/src/dialect/snowflake.rs
@@ -265,7 +265,7 @@ impl Dialect for SnowflakeDialect {
             let set = match parser.parse_one_of_keywords(&[Keyword::SET, 
Keyword::UNSET]) {
                 Some(Keyword::SET) => true,
                 Some(Keyword::UNSET) => false,
-                _ => return Some(parser.expected("SET or UNSET", 
parser.peek_token())),
+                _ => return Some(parser.expected_ref("SET or UNSET", 
parser.peek_token_ref())),
             };
             return Some(parse_alter_session(parser, set));
         }
@@ -417,9 +417,9 @@ impl Dialect for SnowflakeDialect {
     }
 
     fn get_next_precedence(&self, parser: &Parser) -> Option<Result<u8, 
ParserError>> {
-        let token = parser.peek_token();
+        let token = parser.peek_token_ref();
         // Snowflake supports the `:` cast operator unlike other dialects
-        match token.token {
+        match &token.token {
             Token::Colon => Some(Ok(self.prec_value(Precedence::DoubleColon))),
             _ => None,
         }
@@ -715,9 +715,9 @@ fn parse_alter_dynamic_table(parser: &mut Parser) -> 
Result<Statement, ParserErr
     } else if parser.parse_keyword(Keyword::RESUME) {
         AlterTableOperation::Resume
     } else {
-        return parser.expected(
+        return parser.expected_ref(
             "REFRESH, SUSPEND, or RESUME after ALTER DYNAMIC TABLE",
-            parser.peek_token(),
+            parser.peek_token_ref(),
         );
     };
 
@@ -757,7 +757,10 @@ fn parse_alter_external_table(parser: &mut Parser) -> 
Result<Statement, ParserEr
         };
         AlterTableOperation::Refresh { subpath }
     } else {
-        return parser.expected("REFRESH after ALTER EXTERNAL TABLE", 
parser.peek_token());
+        return parser.expected_ref(
+            "REFRESH after ALTER EXTERNAL TABLE",
+            parser.peek_token_ref(),
+        );
     };
 
     let end_token = if parser.peek_token_ref().token == Token::SemiColon {
@@ -1242,7 +1245,7 @@ pub fn parse_stage_name_identifier(parser: &mut Parser) 
-> Result<Ident, ParserE
             Token::Minus => ident.push('-'),
             Token::Number(n, _) => ident.push_str(n),
             Token::Word(w) => ident.push_str(&w.to_string()),
-            _ => return parser.expected("stage name identifier", 
parser.peek_token()),
+            _ => return parser.expected_ref("stage name identifier", 
parser.peek_token_ref()),
         }
     }
     Ok(Ident::new(ident))
@@ -1273,7 +1276,7 @@ pub fn parse_snowflake_stage_name(parser: &mut Parser) -> 
Result<ObjectName, Par
 /// Parses a `COPY INTO` statement. Snowflake has two variants, `COPY INTO 
<table>`
 /// and `COPY INTO <location>` which have different syntax.
 pub fn parse_copy_into(parser: &mut Parser) -> Result<Statement, ParserError> {
-    let kind = match parser.peek_token().token {
+    let kind = match &parser.peek_token_ref().token {
         // Indicates an internal stage
         Token::AtSign => CopyIntoSnowflakeKind::Location,
         // Indicates an external stage, i.e. s3://, gcs:// or azure://
@@ -1346,7 +1349,7 @@ pub fn parse_copy_into(parser: &mut Parser) -> 
Result<Statement, ParserError> {
             from_stage_alias = if parser.parse_keyword(Keyword::AS) {
                 Some(match parser.next_token().token {
                     Token::Word(w) => Ok(Ident::new(w.value)),
-                    _ => parser.expected("stage alias", parser.peek_token()),
+                    _ => parser.expected_ref("stage alias", 
parser.peek_token_ref()),
                 }?)
             } else {
                 None
@@ -1404,7 +1407,10 @@ pub fn parse_copy_into(parser: &mut Parser) -> 
Result<Statement, ParserError> {
                 // In `COPY INTO <location>` the copy options do not have a 
shared key
                 // like in `COPY INTO <table>`
                 Token::Word(key) => 
copy_options.push(parser.parse_key_value_option(&key)?),
-                _ => return parser.expected("another copy option, ; or EOF'", 
parser.peek_token()),
+                _ => {
+                    return parser
+                        .expected_ref("another copy option, ; or EOF'", 
parser.peek_token_ref())
+                }
             }
         }
     }
@@ -1499,7 +1505,7 @@ fn parse_select_item_for_data_load(
             // parse element
             element = Some(Ident::new(match parser.next_token().token {
                 Token::Word(w) => Ok(w.value),
-                _ => parser.expected("file_col_num", parser.peek_token()),
+                _ => parser.expected_ref("file_col_num", 
parser.peek_token_ref()),
             }?));
         }
         _ => {
@@ -1512,7 +1518,7 @@ fn parse_select_item_for_data_load(
     if parser.parse_keyword(Keyword::AS) {
         item_as = Some(match parser.next_token().token {
             Token::Word(w) => Ok(Ident::new(w.value)),
-            _ => parser.expected("column item alias", parser.peek_token()),
+            _ => parser.expected_ref("column item alias", 
parser.peek_token_ref()),
         }?);
     }
 
@@ -1540,7 +1546,7 @@ fn parse_stage_params(parser: &mut Parser) -> 
Result<StageParamsObject, ParserEr
         parser.expect_token(&Token::Eq)?;
         url = Some(match parser.next_token().token {
             Token::SingleQuotedString(word) => Ok(word),
-            _ => parser.expected("a URL statement", parser.peek_token()),
+            _ => parser.expected_ref("a URL statement", 
parser.peek_token_ref()),
         }?)
     }
 
@@ -1555,7 +1561,7 @@ fn parse_stage_params(parser: &mut Parser) -> 
Result<StageParamsObject, ParserEr
         parser.expect_token(&Token::Eq)?;
         endpoint = Some(match parser.next_token().token {
             Token::SingleQuotedString(word) => Ok(word),
-            _ => parser.expected("an endpoint statement", parser.peek_token()),
+            _ => parser.expected_ref("an endpoint statement", 
parser.peek_token_ref()),
         }?)
     }
 
@@ -1795,7 +1801,7 @@ fn parse_multi_table_insert_into_clauses(
         into_clauses.push(parse_multi_table_insert_into_clause(parser)?);
     }
     if into_clauses.is_empty() {
-        return parser.expected("INTO clause in multi-table INSERT", 
parser.peek_token());
+        return parser.expected_ref("INTO clause in multi-table INSERT", 
parser.peek_token_ref());
     }
     Ok(into_clauses)
 }
@@ -1874,9 +1880,9 @@ fn parse_multi_table_insert_when_clauses(
     }
 
     if when_clauses.is_empty() {
-        return parser.expected(
+        return parser.expected_ref(
             "at least one WHEN clause in conditional multi-table INSERT",
-            parser.peek_token(),
+            parser.peek_token_ref(),
         );
     }
 
diff --git a/src/parser/alter.rs b/src/parser/alter.rs
index c64c4a40..ce1220e1 100644
--- a/src/parser/alter.rs
+++ b/src/parser/alter.rs
@@ -182,9 +182,9 @@ impl Parser<'_> {
             } else if self.parse_keyword(Keyword::AUTHORIZATIONS) {
                 None
             } else {
-                return self.expected(
+                return self.expected_ref(
                     "REMOVE DELEGATED AUTHORIZATION OF ROLE | REMOVE DELEGATED 
AUTHORIZATIONS",
-                    self.peek_token(),
+                    self.peek_token_ref(),
                 );
             };
             self.expect_keywords(&[Keyword::FROM, Keyword::SECURITY, 
Keyword::INTEGRATION])?;
@@ -340,7 +340,7 @@ impl Parser<'_> {
         } else if self.parse_keyword(Keyword::DUO) {
             Ok(MfaMethodKind::Duo)
         } else {
-            self.expected("PASSKEY, TOTP or DUO", self.peek_token())
+            self.expected_ref("PASSKEY, TOTP or DUO", self.peek_token_ref())
         }
     }
 
@@ -358,10 +358,10 @@ impl Parser<'_> {
                 let role_name = self.parse_identifier()?;
                 AlterRoleOperation::RenameRole { role_name }
             } else {
-                return self.expected("= after WITH NAME ", self.peek_token());
+                return self.expected_ref("= after WITH NAME ", 
self.peek_token_ref());
             }
         } else {
-            return self.expected("'ADD' or 'DROP' or 'WITH NAME'", 
self.peek_token());
+            return self.expected_ref("'ADD' or 'DROP' or 'WITH NAME'", 
self.peek_token_ref());
         };
 
         Ok(Statement::AlterRole {
@@ -385,7 +385,7 @@ impl Parser<'_> {
                 let role_name = self.parse_identifier()?;
                 AlterRoleOperation::RenameRole { role_name }
             } else {
-                return self.expected("TO after RENAME", self.peek_token());
+                return self.expected_ref("TO after RENAME", 
self.peek_token_ref());
             }
         // SET
         } else if self.parse_keyword(Keyword::SET) {
@@ -412,10 +412,10 @@ impl Parser<'_> {
                         in_database,
                     }
                 } else {
-                    self.expected("config value", self.peek_token())?
+                    self.expected_ref("config value", self.peek_token_ref())?
                 }
             } else {
-                self.expected("'TO' or '=' or 'FROM CURRENT'", 
self.peek_token())?
+                self.expected_ref("'TO' or '=' or 'FROM CURRENT'", 
self.peek_token_ref())?
             }
         // RESET
         } else if self.parse_keyword(Keyword::RESET) {
@@ -442,7 +442,7 @@ impl Parser<'_> {
             }
             // check option
             if options.is_empty() {
-                return self.expected("option", self.peek_token())?;
+                return self.expected_ref("option", self.peek_token_ref())?;
             }
 
             AlterRoleOperation::WithOptions { options }
@@ -504,7 +504,7 @@ impl Parser<'_> {
                 self.expect_keyword_is(Keyword::UNTIL)?;
                 RoleOption::ValidUntil(Expr::Value(self.parse_value()?))
             }
-            _ => self.expected("option", self.peek_token())?,
+            _ => self.expected_ref("option", self.peek_token_ref())?,
         };
 
         Ok(option)
diff --git a/src/parser/mod.rs b/src/parser/mod.rs
index 6c9314d9..de12078a 100644
--- a/src/parser/mod.rs
+++ b/src/parser/mod.rs
@@ -504,7 +504,7 @@ impl<'a> Parser<'a> {
                 expecting_statement_delimiter = false;
             }
 
-            match self.peek_token().token {
+            match &self.peek_token_ref().token {
                 Token::EOF => break,
 
                 // end of statement
@@ -517,7 +517,7 @@ impl<'a> Parser<'a> {
             }
 
             if expecting_statement_delimiter {
-                return self.expected("end of statement", self.peek_token());
+                return self.expected_ref("end of statement", 
self.peek_token_ref());
             }
 
             let statement = self.parse_statement()?;
@@ -944,7 +944,10 @@ impl<'a> Parser<'a> {
         let mut export = false;
 
         if !dialect_of!(self is MySqlDialect | GenericDialect) {
-            return parser_err!("Unsupported statement FLUSH", 
self.peek_token().span.start);
+            return parser_err!(
+                "Unsupported statement FLUSH",
+                self.peek_token_ref().span.start
+            );
         }
 
         let location = if self.parse_keyword(Keyword::NO_WRITE_TO_BINLOG) {
@@ -1007,10 +1010,10 @@ impl<'a> Parser<'a> {
 
             FlushType::Tables
         } else {
-            return self.expected(
+            return self.expected_ref(
                 "BINARY LOGS, ENGINE LOGS, ERROR LOGS, GENERAL LOGS, HOSTS, 
LOGS, PRIVILEGES, OPTIMIZER_COSTS,\
                  RELAY LOGS [FOR CHANNEL channel], SLOW LOGS, STATUS, 
USER_RESOURCES",
-                self.peek_token(),
+                self.peek_token_ref(),
             );
         };
 
@@ -1136,7 +1139,8 @@ impl<'a> Parser<'a> {
                 let ident = self.parse_identifier()?;
                 options.push(AttachDuckDBDatabaseOption::Type(ident));
             } else {
-                return self.expected("expected one of: ), READ_ONLY, TYPE", 
self.peek_token());
+                return self
+                    .expected_ref("expected one of: ), READ_ONLY, TYPE", 
self.peek_token_ref());
             };
 
             if self.consume_token(&Token::RParen) {
@@ -1144,7 +1148,7 @@ impl<'a> Parser<'a> {
             } else if self.consume_token(&Token::Comma) {
                 continue;
             } else {
-                return self.expected("expected one of: ')', ','", 
self.peek_token());
+                return self.expected_ref("expected one of: ')', ','", 
self.peek_token_ref());
             }
         }
     }
@@ -1267,7 +1271,7 @@ impl<'a> Parser<'a> {
         let next_token = self.next_token();
         match next_token.token {
             t @ (Token::Word(_) | Token::SingleQuotedString(_)) => {
-                if self.peek_token().token == Token::Period {
+                if self.peek_token_ref().token == Token::Period {
                     let mut id_parts: Vec<Ident> = vec![match t {
                         Token::Word(w) => w.into_ident(next_token.span),
                         Token::SingleQuotedString(s) => 
Ident::with_quote('\'', s),
@@ -1418,7 +1422,7 @@ impl<'a> Parser<'a> {
                 Ok(expr) => expr,
                 _ => {
                     self.prev_token();
-                    return self.expected("wildcard or identifier", 
self.peek_token());
+                    return self.expected_ref("wildcard or identifier", 
self.peek_token_ref());
                 }
             }
         };
@@ -1449,7 +1453,7 @@ impl<'a> Parser<'a> {
             })?;
             Ok(rename_tables.into())
         } else {
-            self.expected("KEYWORD `TABLE` after RENAME", self.peek_token())
+            self.expected_ref("KEYWORD `TABLE` after RENAME", 
self.peek_token_ref())
         }
     }
 
@@ -1531,7 +1535,7 @@ impl<'a> Parser<'a> {
                 Ok(Some(self.parse_array_expr(true)?))
             }
             Keyword::ARRAY
-            if self.peek_token() == Token::LParen
+            if self.peek_token_ref().token == Token::LParen
                 && !dialect_of!(self is ClickHouseDialect | DatabricksDialect) 
=>
                 {
                     self.expect_token(&Token::LParen)?;
@@ -1974,7 +1978,10 @@ impl<'a> Parser<'a> {
                                 | Expr::Identifier(_)
                                 | Expr::Value(_)
                                 | Expr::Function(_) => Ok(expr),
-                                _ => parser.expected("an identifier or value", 
parser.peek_token()),
+                                _ => parser.expected_ref(
+                                    "an identifier or value",
+                                    parser.peek_token_ref(),
+                                ),
                             }
                         })?;
 
@@ -2020,7 +2027,8 @@ impl<'a> Parser<'a> {
         let tok_index = self.get_current_index();
         if let Some(wildcard_token) = ending_wildcard {
             if !Self::is_all_ident(&root, &chain) {
-                return self.expected("an identifier or a '*' after '.'", 
self.peek_token());
+                return self
+                    .expected_ref("an identifier or a '*' after '.'", 
self.peek_token_ref());
             };
             Ok(Expr::QualifiedWildcard(
                 ObjectName::from(Self::exprs_to_idents(root, chain)?),
@@ -2540,7 +2548,7 @@ impl<'a> Parser<'a> {
             } else if self.parse_keyword(Keyword::FOLLOWING) {
                 Ok(WindowFrameBound::Following(rows))
             } else {
-                self.expected("PRECEDING or FOLLOWING", self.peek_token())
+                self.expected_ref("PRECEDING or FOLLOWING", 
self.peek_token_ref())
             }
         }
     }
@@ -2849,7 +2857,7 @@ impl<'a> Parser<'a> {
             Keyword::SUBSTRING => false,
             _ => {
                 self.prev_token();
-                return self.expected("SUBSTR or SUBSTRING", self.peek_token());
+                return self.expected_ref("SUBSTR or SUBSTRING", 
self.peek_token_ref());
             }
         };
         self.expect_token(&Token::LParen)?;
@@ -2908,7 +2916,7 @@ impl<'a> Parser<'a> {
     pub fn parse_trim_expr(&mut self) -> Result<Expr, ParserError> {
         self.expect_token(&Token::LParen)?;
         let mut trim_where = None;
-        if let Token::Word(word) = self.peek_token().token {
+        if let Token::Word(word) = &self.peek_token_ref().token {
             if [Keyword::BOTH, Keyword::LEADING, 
Keyword::TRAILING].contains(&word.keyword) {
                 trim_where = Some(self.parse_trim_where()?);
             }
@@ -2992,14 +3000,14 @@ impl<'a> Parser<'a> {
                     | Token::QuoteDelimitedStringLiteral(_)
                     | Token::NationalQuoteDelimitedStringLiteral(_)
                     | Token::HexStringLiteral(_) => 
Some(Box::new(self.parse_expr()?)),
-                    _ => self.expected(
+                    _ => self.expected_ref(
                         "either filler, WITH, or WITHOUT in LISTAGG",
-                        self.peek_token(),
+                        self.peek_token_ref(),
                     )?,
                 };
                 let with_count = self.parse_keyword(Keyword::WITH);
                 if !with_count && !self.parse_keyword(Keyword::WITHOUT) {
-                    self.expected("either WITH or WITHOUT in LISTAGG", 
self.peek_token())?;
+                    self.expected_ref("either WITH or WITHOUT in LISTAGG", 
self.peek_token_ref())?;
                 }
                 self.expect_keyword_is(Keyword::COUNT)?;
                 Ok(Some(ListAggOnOverflow::Truncate { filler, with_count }))
@@ -3230,7 +3238,7 @@ impl<'a> Parser<'a> {
         } else if self.dialect.require_interval_qualifier() {
             return parser_err!(
                 "INTERVAL requires a unit after the literal value",
-                self.peek_token().span.start
+                self.peek_token_ref().span.start
             );
         } else {
             None
@@ -3273,7 +3281,7 @@ impl<'a> Parser<'a> {
     /// Peek at the next token and determine if it is a temporal unit
     /// like `second`.
     pub fn next_token_is_temporal_unit(&mut self) -> bool {
-        if let Token::Word(word) = self.peek_token().token {
+        if let Token::Word(word) = &self.peek_token_ref().token {
             matches!(
                 word.keyword,
                 Keyword::YEAR
@@ -3331,7 +3339,7 @@ impl<'a> Parser<'a> {
         if trailing_bracket.0 {
             return parser_err!(
                 "unmatched > in STRUCT literal",
-                self.peek_token().span.start
+                self.peek_token_ref().span.start
             );
         }
 
@@ -3363,7 +3371,7 @@ impl<'a> Parser<'a> {
             if typed_syntax {
                 return parser_err!("Typed syntax does not allow AS", {
                     self.prev_token();
-                    self.peek_token().span.start
+                    self.peek_token_ref().span.start
                 });
             }
             let field_name = self.parse_identifier()?;
@@ -3398,7 +3406,7 @@ impl<'a> Parser<'a> {
         self.expect_keyword_is(Keyword::STRUCT)?;
 
         // Nothing to do if we have no type information.
-        if Token::Lt != self.peek_token() {
+        if self.peek_token_ref().token != Token::Lt {
             return Ok((Default::default(), false.into()));
         }
         self.next_token();
@@ -3650,7 +3658,7 @@ impl<'a> Parser<'a> {
                     self.next_token();
                     true.into()
                 }
-                _ => return self.expected(">", self.peek_token()),
+                _ => return self.expected_ref(">", self.peek_token_ref()),
             }
         } else {
             false.into()
@@ -3919,9 +3927,9 @@ impl<'a> Parser<'a> {
                     } else if let Ok(is_normalized) = 
self.parse_unicode_is_normalized(expr) {
                         Ok(is_normalized)
                     } else {
-                        self.expected(
+                        self.expected_ref(
                             "[NOT] NULL | TRUE | FALSE | DISTINCT | [form] 
NORMALIZED FROM after IS",
-                            self.peek_token(),
+                            self.peek_token_ref(),
                         )
                     }
                 }
@@ -3994,7 +4002,7 @@ impl<'a> Parser<'a> {
                             escape_char: self.parse_escape_char()?,
                         })
                     } else {
-                        self.expected("IN or BETWEEN after NOT", 
self.peek_token())
+                        self.expected_ref("IN or BETWEEN after NOT", 
self.peek_token_ref())
                     }
                 }
                 Keyword::NOTNULL if dialect.supports_notnull_operator() => {
@@ -4010,7 +4018,7 @@ impl<'a> Parser<'a> {
                             array: Box::new(array),
                         }))
                     } else {
-                        self.expected("OF after MEMBER", self.peek_token())
+                        self.expected_ref("OF after MEMBER", 
self.peek_token_ref())
                     }
                 }
                 // Can only happen if `get_next_precedence` got out of sync 
with this function
@@ -4767,7 +4775,7 @@ impl<'a> Parser<'a> {
             if !self.consume_token(&Token::Comma) {
                 break;
             } else if self.options.trailing_commas {
-                match self.peek_token().token {
+                match &self.peek_token_ref().token {
                     Token::Word(kw) if kw.keyword == Keyword::ON => {
                         break;
                     }
@@ -4930,7 +4938,7 @@ impl<'a> Parser<'a> {
     where
         F: FnMut(&mut Parser<'a>) -> Result<T, ParserError>,
     {
-        if self.peek_token().token == end_token {
+        if self.peek_token_ref().token == end_token {
             return Ok(vec![]);
         }
 
@@ -5007,7 +5015,7 @@ impl<'a> Parser<'a> {
     /// Parse either `ALL`, `DISTINCT` or `DISTINCT ON (...)`. Returns 
[`None`] if `ALL` is parsed
     /// and results in a [`ParserError`] if both `ALL` and `DISTINCT` are 
found.
     pub fn parse_all_or_distinct(&mut self) -> Result<Option<Distinct>, 
ParserError> {
-        let loc = self.peek_token().span.start;
+        let loc = self.peek_token_ref().span.start;
         let distinct = match self.parse_one_of_keywords(&[Keyword::ALL, 
Keyword::DISTINCT]) {
             Some(Keyword::ALL) => {
                 if self.peek_keyword(Keyword::DISTINCT) {
@@ -5094,9 +5102,9 @@ impl<'a> Parser<'a> {
         } else if self.parse_keyword(Keyword::USER) {
             self.parse_create_user(or_replace).map(Into::into)
         } else if or_replace {
-            self.expected(
+            self.expected_ref(
                 "[EXTERNAL] TABLE or [MATERIALIZED] VIEW or FUNCTION after 
CREATE OR REPLACE",
-                self.peek_token(),
+                self.peek_token_ref(),
             )
         } else if self.parse_keyword(Keyword::EXTENSION) {
             self.parse_create_extension().map(Into::into)
@@ -5132,7 +5140,7 @@ impl<'a> Parser<'a> {
         } else if self.parse_keyword(Keyword::SERVER) {
             self.parse_pg_create_server()
         } else {
-            self.expected("an object type after CREATE", self.peek_token())
+            self.expected_ref("an object type after CREATE", 
self.peek_token_ref())
         }
     }
 
@@ -5175,7 +5183,7 @@ impl<'a> Parser<'a> {
 
         let mut storage_specifier = None;
         let mut name = None;
-        if self.peek_token() != Token::LParen {
+        if self.peek_token_ref().token != Token::LParen {
             if self.parse_keyword(Keyword::IN) {
                 storage_specifier = self.parse_identifier().ok()
             } else {
@@ -5184,7 +5192,7 @@ impl<'a> Parser<'a> {
 
             // Storage specifier may follow the name
             if storage_specifier.is_none()
-                && self.peek_token() != Token::LParen
+                && self.peek_token_ref().token != Token::LParen
                 && self.parse_keyword(Keyword::IN)
             {
                 storage_specifier = self.parse_identifier().ok();
@@ -5209,7 +5217,7 @@ impl<'a> Parser<'a> {
             (true, false) => Some(true),
             (false, true) => Some(false),
             (false, false) => None,
-            _ => self.expected("TEMPORARY or PERSISTENT", self.peek_token())?,
+            _ => self.expected_ref("TEMPORARY or PERSISTENT", 
self.peek_token_ref())?,
         };
 
         Ok(Statement::CreateSecret {
@@ -5228,14 +5236,14 @@ impl<'a> Parser<'a> {
         let (mut table_flag, mut options, mut has_as, mut query) = (None, 
vec![], false, None);
         if self.parse_keyword(Keyword::TABLE) {
             let table_name = self.parse_object_name(false)?;
-            if self.peek_token().token != Token::EOF {
-                if let Token::Word(word) = self.peek_token().token {
+            if self.peek_token_ref().token != Token::EOF {
+                if let Token::Word(word) = &self.peek_token_ref().token {
                     if word.keyword == Keyword::OPTIONS {
                         options = self.parse_options(Keyword::OPTIONS)?
                     }
                 };
 
-                if self.peek_token().token != Token::EOF {
+                if self.peek_token_ref().token != Token::EOF {
                     let (a, q) = self.parse_as_query()?;
                     has_as = a;
                     query = Some(q);
@@ -5261,14 +5269,14 @@ impl<'a> Parser<'a> {
             table_flag = Some(self.parse_object_name(false)?);
             if self.parse_keyword(Keyword::TABLE) {
                 let table_name = self.parse_object_name(false)?;
-                if self.peek_token() != Token::EOF {
-                    if let Token::Word(word) = self.peek_token().token {
+                if self.peek_token_ref().token != Token::EOF {
+                    if let Token::Word(word) = &self.peek_token_ref().token {
                         if word.keyword == Keyword::OPTIONS {
                             options = self.parse_options(Keyword::OPTIONS)?
                         }
                     };
 
-                    if self.peek_token() != Token::EOF {
+                    if self.peek_token_ref().token != Token::EOF {
                         let (a, q) = self.parse_as_query()?;
                         has_as = a;
                         query = Some(q);
@@ -5291,10 +5299,10 @@ impl<'a> Parser<'a> {
                     })
                 }
             } else {
-                if self.peek_token() == Token::EOF {
+                if self.peek_token_ref().token == Token::EOF {
                     self.prev_token();
                 }
-                self.expected("a `TABLE` keyword", self.peek_token())
+                self.expected_ref("a `TABLE` keyword", self.peek_token_ref())
             }
         }
     }
@@ -5309,7 +5317,7 @@ impl<'a> Parser<'a> {
                 }
                 _ => Ok((false, self.parse_query()?)),
             },
-            _ => self.expected("a QUERY statement", self.peek_token()),
+            _ => self.expected_ref("a QUERY statement", self.peek_token_ref()),
         }
     }
 
@@ -5522,7 +5530,7 @@ impl<'a> Parser<'a> {
                 .map(Into::into)
         } else {
             self.prev_token();
-            self.expected("an object type after CREATE", self.peek_token())
+            self.expected_ref("an object type after CREATE", 
self.peek_token_ref())
         }
     }
 
@@ -5623,7 +5631,8 @@ impl<'a> Parser<'a> {
                 } else if self.parse_keyword(Keyword::SAFE) {
                     body.parallel = Some(FunctionParallel::Safe);
                 } else {
-                    return self.expected("one of UNSAFE | RESTRICTED | SAFE", 
self.peek_token());
+                    return self
+                        .expected_ref("one of UNSAFE | RESTRICTED | SAFE", 
self.peek_token_ref());
                 }
             } else if self.parse_keyword(Keyword::SECURITY) {
                 ensure_not_set(&body.security, "SECURITY { DEFINER | INVOKER 
}")?;
@@ -5632,7 +5641,7 @@ impl<'a> Parser<'a> {
                 } else if self.parse_keyword(Keyword::INVOKER) {
                     body.security = Some(FunctionSecurity::Invoker);
                 } else {
-                    return self.expected("DEFINER or INVOKER", 
self.peek_token());
+                    return self.expected_ref("DEFINER or INVOKER", 
self.peek_token_ref());
                 }
             } else if self.parse_keyword(Keyword::SET) {
                 let name = self.parse_identifier()?;
@@ -5640,7 +5649,7 @@ impl<'a> Parser<'a> {
                     FunctionSetValue::FromCurrent
                 } else {
                     if !self.consume_token(&Token::Eq) && 
!self.parse_keyword(Keyword::TO) {
-                        return self.expected("= or TO", self.peek_token());
+                        return self.expected_ref("= or TO", 
self.peek_token_ref());
                     }
                     let values = 
self.parse_comma_separated(Parser::parse_expr)?;
                     FunctionSetValue::Values(values)
@@ -5846,7 +5855,7 @@ impl<'a> Parser<'a> {
                 end_token: AttachedToken(end_token),
             }))
         } else if self.parse_keyword(Keyword::RETURN) {
-            if self.peek_token() == Token::LParen {
+            if self.peek_token_ref().token == Token::LParen {
                 Some(CreateFunctionBody::AsReturnExpr(self.parse_expr()?))
             } else if self.peek_keyword(Keyword::SELECT) {
                 let select = self.parse_select()?;
@@ -5854,11 +5863,11 @@ impl<'a> Parser<'a> {
             } else {
                 parser_err!(
                     "Expected a subquery (or bare SELECT statement) after 
RETURN",
-                    self.peek_token().span.start
+                    self.peek_token_ref().span.start
                 )?
             }
         } else {
-            parser_err!("Unparsable function body", 
self.peek_token().span.start)?
+            parser_err!("Unparsable function body", 
self.peek_token_ref().span.start)?
         };
 
         Ok(CreateFunction {
@@ -5936,7 +5945,7 @@ impl<'a> Parser<'a> {
                 // This dummy error is ignored in `maybe_parse`
                 parser_err!(
                     "The DEFAULT keyword is not a type",
-                    parser.peek_token().span.start
+                    parser.peek_token_ref().span.start
                 )
             } else {
                 parser.parse_data_type()
@@ -5978,7 +5987,7 @@ impl<'a> Parser<'a> {
         if !dialect_of!(self is PostgreSqlDialect | SQLiteDialect | 
GenericDialect | MySqlDialect | MsSqlDialect)
         {
             self.prev_token();
-            return self.expected("an object type after DROP", 
self.peek_token());
+            return self.expected_ref("an object type after DROP", 
self.peek_token_ref());
         }
         let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
         let trigger_name = self.parse_object_name(false)?;
@@ -6014,7 +6023,7 @@ impl<'a> Parser<'a> {
         if !dialect_of!(self is PostgreSqlDialect | SQLiteDialect | 
GenericDialect | MySqlDialect | MsSqlDialect)
         {
             self.prev_token();
-            return self.expected("an object type after CREATE", 
self.peek_token());
+            return self.expected_ref("an object type after CREATE", 
self.peek_token_ref());
         }
 
         let name = self.parse_object_name(false)?;
@@ -6215,7 +6224,7 @@ impl<'a> Parser<'a> {
             })
         } else {
             self.prev_token();
-            self.expected("an object type after CREATE", self.peek_token())
+            self.expected_ref("an object type after CREATE", 
self.peek_token_ref())
         }
     }
 
@@ -6641,7 +6650,7 @@ impl<'a> Parser<'a> {
                             Ok(())
                         }
                     } else {
-                        self.expected("ROLE or GROUP after IN", 
self.peek_token())
+                        self.expected_ref("ROLE or GROUP after IN", 
self.peek_token_ref())
                     }
                 }
                 Keyword::ROLE => {
@@ -7067,7 +7076,8 @@ impl<'a> Parser<'a> {
                         let sort_family = self.parse_object_name(false)?;
                         Some(OperatorPurpose::ForOrderBy { sort_family })
                     } else {
-                        return self.expected("SEARCH or ORDER BY after FOR", 
self.peek_token());
+                        return self
+                            .expected_ref("SEARCH or ORDER BY after FOR", 
self.peek_token_ref());
                     }
                 } else {
                     None
@@ -7083,23 +7093,24 @@ impl<'a> Parser<'a> {
                 let support_number = self.parse_literal_uint()?;
 
                 // Optional operator types
-                let op_types =
-                    if self.consume_token(&Token::LParen) && self.peek_token() 
!= Token::RParen {
-                        let mut types = vec![];
-                        loop {
-                            types.push(self.parse_data_type()?);
-                            if !self.consume_token(&Token::Comma) {
-                                break;
-                            }
+                let op_types = if self.consume_token(&Token::LParen)
+                    && self.peek_token_ref().token != Token::RParen
+                {
+                    let mut types = vec![];
+                    loop {
+                        types.push(self.parse_data_type()?);
+                        if !self.consume_token(&Token::Comma) {
+                            break;
                         }
-                        self.expect_token(&Token::RParen)?;
-                        Some(types)
-                    } else if self.consume_token(&Token::LParen) {
-                        self.expect_token(&Token::RParen)?;
-                        Some(vec![])
-                    } else {
-                        None
-                    };
+                    }
+                    self.expect_token(&Token::RParen)?;
+                    Some(types)
+                } else if self.consume_token(&Token::LParen) {
+                    self.expect_token(&Token::RParen)?;
+                    Some(vec![])
+                } else {
+                    None
+                };
 
                 let function_name = self.parse_object_name(false)?;
 
@@ -7107,7 +7118,7 @@ impl<'a> Parser<'a> {
                 let argument_types = if self.consume_token(&Token::LParen) {
                     let mut types = vec![];
                     loop {
-                        if self.peek_token() == Token::RParen {
+                        if self.peek_token_ref().token == Token::RParen {
                             break;
                         }
                         types.push(self.parse_data_type()?);
@@ -7208,9 +7219,9 @@ impl<'a> Parser<'a> {
                 self.parse_drop_operator()
             };
         } else {
-            return self.expected(
+            return self.expected_ref(
                 "CONNECTOR, DATABASE, EXTENSION, FUNCTION, INDEX, OPERATOR, 
POLICY, PROCEDURE, ROLE, SCHEMA, SECRET, SEQUENCE, STAGE, TABLE, TRIGGER, TYPE, 
VIEW, MATERIALIZED VIEW or USER after DROP",
-                self.peek_token(),
+                self.peek_token_ref(),
             );
         };
         // Many dialects support the non-standard `IF EXISTS` clause and allow
@@ -7218,7 +7229,7 @@ impl<'a> Parser<'a> {
         let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
         let names = self.parse_comma_separated(|p| 
p.parse_object_name(false))?;
 
-        let loc = self.peek_token().span.start;
+        let loc = self.peek_token_ref().span.start;
         let cascade = self.parse_keyword(Keyword::CASCADE);
         let restrict = self.parse_keyword(Keyword::RESTRICT);
         let purge = self.parse_keyword(Keyword::PURGE);
@@ -7364,7 +7375,7 @@ impl<'a> Parser<'a> {
             (true, false) => Some(true),
             (false, true) => Some(false),
             (false, false) => None,
-            _ => self.expected("TEMPORARY or PERSISTENT", self.peek_token())?,
+            _ => self.expected_ref("TEMPORARY or PERSISTENT", 
self.peek_token_ref())?,
         };
 
         Ok(Statement::DropSecret {
@@ -7539,7 +7550,7 @@ impl<'a> Parser<'a> {
                         ),
                     }
                 } else if self.parse_keyword(Keyword::RESULTSET) {
-                    let assigned_expr = if self.peek_token().token != 
Token::SemiColon {
+                    let assigned_expr = if self.peek_token_ref().token != 
Token::SemiColon {
                         self.parse_snowflake_variable_declaration_expression()?
                     } else {
                         // Nothing more to do. The statement has no further 
parameters.
@@ -7548,7 +7559,7 @@ impl<'a> Parser<'a> {
 
                     (Some(DeclareType::ResultSet), None, assigned_expr, None)
                 } else if self.parse_keyword(Keyword::EXCEPTION) {
-                    let assigned_expr = if self.peek_token().token == 
Token::LParen {
+                    let assigned_expr = if self.peek_token_ref().token == 
Token::LParen {
                         
Some(DeclareAssignment::Expr(Box::new(self.parse_expr()?)))
                     } else {
                         // Nothing more to do. The statement has no further 
parameters.
@@ -7562,7 +7573,7 @@ impl<'a> Parser<'a> {
                         self.parse_snowflake_variable_declaration_expression()?
                     {
                         (Some(assigned_expr), None)
-                    } else if let Token::Word(_) = self.peek_token().token {
+                    } else if let Token::Word(_) = 
&self.peek_token_ref().token {
                         let data_type = self.parse_data_type()?;
                         (
                             
self.parse_snowflake_variable_declaration_expression()?,
@@ -7786,7 +7797,7 @@ impl<'a> Parser<'a> {
             self.expect_keyword(Keyword::IN)?;
             FetchPosition::In
         } else {
-            return parser_err!("Expected FROM or IN", 
self.peek_token().span.start);
+            return parser_err!("Expected FROM or IN", 
self.peek_token_ref().span.start);
         };
 
         let name = self.parse_identifier()?;
@@ -7816,9 +7827,9 @@ impl<'a> Parser<'a> {
         } else if self.parse_keyword(Keyword::TEMP) || 
self.parse_keyword(Keyword::TEMPORARY) {
             DiscardObject::TEMP
         } else {
-            return self.expected(
+            return self.expected_ref(
                 "ALL, PLANS, SEQUENCES, TEMP or TEMPORARY after DISCARD",
-                self.peek_token(),
+                self.peek_token_ref(),
             );
         };
         Ok(Statement::Discard { object_type })
@@ -7963,7 +7974,7 @@ impl<'a> Parser<'a> {
                 .map(|k| match k {
                     Keyword::CASCADE => Ok(ReferentialAction::Cascade),
                     Keyword::RESTRICT => Ok(ReferentialAction::Restrict),
-                    _ => self.expected("CASCADE or RESTRICT", 
self.peek_token()),
+                    _ => self.expected_ref("CASCADE or RESTRICT", 
self.peek_token_ref()),
                 })
                 .transpose()?,
         }))
@@ -8276,9 +8287,9 @@ impl<'a> Parser<'a> {
             if self.peek_keyword(Keyword::FOR) || 
self.peek_keyword(Keyword::DEFAULT) {
                 Some(self.parse_partition_for_values()?)
             } else {
-                return self.expected(
+                return self.expected_ref(
                     "FOR VALUES or DEFAULT after PARTITION OF",
-                    self.peek_token(),
+                    self.peek_token_ref(),
                 );
             }
         } else {
@@ -8306,7 +8317,7 @@ impl<'a> Parser<'a> {
 
         let order_by = if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
             if self.consume_token(&Token::LParen) {
-                let columns = if self.peek_token() != Token::RParen {
+                let columns = if self.peek_token_ref().token != Token::RParen {
                     self.parse_comma_separated(|p| p.parse_expr())?
                 } else {
                     vec![]
@@ -8438,8 +8449,8 @@ impl<'a> Parser<'a> {
         if self.parse_keyword(Keyword::IN) {
             // FOR VALUES IN (expr, ...)
             self.expect_token(&Token::LParen)?;
-            if self.peek_token() == Token::RParen {
-                return self.expected("at least one value", self.peek_token());
+            if self.peek_token_ref().token == Token::RParen {
+                return self.expected_ref("at least one value", 
self.peek_token_ref());
             }
             let values = self.parse_comma_separated(Parser::parse_expr)?;
             self.expect_token(&Token::RParen)?;
@@ -8447,15 +8458,15 @@ impl<'a> Parser<'a> {
         } else if self.parse_keyword(Keyword::FROM) {
             // FOR VALUES FROM (...) TO (...)
             self.expect_token(&Token::LParen)?;
-            if self.peek_token() == Token::RParen {
-                return self.expected("at least one value", self.peek_token());
+            if self.peek_token_ref().token == Token::RParen {
+                return self.expected_ref("at least one value", 
self.peek_token_ref());
             }
             let from = 
self.parse_comma_separated(Parser::parse_partition_bound_value)?;
             self.expect_token(&Token::RParen)?;
             self.expect_keyword(Keyword::TO)?;
             self.expect_token(&Token::LParen)?;
-            if self.peek_token() == Token::RParen {
-                return self.expected("at least one value", self.peek_token());
+            if self.peek_token_ref().token == Token::RParen {
+                return self.expected_ref("at least one value", 
self.peek_token_ref());
             }
             let to = 
self.parse_comma_separated(Parser::parse_partition_bound_value)?;
             self.expect_token(&Token::RParen)?;
@@ -8471,7 +8482,7 @@ impl<'a> Parser<'a> {
             self.expect_token(&Token::RParen)?;
             Ok(ForValues::With { modulus, remainder })
         } else {
-            self.expected("IN, FROM, or WITH after FOR VALUES", 
self.peek_token())
+            self.expected_ref("IN, FROM, or WITH after FOR VALUES", 
self.peek_token_ref())
         }
     }
 
@@ -8528,7 +8539,7 @@ impl<'a> Parser<'a> {
                 ));
             };
 
-            if let Token::Word(word) = self.peek_token().token {
+            if let Token::Word(word) = &self.peek_token_ref().token {
                 if word.keyword == Keyword::OPTIONS {
                     table_options =
                         
CreateTableOptions::Options(self.parse_options(Keyword::OPTIONS)?)
@@ -8586,7 +8597,7 @@ impl<'a> Parser<'a> {
 
             let engine = match value.token {
                 Token::Word(w) => {
-                    let parameters = if self.peek_token() == Token::LParen {
+                    let parameters = if self.peek_token_ref().token == 
Token::LParen {
                         self.parse_parenthesized_identifiers()?
                     } else {
                         vec![]
@@ -8794,7 +8805,7 @@ impl<'a> Parser<'a> {
             return Ok(Some(params));
         }
         loop {
-            if let Token::Word(_) = self.peek_token().token {
+            if let Token::Word(_) = &self.peek_token_ref().token {
                 params.push(self.parse_procedure_param()?)
             }
             let comma = self.consume_token(&Token::Comma);
@@ -8802,7 +8813,10 @@ impl<'a> Parser<'a> {
                 // allow a trailing comma, even though it's not in standard
                 break;
             } else if !comma {
-                return self.expected("',' or ')' after parameter definition", 
self.peek_token());
+                return self.expected_ref(
+                    "',' or ')' after parameter definition",
+                    self.peek_token_ref(),
+                );
             }
         }
         Ok(Some(params))
@@ -8819,17 +8833,21 @@ impl<'a> Parser<'a> {
         loop {
             if let Some(constraint) = self.parse_optional_table_constraint()? {
                 constraints.push(constraint);
-            } else if let Token::Word(_) = self.peek_token().token {
+            } else if let Token::Word(_) = &self.peek_token_ref().token {
                 columns.push(self.parse_column_def()?);
             } else {
-                return self.expected("column name or constraint definition", 
self.peek_token());
+                return self.expected_ref(
+                    "column name or constraint definition",
+                    self.peek_token_ref(),
+                );
             }
 
             let comma = self.consume_token(&Token::Comma);
-            let rparen = self.peek_token().token == Token::RParen;
+            let rparen = self.peek_token_ref().token == Token::RParen;
 
             if !comma && !rparen {
-                return self.expected("',' or ')' after column definition", 
self.peek_token());
+                return self
+                    .expected_ref("',' or ')' after column definition", 
self.peek_token_ref());
             };
 
             if rparen
@@ -8897,9 +8915,9 @@ impl<'a> Parser<'a> {
                 if let Some(option) = self.parse_optional_column_option()? {
                     options.push(ColumnOptionDef { name, option });
                 } else {
-                    return self.expected(
+                    return self.expected_ref(
                         "constraint details after CONSTRAINT <name>",
-                        self.peek_token(),
+                        self.peek_token_ref(),
                     );
                 }
             } else if let Some(option) = self.parse_optional_column_option()? {
@@ -8917,7 +8935,7 @@ impl<'a> Parser<'a> {
 
     fn is_column_type_sqlite_unspecified(&mut self) -> bool {
         if dialect_of!(self is SQLiteDialect) {
-            match self.peek_token().token {
+            match &self.peek_token_ref().token {
                 Token::Word(word) => matches!(
                     word.keyword,
                     Keyword::CONSTRAINT
@@ -8982,7 +9000,7 @@ impl<'a> Parser<'a> {
         {
             // The expression is optional for the EPHEMERAL syntax, so we need 
to check
             // if the column definition has remaining tokens before parsing 
the expression.
-            if matches!(self.peek_token().token, Token::Comma | Token::RParen) 
{
+            if matches!(self.peek_token_ref().token, Token::Comma | 
Token::RParen) {
                 Ok(Some(ColumnOption::Ephemeral(None)))
             } else {
                 Ok(Some(ColumnOption::Ephemeral(Some(self.parse_expr()?))))
@@ -9220,7 +9238,7 @@ impl<'a> Parser<'a> {
                     ))
                 } else if dialect_of!(self is PostgreSqlDialect) {
                     // Postgres' AS IDENTITY branches are above, this one 
needs STORED
-                    self.expected("STORED", self.peek_token())
+                    self.expected_ref("STORED", self.peek_token_ref())
                 } else if self.parse_keywords(&[Keyword::VIRTUAL]) {
                     Ok((GeneratedAs::Always, 
Some(GeneratedExpressionMode::Virtual)))
                 } else {
@@ -9313,9 +9331,9 @@ impl<'a> Parser<'a> {
         } else if self.parse_keywords(&[Keyword::SET, Keyword::DEFAULT]) {
             Ok(ReferentialAction::SetDefault)
         } else {
-            self.expected(
+            self.expected_ref(
                 "one of RESTRICT, CASCADE, SET NULL, NO ACTION or SET DEFAULT",
-                self.peek_token(),
+                self.peek_token_ref(),
             )
         }
     }
@@ -9329,7 +9347,7 @@ impl<'a> Parser<'a> {
         } else if self.parse_keyword(Keyword::SIMPLE) {
             Ok(ConstraintReferenceMatchKind::Simple)
         } else {
-            self.expected("one of FULL, PARTIAL or SIMPLE", self.peek_token())
+            self.expected_ref("one of FULL, PARTIAL or SIMPLE", 
self.peek_token_ref())
         }
     }
 
@@ -9366,7 +9384,7 @@ impl<'a> Parser<'a> {
                 } else if self.parse_keyword(Keyword::IMMEDIATE) {
                     cc.initially = Some(DeferrableInitial::Immediate);
                 } else {
-                    self.expected("one of DEFERRED or IMMEDIATE", 
self.peek_token())?;
+                    self.expected_ref("one of DEFERRED or IMMEDIATE", 
self.peek_token_ref())?;
                 }
             } else if cc.enforced.is_none() && 
self.parse_keyword(Keyword::ENFORCED) {
                 cc.enforced = Some(true);
@@ -9424,8 +9442,10 @@ impl<'a> Parser<'a> {
                 if !dialect_of!(self is GenericDialect | MySqlDialect)
                     && !index_type_display.is_none()
                 {
-                    return self
-                        .expected("`index_name` or `(column_name [, ...])`", 
self.peek_token());
+                    return self.expected_ref(
+                        "`index_name` or `(column_name [, ...])`",
+                        self.peek_token_ref(),
+                    );
                 }
 
                 let nulls_distinct = self.parse_optional_nulls_distinct()?;
@@ -9636,7 +9656,7 @@ impl<'a> Parser<'a> {
         &mut self,
         keyword: Keyword,
     ) -> Result<Option<Vec<SqlOption>>, ParserError> {
-        if let Token::Word(word) = self.peek_token().token {
+        if let Token::Word(word) = &self.peek_token_ref().token {
             if word.keyword == keyword {
                 return Ok(Some(self.parse_options(keyword)?));
             }
@@ -9964,9 +9984,9 @@ impl<'a> Parser<'a> {
                 let name = self.parse_identifier()?;
                 AlterTableOperation::DisableTrigger { name }
             } else {
-                return self.expected(
+                return self.expected_ref(
                     "ROW LEVEL SECURITY, RULE, or TRIGGER after DISABLE",
-                    self.peek_token(),
+                    self.peek_token_ref(),
                 );
             }
         } else if self.parse_keyword(Keyword::ENABLE) {
@@ -9991,9 +10011,9 @@ impl<'a> Parser<'a> {
                 let name = self.parse_identifier()?;
                 AlterTableOperation::EnableTrigger { name }
             } else {
-                return self.expected(
+                return self.expected_ref(
                     "ALWAYS, REPLICA, ROW LEVEL SECURITY, RULE, or TRIGGER 
after ENABLE",
-                    self.peek_token(),
+                    self.peek_token_ref(),
                 );
             }
         } else if self.parse_keywords(&[
@@ -10189,7 +10209,7 @@ impl<'a> Parser<'a> {
 
                 let mut sequence_options: Option<Vec<SequenceOptions>> = None;
 
-                if self.peek_token().token == Token::LParen {
+                if self.peek_token_ref().token == Token::LParen {
                     self.expect_token(&Token::LParen)?;
                     sequence_options = 
Some(self.parse_create_sequence_options()?);
                     self.expect_token(&Token::RParen)?;
@@ -10206,7 +10226,7 @@ impl<'a> Parser<'a> {
                     "SET/DROP NOT NULL, SET DEFAULT, or SET DATA TYPE after 
ALTER COLUMN"
                 };
 
-                return self.expected(message, self.peek_token());
+                return self.expected_ref(message, self.peek_token_ref());
             };
             AlterTableOperation::AlterColumn { column_name, op }
         } else if self.parse_keyword(Keyword::SWAP) {
@@ -10279,9 +10299,9 @@ impl<'a> Parser<'a> {
                 Some(Keyword::EXCLUSIVE) => AlterTableLock::Exclusive,
                 Some(Keyword::NONE) => AlterTableLock::None,
                 Some(Keyword::SHARED) => AlterTableLock::Shared,
-                _ => self.expected(
+                _ => self.expected_ref(
                     "DEFAULT, EXCLUSIVE, NONE or SHARED after LOCK [=]",
-                    self.peek_token(),
+                    self.peek_token_ref(),
                 )?,
             };
             AlterTableOperation::Lock { equals, lock }
@@ -10297,9 +10317,9 @@ impl<'a> Parser<'a> {
                 Some(Keyword::INSTANT) => AlterTableAlgorithm::Instant,
                 Some(Keyword::INPLACE) => AlterTableAlgorithm::Inplace,
                 Some(Keyword::COPY) => AlterTableAlgorithm::Copy,
-                _ => self.expected(
+                _ => self.expected_ref(
                     "DEFAULT, INSTANT, INPLACE, or COPY after ALGORITHM [=]",
-                    self.peek_token(),
+                    self.peek_token_ref(),
                 )?,
             };
             AlterTableOperation::Algorithm { equals, algorithm }
@@ -10317,9 +10337,9 @@ impl<'a> Parser<'a> {
             } else if self.parse_keywords(&[Keyword::USING, Keyword::INDEX]) {
                 ReplicaIdentity::Index(self.parse_identifier()?)
             } else {
-                return self.expected(
+                return self.expected_ref(
                     "NOTHING, FULL, DEFAULT, or USING INDEX index_name after 
REPLICA IDENTITY",
-                    self.peek_token(),
+                    self.peek_token_ref(),
                 );
             };
 
@@ -10339,9 +10359,9 @@ impl<'a> Parser<'a> {
                 if !options.is_empty() {
                     AlterTableOperation::SetOptionsParens { options }
                 } else {
-                    return self.expected(
+                    return self.expected_ref(
                     "ADD, RENAME, PARTITION, SWAP, DROP, REPLICA IDENTITY, 
SET, or SET TBLPROPERTIES after ALTER TABLE",
-                    self.peek_token(),
+                    self.peek_token_ref(),
                   );
                 }
             }
@@ -10412,10 +10432,10 @@ impl<'a> Parser<'a> {
                         let index_name = self.parse_object_name(false)?;
                         AlterIndexOperation::RenameIndex { index_name }
                     } else {
-                        return self.expected("TO after RENAME", 
self.peek_token());
+                        return self.expected_ref("TO after RENAME", 
self.peek_token_ref());
                     }
                 } else {
-                    return self.expected("RENAME after ALTER INDEX", 
self.peek_token());
+                    return self.expected_ref("RENAME after ALTER INDEX", 
self.peek_token_ref());
                 };
 
                 Ok(Statement::AlterIndex {
@@ -10682,7 +10702,7 @@ impl<'a> Parser<'a> {
                 let sort_family = self.parse_object_name(false)?;
                 Some(OperatorPurpose::ForOrderBy { sort_family })
             } else {
-                return self.expected("SEARCH or ORDER BY after FOR", 
self.peek_token());
+                return self.expected_ref("SEARCH or ORDER BY after FOR", 
self.peek_token_ref());
             }
         } else {
             None
@@ -10701,22 +10721,23 @@ impl<'a> Parser<'a> {
         let support_number = self.parse_literal_uint()?;
 
         // Optional operator types
-        let op_types = if self.consume_token(&Token::LParen) && 
self.peek_token() != Token::RParen {
-            let types = self.parse_comma_separated(Parser::parse_data_type)?;
-            self.expect_token(&Token::RParen)?;
-            Some(types)
-        } else if self.consume_token(&Token::LParen) {
-            self.expect_token(&Token::RParen)?;
-            Some(vec![])
-        } else {
-            None
-        };
+        let op_types =
+            if self.consume_token(&Token::LParen) && 
self.peek_token_ref().token != Token::RParen {
+                let types = 
self.parse_comma_separated(Parser::parse_data_type)?;
+                self.expect_token(&Token::RParen)?;
+                Some(types)
+            } else if self.consume_token(&Token::LParen) {
+                self.expect_token(&Token::RParen)?;
+                Some(vec![])
+            } else {
+                None
+            };
 
         let function_name = self.parse_object_name(false)?;
 
         // Function argument types
         let argument_types = if self.consume_token(&Token::LParen) {
-            if self.peek_token() == Token::RParen {
+            if self.peek_token_ref().token == Token::RParen {
                 self.expect_token(&Token::RParen)?;
                 vec![]
             } else {
@@ -10777,7 +10798,7 @@ impl<'a> Parser<'a> {
         } else if self.parse_keyword(Keyword::FUNCTION) {
             self.parse_operator_family_add_function()
         } else {
-            self.expected("OPERATOR or FUNCTION", self.peek_token())
+            self.expected_ref("OPERATOR or FUNCTION", self.peek_token_ref())
         }
     }
 
@@ -10788,7 +10809,7 @@ impl<'a> Parser<'a> {
         } else if self.parse_keyword(Keyword::FUNCTION) {
             self.parse_operator_family_drop_function()
         } else {
-            self.expected("OPERATOR or FUNCTION", self.peek_token())
+            self.expected_ref("OPERATOR or FUNCTION", self.peek_token_ref())
         }
     }
 
@@ -10904,12 +10925,12 @@ impl<'a> Parser<'a> {
     /// or `CALL procedure_name` statement
     pub fn parse_call(&mut self) -> Result<Statement, ParserError> {
         let object_name = self.parse_object_name(false)?;
-        if self.peek_token().token == Token::LParen {
+        if self.peek_token_ref().token == Token::LParen {
             match self.parse_function(object_name)? {
                 Expr::Function(f) => Ok(Statement::Call(f)),
                 other => parser_err!(
                     format!("Expected a simple procedure call but found: 
{other}"),
-                    self.peek_token().span.start
+                    self.peek_token_ref().span.start
                 ),
             }
         } else {
@@ -10943,7 +10964,7 @@ impl<'a> Parser<'a> {
         let to = match self.parse_one_of_keywords(&[Keyword::FROM, 
Keyword::TO]) {
             Some(Keyword::FROM) => false,
             Some(Keyword::TO) => true,
-            _ => self.expected("FROM or TO", self.peek_token())?,
+            _ => self.expected_ref("FROM or TO", self.peek_token_ref())?,
         };
         if !to {
             // Use a separate if statement to prevent Rust compiler from 
complaining about
@@ -11051,7 +11072,7 @@ impl<'a> Parser<'a> {
                 
CopyOption::ForceNull(self.parse_parenthesized_column_list(Mandatory, false)?)
             }
             Some(Keyword::ENCODING) => 
CopyOption::Encoding(self.parse_literal_string()?),
-            _ => self.expected("option", self.peek_token())?,
+            _ => self.expected_ref("option", self.peek_token_ref())?,
         };
         Ok(ret)
     }
@@ -11102,7 +11123,7 @@ impl<'a> Parser<'a> {
             Some(Keyword::ACCEPTANYDATE) => CopyLegacyOption::AcceptAnyDate,
             Some(Keyword::ACCEPTINVCHARS) => {
                 let _ = self.parse_keyword(Keyword::AS); // [ AS ]
-                let ch = if matches!(self.peek_token().token, 
Token::SingleQuotedString(_)) {
+                let ch = if matches!(self.peek_token_ref().token, 
Token::SingleQuotedString(_)) {
                     Some(self.parse_literal_string()?)
                 } else {
                     None
@@ -11140,7 +11161,7 @@ impl<'a> Parser<'a> {
             }),
             Some(Keyword::DATEFORMAT) => {
                 let _ = self.parse_keyword(Keyword::AS);
-                let fmt = if matches!(self.peek_token().token, 
Token::SingleQuotedString(_)) {
+                let fmt = if matches!(self.peek_token_ref().token, 
Token::SingleQuotedString(_)) {
                     Some(self.parse_literal_string()?)
                 } else {
                     None
@@ -11175,7 +11196,7 @@ impl<'a> Parser<'a> {
             }
             Some(Keyword::JSON) => {
                 let _ = self.parse_keyword(Keyword::AS);
-                let fmt = if matches!(self.peek_token().token, 
Token::SingleQuotedString(_)) {
+                let fmt = if matches!(self.peek_token_ref().token, 
Token::SingleQuotedString(_)) {
                     Some(self.parse_literal_string()?)
                 } else {
                     None
@@ -11246,7 +11267,7 @@ impl<'a> Parser<'a> {
             }
             Some(Keyword::TIMEFORMAT) => {
                 let _ = self.parse_keyword(Keyword::AS);
-                let fmt = if matches!(self.peek_token().token, 
Token::SingleQuotedString(_)) {
+                let fmt = if matches!(self.peek_token_ref().token, 
Token::SingleQuotedString(_)) {
                     Some(self.parse_literal_string()?)
                 } else {
                     None
@@ -11255,7 +11276,7 @@ impl<'a> Parser<'a> {
             }
             Some(Keyword::TRUNCATECOLUMNS) => 
CopyLegacyOption::TruncateColumns,
             Some(Keyword::ZSTD) => CopyLegacyOption::Zstd,
-            _ => self.expected("option", self.peek_token())?,
+            _ => self.expected_ref("option", self.peek_token_ref())?,
         };
         Ok(ret)
     }
@@ -11309,7 +11330,7 @@ impl<'a> Parser<'a> {
                     self.parse_comma_separated(|p| p.parse_identifier())?,
                 )
             }
-            _ => self.expected("csv option", self.peek_token())?,
+            _ => self.expected_ref("csv option", self.peek_token_ref())?,
         };
         Ok(ret)
     }
@@ -11527,7 +11548,7 @@ impl<'a> Parser<'a> {
             Value::Placeholder(_) => Ok(value_wrapper),
             _ => {
                 self.prev_token();
-                self.expected("literal number", self.peek_token())
+                self.expected_ref("literal number", self.peek_token_ref())
             }
         }
     }
@@ -11636,7 +11657,7 @@ impl<'a> Parser<'a> {
         match self.parse_one_of_keywords(&[Keyword::TRUE, Keyword::FALSE]) {
             Some(Keyword::TRUE) => Ok(true),
             Some(Keyword::FALSE) => Ok(false),
-            _ => self.expected("TRUE or FALSE", self.peek_token()),
+            _ => self.expected_ref("TRUE or FALSE", self.peek_token_ref()),
         }
     }
 
@@ -11654,7 +11675,7 @@ impl<'a> Parser<'a> {
                 Some(Keyword::NFD) => Ok(NormalizationForm::NFD),
                 Some(Keyword::NFKC) => Ok(NormalizationForm::NFKC),
                 Some(Keyword::NFKD) => Ok(NormalizationForm::NFKD),
-                _ => parser.expected("unicode normalization form", 
parser.peek_token()),
+                _ => parser.expected_ref("unicode normalization form", 
parser.peek_token_ref()),
             }
         })?;
         if self.parse_keyword(Keyword::NORMALIZED) {
@@ -11664,7 +11685,7 @@ impl<'a> Parser<'a> {
                 negated: neg,
             });
         }
-        self.expected("unicode normalization form", self.peek_token())
+        self.expected_ref("unicode normalization form", self.peek_token_ref())
     }
 
     /// Parse parenthesized enum members, used with `ENUM(...)` type 
definitions.
@@ -12072,7 +12093,7 @@ impl<'a> Parser<'a> {
                 Keyword::TABLE => {
                     // an LParen after the TABLE keyword indicates that table 
columns are being defined
                     // whereas no LParen indicates an anonymous table 
expression will be returned
-                    if self.peek_token() == Token::LParen {
+                    if self.peek_token_ref().token == Token::LParen {
                         let columns = self.parse_returns_table_columns()?;
                         Ok(DataType::Table(Some(columns)))
                     } else {
@@ -12243,9 +12264,9 @@ impl<'a> Parser<'a> {
                 Keyword::IGNORE => TableIndexHintType::Ignore,
                 Keyword::FORCE => TableIndexHintType::Force,
                 _ => {
-                    return self.expected(
+                    return self.expected_ref(
                         "expected to match USE/IGNORE/FORCE keyword",
-                        self.peek_token(),
+                        self.peek_token_ref(),
                     )
                 }
             };
@@ -12253,7 +12274,8 @@ impl<'a> Parser<'a> {
                 Some(Keyword::INDEX) => TableIndexType::Index,
                 Some(Keyword::KEY) => TableIndexType::Key,
                 _ => {
-                    return self.expected("expected to match INDEX/KEY 
keyword", self.peek_token())
+                    return self
+                        .expected_ref("expected to match INDEX/KEY keyword", 
self.peek_token_ref())
                 }
             };
             let for_clause = if self.parse_keyword(Keyword::FOR) {
@@ -12264,9 +12286,9 @@ impl<'a> Parser<'a> {
                 } else if self.parse_keywords(&[Keyword::GROUP, Keyword::BY]) {
                     TableIndexHintForClause::GroupBy
                 } else {
-                    return self.expected(
+                    return self.expected_ref(
                         "expected to match FOR/ORDER BY/GROUP BY table hint in 
for clause",
-                        self.peek_token(),
+                        self.peek_token_ref(),
                     );
                 };
                 Some(clause)
@@ -12275,7 +12297,7 @@ impl<'a> Parser<'a> {
             };
 
             self.expect_token(&Token::LParen)?;
-            let index_names = if self.peek_token().token != Token::RParen {
+            let index_names = if self.peek_token_ref().token != Token::RParen {
                 self.parse_comma_separated(Parser::parse_identifier)?
             } else {
                 vec![]
@@ -12376,7 +12398,7 @@ impl<'a> Parser<'a> {
                         _ => {
                             return parser_err!(
                                 "BUG: expected to match GroupBy modifier 
keyword",
-                                self.peek_token().span.start
+                                self.peek_token_ref().span.start
                             )
                         }
                     });
@@ -12533,7 +12555,7 @@ impl<'a> Parser<'a> {
             }
         } else {
             loop {
-                if allow_wildcards && self.peek_token().token == Token::Mul {
+                if allow_wildcards && self.peek_token_ref().token == 
Token::Mul {
                     let span = self.next_token().span;
                     parts.push(ObjectNamePart::Identifier(Ident {
                         value: Token::Mul.to_string(),
@@ -12548,7 +12570,7 @@ impl<'a> Parser<'a> {
                     }
                 } else if 
self.dialect.supports_object_name_double_dot_notation()
                     && parts.len() == 1
-                    && matches!(self.peek_token().token, Token::Period)
+                    && matches!(self.peek_token_ref().token, Token::Period)
                 {
                     // Empty string here means default schema
                     parts.push(ObjectNamePart::Identifier(Ident::new("")));
@@ -12778,7 +12800,7 @@ impl<'a> Parser<'a> {
                                 }
                                 // If next token is period, then it is part of 
an ObjectName and we don't expect whitespace
                                 // after the number.
-                                !matches!(self.peek_token().token, 
Token::Period)
+                                !matches!(self.peek_token_ref().token, 
Token::Period)
                             }
                             _ => {
                                 return self
@@ -12806,7 +12828,7 @@ impl<'a> Parser<'a> {
     /// Parses a parenthesized, comma-separated list of column definitions 
within a view.
     fn parse_view_columns(&mut self) -> Result<Vec<ViewColumnDef>, 
ParserError> {
         if self.consume_token(&Token::LParen) {
-            if self.peek_token().token == Token::RParen {
+            if self.peek_token_ref().token == Token::RParen {
                 self.next_token();
                 Ok(vec![])
             } else {
@@ -12913,7 +12935,7 @@ impl<'a> Parser<'a> {
         F: FnMut(&mut Parser) -> Result<T, ParserError>,
     {
         if self.consume_token(&Token::LParen) {
-            if allow_empty && self.peek_token().token == Token::RParen {
+            if allow_empty && self.peek_token_ref().token == Token::RParen {
                 self.next_token();
                 Ok(vec![])
             } else {
@@ -12924,7 +12946,7 @@ impl<'a> Parser<'a> {
         } else if optional == Optional {
             Ok(vec![])
         } else {
-            self.expected("a list of columns in parentheses", 
self.peek_token())
+            self.expected_ref("a list of columns in parentheses", 
self.peek_token_ref())
         }
     }
 
@@ -12997,7 +13019,7 @@ impl<'a> Parser<'a> {
                         Keyword::SECOND => 
Ok(Some(IntervalFields::DayToSecond)),
                         _ => {
                             self.prev_token();
-                            self.expected("HOUR, MINUTE, or SECOND", 
self.peek_token())
+                            self.expected_ref("HOUR, MINUTE, or SECOND", 
self.peek_token_ref())
                         }
                     }
                 } else {
@@ -13012,7 +13034,7 @@ impl<'a> Parser<'a> {
                         Keyword::SECOND => 
Ok(Some(IntervalFields::HourToSecond)),
                         _ => {
                             self.prev_token();
-                            self.expected("MINUTE or SECOND", 
self.peek_token())
+                            self.expected_ref("MINUTE or SECOND", 
self.peek_token_ref())
                         }
                     }
                 } else {
@@ -13032,9 +13054,9 @@ impl<'a> Parser<'a> {
             Some(Keyword::SECOND) => Ok(Some(IntervalFields::Second)),
             Some(_) => {
                 self.prev_token();
-                self.expected(
+                self.expected_ref(
                     "YEAR, MONTH, DAY, HOUR, MINUTE, or SECOND",
-                    self.peek_token(),
+                    self.peek_token_ref(),
                 )
             }
             None => Ok(None),
@@ -13296,9 +13318,9 @@ impl<'a> Parser<'a> {
                 if dialect_of!(self is ClickHouseDialect | GenericDialect) {
                     Some(KillType::Mutation)
                 } else {
-                    self.expected(
+                    self.expected_ref(
                         "Unsupported type for KILL, allowed: CONNECTION | 
QUERY",
-                        self.peek_token(),
+                        self.peek_token_ref(),
                     )?
                 }
             }
@@ -13324,7 +13346,7 @@ impl<'a> Parser<'a> {
         // although not all features may be implemented.
         if describe_alias == DescribeAlias::Explain
             && self.dialect.supports_explain_with_utility_options()
-            && self.peek_token().token == Token::LParen
+            && self.peek_token_ref().token == Token::LParen
         {
             options = Some(self.parse_utility_options()?)
         } else if self.parse_keywords(&[Keyword::QUERY, Keyword::PLAN]) {
@@ -13763,7 +13785,7 @@ impl<'a> Parser<'a> {
     pub fn parse_for_xml(&mut self) -> Result<ForClause, ParserError> {
         let for_xml = if self.parse_keyword(Keyword::RAW) {
             let mut element_name = None;
-            if self.peek_token().token == Token::LParen {
+            if self.peek_token_ref().token == Token::LParen {
                 self.expect_token(&Token::LParen)?;
                 element_name = Some(self.parse_literal_string()?);
                 self.expect_token(&Token::RParen)?;
@@ -13775,7 +13797,7 @@ impl<'a> Parser<'a> {
             ForXml::Explicit
         } else if self.parse_keyword(Keyword::PATH) {
             let mut element_name = None;
-            if self.peek_token().token == Token::LParen {
+            if self.peek_token_ref().token == Token::LParen {
                 self.expect_token(&Token::LParen)?;
                 element_name = Some(self.parse_literal_string()?);
                 self.expect_token(&Token::RParen)?;
@@ -13790,7 +13812,7 @@ impl<'a> Parser<'a> {
         let mut binary_base64 = false;
         let mut root = None;
         let mut r#type = false;
-        while self.peek_token().token == Token::Comma {
+        while self.peek_token_ref().token == Token::Comma {
             self.next_token();
             if self.parse_keyword(Keyword::ELEMENTS) {
                 elements = true;
@@ -13828,7 +13850,7 @@ impl<'a> Parser<'a> {
         let mut root = None;
         let mut include_null_values = false;
         let mut without_array_wrapper = false;
-        while self.peek_token().token == Token::Comma {
+        while self.peek_token_ref().token == Token::Comma {
             self.next_token();
             if self.parse_keyword(Keyword::ROOT) {
                 self.expect_token(&Token::LParen)?;
@@ -13942,9 +13964,9 @@ impl<'a> Parser<'a> {
         } else if self.parse_keyword(Keyword::TABLE) {
             SetExpr::Table(Box::new(self.parse_as_table()?))
         } else {
-            return self.expected(
+            return self.expected_ref(
                 "SELECT, VALUES, or a subquery in the query body",
-                self.peek_token(),
+                self.peek_token_ref(),
             );
         };
 
@@ -14349,9 +14371,9 @@ impl<'a> Parser<'a> {
                 Keyword::SQL_CALC_FOUND_ROWS => modifiers.sql_calc_found_rows 
= true,
                 _ => {
                     self.prev_token();
-                    return self.expected(
+                    return self.expected_ref(
                         "HIGH_PRIORITY, STRAIGHT_JOIN, or other MySQL select 
modifier",
-                        self.peek_token(),
+                        self.peek_token_ref(),
                     );
                 }
             }
@@ -14385,7 +14407,7 @@ impl<'a> Parser<'a> {
         {
             Some(ValueTableMode::AsStruct)
         } else if self.parse_keyword(Keyword::AS) {
-            self.expected("VALUE or STRUCT", self.peek_token())?
+            self.expected_ref("VALUE or STRUCT", self.peek_token_ref())?
         } else {
             None
         };
@@ -14511,7 +14533,7 @@ impl<'a> Parser<'a> {
             } else if let Ok(expr) = self.parse_expr() {
                 expr
             } else {
-                self.expected("variable value", self.peek_token())?
+                self.expected_ref("variable value", self.peek_token_ref())?
             };
 
             values.push(value);
@@ -14543,13 +14565,13 @@ impl<'a> Parser<'a> {
             // Parenthesized assignments are handled in the `parse_set` 
function after
             // trying to parse list of assignments using this function.
             // If a dialect supports both, and we find a LParen, we early exit 
from this function.
-            self.expected("Unparenthesized assignment", self.peek_token())?
+            self.expected_ref("Unparenthesized assignment", 
self.peek_token_ref())?
         } else {
             self.parse_object_name(false)?
         };
 
         if !(self.consume_token(&Token::Eq) || 
self.parse_keyword(Keyword::TO)) {
-            return self.expected("assignment operator", self.peek_token());
+            return self.expected_ref("assignment operator", 
self.peek_token_ref());
         }
 
         let value = self.parse_expr()?;
@@ -14724,7 +14746,7 @@ impl<'a> Parser<'a> {
             return self.parse_set_session_params();
         };
 
-        self.expected("equals sign or TO", self.peek_token())
+        self.expected_ref("equals sign or TO", self.peek_token_ref())
     }
 
     /// Parse session parameter assignments after `SET` when no `=` or `TO` is 
present.
@@ -14740,7 +14762,7 @@ impl<'a> Parser<'a> {
                 Some(Keyword::PROFILE) => SessionParamStatsTopic::Profile,
                 Some(Keyword::TIME) => SessionParamStatsTopic::Time,
                 Some(Keyword::XML) => SessionParamStatsTopic::Xml,
-                _ => return self.expected("IO, PROFILE, TIME or XML", 
self.peek_token()),
+                _ => return self.expected_ref("IO, PROFILE, TIME or XML", 
self.peek_token_ref()),
             };
             let value = self.parse_session_param_value()?;
             Ok(
@@ -14798,7 +14820,7 @@ impl<'a> Parser<'a> {
         } else if self.parse_keyword(Keyword::OFF) {
             Ok(SessionParamValue::Off)
         } else {
-            self.expected("ON or OFF", self.peek_token())
+            self.expected_ref("ON or OFF", self.peek_token_ref())
         }
     }
 
@@ -15071,7 +15093,7 @@ impl<'a> Parser<'a> {
                     // MSSQL extension, similar to CROSS JOIN LATERAL
                     JoinOperator::CrossApply
                 } else {
-                    return self.expected("JOIN or APPLY after CROSS", 
self.peek_token());
+                    return self.expected_ref("JOIN or APPLY after CROSS", 
self.peek_token_ref());
                 };
                 let relation = self.parse_table_factor()?;
                 let join_operator = if matches!(join_operator, 
JoinOperator::CrossJoin(_))
@@ -15191,14 +15213,15 @@ impl<'a> Parser<'a> {
                         JoinOperator::FullOuter
                     }
                     Keyword::OUTER => {
-                        return self.expected("LEFT, RIGHT, or FULL", 
self.peek_token());
+                        return self.expected_ref("LEFT, RIGHT, or FULL", 
self.peek_token_ref());
                     }
                     Keyword::STRAIGHT_JOIN => {
                         let _ = self.next_token(); // consume STRAIGHT_JOIN
                         JoinOperator::StraightJoin
                     }
                     _ if natural => {
-                        return self.expected("a join type after NATURAL", 
self.peek_token());
+                        return self
+                            .expected_ref("a join type after NATURAL", 
self.peek_token_ref());
                     }
                     _ => break,
                 };
@@ -15380,7 +15403,7 @@ impl<'a> Parser<'a> {
             } else {
                 // The SQL spec prohibits derived tables and bare tables from
                 // appearing alone in parentheses (e.g. `FROM (mytable)`)
-                self.expected("joined table", self.peek_token())
+                self.expected_ref("joined table", self.peek_token_ref())
             }
         } else if self.dialect.supports_values_as_table_factor()
             && matches!(
@@ -15667,7 +15690,7 @@ impl<'a> Parser<'a> {
                     } else {
                         return parser_err!(
                             "Expecting number or byte length e.g. 100M",
-                            self.peek_token().span.start
+                            self.peek_token_ref().span.start
                         );
                     }
                 }
@@ -15860,7 +15883,7 @@ impl<'a> Parser<'a> {
         let mut facts = Vec::new();
         let mut where_clause = None;
 
-        while self.peek_token().token != Token::RParen {
+        while self.peek_token_ref().token != Token::RParen {
             if self.parse_keyword(Keyword::DIMENSIONS) {
                 if !dimensions.is_empty() {
                     return Err(ParserError::ParserError(
@@ -15895,7 +15918,7 @@ impl<'a> Parser<'a> {
                         "Expected one of DIMENSIONS, METRICS, FACTS or WHERE, 
got {}",
                         self.peek_token().token
                     ),
-                    self.peek_token().span.start
+                    self.peek_token_ref().span.start
                 )?;
             }
         }
@@ -16115,7 +16138,7 @@ impl<'a> Parser<'a> {
 
     fn parse_concat_pattern(&mut self) -> Result<MatchRecognizePattern, 
ParserError> {
         let mut patterns = vec![self.parse_repetition_pattern()?];
-        while !matches!(self.peek_token().token, Token::RParen | Token::Pipe) {
+        while !matches!(self.peek_token_ref().token, Token::RParen | 
Token::Pipe) {
             patterns.push(self.parse_repetition_pattern()?);
         }
         match <[MatchRecognizePattern; 1]>::try_from(patterns) {
@@ -16321,7 +16344,7 @@ impl<'a> Parser<'a> {
     fn parse_pivot_aggregate_function(&mut self) -> Result<ExprWithAlias, 
ParserError> {
         let function_name = match self.next_token().token {
             Token::Word(w) => Ok(w.value),
-            _ => self.expected("a function identifier", self.peek_token()),
+            _ => self.expected_ref("a function identifier", 
self.peek_token_ref()),
         }?;
         let expr = 
self.parse_function(ObjectName::from(vec![Ident::new(function_name)]))?;
         let alias = {
@@ -16437,7 +16460,7 @@ impl<'a> Parser<'a> {
             Ok(JoinConstraint::Using(columns))
         } else {
             Ok(JoinConstraint::None)
-            //self.expected("ON, or USING after JOIN", self.peek_token())
+            //self.expected_ref("ON, or USING after JOIN", 
self.peek_token_ref())
         }
     }
 
@@ -16724,7 +16747,7 @@ impl<'a> Parser<'a> {
                         if let Some(name) = objects?.first() {
                             self.parse_grant_procedure_or_function(name, &kw)?
                         } else {
-                            self.expected("procedure or function name", 
self.peek_token())?
+                            self.expected_ref("procedure or function name", 
self.peek_token_ref())?
                         }
                     }
                     Some(Keyword::TABLE) | None => 
Some(GrantObjects::Tables(objects?)),
@@ -16761,7 +16784,7 @@ impl<'a> Parser<'a> {
                 name: name.clone(),
                 arg_types,
             })),
-            _ => self.expected("procedure or function keywords", 
self.peek_token())?,
+            _ => self.expected_ref("procedure or function keywords", 
self.peek_token_ref())?,
         }
     }
 
@@ -16882,7 +16905,7 @@ impl<'a> Parser<'a> {
         } else if self.parse_keyword(Keyword::DROP) {
             Ok(Action::Drop)
         } else {
-            self.expected("a privilege keyword", self.peek_token())?
+            self.expected_ref("a privilege keyword", self.peek_token_ref())?
         }
     }
 
@@ -16951,7 +16974,7 @@ impl<'a> Parser<'a> {
         } else if self.parse_keyword(Keyword::TAG) {
             Ok(ActionApplyType::Tag)
         } else {
-            self.expected("GRANT APPLY type", self.peek_token())
+            self.expected_ref("GRANT APPLY type", self.peek_token_ref())
         }
     }
 
@@ -16987,7 +17010,7 @@ impl<'a> Parser<'a> {
         } else if self.parse_keyword(Keyword::WAREHOUSES) {
             Ok(ActionManageType::Warehouses)
         } else {
-            self.expected("GRANT MANAGE type", self.peek_token())
+            self.expected_ref("GRANT MANAGE type", self.peek_token_ref())
         }
     }
 
@@ -17043,7 +17066,7 @@ impl<'a> Parser<'a> {
             None => {
                 return parser_err!(
                     "DENY statements must specify an object",
-                    self.peek_token().span.start
+                    self.peek_token_ref().span.start
                 )
             }
         };
@@ -17098,7 +17121,7 @@ impl<'a> Parser<'a> {
         if !dialect_of!(self is MySqlDialect | GenericDialect) {
             return parser_err!(
                 "Unsupported statement REPLACE",
-                self.peek_token().span.start
+                self.peek_token_ref().span.start
             );
         }
 
@@ -17242,7 +17265,7 @@ impl<'a> Parser<'a> {
                     let conflict_target =
                         if self.parse_keywords(&[Keyword::ON, 
Keyword::CONSTRAINT]) {
                             
Some(ConflictTarget::OnConstraint(self.parse_object_name(false)?))
-                        } else if self.peek_token() == Token::LParen {
+                        } else if self.peek_token_ref().token == Token::LParen 
{
                             Some(ConflictTarget::Columns(
                                 
self.parse_parenthesized_column_list(IsOptional::Mandatory, false)?,
                             ))
@@ -17676,7 +17699,7 @@ impl<'a> Parser<'a> {
     }
 
     fn parse_duplicate_treatment(&mut self) -> 
Result<Option<DuplicateTreatment>, ParserError> {
-        let loc = self.peek_token().span.start;
+        let loc = self.peek_token_ref().span.start;
         match (
             self.parse_keyword(Keyword::ALL),
             self.parse_keyword(Keyword::DISTINCT),
@@ -17708,7 +17731,7 @@ impl<'a> Parser<'a> {
             Expr::Identifier(v) if v.value.to_lowercase() == "from" && 
v.quote_style.is_none() => {
                 parser_err!(
                     format!("Expected an expression, found: {}", v),
-                    self.peek_token().span.start
+                    self.peek_token_ref().span.start
                 )
             }
             Expr::BinaryOp {
@@ -17721,7 +17744,7 @@ impl<'a> Parser<'a> {
                 let Expr::Identifier(alias) = *left else {
                     return parser_err!(
                         "BUG: expected identifier expression as alias",
-                        self.peek_token().span.start
+                        self.peek_token_ref().span.start
                     );
                 };
                 Ok(SelectItem::ExprWithAlias {
@@ -17842,13 +17865,13 @@ impl<'a> Parser<'a> {
         &mut self,
     ) -> Result<Option<ExceptSelectItem>, ParserError> {
         let opt_except = if self.parse_keyword(Keyword::EXCEPT) {
-            if self.peek_token().token == Token::LParen {
+            if self.peek_token_ref().token == Token::LParen {
                 let idents = self.parse_parenthesized_column_list(Mandatory, 
false)?;
                 match &idents[..] {
                     [] => {
-                        return self.expected(
+                        return self.expected_ref(
                             "at least one column should be parsed by the 
expect clause",
-                            self.peek_token(),
+                            self.peek_token_ref(),
                         )?;
                     }
                     [first, idents @ ..] => Some(ExceptSelectItem {
@@ -18336,7 +18359,7 @@ impl<'a> Parser<'a> {
                 } else if self.parse_keyword(Keyword::SNAPSHOT) {
                     TransactionIsolationLevel::Snapshot
                 } else {
-                    self.expected("isolation level", self.peek_token())?
+                    self.expected_ref("isolation level", 
self.peek_token_ref())?
                 };
                 TransactionMode::IsolationLevel(iso_level)
             } else if self.parse_keywords(&[Keyword::READ, Keyword::ONLY]) {
@@ -18344,7 +18367,7 @@ impl<'a> Parser<'a> {
             } else if self.parse_keywords(&[Keyword::READ, Keyword::WRITE]) {
                 TransactionMode::AccessMode(TransactionAccessMode::ReadWrite)
             } else if required {
-                self.expected("transaction mode", self.peek_token())?
+                self.expected_ref("transaction mode", self.peek_token_ref())?
             } else {
                 break;
             };
@@ -18433,9 +18456,9 @@ impl<'a> Parser<'a> {
             Keyword::LOG => Ok(RaisErrorOption::Log),
             Keyword::NOWAIT => Ok(RaisErrorOption::NoWait),
             Keyword::SETERROR => Ok(RaisErrorOption::SetError),
-            _ => self.expected(
+            _ => self.expected_ref(
                 "LOG, NOWAIT OR SETERROR raiserror option",
-                self.peek_token(),
+                self.peek_token_ref(),
             ),
         }
     }
@@ -18553,12 +18576,12 @@ impl<'a> Parser<'a> {
     pub fn parse_unload(&mut self) -> Result<Statement, ParserError> {
         self.expect_keyword(Keyword::UNLOAD)?;
         self.expect_token(&Token::LParen)?;
-        let (query, query_text) = if matches!(self.peek_token().token, 
Token::SingleQuotedString(_))
-        {
-            (None, Some(self.parse_literal_string()?))
-        } else {
-            (Some(self.parse_query()?), None)
-        };
+        let (query, query_text) =
+            if matches!(self.peek_token_ref().token, 
Token::SingleQuotedString(_)) {
+                (None, Some(self.parse_literal_string()?))
+            } else {
+                (Some(self.parse_query()?), None)
+            };
         self.expect_token(&Token::RParen)?;
 
         self.expect_keyword_is(Keyword::TO)?;
@@ -18607,7 +18630,7 @@ impl<'a> Parser<'a> {
             v @ Value::Placeholder(_) => Ok(v),
             _ => {
                 self.prev_token();
-                self.expected("number or string or ? placeholder", 
self.peek_token())
+                self.expected_ref("number or string or ? placeholder", 
self.peek_token_ref())
             }
         }
     }
@@ -18669,9 +18692,9 @@ impl<'a> Parser<'a> {
                 table_format,
             })
         } else {
-            self.expected(
+            self.expected_ref(
                 "`DATA` or an extension name after `LOAD`",
-                self.peek_token(),
+                self.peek_token_ref(),
             )
         }
     }
@@ -18884,7 +18907,7 @@ impl<'a> Parser<'a> {
         } else if self.dialect.supports_window_clause_named_window_reference() 
{
             NamedWindowExpr::NamedWindow(self.parse_identifier()?)
         } else {
-            return self.expected("(", self.peek_token());
+            return self.expected_ref("(", self.peek_token_ref());
         };
 
         Ok(NamedWindowDefinition(ident, window_expr))
@@ -18986,7 +19009,7 @@ impl<'a> Parser<'a> {
             // CREATE TYPE name AS (attributes) - Composite
             self.parse_create_type_composite(name)
         } else {
-            self.expected("ENUM, RANGE, or '(' after AS", self.peek_token())
+            self.expected_ref("ENUM, RANGE, or '(' after AS", 
self.peek_token_ref())
         }
     }
 
@@ -19101,7 +19124,7 @@ impl<'a> Parser<'a> {
                 let name = self.parse_object_name(false)?;
                 Ok(UserDefinedTypeRangeOption::MultirangeTypeName(name))
             }
-            _ => self.expected("range option keyword", self.peek_token()),
+            _ => self.expected_ref("range option keyword", 
self.peek_token_ref()),
         }
     }
 
@@ -19289,7 +19312,7 @@ impl<'a> Parser<'a> {
                     self.parse_keyword(Keyword::TRUE) || 
!self.parse_keyword(Keyword::FALSE);
                 Ok(UserDefinedTypeSqlDefinitionOption::Collatable(value))
             }
-            _ => self.expected("SQL definition option keyword", 
self.peek_token()),
+            _ => self.expected_ref("SQL definition option keyword", 
self.peek_token_ref()),
         }
     }
 
@@ -19331,7 +19354,7 @@ impl<'a> Parser<'a> {
         } else if self.parse_keyword(Keyword::TIME) {
             WaitForType::Time
         } else {
-            return self.expected("DELAY or TIME", self.peek_token());
+            return self.expected_ref("DELAY or TIME", self.peek_token_ref());
         };
         let expr = self.parse_expr()?;
         Ok(Statement::WaitFor(WaitForStatement { wait_type, expr }))
@@ -19453,7 +19476,7 @@ impl<'a> Parser<'a> {
             Some(Keyword::FROM) => ShowStatementInClause::FROM,
             Some(Keyword::IN) => ShowStatementInClause::IN,
             None => return Ok(None),
-            _ => return self.expected("FROM or IN", self.peek_token()),
+            _ => return self.expected_ref("FROM or IN", self.peek_token_ref()),
         };
 
         let (parent_type, parent_name) = match self.parse_one_of_keywords(&[
@@ -19488,9 +19511,9 @@ impl<'a> Parser<'a> {
                     Keyword::TABLE => (Some(ShowStatementInParentType::Table), 
parent_name),
                     Keyword::VIEW => (Some(ShowStatementInParentType::View), 
parent_name),
                     _ => {
-                        return self.expected(
+                        return self.expected_ref(
                             "one of ACCOUNT, DATABASE, SCHEMA, TABLE or VIEW",
-                            self.peek_token(),
+                            self.peek_token_ref(),
                         )
                     }
                 }
@@ -19566,7 +19589,7 @@ impl<'a> Parser<'a> {
                     if parenthesized {
                         break;
                     } else {
-                        return self.expected(" another option or EOF", 
self.peek_token());
+                        return self.expected_ref(" another option or EOF", 
self.peek_token_ref());
                     }
                 }
                 Token::EOF | Token::SemiColon => break,
@@ -19650,7 +19673,7 @@ impl<'a> Parser<'a> {
                     }),
                 }
             }
-            _ => self.expected("expected option value", self.peek_token()),
+            _ => self.expected_ref("expected option value", 
self.peek_token_ref()),
         }
     }
 


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to