(expr: &rq::Expr, ctx: &mut Context)
| 335 | } |
| 336 | |
| 337 | fn process_concat(expr: &rq::Expr, ctx: &mut Context) -> Result<sql_ast::Expr> { |
| 338 | if ctx.dialect.has_concat_function() { |
| 339 | let concat_args = collect_concat_args(expr); |
| 340 | |
| 341 | let args_list = concat_args |
| 342 | .iter() |
| 343 | .map(|a| { |
| 344 | translate_expr((*a).clone(), ctx) |
| 345 | .map(|x| FunctionArg::Unnamed(FunctionArgExpr::Expr(x.into_ast()))) |
| 346 | }) |
| 347 | .try_collect()?; |
| 348 | |
| 349 | let args = sql_ast::FunctionArguments::List(FunctionArgumentList { |
| 350 | args: args_list, |
| 351 | clauses: vec![], |
| 352 | duplicate_treatment: None, |
| 353 | }); |
| 354 | |
| 355 | Ok(sql_ast::Expr::Function(Function { |
| 356 | name: ObjectName(vec![sqlparser::ast::ObjectNamePart::Identifier( |
| 357 | sql_ast::Ident::new("CONCAT"), |
| 358 | )]), |
| 359 | args, |
| 360 | over: None, |
| 361 | filter: None, |
| 362 | null_treatment: None, |
| 363 | within_group: vec![], |
| 364 | parameters: sql_ast::FunctionArguments::None, |
| 365 | uses_odbc_syntax: false, |
| 366 | })) |
| 367 | } else { |
| 368 | let concat_args = collect_concat_args(expr); |
| 369 | |
| 370 | let mut iter = concat_args.into_iter(); |
| 371 | let first_expr = iter.next().unwrap(); |
| 372 | let mut current_expr = translate_expr(first_expr.clone(), ctx)?.into_ast(); |
| 373 | |
| 374 | for arg in iter { |
| 375 | let translated_arg = translate_expr(arg.clone(), ctx)?.into_ast(); |
| 376 | current_expr = sql_ast::Expr::BinaryOp { |
| 377 | left: Box::new(current_expr), |
| 378 | op: BinaryOperator::StringConcat, |
| 379 | right: Box::new(translated_arg), |
| 380 | }; |
| 381 | } |
| 382 | |
| 383 | Ok(current_expr) |
| 384 | } |
| 385 | } |
| 386 | |
| 387 | fn translate_binary_operator( |
| 388 | left: &rq::Expr, |
no test coverage detected