Skip to content

Commit 8d8e2fb

Browse files
committed
fix: modify replace option ast
1 parent 04cd108 commit 8d8e2fb

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
@@ -395,7 +395,7 @@ pub struct WildcardAdditionalOptions {
395395
/// `[RENAME ...]`.
396396
pub opt_rename: Option<RenameSelectItem>,
397397
/// `[REPLACE]`
398-
pub opt_replace:Option<ReplaceSelectItem>
398+
pub opt_replace: Option<ReplaceSelectItem>,
399399
}
400400

401401
impl fmt::Display for WildcardAdditionalOptions {
@@ -409,6 +409,9 @@ impl fmt::Display for WildcardAdditionalOptions {
409409
if let Some(rename) = &self.opt_rename {
410410
write!(f, " {rename}")?;
411411
}
412+
if let Some(replace) = &self.opt_replace {
413+
write!(f, " {replace}")?;
414+
}
412415
Ok(())
413416
}
414417
}
@@ -544,13 +547,13 @@ pub enum ReplaceSelectItem {
544547
/// ```plaintext
545548
/// <col_name> AS <col_alias>
546549
/// ```
547-
Single(IdentWithAlias),
550+
Single(Box<SelectItem>),
548551
/// Multiple column names with aliases inside parenthesis.
549552
/// # Syntax
550553
/// ```plaintext
551554
/// (<col_name> AS <col_alias>, <col_name> AS <col_alias>, ...)
552555
/// ```
553-
Multiple(Vec<IdentWithAlias>),
556+
Multiple(Vec<Box<SelectItem>>),
554557
}
555558

556559
impl fmt::Display for ReplaceSelectItem {

src/parser.rs

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -6164,17 +6164,17 @@ impl<'a> Parser<'a> {
61646164
None
61656165
};
61666166

6167-
let opt_replace = if dialect_of!(self is GenericDialect | BigQueryDialect){
6168-
self.parse_optional_select_item_replace()?
6169-
}else {
6167+
let opt_replace = if dialect_of!(self is GenericDialect | BigQueryDialect) {
6168+
self.parse_optional_select_item_replace()?
6169+
} else {
61706170
None
61716171
};
61726172

61736173
Ok(WildcardAdditionalOptions {
61746174
opt_exclude,
61756175
opt_except,
61766176
opt_rename,
6177-
opt_replace
6177+
opt_replace,
61786178
})
61796179
}
61806180

@@ -6248,26 +6248,26 @@ impl<'a> Parser<'a> {
62486248
Ok(opt_rename)
62496249
}
62506250

6251-
/// Parse a [`Replace](RepalceSelectItem) information for wildcard select items.
6252-
pub fn parse_optional_select_item_replace(
6253-
&mut self,
6254-
) -> Result<Option<ReplaceSelectItem>, ParserError> {
6255-
let opt_replace = if self.parse_keyword(Keyword::REPLACE) {
6256-
if self.consume_token(&Token::LParen) {
6257-
let idents =
6258-
self.parse_comma_separated(|parser| parser.parse_identifier_with_alias())?;
6259-
self.expect_token(&Token::RParen)?;
6260-
Some(ReplaceSelectItem::Multiple(idents))
6261-
} else {
6262-
let ident = self.parse_identifier_with_alias()?;
6263-
Some(ReplaceSelectItem::Single(ident))
6264-
}
6251+
/// Parse a [`Replace](RepalceSelectItem) information for wildcard select items.
6252+
pub fn parse_optional_select_item_replace(
6253+
&mut self,
6254+
) -> Result<Option<ReplaceSelectItem>, ParserError> {
6255+
let opt_replace = if self.parse_keyword(Keyword::REPLACE) {
6256+
if self.consume_token(&Token::LParen) {
6257+
let idents =
6258+
self.parse_comma_separated(|parser| Ok(Box::new(parser.parse_select_item()?)))?;
6259+
self.expect_token(&Token::RParen)?;
6260+
Some(ReplaceSelectItem::Multiple(idents))
62656261
} else {
6266-
None
6267-
};
6262+
let ident = self.parse_select_item()?;
6263+
Some(ReplaceSelectItem::Single(Box::new(ident)))
6264+
}
6265+
} else {
6266+
None
6267+
};
62686268

6269-
Ok(opt_replace)
6270-
}
6269+
Ok(opt_replace)
6270+
}
62716271

62726272
/// Parse an expression, optionally followed by ASC or DESC (used in ORDER BY)
62736273
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
@@ -315,17 +315,22 @@ fn test_select_wildcard_with_except() {
315315

316316
#[test]
317317
fn test_select_wildcard_with_replace() {
318-
let select = bigquery_and_generic().verified_only_select(r#"WITH orders AS
319-
(SELECT 5 as order_id,
320-
"sprocket" as item_name,
321-
200 as quantity)
322-
SELECT * REPLACE ("widget" AS item_name)
323-
FROM orders;"#);
318+
let select = bigquery_and_generic()
319+
.verified_only_select(r#"SELECT * REPLACE (quantity / 2 AS quantity) FROM orders"#);
324320
let expected = SelectItem::Wildcard(WildcardAdditionalOptions {
325-
opt_except: Some(ExceptSelectItem {
326-
first_element: Ident::new("col_a"),
327-
additional_elements: vec![],
328-
}),
321+
opt_replace: Some(ReplaceSelectItem::Multiple(vec![Box::new(
322+
SelectItem::ExprWithAlias {
323+
expr: Expr::BinaryOp {
324+
left: Box::new(sqlparser::ast::Expr::Identifier(Ident::new("quantity"))),
325+
op: BinaryOperator::Divide,
326+
right: Box::new(sqlparser::ast::Expr::Value(Value::Number(
327+
"2".to_string(),
328+
false,
329+
))),
330+
},
331+
alias: Ident::new("quantity"),
332+
},
333+
)])),
329334
..Default::default()
330335
});
331336
assert_eq!(expected, select.projection[0]);

0 commit comments

Comments
 (0)