Skip to content

Commit 8794ca5

Browse files
authored
fix(binder): different UDAF call must have unique display_name (#17500)
different UDAF call should have unique display_name
1 parent 16de6da commit 8794ca5

File tree

3 files changed

+25
-22
lines changed

3 files changed

+25
-22
lines changed

src/query/sql/src/planner/format/display_rel_operator.rs

+1-11
Original file line numberDiff line numberDiff line change
@@ -113,17 +113,7 @@ pub fn format_scalar(scalar: &ScalarExpr) -> String {
113113
ScalarExpr::UDFLambdaCall(udf) => {
114114
format!("{}({})", &udf.func_name, format_scalar(&udf.scalar))
115115
}
116-
ScalarExpr::UDAFCall(udaf) => {
117-
format!(
118-
"{}({})",
119-
&udaf.name,
120-
udaf.arguments
121-
.iter()
122-
.map(format_scalar)
123-
.collect::<Vec<String>>()
124-
.join(", ")
125-
)
126-
}
116+
ScalarExpr::UDAFCall(udaf) => udaf.display_name.clone(),
127117
ScalarExpr::AsyncFunctionCall(async_func) => async_func.display_name.clone(),
128118
}
129119
}

src/query/sql/src/planner/semantic/type_check.rs

+13-10
Original file line numberDiff line numberDiff line change
@@ -4107,19 +4107,22 @@ impl<'a> TypeChecker<'a> {
41074107
code: code_blob.into(),
41084108
});
41094109

4110-
let mut arguments = Vec::with_capacity(arg_types.len());
4111-
for (argument, dest_type) in args.iter().zip(arg_types.iter()) {
4112-
let box (arg, ty) = self.resolve(argument)?;
4113-
if ty != *dest_type {
4114-
arguments.push(wrap_cast(&arg, dest_type));
4115-
} else {
4116-
arguments.push(arg);
4117-
}
4118-
}
4110+
let arguments = args
4111+
.iter()
4112+
.zip(arg_types.iter())
4113+
.map(|(argument, dest_type)| {
4114+
let box (arg, ty) = self.resolve(argument)?;
4115+
Ok(if ty == *dest_type {
4116+
arg
4117+
} else {
4118+
wrap_cast(&arg, dest_type)
4119+
})
4120+
})
4121+
.collect::<Result<Vec<_>>>()?;
41194122

41204123
let display_name = format!(
41214124
"{name}({})",
4122-
arg_types.iter().map(|arg| format!("{arg}")).join(", ")
4125+
args.iter().map(|arg| format!("{:#}", arg)).join(", ")
41234126
);
41244127

41254128
self.bind_context.have_udf_script = true;

tests/sqllogictests/suites/base/03_common/03_0047_select_udaf.test

+11-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
statement ok
2-
CREATE or replace FUNCTION weighted_avg (INT, INT) STATE {sum INT, weight INT} RETURNS FLOAT
2+
CREATE or REPLACE FUNCTION weighted_avg (INT, INT) STATE {sum INT, weight INT} RETURNS FLOAT
33
LANGUAGE javascript AS $$
44
export function create_state() {
55
return {sum: 0, weight: 0};
@@ -45,3 +45,13 @@ select number % 3, weighted_avg(number, 1) from numbers(10) group by 1 order by
4545
0 4.5
4646
1 4.0
4747
2 5.0
48+
49+
query IRR
50+
select number % 3, weighted_avg(number+1, 1), weighted_avg(number+2, 1) from numbers(10) group by 1 order by 1;
51+
----
52+
0 5.5 6.5
53+
1 5.0 6.0
54+
2 6.0 7.0
55+
56+
statement ok
57+
drop function weighted_avg

0 commit comments

Comments
 (0)