Skip to content

Commit 5176273

Browse files
committed
fix: modify replace option ast
1 parent 526938f commit 5176273

File tree

3 files changed

+43
-35
lines changed

3 files changed

+43
-35
lines changed

src/ast/query.rs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -397,7 +397,7 @@ pub struct WildcardAdditionalOptions {
397397
/// `[RENAME ...]`.
398398
pub opt_rename: Option<RenameSelectItem>,
399399
/// `[REPLACE]`
400-
pub opt_replace:Option<ReplaceSelectItem>
400+
pub opt_replace: Option<ReplaceSelectItem>,
401401
}
402402

403403
impl fmt::Display for WildcardAdditionalOptions {
@@ -411,6 +411,9 @@ impl fmt::Display for WildcardAdditionalOptions {
411411
if let Some(rename) = &self.opt_rename {
412412
write!(f, " {rename}")?;
413413
}
414+
if let Some(replace) = &self.opt_replace {
415+
write!(f, " {replace}")?;
416+
}
414417
Ok(())
415418
}
416419
}
@@ -546,13 +549,13 @@ pub enum ReplaceSelectItem {
546549
/// ```plaintext
547550
/// <col_name> AS <col_alias>
548551
/// ```
549-
Single(IdentWithAlias),
552+
Single(Box<SelectItem>),
550553
/// Multiple column names with aliases inside parenthesis.
551554
/// # Syntax
552555
/// ```plaintext
553556
/// (<col_name> AS <col_alias>, <col_name> AS <col_alias>, ...)
554557
/// ```
555-
Multiple(Vec<IdentWithAlias>),
558+
Multiple(Vec<Box<SelectItem>>),
556559
}
557560

558561
impl fmt::Display for ReplaceSelectItem {

src/parser.rs

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -6077,17 +6077,17 @@ impl<'a> Parser<'a> {
60776077
None
60786078
};
60796079

6080-
let opt_replace = if dialect_of!(self is GenericDialect | BigQueryDialect){
6081-
self.parse_optional_select_item_replace()?
6082-
}else {
6080+
let opt_replace = if dialect_of!(self is GenericDialect | BigQueryDialect) {
6081+
self.parse_optional_select_item_replace()?
6082+
} else {
60836083
None
60846084
};
60856085

60866086
Ok(WildcardAdditionalOptions {
60876087
opt_exclude,
60886088
opt_except,
60896089
opt_rename,
6090-
opt_replace
6090+
opt_replace,
60916091
})
60926092
}
60936093

@@ -6161,26 +6161,26 @@ impl<'a> Parser<'a> {
61616161
Ok(opt_rename)
61626162
}
61636163

6164-
/// Parse a [`Replace](RepalceSelectItem) information for wildcard select items.
6165-
pub fn parse_optional_select_item_replace(
6166-
&mut self,
6167-
) -> Result<Option<ReplaceSelectItem>, ParserError> {
6168-
let opt_replace = if self.parse_keyword(Keyword::REPLACE) {
6169-
if self.consume_token(&Token::LParen) {
6170-
let idents =
6171-
self.parse_comma_separated(|parser| parser.parse_identifier_with_alias())?;
6172-
self.expect_token(&Token::RParen)?;
6173-
Some(ReplaceSelectItem::Multiple(idents))
6174-
} else {
6175-
let ident = self.parse_identifier_with_alias()?;
6176-
Some(ReplaceSelectItem::Single(ident))
6177-
}
6164+
/// Parse a [`Replace](RepalceSelectItem) information for wildcard select items.
6165+
pub fn parse_optional_select_item_replace(
6166+
&mut self,
6167+
) -> Result<Option<ReplaceSelectItem>, ParserError> {
6168+
let opt_replace = if self.parse_keyword(Keyword::REPLACE) {
6169+
if self.consume_token(&Token::LParen) {
6170+
let idents =
6171+
self.parse_comma_separated(|parser| Ok(Box::new(parser.parse_select_item()?)))?;
6172+
self.expect_token(&Token::RParen)?;
6173+
Some(ReplaceSelectItem::Multiple(idents))
61786174
} else {
6179-
None
6180-
};
6175+
let ident = self.parse_select_item()?;
6176+
Some(ReplaceSelectItem::Single(Box::new(ident)))
6177+
}
6178+
} else {
6179+
None
6180+
};
61816181

6182-
Ok(opt_replace)
6183-
}
6182+
Ok(opt_replace)
6183+
}
61846184

61856185
/// Parse an expression, optionally followed by ASC or DESC (used in ORDER BY)
61866186
pub fn parse_order_by_expr(&mut self) -> Result<OrderByExpr, ParserError> {

tests/sqlparser_bigquery.rs

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -297,17 +297,22 @@ fn test_select_wildcard_with_except() {
297297

298298
#[test]
299299
fn test_select_wildcard_with_replace() {
300-
let select = bigquery_and_generic().verified_only_select(r#"WITH orders AS
301-
(SELECT 5 as order_id,
302-
"sprocket" as item_name,
303-
200 as quantity)
304-
SELECT * REPLACE ("widget" AS item_name)
305-
FROM orders;"#);
300+
let select = bigquery_and_generic()
301+
.verified_only_select(r#"SELECT * REPLACE (quantity / 2 AS quantity) FROM orders"#);
306302
let expected = SelectItem::Wildcard(WildcardAdditionalOptions {
307-
opt_except: Some(ExceptSelectItem {
308-
first_element: Ident::new("col_a"),
309-
additional_elements: vec![],
310-
}),
303+
opt_replace: Some(ReplaceSelectItem::Multiple(vec![Box::new(
304+
SelectItem::ExprWithAlias {
305+
expr: Expr::BinaryOp {
306+
left: Box::new(sqlparser::ast::Expr::Identifier(Ident::new("quantity"))),
307+
op: BinaryOperator::Divide,
308+
right: Box::new(sqlparser::ast::Expr::Value(Value::Number(
309+
"2".to_string(),
310+
false,
311+
))),
312+
},
313+
alias: Ident::new("quantity"),
314+
},
315+
)])),
311316
..Default::default()
312317
});
313318
assert_eq!(expected, select.projection[0]);

0 commit comments

Comments
 (0)