Skip to content

Commit bfd944c

Browse files
alexander-beedieAlexander Beedie
andauthored
Prefer use of peek_token_ref over peek_token where valid (#2225)
Co-authored-by: Alexander Beedie <alexander.beedie@adia.ae>
1 parent 15dc6a2 commit bfd944c

File tree

8 files changed

+337
-306
lines changed

8 files changed

+337
-306
lines changed

src/dialect/mod.rs

Lines changed: 28 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -756,17 +756,17 @@ pub trait Dialect: Debug + Any {
756756
};
757757
}
758758

759-
let token = parser.peek_token();
759+
let token = parser.peek_token_ref();
760760
debug!("get_next_precedence_full() {token:?}");
761-
match token.token {
761+
match &token.token {
762762
Token::Word(w) if w.keyword == Keyword::OR => Ok(p!(Or)),
763763
Token::Word(w) if w.keyword == Keyword::AND => Ok(p!(And)),
764764
Token::Word(w) if w.keyword == Keyword::XOR => Ok(p!(Xor)),
765765

766766
Token::Word(w) if w.keyword == Keyword::AT => {
767767
match (
768-
parser.peek_nth_token(1).token,
769-
parser.peek_nth_token(2).token,
768+
&parser.peek_nth_token_ref(1).token,
769+
&parser.peek_nth_token_ref(2).token,
770770
) {
771771
(Token::Word(w), Token::Word(w2))
772772
if w.keyword == Keyword::TIME && w2.keyword == Keyword::ZONE =>
@@ -777,28 +777,30 @@ pub trait Dialect: Debug + Any {
777777
}
778778
}
779779

780-
Token::Word(w) if w.keyword == Keyword::NOT => match parser.peek_nth_token(1).token {
781-
// The precedence of NOT varies depending on keyword that
782-
// follows it. If it is followed by IN, BETWEEN, or LIKE,
783-
// it takes on the precedence of those tokens. Otherwise, it
784-
// is not an infix operator, and therefore has zero
785-
// precedence.
786-
Token::Word(w) if w.keyword == Keyword::IN => Ok(p!(Between)),
787-
Token::Word(w) if w.keyword == Keyword::BETWEEN => Ok(p!(Between)),
788-
Token::Word(w) if w.keyword == Keyword::LIKE => Ok(p!(Like)),
789-
Token::Word(w) if w.keyword == Keyword::ILIKE => Ok(p!(Like)),
790-
Token::Word(w) if w.keyword == Keyword::RLIKE => Ok(p!(Like)),
791-
Token::Word(w) if w.keyword == Keyword::REGEXP => Ok(p!(Like)),
792-
Token::Word(w) if w.keyword == Keyword::MATCH => Ok(p!(Like)),
793-
Token::Word(w) if w.keyword == Keyword::SIMILAR => Ok(p!(Like)),
794-
Token::Word(w) if w.keyword == Keyword::MEMBER => Ok(p!(Like)),
795-
Token::Word(w)
796-
if w.keyword == Keyword::NULL && !parser.in_column_definition_state() =>
797-
{
798-
Ok(p!(Is))
780+
Token::Word(w) if w.keyword == Keyword::NOT => {
781+
match &parser.peek_nth_token_ref(1).token {
782+
// The precedence of NOT varies depending on keyword that
783+
// follows it. If it is followed by IN, BETWEEN, or LIKE,
784+
// it takes on the precedence of those tokens. Otherwise, it
785+
// is not an infix operator, and therefore has zero
786+
// precedence.
787+
Token::Word(w) if w.keyword == Keyword::IN => Ok(p!(Between)),
788+
Token::Word(w) if w.keyword == Keyword::BETWEEN => Ok(p!(Between)),
789+
Token::Word(w) if w.keyword == Keyword::LIKE => Ok(p!(Like)),
790+
Token::Word(w) if w.keyword == Keyword::ILIKE => Ok(p!(Like)),
791+
Token::Word(w) if w.keyword == Keyword::RLIKE => Ok(p!(Like)),
792+
Token::Word(w) if w.keyword == Keyword::REGEXP => Ok(p!(Like)),
793+
Token::Word(w) if w.keyword == Keyword::MATCH => Ok(p!(Like)),
794+
Token::Word(w) if w.keyword == Keyword::SIMILAR => Ok(p!(Like)),
795+
Token::Word(w) if w.keyword == Keyword::MEMBER => Ok(p!(Like)),
796+
Token::Word(w)
797+
if w.keyword == Keyword::NULL && !parser.in_column_definition_state() =>
798+
{
799+
Ok(p!(Is))
800+
}
801+
_ => Ok(self.prec_unknown()),
799802
}
800-
_ => Ok(self.prec_unknown()),
801-
},
803+
}
802804
Token::Word(w) if w.keyword == Keyword::NOTNULL && self.supports_notnull_operator() => {
803805
Ok(p!(Is))
804806
}
@@ -861,7 +863,7 @@ pub trait Dialect: Debug + Any {
861863
Token::DoubleColon | Token::ExclamationMark | Token::LBracket | Token::CaretAt => {
862864
Ok(p!(DoubleColon))
863865
}
864-
Token::Colon => match parser.peek_nth_token(1).token {
866+
Token::Colon => match &parser.peek_nth_token_ref(1).token {
865867
// When colon is followed by a string or a number, it's usually in MAP syntax.
866868
Token::SingleQuotedString(_) | Token::Number(_, _) => Ok(self.prec_unknown()),
867869
// In other cases, it's used in semi-structured data traversal like in variant or JSON

src/dialect/mssql.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,7 @@ impl Dialect for MsSqlDialect {
159159
.is_some()
160160
|| matches!(p.peek_token_ref().token, Token::SemiColon | Token::EOF)
161161
{
162-
p.expected("statement", p.peek_token())
162+
p.expected_ref("statement", p.peek_token_ref())
163163
} else {
164164
Ok(())
165165
}
@@ -189,8 +189,8 @@ impl Dialect for MsSqlDialect {
189189
}
190190

191191
fn get_next_precedence(&self, parser: &Parser) -> Option<Result<u8, ParserError>> {
192-
let token = parser.peek_token();
193-
match token.token {
192+
let token = parser.peek_token_ref();
193+
match &token.token {
194194
// lowest prec to prevent it from turning into a binary op
195195
Token::Colon => Some(Ok(self.prec_unknown())),
196196
_ => None,

src/dialect/mysql.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -244,7 +244,7 @@ fn parse_lock_tables_type(parser: &mut Parser) -> Result<LockTableType, ParserEr
244244
} else if parser.parse_keywords(&[Keyword::LOW_PRIORITY, Keyword::WRITE]) {
245245
Ok(LockTableType::Write { low_priority: true })
246246
} else {
247-
parser.expected("an lock type in LOCK TABLES", parser.peek_token())
247+
parser.expected_ref("an lock type in LOCK TABLES", parser.peek_token_ref())
248248
}
249249
}
250250

src/dialect/oracle.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -86,10 +86,10 @@ impl Dialect for OracleDialect {
8686
}
8787

8888
fn get_next_precedence(&self, parser: &Parser) -> Option<Result<u8, ParserError>> {
89-
let t = parser.peek_token();
89+
let t = parser.peek_token_ref();
9090
debug!("get_next_precedence() {t:?}");
9191

92-
match t.token {
92+
match &t.token {
9393
Token::StringConcat => Some(Ok(self.prec_value(Precedence::PlusMinus))),
9494
_ => None,
9595
}

src/dialect/postgresql.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -105,12 +105,12 @@ impl Dialect for PostgreSqlDialect {
105105
}
106106

107107
fn get_next_precedence(&self, parser: &Parser) -> Option<Result<u8, ParserError>> {
108-
let token = parser.peek_token();
108+
let token = parser.peek_token_ref();
109109
debug!("get_next_precedence() {token:?}");
110110

111111
// we only return some custom value here when the behaviour (not merely the numeric value) differs
112112
// from the default implementation
113-
match token.token {
113+
match &token.token {
114114
Token::Word(w)
115115
if w.keyword == Keyword::COLLATE && !parser.in_column_definition_state() =>
116116
{

src/dialect/snowflake.rs

Lines changed: 23 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -265,7 +265,7 @@ impl Dialect for SnowflakeDialect {
265265
let set = match parser.parse_one_of_keywords(&[Keyword::SET, Keyword::UNSET]) {
266266
Some(Keyword::SET) => true,
267267
Some(Keyword::UNSET) => false,
268-
_ => return Some(parser.expected("SET or UNSET", parser.peek_token())),
268+
_ => return Some(parser.expected_ref("SET or UNSET", parser.peek_token_ref())),
269269
};
270270
return Some(parse_alter_session(parser, set));
271271
}
@@ -417,9 +417,9 @@ impl Dialect for SnowflakeDialect {
417417
}
418418

419419
fn get_next_precedence(&self, parser: &Parser) -> Option<Result<u8, ParserError>> {
420-
let token = parser.peek_token();
420+
let token = parser.peek_token_ref();
421421
// Snowflake supports the `:` cast operator unlike other dialects
422-
match token.token {
422+
match &token.token {
423423
Token::Colon => Some(Ok(self.prec_value(Precedence::DoubleColon))),
424424
_ => None,
425425
}
@@ -715,9 +715,9 @@ fn parse_alter_dynamic_table(parser: &mut Parser) -> Result<Statement, ParserErr
715715
} else if parser.parse_keyword(Keyword::RESUME) {
716716
AlterTableOperation::Resume
717717
} else {
718-
return parser.expected(
718+
return parser.expected_ref(
719719
"REFRESH, SUSPEND, or RESUME after ALTER DYNAMIC TABLE",
720-
parser.peek_token(),
720+
parser.peek_token_ref(),
721721
);
722722
};
723723

@@ -757,7 +757,10 @@ fn parse_alter_external_table(parser: &mut Parser) -> Result<Statement, ParserEr
757757
};
758758
AlterTableOperation::Refresh { subpath }
759759
} else {
760-
return parser.expected("REFRESH after ALTER EXTERNAL TABLE", parser.peek_token());
760+
return parser.expected_ref(
761+
"REFRESH after ALTER EXTERNAL TABLE",
762+
parser.peek_token_ref(),
763+
);
761764
};
762765

763766
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
12421245
Token::Minus => ident.push('-'),
12431246
Token::Number(n, _) => ident.push_str(n),
12441247
Token::Word(w) => ident.push_str(&w.to_string()),
1245-
_ => return parser.expected("stage name identifier", parser.peek_token()),
1248+
_ => return parser.expected_ref("stage name identifier", parser.peek_token_ref()),
12461249
}
12471250
}
12481251
Ok(Ident::new(ident))
@@ -1273,7 +1276,7 @@ pub fn parse_snowflake_stage_name(parser: &mut Parser) -> Result<ObjectName, Par
12731276
/// Parses a `COPY INTO` statement. Snowflake has two variants, `COPY INTO <table>`
12741277
/// and `COPY INTO <location>` which have different syntax.
12751278
pub fn parse_copy_into(parser: &mut Parser) -> Result<Statement, ParserError> {
1276-
let kind = match parser.peek_token().token {
1279+
let kind = match &parser.peek_token_ref().token {
12771280
// Indicates an internal stage
12781281
Token::AtSign => CopyIntoSnowflakeKind::Location,
12791282
// 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> {
13461349
from_stage_alias = if parser.parse_keyword(Keyword::AS) {
13471350
Some(match parser.next_token().token {
13481351
Token::Word(w) => Ok(Ident::new(w.value)),
1349-
_ => parser.expected("stage alias", parser.peek_token()),
1352+
_ => parser.expected_ref("stage alias", parser.peek_token_ref()),
13501353
}?)
13511354
} else {
13521355
None
@@ -1404,7 +1407,10 @@ pub fn parse_copy_into(parser: &mut Parser) -> Result<Statement, ParserError> {
14041407
// In `COPY INTO <location>` the copy options do not have a shared key
14051408
// like in `COPY INTO <table>`
14061409
Token::Word(key) => copy_options.push(parser.parse_key_value_option(&key)?),
1407-
_ => return parser.expected("another copy option, ; or EOF'", parser.peek_token()),
1410+
_ => {
1411+
return parser
1412+
.expected_ref("another copy option, ; or EOF'", parser.peek_token_ref())
1413+
}
14081414
}
14091415
}
14101416
}
@@ -1499,7 +1505,7 @@ fn parse_select_item_for_data_load(
14991505
// parse element
15001506
element = Some(Ident::new(match parser.next_token().token {
15011507
Token::Word(w) => Ok(w.value),
1502-
_ => parser.expected("file_col_num", parser.peek_token()),
1508+
_ => parser.expected_ref("file_col_num", parser.peek_token_ref()),
15031509
}?));
15041510
}
15051511
_ => {
@@ -1512,7 +1518,7 @@ fn parse_select_item_for_data_load(
15121518
if parser.parse_keyword(Keyword::AS) {
15131519
item_as = Some(match parser.next_token().token {
15141520
Token::Word(w) => Ok(Ident::new(w.value)),
1515-
_ => parser.expected("column item alias", parser.peek_token()),
1521+
_ => parser.expected_ref("column item alias", parser.peek_token_ref()),
15161522
}?);
15171523
}
15181524

@@ -1540,7 +1546,7 @@ fn parse_stage_params(parser: &mut Parser) -> Result<StageParamsObject, ParserEr
15401546
parser.expect_token(&Token::Eq)?;
15411547
url = Some(match parser.next_token().token {
15421548
Token::SingleQuotedString(word) => Ok(word),
1543-
_ => parser.expected("a URL statement", parser.peek_token()),
1549+
_ => parser.expected_ref("a URL statement", parser.peek_token_ref()),
15441550
}?)
15451551
}
15461552

@@ -1555,7 +1561,7 @@ fn parse_stage_params(parser: &mut Parser) -> Result<StageParamsObject, ParserEr
15551561
parser.expect_token(&Token::Eq)?;
15561562
endpoint = Some(match parser.next_token().token {
15571563
Token::SingleQuotedString(word) => Ok(word),
1558-
_ => parser.expected("an endpoint statement", parser.peek_token()),
1564+
_ => parser.expected_ref("an endpoint statement", parser.peek_token_ref()),
15591565
}?)
15601566
}
15611567

@@ -1795,7 +1801,7 @@ fn parse_multi_table_insert_into_clauses(
17951801
into_clauses.push(parse_multi_table_insert_into_clause(parser)?);
17961802
}
17971803
if into_clauses.is_empty() {
1798-
return parser.expected("INTO clause in multi-table INSERT", parser.peek_token());
1804+
return parser.expected_ref("INTO clause in multi-table INSERT", parser.peek_token_ref());
17991805
}
18001806
Ok(into_clauses)
18011807
}
@@ -1874,9 +1880,9 @@ fn parse_multi_table_insert_when_clauses(
18741880
}
18751881

18761882
if when_clauses.is_empty() {
1877-
return parser.expected(
1883+
return parser.expected_ref(
18781884
"at least one WHEN clause in conditional multi-table INSERT",
1879-
parser.peek_token(),
1885+
parser.peek_token_ref(),
18801886
);
18811887
}
18821888

src/parser/alter.rs

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -182,9 +182,9 @@ impl Parser<'_> {
182182
} else if self.parse_keyword(Keyword::AUTHORIZATIONS) {
183183
None
184184
} else {
185-
return self.expected(
185+
return self.expected_ref(
186186
"REMOVE DELEGATED AUTHORIZATION OF ROLE | REMOVE DELEGATED AUTHORIZATIONS",
187-
self.peek_token(),
187+
self.peek_token_ref(),
188188
);
189189
};
190190
self.expect_keywords(&[Keyword::FROM, Keyword::SECURITY, Keyword::INTEGRATION])?;
@@ -340,7 +340,7 @@ impl Parser<'_> {
340340
} else if self.parse_keyword(Keyword::DUO) {
341341
Ok(MfaMethodKind::Duo)
342342
} else {
343-
self.expected("PASSKEY, TOTP or DUO", self.peek_token())
343+
self.expected_ref("PASSKEY, TOTP or DUO", self.peek_token_ref())
344344
}
345345
}
346346

@@ -358,10 +358,10 @@ impl Parser<'_> {
358358
let role_name = self.parse_identifier()?;
359359
AlterRoleOperation::RenameRole { role_name }
360360
} else {
361-
return self.expected("= after WITH NAME ", self.peek_token());
361+
return self.expected_ref("= after WITH NAME ", self.peek_token_ref());
362362
}
363363
} else {
364-
return self.expected("'ADD' or 'DROP' or 'WITH NAME'", self.peek_token());
364+
return self.expected_ref("'ADD' or 'DROP' or 'WITH NAME'", self.peek_token_ref());
365365
};
366366

367367
Ok(Statement::AlterRole {
@@ -385,7 +385,7 @@ impl Parser<'_> {
385385
let role_name = self.parse_identifier()?;
386386
AlterRoleOperation::RenameRole { role_name }
387387
} else {
388-
return self.expected("TO after RENAME", self.peek_token());
388+
return self.expected_ref("TO after RENAME", self.peek_token_ref());
389389
}
390390
// SET
391391
} else if self.parse_keyword(Keyword::SET) {
@@ -412,10 +412,10 @@ impl Parser<'_> {
412412
in_database,
413413
}
414414
} else {
415-
self.expected("config value", self.peek_token())?
415+
self.expected_ref("config value", self.peek_token_ref())?
416416
}
417417
} else {
418-
self.expected("'TO' or '=' or 'FROM CURRENT'", self.peek_token())?
418+
self.expected_ref("'TO' or '=' or 'FROM CURRENT'", self.peek_token_ref())?
419419
}
420420
// RESET
421421
} else if self.parse_keyword(Keyword::RESET) {
@@ -442,7 +442,7 @@ impl Parser<'_> {
442442
}
443443
// check option
444444
if options.is_empty() {
445-
return self.expected("option", self.peek_token())?;
445+
return self.expected_ref("option", self.peek_token_ref())?;
446446
}
447447

448448
AlterRoleOperation::WithOptions { options }
@@ -504,7 +504,7 @@ impl Parser<'_> {
504504
self.expect_keyword_is(Keyword::UNTIL)?;
505505
RoleOption::ValidUntil(Expr::Value(self.parse_value()?))
506506
}
507-
_ => self.expected("option", self.peek_token())?,
507+
_ => self.expected_ref("option", self.peek_token_ref())?,
508508
};
509509

510510
Ok(option)

0 commit comments

Comments
 (0)