Skip to content

Commit 27cd789

Browse files
fix: have wildcard replace work in duckdb and snowflake syntax
1 parent b22099b commit 27cd789

File tree

3 files changed

+52
-1
lines changed

3 files changed

+52
-1
lines changed

src/parser/mod.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -8793,7 +8793,7 @@ impl<'a> Parser<'a> {
87938793
None
87948794
};
87958795

8796-
let opt_replace = if dialect_of!(self is GenericDialect | BigQueryDialect | ClickHouseDialect)
8796+
let opt_replace = if dialect_of!(self is GenericDialect | BigQueryDialect | ClickHouseDialect | SnowflakeDialect | DuckDbDialect)
87978797
{
87988798
self.parse_optional_select_item_replace()?
87998799
} else {

tests/sqlparser_duckdb.rs

+29
Original file line numberDiff line numberDiff line change
@@ -246,3 +246,32 @@ fn test_duckdb_load_extension() {
246246
stmt
247247
);
248248
}
249+
250+
#[test]
251+
fn test_select_wildcard_with_replace() {
252+
let select = duckdb_and_generic()
253+
.verified_only_select(r#"SELECT * REPLACE (lower(city) AS city) FROM addresses"#);
254+
let expected = SelectItem::Wildcard(WildcardAdditionalOptions {
255+
opt_replace: Some(ReplaceSelectItem {
256+
items: vec![Box::new(ReplaceSelectElement {
257+
expr: Expr::Function(Function {
258+
name: ObjectName(vec![Ident::new("lower")]),
259+
args: vec![FunctionArg::Unnamed(FunctionArgExpr::Expr(
260+
Expr::Identifier(Ident::new("city")),
261+
))],
262+
filter: None,
263+
null_treatment: None,
264+
within_group: None,
265+
over: None,
266+
distinct: false,
267+
special: false,
268+
order_by: vec![],
269+
}),
270+
column_name: Ident::new("city"),
271+
as_keyword: true,
272+
})],
273+
}),
274+
..Default::default()
275+
});
276+
assert_eq!(expected, select.projection[0]);
277+
}

tests/sqlparser_snowflake.rs

+22
Original file line numberDiff line numberDiff line change
@@ -1593,3 +1593,25 @@ fn parse_connect_by() {
15931593
)))]
15941594
);
15951595
}
1596+
1597+
#[test]
1598+
fn test_select_wildcard_with_replace() {
1599+
let select = snowflake_and_generic().verified_only_select(
1600+
r#"SELECT * REPLACE ('DEPT-' || department_id AS department_id) FROM tbl"#,
1601+
);
1602+
let expected = SelectItem::Wildcard(WildcardAdditionalOptions {
1603+
opt_replace: Some(ReplaceSelectItem {
1604+
items: vec![Box::new(ReplaceSelectElement {
1605+
expr: Expr::BinaryOp {
1606+
left: Box::new(Expr::Value(Value::SingleQuotedString("DEPT-".to_owned()))),
1607+
op: BinaryOperator::StringConcat,
1608+
right: Box::new(Expr::Identifier(Ident::new("department_id"))),
1609+
},
1610+
column_name: Ident::new("department_id"),
1611+
as_keyword: true,
1612+
})],
1613+
}),
1614+
..Default::default()
1615+
});
1616+
assert_eq!(expected, select.projection[0]);
1617+
}

0 commit comments

Comments
 (0)