22
22
#include " runtime/current_thread.h"
23
23
#include " runtime/descriptors.h"
24
24
#include " simd/simd.h"
25
+ #include " storage/chunk_helper.h"
25
26
26
27
namespace starrocks ::pipeline {
27
28
@@ -30,6 +31,7 @@ NLJoinProbeOperator::NLJoinProbeOperator(OperatorFactory* factory, int32_t id, i
30
31
const std::string& sql_join_conjuncts,
31
32
const std::vector<ExprContext*>& join_conjuncts,
32
33
const std::vector<ExprContext*>& conjunct_ctxs,
34
+ const std::map<SlotId, ExprContext*>& common_expr_ctxs,
33
35
const std::vector<SlotDescriptor*>& col_types, size_t probe_column_count,
34
36
const std::shared_ptr<NLJoinContext>& cross_join_context)
35
37
: OperatorWithDependency(factory, id, " nestloop_join_probe" , plan_node_id, false , driver_sequence),
@@ -39,6 +41,7 @@ NLJoinProbeOperator::NLJoinProbeOperator(OperatorFactory* factory, int32_t id, i
39
41
_sql_join_conjuncts(sql_join_conjuncts),
40
42
_join_conjuncts(join_conjuncts),
41
43
_conjunct_ctxs(conjunct_ctxs),
44
+ _common_expr_ctxs(common_expr_ctxs),
42
45
_cross_join_context(cross_join_context) {}
43
46
44
47
Status NLJoinProbeOperator::prepare (RuntimeState* state) {
@@ -309,6 +312,9 @@ Status NLJoinProbeOperator::_eval_nullaware_anti_conjuncts(const ChunkPtr& chunk
309
312
// for null-aware left anti join, join_conjunct[0] is on-predicate
310
313
// others are other-conjuncts
311
314
// process on conjuncts
315
+ CommonExprEvalScopeGuard guard (chunk, _common_expr_ctxs);
316
+ RETURN_IF_ERROR (guard.evaluate ());
317
+
312
318
{
313
319
ASSIGN_OR_RETURN (ColumnPtr column, _join_conjuncts[0 ]->evaluate (chunk.get ()));
314
320
size_t num_false = ColumnHelper::count_false_with_notnull (column);
@@ -354,6 +360,8 @@ Status NLJoinProbeOperator::_eval_nullaware_anti_conjuncts(const ChunkPtr& chunk
354
360
355
361
Status NLJoinProbeOperator::_probe_for_inner_join (const ChunkPtr& chunk) {
356
362
if (!_join_conjuncts.empty () && chunk && !chunk->is_empty ()) {
363
+ CommonExprEvalScopeGuard guard (chunk, _common_expr_ctxs);
364
+ RETURN_IF_ERROR (guard.evaluate ());
357
365
RETURN_IF_ERROR (eval_conjuncts_and_in_filters (_join_conjuncts, chunk.get (), nullptr , true ));
358
366
}
359
367
return Status::OK ();
@@ -374,7 +382,10 @@ Status NLJoinProbeOperator::_probe_for_other_join(const ChunkPtr& chunk) {
374
382
if (_is_null_aware_left_anti_join ()) {
375
383
RETURN_IF_ERROR (_eval_nullaware_anti_conjuncts (chunk, &filter));
376
384
} else {
385
+ CommonExprEvalScopeGuard guard (chunk, _common_expr_ctxs);
386
+ RETURN_IF_ERROR (guard.evaluate ());
377
387
RETURN_IF_ERROR (eval_conjuncts_and_in_filters (_join_conjuncts, chunk.get (), &filter, apply_filter));
388
+ chunk->check_or_die ();
378
389
}
379
390
DCHECK (!!filter);
380
391
// The filter has not been assigned if no rows matched
@@ -652,8 +663,11 @@ Status NLJoinProbeOperator::_permute_right_join(size_t chunk_size) {
652
663
}
653
664
}
654
665
permute_rows += chunk->num_rows ();
655
-
656
- RETURN_IF_ERROR (eval_conjuncts (_conjunct_ctxs, chunk.get (), nullptr ));
666
+ {
667
+ CommonExprEvalScopeGuard guard (chunk, _common_expr_ctxs);
668
+ RETURN_IF_ERROR (guard.evaluate ());
669
+ RETURN_IF_ERROR (eval_conjuncts (_conjunct_ctxs, chunk.get (), nullptr ));
670
+ }
657
671
RETURN_IF_ERROR (_output_accumulator.push (std::move (chunk)));
658
672
match_flag_index += cur_chunk_size;
659
673
}
@@ -703,7 +717,11 @@ StatusOr<ChunkPtr> NLJoinProbeOperator::_pull_chunk_for_other_join(size_t chunk_
703
717
ASSIGN_OR_RETURN (ChunkPtr chunk, _permute_chunk_for_other_join (chunk_size));
704
718
DCHECK (chunk);
705
719
RETURN_IF_ERROR (_probe_for_other_join (chunk));
706
- RETURN_IF_ERROR (eval_conjuncts (_conjunct_ctxs, chunk.get (), nullptr ));
720
+ {
721
+ CommonExprEvalScopeGuard guard (chunk, _common_expr_ctxs);
722
+ RETURN_IF_ERROR (guard.evaluate ());
723
+ RETURN_IF_ERROR (eval_conjuncts (_conjunct_ctxs, chunk.get (), nullptr ));
724
+ }
707
725
708
726
RETURN_IF_ERROR (_output_accumulator.push (std::move (chunk)));
709
727
if (ChunkPtr res = _output_accumulator.pull ()) {
@@ -800,9 +818,9 @@ void NLJoinProbeOperatorFactory::_init_row_desc() {
800
818
}
801
819
802
820
OperatorPtr NLJoinProbeOperatorFactory::create (int32_t degree_of_parallelism, int32_t driver_sequence) {
803
- return std::make_shared<NLJoinProbeOperator>(this , _id, _plan_node_id, driver_sequence, _join_op,
804
- _sql_join_conjuncts, _join_conjuncts, _conjunct_ctxs, _col_types ,
805
- _probe_column_count, _cross_join_context);
821
+ return std::make_shared<NLJoinProbeOperator>(
822
+ this , _id, _plan_node_id, driver_sequence, _join_op, _sql_join_conjuncts, _join_conjuncts, _conjunct_ctxs,
823
+ _common_expr_ctxs, _col_types, _probe_column_count, _cross_join_context);
806
824
}
807
825
808
826
Status NLJoinProbeOperatorFactory::prepare (RuntimeState* state) {
@@ -812,6 +830,9 @@ Status NLJoinProbeOperatorFactory::prepare(RuntimeState* state) {
812
830
_cross_join_context->ref ();
813
831
814
832
_init_row_desc ();
833
+
834
+ RETURN_IF_ERROR (Expr::prepare (_common_expr_ctxs, state));
835
+ RETURN_IF_ERROR (Expr::open (_common_expr_ctxs, state));
815
836
RETURN_IF_ERROR (Expr::prepare (_join_conjuncts, state));
816
837
RETURN_IF_ERROR (Expr::open (_join_conjuncts, state));
817
838
RETURN_IF_ERROR (Expr::prepare (_conjunct_ctxs, state));
@@ -821,6 +842,7 @@ Status NLJoinProbeOperatorFactory::prepare(RuntimeState* state) {
821
842
}
822
843
823
844
void NLJoinProbeOperatorFactory::close (RuntimeState* state) {
845
+ Expr::close (_common_expr_ctxs, state);
824
846
Expr::close (_join_conjuncts, state);
825
847
Expr::close (_conjunct_ctxs, state);
826
848
0 commit comments