Skip to content

Commit a339822

Browse files
DuckDB: Add support for multiple TRIM arguments (apache#1916)
Co-authored-by: Ifeanyi Ubah <[email protected]>
1 parent f32a41a commit a339822

File tree

3 files changed

+31
-2
lines changed

3 files changed

+31
-2
lines changed

src/parser/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2576,7 +2576,7 @@ impl<'a> Parser<'a> {
25762576
trim_characters: None,
25772577
})
25782578
} else if self.consume_token(&Token::Comma)
2579-
&& dialect_of!(self is SnowflakeDialect | BigQueryDialect | GenericDialect)
2579+
&& dialect_of!(self is DuckDbDialect | SnowflakeDialect | BigQueryDialect | GenericDialect)
25802580
{
25812581
let characters = self.parse_comma_separated(Parser::parse_expr)?;
25822582
self.expect_token(&Token::RParen)?;

tests/sqlparser_common.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7762,7 +7762,6 @@ fn parse_trim() {
77627762
Box::new(MySqlDialect {}),
77637763
//Box::new(BigQueryDialect {}),
77647764
Box::new(SQLiteDialect {}),
7765-
Box::new(DuckDbDialect {}),
77667765
]);
77677766

77687767
assert_eq!(

tests/sqlparser_duckdb.rs

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ use test_utils::*;
2424

2525
use sqlparser::ast::*;
2626
use sqlparser::dialect::{DuckDbDialect, GenericDialect};
27+
use sqlparser::parser::ParserError;
2728

2829
fn duckdb() -> TestedDialects {
2930
TestedDialects::new(vec![Box::new(DuckDbDialect {})])
@@ -830,3 +831,32 @@ fn parse_use() {
830831
])))
831832
);
832833
}
834+
835+
#[test]
836+
fn test_duckdb_trim() {
837+
let real_sql = r#"SELECT customer_id, TRIM(item_price_id, '"', "a") AS item_price_id FROM models_staging.subscriptions"#;
838+
assert_eq!(duckdb().verified_stmt(real_sql).to_string(), real_sql);
839+
840+
let sql_only_select = "SELECT TRIM('xyz', 'a')";
841+
let select = duckdb().verified_only_select(sql_only_select);
842+
assert_eq!(
843+
&Expr::Trim {
844+
expr: Box::new(Expr::Value(
845+
Value::SingleQuotedString("xyz".to_owned()).with_empty_span()
846+
)),
847+
trim_where: None,
848+
trim_what: None,
849+
trim_characters: Some(vec![Expr::Value(
850+
Value::SingleQuotedString("a".to_owned()).with_empty_span()
851+
)]),
852+
},
853+
expr_from_projection(only(&select.projection))
854+
);
855+
856+
// missing comma separation
857+
let error_sql = "SELECT TRIM('xyz' 'a')";
858+
assert_eq!(
859+
ParserError::ParserError("Expected: ), found: 'a'".to_owned()),
860+
duckdb().parse_sql_statements(error_sql).unwrap_err()
861+
);
862+
}

0 commit comments

Comments
 (0)