Skip to content

Commit fab743b

Browse files
authored
fix(query): fix subquery writer in udf (#15610)
* fix(query): fix subquery write in udf * fix(query): fix subquery write in udf * fix(query): fix subquery write in udf
1 parent e4e3aad commit fab743b

File tree

3 files changed

+17
-4
lines changed

3 files changed

+17
-4
lines changed

src/query/sql/src/evaluator/cse.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
use std::collections::HashMap;
1616

1717
use databend_common_expression::Expr;
18+
use databend_common_functions::BUILTIN_FUNCTIONS;
1819
use log::debug;
1920

2021
use super::BlockOperator;
@@ -117,6 +118,9 @@ pub fn apply_cse(
117118
/// `count_expressions` recursively counts the occurrences of expressions in an expression tree
118119
/// and stores the count in a HashMap.
119120
fn count_expressions(expr: &Expr, counter: &mut HashMap<Expr, usize>) {
121+
if !expr.is_deterministic(&BUILTIN_FUNCTIONS) {
122+
return;
123+
}
120124
match expr {
121125
Expr::FunctionCall { function, .. } if function.signature.name == "if" => {}
122126
Expr::FunctionCall { function, .. } if function.signature.name == "is_not_error" => {}

src/query/sql/src/planner/optimizer/decorrelate/subquery_rewriter.rs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -168,17 +168,20 @@ impl SubqueryRewriter {
168168
))
169169
}
170170

171-
RelOperator::Limit(_) | RelOperator::Sort(_) => Ok(SExpr::create_unary(
171+
RelOperator::Limit(_)
172+
| RelOperator::Sort(_)
173+
| RelOperator::Udf(_)
174+
| RelOperator::AsyncFunction(_) => Ok(SExpr::create_unary(
172175
Arc::new(s_expr.plan().clone()),
173176
Arc::new(self.rewrite(s_expr.child(0)?)?),
174177
)),
175178

176179
RelOperator::DummyTableScan(_)
177180
| RelOperator::Scan(_)
178181
| RelOperator::CteScan(_)
179-
| RelOperator::ConstantTableScan(_) => Ok(s_expr.clone()),
180-
181-
_ => Err(ErrorCode::Internal("Invalid plan type")),
182+
| RelOperator::ConstantTableScan(_)
183+
| RelOperator::AddRowNumber(_)
184+
| RelOperator::Exchange(_) => Ok(s_expr.clone()),
182185
}
183186
}
184187

tests/sqllogictests/suites/udf_server/udf_server_test.test

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,12 @@ NULL
170170
6
171171
NULL
172172

173+
query I
174+
SELECT gcd(a,b) d from (select number + 1 a, a * 2 b from numbers(3) where number in (select * from numbers(300))) order by d;
175+
----
176+
1
177+
2
178+
3
173179

174180

175181
statement ok

0 commit comments

Comments
 (0)