Skip to content

Commit 9931f50

Browse files
authored
fix(query): fix update set with udf and filter (#18487)
1 parent 14134a4 commit 9931f50

File tree

3 files changed

+43
-9
lines changed

3 files changed

+43
-9
lines changed

src/query/service/src/pipelines/processors/transforms/transform_udf_server.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ use databend_common_exception::ErrorCode;
2525
use databend_common_exception::Result;
2626
use databend_common_expression::udf_client::error_kind;
2727
use databend_common_expression::udf_client::UDFFlightClient;
28+
use databend_common_expression::BlockEntry;
29+
use databend_common_expression::ColumnBuilder;
2830
use databend_common_expression::DataBlock;
2931
use databend_common_metrics::external_server::record_error_external;
3032
use databend_common_metrics::external_server::record_retry_external;
@@ -168,6 +170,14 @@ impl AsyncTransform for TransformUdfServer {
168170

169171
#[async_backtrace::framed]
170172
async fn transform(&mut self, mut data_block: DataBlock) -> Result<DataBlock> {
173+
if data_block.is_empty() {
174+
for func in self.funcs.iter() {
175+
let builder = ColumnBuilder::repeat_default(&func.data_type, 0);
176+
let entry = BlockEntry::Column(builder.build());
177+
data_block.add_entry(entry);
178+
}
179+
return Ok(data_block);
180+
}
171181
let rows = data_block.num_rows();
172182
let batch_rows = self.request_batch_rows;
173183
let mut batch_blocks: Vec<DataBlock> = (0..rows)

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

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ use crate::plans::Join;
4747
use crate::plans::JoinType;
4848
use crate::plans::MatchedEvaluator;
4949
use crate::plans::Mutation;
50+
use crate::plans::MutationSource;
5051
use crate::plans::Operator;
5152
use crate::plans::Plan;
5253
use crate::plans::RelOp;
@@ -398,7 +399,22 @@ async fn optimize_mutation(opt_ctx: Arc<OptimizerContext>, s_expr: SExpr) -> Res
398399
}
399400
}
400401
MutationType::Update | MutationType::Delete => {
401-
if let RelOperator::MutationSource(rel) = input_s_expr.plan() {
402+
// Helper function to find MutationSource in a chain of operators
403+
fn find_mutation_source(s_expr: &SExpr) -> Option<&MutationSource> {
404+
match s_expr.plan() {
405+
RelOperator::MutationSource(rel) => Some(rel),
406+
RelOperator::Udf(_) | RelOperator::EvalScalar(_) => {
407+
if s_expr.arity() == 1 {
408+
find_mutation_source(s_expr.unary_child())
409+
} else {
410+
None
411+
}
412+
}
413+
_ => None,
414+
}
415+
}
416+
417+
if let Some(rel) = find_mutation_source(&input_s_expr) {
402418
if rel.mutation_type == MutationType::Delete && rel.predicates.is_empty() {
403419
mutation.truncate_table = true;
404420
}

tests/sqllogictests/suites/udf_server/udf_server_test.test

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -579,6 +579,19 @@ SELECT * FROM test_update_udf;
579579
databend.com 12
580580
databend.cn 11
581581

582+
statement ok
583+
INSERT INTO test_update_udf (url) VALUES('databend.com'),('databend.cn');
584+
585+
statement ok
586+
UPDATE test_update_udf SET length = url_len(url) WHERE length IS NULL;
587+
588+
query TI
589+
SELECT * FROM test_update_udf ORDER BY url;
590+
----
591+
databend.cn 11
592+
databend.cn 11
593+
databend.com 12
594+
databend.com 12
582595

583596
statement ok
584597
CREATE OR REPLACE TABLE test_update_udf_1(url STRING, a INT64,b INT64,c INT64);
@@ -632,19 +645,13 @@ SELECT embedding_4('databend.com')::vector(4);
632645
----
633646
[1.1,1.2,1.3,1.4]
634647

635-
statement ok
636-
CREATE OR REPLACE TABLE test(url STRING, length INT64);
637-
638-
statement ok
639-
INSERT INTO test (url) VALUES('databend.com'),('databend.cn');
640-
641648
query T
642-
SELECT embedding_4('databend.com')::vector(4) fro
649+
SELECT embedding_4('databend.com')::vector(4)
643650
----
644651
[1.1,1.2,1.3,1.4]
645652

646653
query T
647-
SELECT embedding_4(url)::vector(4) FROM test;
654+
SELECT embedding_4(url)::vector(4) FROM test_update_udf_1;
648655
----
649656
[1.1,1.2,1.3,1.4]
650657
[1.1,1.2,1.3,1.4]
@@ -673,3 +680,4 @@ select sum((value::Int)::Int) from system.metrics where metric = 'external_runni
673680
----
674681
0
675682

683+

0 commit comments

Comments
 (0)