Merge 'Compat: Translate the 2nd argument of group_concat / string_agg' from Iaroslav Zeigerman

Fixes #3140

Reviewed-by: Jussi Saurio <jussi.saurio@gmail.com>

Closes #3155
This commit is contained in:
Jussi Saurio
2025-09-18 09:23:05 +03:00
committed by GitHub
2 changed files with 11 additions and 22 deletions

View File

@@ -337,17 +337,7 @@ pub fn translate_aggregation_step(
}
let delimiter_reg = if num_args == 2 {
match &agg_arg_source.arg_at(1) {
ast::Expr::Column { .. } => {
agg_arg_source.translate(program, referenced_tables, resolver, 1)?
}
ast::Expr::Literal(ast::Literal::String(s)) => {
let delimiter_expr =
ast::Expr::Literal(ast::Literal::String(s.to_string()));
translate_const_arg(program, referenced_tables, resolver, &delimiter_expr)?
}
_ => crate::bail_parse_error!("Incorrect delimiter parameter"),
}
agg_arg_source.translate(program, referenced_tables, resolver, 1)?
} else {
let delimiter_expr =
ast::Expr::Literal(ast::Literal::String(String::from("\",\"")));
@@ -435,18 +425,9 @@ pub fn translate_aggregation_step(
crate::bail_parse_error!("string_agg bad number of arguments");
}
let delimiter_reg = match &agg_arg_source.arg_at(1) {
ast::Expr::Column { .. } => {
agg_arg_source.translate(program, referenced_tables, resolver, 1)?
}
ast::Expr::Literal(ast::Literal::String(s)) => {
let delimiter_expr = ast::Expr::Literal(ast::Literal::String(s.to_string()));
translate_const_arg(program, referenced_tables, resolver, &delimiter_expr)?
}
_ => crate::bail_parse_error!("Incorrect delimiter parameter"),
};
let expr_reg = agg_arg_source.translate(program, referenced_tables, resolver, 0)?;
let delimiter_reg =
agg_arg_source.translate(program, referenced_tables, resolver, 1)?;
program.emit_insn(Insn::AggStep {
acc_reg: target_register,

View File

@@ -84,6 +84,10 @@ do_execsql_test select-group-concat-with-delimiter {
SELECT group_concat(name, ';') FROM products;
} {hat;cap;shirt;sweater;sweatshirt;shorts;jeans;sneakers;boots;coat;accessories}
do_execsql_test select-group-concat-with-delimiter-expression {
SELECT group_concat(name, ';' || '|') FROM products;
} {hat;|cap;|shirt;|sweater;|sweatshirt;|shorts;|jeans;|sneakers;|boots;|coat;|accessories}
do_execsql_test select-group-concat-with-column-delimiter {
SELECT group_concat(name, id) FROM products;
} {hat2cap3shirt4sweater5sweatshirt6shorts7jeans8sneakers9boots10coat11accessories}
@@ -96,6 +100,10 @@ do_execsql_test select-string-agg-with-delimiter {
SELECT string_agg(name, ',') FROM products;
} {hat,cap,shirt,sweater,sweatshirt,shorts,jeans,sneakers,boots,coat,accessories}
do_execsql_test select-string-agg-with-delimiter-expression {
SELECT string_agg(name, ';' || '|') FROM products;
} {hat;|cap;|shirt;|sweater;|sweatshirt;|shorts;|jeans;|sneakers;|boots;|coat;|accessories}
do_execsql_test select-string-agg-with-column-delimiter {
SELECT string_agg(name, id) FROM products;
} {hat2cap3shirt4sweater5sweatshirt6shorts7jeans8sneakers9boots10coat11accessories}