mirror of
https://github.com/apache/datafusion-sqlparser-rs.git
synced 2025-08-22 15:04:04 +00:00
Take slice as input for parse_keywords (#199)
This commit is contained in:
parent
6cdd4a146d
commit
f4fbd9b6b3
1 changed files with 31 additions and 31 deletions
|
@ -312,13 +312,13 @@ impl Parser {
|
|||
let over = if self.parse_keyword(Keyword::OVER) {
|
||||
// TBD: support window names (`OVER mywin`) in place of inline specification
|
||||
self.expect_token(&Token::LParen)?;
|
||||
let partition_by = if self.parse_keywords(vec![Keyword::PARTITION, Keyword::BY]) {
|
||||
let partition_by = if self.parse_keywords(&[Keyword::PARTITION, Keyword::BY]) {
|
||||
// a list of possibly-qualified column names
|
||||
self.parse_comma_separated(Parser::parse_expr)?
|
||||
} else {
|
||||
vec![]
|
||||
};
|
||||
let order_by = if self.parse_keywords(vec![Keyword::ORDER, Keyword::BY]) {
|
||||
let order_by = if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
|
||||
self.parse_comma_separated(Parser::parse_order_by_expr)?
|
||||
} else {
|
||||
vec![]
|
||||
|
@ -379,7 +379,7 @@ impl Parser {
|
|||
|
||||
/// Parse `CURRENT ROW` or `{ <positive number> | UNBOUNDED } { PRECEDING | FOLLOWING }`
|
||||
pub fn parse_window_frame_bound(&mut self) -> Result<WindowFrameBound, ParserError> {
|
||||
if self.parse_keywords(vec![Keyword::CURRENT, Keyword::ROW]) {
|
||||
if self.parse_keywords(&[Keyword::CURRENT, Keyword::ROW]) {
|
||||
Ok(WindowFrameBound::CurrentRow)
|
||||
} else {
|
||||
let rows = if self.parse_keyword(Keyword::UNBOUNDED) {
|
||||
|
@ -472,7 +472,7 @@ impl Parser {
|
|||
} else {
|
||||
None
|
||||
};
|
||||
let on_overflow = if self.parse_keywords(vec![Keyword::ON, Keyword::OVERFLOW]) {
|
||||
let on_overflow = if self.parse_keywords(&[Keyword::ON, Keyword::OVERFLOW]) {
|
||||
if self.parse_keyword(Keyword::ERROR) {
|
||||
Some(ListAggOnOverflow::Error)
|
||||
} else {
|
||||
|
@ -503,7 +503,7 @@ impl Parser {
|
|||
self.expect_token(&Token::RParen)?;
|
||||
// Once again ANSI SQL requires WITHIN GROUP, but Redshift does not. Again we choose the
|
||||
// more general implementation.
|
||||
let within_group = if self.parse_keywords(vec![Keyword::WITHIN, Keyword::GROUP]) {
|
||||
let within_group = if self.parse_keywords(&[Keyword::WITHIN, Keyword::GROUP]) {
|
||||
self.expect_token(&Token::LParen)?;
|
||||
self.expect_keywords(&[Keyword::ORDER, Keyword::BY])?;
|
||||
let order_by_expr = self.parse_comma_separated(Parser::parse_order_by_expr)?;
|
||||
|
@ -665,7 +665,7 @@ impl Parser {
|
|||
Keyword::IS => {
|
||||
if self.parse_keyword(Keyword::NULL) {
|
||||
Ok(Expr::IsNull(Box::new(expr)))
|
||||
} else if self.parse_keywords(vec![Keyword::NOT, Keyword::NULL]) {
|
||||
} else if self.parse_keywords(&[Keyword::NOT, Keyword::NULL]) {
|
||||
Ok(Expr::IsNotNull(Box::new(expr)))
|
||||
} else {
|
||||
self.expected("NULL or NOT NULL after IS", self.peek_token())
|
||||
|
@ -849,9 +849,9 @@ impl Parser {
|
|||
|
||||
/// Look for an expected sequence of keywords and consume them if they exist
|
||||
#[must_use]
|
||||
pub fn parse_keywords(&mut self, keywords: Vec<Keyword>) -> bool {
|
||||
pub fn parse_keywords(&mut self, keywords: &[Keyword]) -> bool {
|
||||
let index = self.index;
|
||||
for keyword in keywords {
|
||||
for &keyword in keywords {
|
||||
if !self.parse_keyword(keyword) {
|
||||
//println!("parse_keywords aborting .. did not find {}", keyword);
|
||||
// reset index and return immediately
|
||||
|
@ -979,7 +979,7 @@ impl Parser {
|
|||
self.parse_create_table()
|
||||
} else if self.parse_keyword(Keyword::INDEX) {
|
||||
self.parse_create_index(false)
|
||||
} else if self.parse_keywords(vec![Keyword::UNIQUE, Keyword::INDEX]) {
|
||||
} else if self.parse_keywords(&[Keyword::UNIQUE, Keyword::INDEX]) {
|
||||
self.parse_create_index(true)
|
||||
} else if self.parse_keyword(Keyword::MATERIALIZED) || self.parse_keyword(Keyword::VIEW) {
|
||||
self.prev_token();
|
||||
|
@ -1057,7 +1057,7 @@ impl Parser {
|
|||
};
|
||||
// Many dialects support the non standard `IF EXISTS` clause and allow
|
||||
// specifying multiple objects to delete in a single statement
|
||||
let if_exists = self.parse_keywords(vec![Keyword::IF, Keyword::EXISTS]);
|
||||
let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]);
|
||||
let names = self.parse_comma_separated(Parser::parse_object_name)?;
|
||||
let cascade = self.parse_keyword(Keyword::CASCADE);
|
||||
let restrict = self.parse_keyword(Keyword::RESTRICT);
|
||||
|
@ -1073,7 +1073,7 @@ impl Parser {
|
|||
}
|
||||
|
||||
pub fn parse_create_index(&mut self, unique: bool) -> Result<Statement, ParserError> {
|
||||
let if_not_exists = self.parse_keywords(vec![Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
|
||||
let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
|
||||
let index_name = self.parse_object_name()?;
|
||||
self.expect_keyword(Keyword::ON)?;
|
||||
let table_name = self.parse_object_name()?;
|
||||
|
@ -1088,7 +1088,7 @@ impl Parser {
|
|||
}
|
||||
|
||||
pub fn parse_create_table(&mut self) -> Result<Statement, ParserError> {
|
||||
let if_not_exists = self.parse_keywords(vec![Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
|
||||
let if_not_exists = self.parse_keywords(&[Keyword::IF, Keyword::NOT, Keyword::EXISTS]);
|
||||
let table_name = self.parse_object_name()?;
|
||||
// parse optional column list (schema)
|
||||
let (columns, constraints) = self.parse_columns()?;
|
||||
|
@ -1160,13 +1160,13 @@ impl Parser {
|
|||
None
|
||||
};
|
||||
|
||||
let option = if self.parse_keywords(vec![Keyword::NOT, Keyword::NULL]) {
|
||||
let option = if self.parse_keywords(&[Keyword::NOT, Keyword::NULL]) {
|
||||
ColumnOption::NotNull
|
||||
} else if self.parse_keyword(Keyword::NULL) {
|
||||
ColumnOption::Null
|
||||
} else if self.parse_keyword(Keyword::DEFAULT) {
|
||||
ColumnOption::Default(self.parse_expr()?)
|
||||
} else if self.parse_keywords(vec![Keyword::PRIMARY, Keyword::KEY]) {
|
||||
} else if self.parse_keywords(&[Keyword::PRIMARY, Keyword::KEY]) {
|
||||
ColumnOption::Unique { is_primary: true }
|
||||
} else if self.parse_keyword(Keyword::UNIQUE) {
|
||||
ColumnOption::Unique { is_primary: false }
|
||||
|
@ -1178,10 +1178,10 @@ impl Parser {
|
|||
let mut on_delete = None;
|
||||
let mut on_update = None;
|
||||
loop {
|
||||
if on_delete.is_none() && self.parse_keywords(vec![Keyword::ON, Keyword::DELETE]) {
|
||||
if on_delete.is_none() && self.parse_keywords(&[Keyword::ON, Keyword::DELETE]) {
|
||||
on_delete = Some(self.parse_referential_action()?);
|
||||
} else if on_update.is_none()
|
||||
&& self.parse_keywords(vec![Keyword::ON, Keyword::UPDATE])
|
||||
&& self.parse_keywords(&[Keyword::ON, Keyword::UPDATE])
|
||||
{
|
||||
on_update = Some(self.parse_referential_action()?);
|
||||
} else {
|
||||
|
@ -1211,11 +1211,11 @@ impl Parser {
|
|||
Ok(ReferentialAction::Restrict)
|
||||
} else if self.parse_keyword(Keyword::CASCADE) {
|
||||
Ok(ReferentialAction::Cascade)
|
||||
} else if self.parse_keywords(vec![Keyword::SET, Keyword::NULL]) {
|
||||
} else if self.parse_keywords(&[Keyword::SET, Keyword::NULL]) {
|
||||
Ok(ReferentialAction::SetNull)
|
||||
} else if self.parse_keywords(vec![Keyword::NO, Keyword::ACTION]) {
|
||||
} else if self.parse_keywords(&[Keyword::NO, Keyword::ACTION]) {
|
||||
Ok(ReferentialAction::NoAction)
|
||||
} else if self.parse_keywords(vec![Keyword::SET, Keyword::DEFAULT]) {
|
||||
} else if self.parse_keywords(&[Keyword::SET, Keyword::DEFAULT]) {
|
||||
Ok(ReferentialAction::SetDefault)
|
||||
} else {
|
||||
self.expected(
|
||||
|
@ -1633,7 +1633,7 @@ impl Parser {
|
|||
|
||||
let body = self.parse_query_body(0)?;
|
||||
|
||||
let order_by = if self.parse_keywords(vec![Keyword::ORDER, Keyword::BY]) {
|
||||
let order_by = if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
|
||||
self.parse_comma_separated(Parser::parse_order_by_expr)?
|
||||
} else {
|
||||
vec![]
|
||||
|
@ -1772,7 +1772,7 @@ impl Parser {
|
|||
None
|
||||
};
|
||||
|
||||
let group_by = if self.parse_keywords(vec![Keyword::GROUP, Keyword::BY]) {
|
||||
let group_by = if self.parse_keywords(&[Keyword::GROUP, Keyword::BY]) {
|
||||
self.parse_comma_separated(Parser::parse_expr)?
|
||||
} else {
|
||||
vec![]
|
||||
|
@ -2124,9 +2124,9 @@ impl Parser {
|
|||
None
|
||||
};
|
||||
|
||||
let nulls_first = if self.parse_keywords(vec![Keyword::NULLS, Keyword::FIRST]) {
|
||||
let nulls_first = if self.parse_keywords(&[Keyword::NULLS, Keyword::FIRST]) {
|
||||
Some(true)
|
||||
} else if self.parse_keywords(vec![Keyword::NULLS, Keyword::LAST]) {
|
||||
} else if self.parse_keywords(&[Keyword::NULLS, Keyword::LAST]) {
|
||||
Some(false)
|
||||
} else {
|
||||
None
|
||||
|
@ -2152,7 +2152,7 @@ impl Parser {
|
|||
|
||||
let percent = self.parse_keyword(Keyword::PERCENT);
|
||||
|
||||
let with_ties = self.parse_keywords(vec![Keyword::WITH, Keyword::TIES]);
|
||||
let with_ties = self.parse_keywords(&[Keyword::WITH, Keyword::TIES]);
|
||||
|
||||
Ok(Top {
|
||||
with_ties,
|
||||
|
@ -2199,7 +2199,7 @@ impl Parser {
|
|||
};
|
||||
let with_ties = if self.parse_keyword(Keyword::ONLY) {
|
||||
false
|
||||
} else if self.parse_keywords(vec![Keyword::WITH, Keyword::TIES]) {
|
||||
} else if self.parse_keywords(&[Keyword::WITH, Keyword::TIES]) {
|
||||
true
|
||||
} else {
|
||||
return self.expected("one of ONLY or WITH TIES", self.peek_token());
|
||||
|
@ -2239,12 +2239,12 @@ impl Parser {
|
|||
let mut modes = vec![];
|
||||
let mut required = false;
|
||||
loop {
|
||||
let mode = if self.parse_keywords(vec![Keyword::ISOLATION, Keyword::LEVEL]) {
|
||||
let iso_level = if self.parse_keywords(vec![Keyword::READ, Keyword::UNCOMMITTED]) {
|
||||
let mode = if self.parse_keywords(&[Keyword::ISOLATION, Keyword::LEVEL]) {
|
||||
let iso_level = if self.parse_keywords(&[Keyword::READ, Keyword::UNCOMMITTED]) {
|
||||
TransactionIsolationLevel::ReadUncommitted
|
||||
} else if self.parse_keywords(vec![Keyword::READ, Keyword::COMMITTED]) {
|
||||
} else if self.parse_keywords(&[Keyword::READ, Keyword::COMMITTED]) {
|
||||
TransactionIsolationLevel::ReadCommitted
|
||||
} else if self.parse_keywords(vec![Keyword::REPEATABLE, Keyword::READ]) {
|
||||
} else if self.parse_keywords(&[Keyword::REPEATABLE, Keyword::READ]) {
|
||||
TransactionIsolationLevel::RepeatableRead
|
||||
} else if self.parse_keyword(Keyword::SERIALIZABLE) {
|
||||
TransactionIsolationLevel::Serializable
|
||||
|
@ -2252,9 +2252,9 @@ impl Parser {
|
|||
self.expected("isolation level", self.peek_token())?
|
||||
};
|
||||
TransactionMode::IsolationLevel(iso_level)
|
||||
} else if self.parse_keywords(vec![Keyword::READ, Keyword::ONLY]) {
|
||||
} else if self.parse_keywords(&[Keyword::READ, Keyword::ONLY]) {
|
||||
TransactionMode::AccessMode(TransactionAccessMode::ReadOnly)
|
||||
} else if self.parse_keywords(vec![Keyword::READ, Keyword::WRITE]) {
|
||||
} else if self.parse_keywords(&[Keyword::READ, Keyword::WRITE]) {
|
||||
TransactionMode::AccessMode(TransactionAccessMode::ReadWrite)
|
||||
} else if required {
|
||||
self.expected("transaction mode", self.peek_token())?
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue