This is an automated email from the ASF dual-hosted git repository.
yiguolei pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/master by this push:
new 4ca9942407b [refine](expr)Mark expr's execution function as const.
(#57668)
4ca9942407b is described below
commit 4ca9942407bd50d4d7c440d35c57bb918cc2051d
Author: Mryange <[email protected]>
AuthorDate: Thu Nov 6 19:26:28 2025 +0800
[refine](expr)Mark expr's execution function as const. (#57668)
### What problem does this PR solve?
Our expr is actually a const function; any mutable data must be stored
in VExprContext. Currently only VRuntimeFilterWrapper contains mutable
data (because it needs to check the filter rate).
### Release note
None
### Check List (For Author)
- Test <!-- At least one of them must be included. -->
- [ ] Regression test
- [ ] Unit Test
- [ ] Manual test (add detailed scripts or steps below)
- [x] No need to test or manual test. Explain why:
- [x] This is a refactor/code format and no logic has been changed.
- [ ] Previous test can cover this change.
- [ ] No code files have been changed.
- [ ] Other reason <!-- Add your reason? -->
- Behavior changed:
- [x] No.
- [ ] Yes. <!-- Explain the behavior change -->
- Does this need documentation?
- [x] No.
- [ ] Yes. <!-- Add document PR link here. eg:
https://github.com/apache/doris-website/pull/1214 -->
### Check List (For Reviewer who merge this PR)
- [ ] Confirm the release note
- [ ] Confirm test cases
- [ ] Confirm document
- [ ] Add branch pick label <!-- Add branch pick label that this PR
should merge into -->
---
be/src/vec/exprs/lambda_function/lambda_function.h | 2 +-
be/src/vec/exprs/lambda_function/varray_filter_function.cpp | 2 +-
be/src/vec/exprs/lambda_function/varray_map_function.cpp | 11 ++++++-----
be/src/vec/exprs/vbitmap_predicate.cpp | 2 +-
be/src/vec/exprs/vbitmap_predicate.h | 2 +-
be/src/vec/exprs/vbloom_predicate.cpp | 2 +-
be/src/vec/exprs/vbloom_predicate.h | 2 +-
be/src/vec/exprs/vcase_expr.cpp | 2 +-
be/src/vec/exprs/vcase_expr.h | 4 ++--
be/src/vec/exprs/vcast_expr.cpp | 8 ++++----
be/src/vec/exprs/vcast_expr.h | 8 ++++----
be/src/vec/exprs/vcolumn_ref.h | 2 +-
be/src/vec/exprs/vcompound_pred.h | 2 +-
be/src/vec/exprs/vdirect_in_predicate.h | 4 ++--
be/src/vec/exprs/vectorized_fn_call.cpp | 4 ++--
be/src/vec/exprs/vectorized_fn_call.h | 4 ++--
be/src/vec/exprs/vexpr.cpp | 4 ++--
be/src/vec/exprs/vexpr.h | 10 ++++++----
be/src/vec/exprs/vin_predicate.cpp | 2 +-
be/src/vec/exprs/vin_predicate.h | 2 +-
be/src/vec/exprs/vinfo_func.cpp | 3 ++-
be/src/vec/exprs/vinfo_func.h | 2 +-
be/src/vec/exprs/virtual_slot_ref.cpp | 2 +-
be/src/vec/exprs/virtual_slot_ref.h | 2 +-
be/src/vec/exprs/vlambda_function_call_expr.h | 2 +-
be/src/vec/exprs/vlambda_function_expr.h | 2 +-
be/src/vec/exprs/vliteral.cpp | 3 ++-
be/src/vec/exprs/vliteral.h | 2 +-
be/src/vec/exprs/vmatch_predicate.cpp | 2 +-
be/src/vec/exprs/vmatch_predicate.h | 2 +-
be/src/vec/exprs/vruntimefilter_wrapper.cpp | 3 ++-
be/src/vec/exprs/vruntimefilter_wrapper.h | 12 ++++++------
be/src/vec/exprs/vsearch.cpp | 2 +-
be/src/vec/exprs/vsearch.h | 2 +-
be/src/vec/exprs/vslot_ref.cpp | 2 +-
be/src/vec/exprs/vslot_ref.h | 2 +-
be/src/vec/exprs/vtopn_pred.h | 2 +-
be/test/exprs/mock_vexpr.h | 4 ++--
be/test/exprs/virtual_slot_ref_test.cpp | 6 +++---
be/test/olap/collection_statistics_test.cpp | 2 +-
be/test/testutil/mock/mock_fn_call.h | 2 +-
be/test/testutil/mock/mock_in_expr.h | 2 +-
be/test/testutil/mock/mock_slot_ref.h | 2 +-
be/test/vec/exprs/try_cast_expr_test.cpp | 2 +-
be/test/vec/exprs/vsearch_expr_test.cpp | 2 +-
45 files changed, 77 insertions(+), 71 deletions(-)
diff --git a/be/src/vec/exprs/lambda_function/lambda_function.h
b/be/src/vec/exprs/lambda_function/lambda_function.h
index 07302954688..9e141549042 100644
--- a/be/src/vec/exprs/lambda_function/lambda_function.h
+++ b/be/src/vec/exprs/lambda_function/lambda_function.h
@@ -38,7 +38,7 @@ public:
virtual doris::Status execute(VExprContext* context,
doris::vectorized::Block* block,
int* result_column_id, const DataTypePtr&
result_type,
- const VExprSPtrs& children) = 0;
+ const VExprSPtrs& children) const = 0;
int batch_size;
};
diff --git a/be/src/vec/exprs/lambda_function/varray_filter_function.cpp
b/be/src/vec/exprs/lambda_function/varray_filter_function.cpp
index 981b1c7bd46..4c3021a76be 100644
--- a/be/src/vec/exprs/lambda_function/varray_filter_function.cpp
+++ b/be/src/vec/exprs/lambda_function/varray_filter_function.cpp
@@ -54,7 +54,7 @@ public:
doris::Status execute(VExprContext* context, doris::vectorized::Block*
block,
int* result_column_id, const DataTypePtr&
result_type,
- const VExprSPtrs& children) override {
+ const VExprSPtrs& children) const override {
///* array_filter(array, array<boolean>) *///
//1. child[0:end]->execute(src_block)
diff --git a/be/src/vec/exprs/lambda_function/varray_map_function.cpp
b/be/src/vec/exprs/lambda_function/varray_map_function.cpp
index dae6cda07e1..0b94568b84a 100644
--- a/be/src/vec/exprs/lambda_function/varray_map_function.cpp
+++ b/be/src/vec/exprs/lambda_function/varray_map_function.cpp
@@ -77,7 +77,7 @@ public:
std::string get_name() const override { return name; }
Status execute(VExprContext* context, vectorized::Block* block, int*
result_column_id,
- const DataTypePtr& result_type, const VExprSPtrs& children)
override {
+ const DataTypePtr& result_type, const VExprSPtrs& children)
const override {
LambdaArgs args_info;
// collect used slot ref in lambda function body
std::vector<int>& output_slot_ref_indexs =
args_info.output_slot_ref_indexs;
@@ -340,12 +340,12 @@ public:
}
private:
- bool _contains_column_id(const std::vector<int>& output_slot_ref_indexs,
int id) {
+ bool _contains_column_id(const std::vector<int>& output_slot_ref_indexs,
int id) const {
const auto it = std::find(output_slot_ref_indexs.begin(),
output_slot_ref_indexs.end(), id);
return it != output_slot_ref_indexs.end();
}
- void _set_column_ref_column_id(VExprSPtr expr, int gap) {
+ void _set_column_ref_column_id(VExprSPtr expr, int gap) const {
for (const auto& child : expr->children()) {
if (child->is_column_ref()) {
auto* ref = static_cast<VColumnRef*>(child.get());
@@ -356,7 +356,8 @@ private:
}
}
- void _collect_slot_ref_column_id(VExprSPtr expr, std::vector<int>&
output_slot_ref_indexs) {
+ void _collect_slot_ref_column_id(VExprSPtr expr,
+ std::vector<int>& output_slot_ref_indexs)
const {
for (const auto& child : expr->children()) {
if (child->is_slot_ref()) {
const auto* ref = static_cast<VSlotRef*>(child.get());
@@ -369,7 +370,7 @@ private:
void _extend_data(std::vector<MutableColumnPtr>& columns, Block* block,
int current_repeat_times, int size, int64_t
current_row_idx,
- const std::vector<int>& output_slot_ref_indexs) {
+ const std::vector<int>& output_slot_ref_indexs) const {
if (!current_repeat_times || !size) {
return;
}
diff --git a/be/src/vec/exprs/vbitmap_predicate.cpp
b/be/src/vec/exprs/vbitmap_predicate.cpp
index 78bfb6853b1..f2744106f72 100644
--- a/be/src/vec/exprs/vbitmap_predicate.cpp
+++ b/be/src/vec/exprs/vbitmap_predicate.cpp
@@ -77,7 +77,7 @@ doris::Status
vectorized::VBitmapPredicate::open(doris::RuntimeState* state,
doris::Status vectorized::VBitmapPredicate::execute(vectorized::VExprContext*
context,
doris::vectorized::Block*
block,
- int* result_column_id) {
+ int* result_column_id)
const {
DCHECK(_open_finished || _getting_const_col);
doris::vectorized::ColumnNumbers arguments(_children.size());
for (int i = 0; i < _children.size(); ++i) {
diff --git a/be/src/vec/exprs/vbitmap_predicate.h
b/be/src/vec/exprs/vbitmap_predicate.h
index 90531151207..9432418b405 100644
--- a/be/src/vec/exprs/vbitmap_predicate.h
+++ b/be/src/vec/exprs/vbitmap_predicate.h
@@ -49,7 +49,7 @@ public:
~VBitmapPredicate() override = default;
- Status execute(VExprContext* context, Block* block, int* result_column_id)
override;
+ Status execute(VExprContext* context, Block* block, int* result_column_id)
const override;
Status prepare(RuntimeState* state, const RowDescriptor& desc,
VExprContext* context) override;
diff --git a/be/src/vec/exprs/vbloom_predicate.cpp
b/be/src/vec/exprs/vbloom_predicate.cpp
index e3e61ddde9a..9f89a0f5f0c 100644
--- a/be/src/vec/exprs/vbloom_predicate.cpp
+++ b/be/src/vec/exprs/vbloom_predicate.cpp
@@ -70,7 +70,7 @@ void VBloomPredicate::close(VExprContext* context,
FunctionContext::FunctionStat
VExpr::close(context, scope);
}
-Status VBloomPredicate::execute(VExprContext* context, Block* block, int*
result_column_id) {
+Status VBloomPredicate::execute(VExprContext* context, Block* block, int*
result_column_id) const {
DCHECK(_open_finished || _getting_const_col);
doris::vectorized::ColumnNumbers arguments(_children.size());
for (int i = 0; i < _children.size(); ++i) {
diff --git a/be/src/vec/exprs/vbloom_predicate.h
b/be/src/vec/exprs/vbloom_predicate.h
index 56cb86245e8..35ddf07cab1 100644
--- a/be/src/vec/exprs/vbloom_predicate.h
+++ b/be/src/vec/exprs/vbloom_predicate.h
@@ -43,7 +43,7 @@ class VBloomPredicate final : public VExpr {
public:
VBloomPredicate(const TExprNode& node);
~VBloomPredicate() override = default;
- Status execute(VExprContext* context, Block* block, int* result_column_id)
override;
+ Status execute(VExprContext* context, Block* block, int* result_column_id)
const override;
Status prepare(RuntimeState* state, const RowDescriptor& desc,
VExprContext* context) override;
Status open(RuntimeState* state, VExprContext* context,
FunctionContext::FunctionStateScope scope) override;
diff --git a/be/src/vec/exprs/vcase_expr.cpp b/be/src/vec/exprs/vcase_expr.cpp
index 05f793d0a78..534abad613d 100644
--- a/be/src/vec/exprs/vcase_expr.cpp
+++ b/be/src/vec/exprs/vcase_expr.cpp
@@ -76,7 +76,7 @@ void VCaseExpr::close(VExprContext* context,
FunctionContext::FunctionStateScope
VExpr::close(context, scope);
}
-Status VCaseExpr::execute(VExprContext* context, Block* block, int*
result_column_id) {
+Status VCaseExpr::execute(VExprContext* context, Block* block, int*
result_column_id) const {
if (is_const_and_have_executed()) { // const have execute in open function
return get_result_from_const(block, EXPR_NAME, result_column_id);
}
diff --git a/be/src/vec/exprs/vcase_expr.h b/be/src/vec/exprs/vcase_expr.h
index 3cef1704bd0..e267f216127 100644
--- a/be/src/vec/exprs/vcase_expr.h
+++ b/be/src/vec/exprs/vcase_expr.h
@@ -52,7 +52,7 @@ class VCaseExpr final : public VExpr {
public:
VCaseExpr(const TExprNode& node);
~VCaseExpr() override = default;
- Status execute(VExprContext* context, Block* block, int* result_column_id)
override;
+ Status execute(VExprContext* context, Block* block, int* result_column_id)
const override;
Status prepare(RuntimeState* state, const RowDescriptor& desc,
VExprContext* context) override;
Status open(RuntimeState* state, VExprContext* context,
FunctionContext::FunctionStateScope scope) override;
@@ -224,7 +224,7 @@ private:
template <typename IndexType>
ColumnPtr _execute_impl(const std::vector<ColumnPtr>& when_columns,
- std::vector<ColumnPtr>& then_columns, size_t
rows_count) {
+ std::vector<ColumnPtr>& then_columns, size_t
rows_count) const {
std::vector<IndexType> then_idx(rows_count, 0);
IndexType* __restrict then_idx_ptr = then_idx.data();
for (IndexType i = 0; i < when_columns.size(); i++) {
diff --git a/be/src/vec/exprs/vcast_expr.cpp b/be/src/vec/exprs/vcast_expr.cpp
index cc45fff40b9..c4fffb7264f 100644
--- a/be/src/vec/exprs/vcast_expr.cpp
+++ b/be/src/vec/exprs/vcast_expr.cpp
@@ -105,7 +105,7 @@ void VCastExpr::close(VExprContext* context,
FunctionContext::FunctionStateScope
}
doris::Status VCastExpr::execute(VExprContext* context,
doris::vectorized::Block* block,
- int* result_column_id) {
+ int* result_column_id) const {
DCHECK(_open_finished || _getting_const_col)
<< _open_finished << _getting_const_col << _expr_name;
if (is_const_and_have_executed()) { // const have executed in open function
@@ -135,7 +135,7 @@ bool cast_error_code(Status& st) {
}
}
-DataTypePtr TryCastExpr::original_cast_return_type() {
+DataTypePtr TryCastExpr::original_cast_return_type() const {
if (_original_cast_return_is_nullable) {
return _data_type;
} else {
@@ -143,7 +143,7 @@ DataTypePtr TryCastExpr::original_cast_return_type() {
}
}
-Status TryCastExpr::execute(VExprContext* context, Block* block, int*
result_column_id) {
+Status TryCastExpr::execute(VExprContext* context, Block* block, int*
result_column_id) const {
DCHECK(_open_finished || _getting_const_col)
<< _open_finished << _getting_const_col << _expr_name;
if (is_const_and_have_executed()) { // const have executed in open function
@@ -203,7 +203,7 @@ Status TryCastExpr::execute(VExprContext* context, Block*
block, int* result_col
template <bool original_cast_reutrn_is_nullable>
Status TryCastExpr::single_row_execute(VExprContext* context,
const ColumnWithTypeAndName& input_info,
- ColumnPtr& return_column) {
+ ColumnPtr& return_column) const {
auto input_column = input_info.column;
const auto& input_type = input_info.type;
const auto& input_name = input_info.name;
diff --git a/be/src/vec/exprs/vcast_expr.h b/be/src/vec/exprs/vcast_expr.h
index afcd4e687a4..344d30e8c31 100644
--- a/be/src/vec/exprs/vcast_expr.h
+++ b/be/src/vec/exprs/vcast_expr.h
@@ -48,7 +48,7 @@ public:
#endif
VCastExpr(const TExprNode& node) : VExpr(node) {}
~VCastExpr() override = default;
- Status execute(VExprContext* context, Block* block, int* result_column_id)
override;
+ Status execute(VExprContext* context, Block* block, int* result_column_id)
const override;
Status prepare(RuntimeState* state, const RowDescriptor& desc,
VExprContext* context) override;
Status open(RuntimeState* state, VExprContext* context,
FunctionContext::FunctionStateScope scope) override;
@@ -82,15 +82,15 @@ public:
TryCastExpr(const TExprNode& node)
: VCastExpr(node),
_original_cast_return_is_nullable(node.is_cast_nullable) {}
- Status execute(VExprContext* context, Block* block, int* result_column_id)
override;
+ Status execute(VExprContext* context, Block* block, int* result_column_id)
const override;
~TryCastExpr() override = default;
std::string cast_name() const override { return "TRY CAST"; }
private:
- DataTypePtr original_cast_return_type();
+ DataTypePtr original_cast_return_type() const;
template <bool original_cast_reutrn_is_nullable>
Status single_row_execute(VExprContext* context, const
ColumnWithTypeAndName& input_info,
- ColumnPtr& return_column);
+ ColumnPtr& return_column) const;
//Try_cast always returns nullable,
// but we also need the information of whether the return value of the
original cast is nullable.
diff --git a/be/src/vec/exprs/vcolumn_ref.h b/be/src/vec/exprs/vcolumn_ref.h
index d58e1375291..b04064accca 100644
--- a/be/src/vec/exprs/vcolumn_ref.h
+++ b/be/src/vec/exprs/vcolumn_ref.h
@@ -57,7 +57,7 @@ public:
return Status::OK();
}
- Status execute(VExprContext* context, Block* block, int* result_column_id)
override {
+ Status execute(VExprContext* context, Block* block, int* result_column_id)
const override {
DCHECK(_open_finished || _getting_const_col);
*result_column_id = _column_id + _gap;
return Status::OK();
diff --git a/be/src/vec/exprs/vcompound_pred.h
b/be/src/vec/exprs/vcompound_pred.h
index f357f8780ae..0eeb2355bf2 100644
--- a/be/src/vec/exprs/vcompound_pred.h
+++ b/be/src/vec/exprs/vcompound_pred.h
@@ -155,7 +155,7 @@ public:
return Status::OK();
}
- Status execute(VExprContext* context, Block* block, int* result_column_id)
override {
+ Status execute(VExprContext* context, Block* block, int* result_column_id)
const override {
if (fast_execute(context, block, result_column_id)) {
return Status::OK();
}
diff --git a/be/src/vec/exprs/vdirect_in_predicate.h
b/be/src/vec/exprs/vdirect_in_predicate.h
index 71b10990e55..c9fbee5a48a 100644
--- a/be/src/vec/exprs/vdirect_in_predicate.h
+++ b/be/src/vec/exprs/vdirect_in_predicate.h
@@ -54,7 +54,7 @@ public:
return Status::OK();
}
- Status execute(VExprContext* context, Block* block, int* result_column_id)
override {
+ Status execute(VExprContext* context, Block* block, int* result_column_id)
const override {
ColumnNumbers arguments;
return _do_execute(context, block, result_column_id, arguments);
}
@@ -111,7 +111,7 @@ public:
private:
Status _do_execute(VExprContext* context, Block* block, int*
result_column_id,
- ColumnNumbers& arguments) {
+ ColumnNumbers& arguments) const {
DCHECK(_open_finished || _getting_const_col);
arguments.resize(_children.size());
for (int i = 0; i < _children.size(); ++i) {
diff --git a/be/src/vec/exprs/vectorized_fn_call.cpp
b/be/src/vec/exprs/vectorized_fn_call.cpp
index dfaa1e8a212..582d6832283 100644
--- a/be/src/vec/exprs/vectorized_fn_call.cpp
+++ b/be/src/vec/exprs/vectorized_fn_call.cpp
@@ -186,7 +186,7 @@ Status
VectorizedFnCall::evaluate_inverted_index(VExprContext* context, uint32_t
Status VectorizedFnCall::_do_execute(doris::vectorized::VExprContext* context,
doris::vectorized::Block* block, int*
result_column_id,
- ColumnNumbers& args) {
+ ColumnNumbers& args) const {
if (is_const_and_have_executed()) { // const have executed in open function
return get_result_from_const(block, _expr_name, result_column_id);
}
@@ -267,7 +267,7 @@ Status
VectorizedFnCall::execute_runtime_filter(doris::vectorized::VExprContext*
}
Status VectorizedFnCall::execute(VExprContext* context, vectorized::Block*
block,
- int* result_column_id) {
+ int* result_column_id) const {
ColumnNumbers arguments;
return _do_execute(context, block, result_column_id, arguments);
}
diff --git a/be/src/vec/exprs/vectorized_fn_call.h
b/be/src/vec/exprs/vectorized_fn_call.h
index fb247cf0fab..06328b00019 100644
--- a/be/src/vec/exprs/vectorized_fn_call.h
+++ b/be/src/vec/exprs/vectorized_fn_call.h
@@ -52,7 +52,7 @@ public:
VectorizedFnCall() = default;
#endif
VectorizedFnCall(const TExprNode& node);
- Status execute(VExprContext* context, Block* block, int* result_column_id)
override;
+ Status execute(VExprContext* context, Block* block, int* result_column_id)
const override;
Status execute_runtime_filter(doris::vectorized::VExprContext* context,
doris::vectorized::Block* block, int*
result_column_id,
ColumnNumbers& args) override;
@@ -102,7 +102,7 @@ protected:
private:
Status _do_execute(doris::vectorized::VExprContext* context,
doris::vectorized::Block* block,
- int* result_column_id, ColumnNumbers& args);
+ int* result_column_id, ColumnNumbers& args) const;
};
#include "common/compile_check_end.h"
diff --git a/be/src/vec/exprs/vexpr.cpp b/be/src/vec/exprs/vexpr.cpp
index 4944f3f805b..5752090674d 100644
--- a/be/src/vec/exprs/vexpr.cpp
+++ b/be/src/vec/exprs/vexpr.cpp
@@ -823,7 +823,7 @@ uint64_t VExpr::get_digest(uint64_t seed) const {
}
Status VExpr::get_result_from_const(vectorized::Block* block, const
std::string& expr_name,
- int* result_column_id) {
+ int* result_column_id) const {
*result_column_id = block->columns();
auto column = ColumnConst::create(_constant_col->column_ptr,
block->rows());
block->insert({std::move(column), _data_type, expr_name});
@@ -974,7 +974,7 @@ size_t VExpr::estimate_memory(const size_t rows) {
}
bool VExpr::fast_execute(doris::vectorized::VExprContext* context,
doris::vectorized::Block* block,
- int* result_column_id) {
+ int* result_column_id) const {
if (context->get_inverted_index_context() &&
context->get_inverted_index_context()->get_inverted_index_result_column().contains(this))
{
uint32_t num_columns_without_result = block->columns();
diff --git a/be/src/vec/exprs/vexpr.h b/be/src/vec/exprs/vexpr.h
index 9668edb8263..86a6ed6bde1 100644
--- a/be/src/vec/exprs/vexpr.h
+++ b/be/src/vec/exprs/vexpr.h
@@ -130,7 +130,7 @@ public:
return Status::InternalError(expr_name() + " is not ready when
execute");
}
- virtual Status execute(VExprContext* context, Block* block, int*
result_column_id) = 0;
+ virtual Status execute(VExprContext* context, Block* block, int*
result_column_id) const = 0;
// `is_blockable` means this expr will be blocked in `execute` (e.g. AI
Function, Remote Function)
[[nodiscard]] virtual bool is_blockable() const {
return std::any_of(_children.begin(), _children.end(),
@@ -279,7 +279,7 @@ public:
// fast_execute can direct copy expr filter result which build by apply
index in segment_iterator
bool fast_execute(doris::vectorized::VExprContext* context,
doris::vectorized::Block* block,
- int* result_column_id);
+ int* result_column_id) const;
virtual bool can_push_down_to_index() const { return false; }
virtual bool equals(const VExpr& other);
@@ -348,10 +348,12 @@ protected:
return res;
}
- bool is_const_and_have_executed() { return (is_constant() &&
(_constant_col != nullptr)); }
+ bool is_const_and_have_executed() const {
+ return (is_constant() && (_constant_col != nullptr));
+ }
Status get_result_from_const(vectorized::Block* block, const std::string&
expr_name,
- int* result_column_id);
+ int* result_column_id) const;
Status check_constant(const Block& block, ColumnNumbers arguments) const;
diff --git a/be/src/vec/exprs/vin_predicate.cpp
b/be/src/vec/exprs/vin_predicate.cpp
index 7570b98481b..f6f50b0ca6b 100644
--- a/be/src/vec/exprs/vin_predicate.cpp
+++ b/be/src/vec/exprs/vin_predicate.cpp
@@ -114,7 +114,7 @@ Status VInPredicate::evaluate_inverted_index(VExprContext*
context, uint32_t seg
return _evaluate_inverted_index(context, _function, segment_num_rows);
}
-Status VInPredicate::execute(VExprContext* context, Block* block, int*
result_column_id) {
+Status VInPredicate::execute(VExprContext* context, Block* block, int*
result_column_id) const {
if (is_const_and_have_executed()) { // const have execute in open function
return get_result_from_const(block, _expr_name, result_column_id);
}
diff --git a/be/src/vec/exprs/vin_predicate.h b/be/src/vec/exprs/vin_predicate.h
index b7cfc2ef6c8..af444e3e5ab 100644
--- a/be/src/vec/exprs/vin_predicate.h
+++ b/be/src/vec/exprs/vin_predicate.h
@@ -45,7 +45,7 @@ public:
VInPredicate() = default;
#endif
~VInPredicate() override = default;
- Status execute(VExprContext* context, Block* block, int* result_column_id)
override;
+ Status execute(VExprContext* context, Block* block, int* result_column_id)
const override;
size_t estimate_memory(const size_t rows) override;
Status prepare(RuntimeState* state, const RowDescriptor& desc,
VExprContext* context) override;
Status open(RuntimeState* state, VExprContext* context,
diff --git a/be/src/vec/exprs/vinfo_func.cpp b/be/src/vec/exprs/vinfo_func.cpp
index cdfe7de2289..3c18fbe1bf8 100644
--- a/be/src/vec/exprs/vinfo_func.cpp
+++ b/be/src/vec/exprs/vinfo_func.cpp
@@ -55,7 +55,8 @@ VInfoFunc::VInfoFunc(const TExprNode& node) : VExpr(node) {
this->_column_ptr = _data_type->create_column_const(1, field);
}
-Status VInfoFunc::execute(VExprContext* context, vectorized::Block* block,
int* result_column_id) {
+Status VInfoFunc::execute(VExprContext* context, vectorized::Block* block,
+ int* result_column_id) const {
// Info function should return least one row, e.g. select current_user().
size_t row_size = std::max(block->rows(), 1UL);
*result_column_id = VExpr::insert_param(block, {_column_ptr, _data_type,
_expr_name}, row_size);
diff --git a/be/src/vec/exprs/vinfo_func.h b/be/src/vec/exprs/vinfo_func.h
index c21ef6bf07f..d804e697045 100644
--- a/be/src/vec/exprs/vinfo_func.h
+++ b/be/src/vec/exprs/vinfo_func.h
@@ -39,7 +39,7 @@ public:
~VInfoFunc() override = default;
const std::string& expr_name() const override { return _expr_name; }
- Status execute(VExprContext* context, Block* block, int* result_column_id)
override;
+ Status execute(VExprContext* context, Block* block, int* result_column_id)
const override;
private:
const std::string _expr_name = "vinfofunc expr";
diff --git a/be/src/vec/exprs/virtual_slot_ref.cpp
b/be/src/vec/exprs/virtual_slot_ref.cpp
index 8a83dca3b6f..eed6b56ef9a 100644
--- a/be/src/vec/exprs/virtual_slot_ref.cpp
+++ b/be/src/vec/exprs/virtual_slot_ref.cpp
@@ -110,7 +110,7 @@ Status VirtualSlotRef::open(RuntimeState* state,
VExprContext* context,
return Status::OK();
}
-Status VirtualSlotRef::execute(VExprContext* context, Block* block, int*
result_column_id) {
+Status VirtualSlotRef::execute(VExprContext* context, Block* block, int*
result_column_id) const {
if (_column_id >= 0 && _column_id >= block->columns()) {
return Status::Error<ErrorCode::INTERNAL_ERROR>(
"input block not contain slot column {}, column_id={},
block={}", *_column_name,
diff --git a/be/src/vec/exprs/virtual_slot_ref.h
b/be/src/vec/exprs/virtual_slot_ref.h
index 85ca13d1ae4..3640542e713 100644
--- a/be/src/vec/exprs/virtual_slot_ref.h
+++ b/be/src/vec/exprs/virtual_slot_ref.h
@@ -31,7 +31,7 @@ public:
Status prepare(RuntimeState* state, const RowDescriptor& desc,
VExprContext* context) override;
Status open(RuntimeState* state, VExprContext* context,
FunctionContext::FunctionStateScope scope) override;
- Status execute(VExprContext* context, Block* block, int* result_column_id)
override;
+ Status execute(VExprContext* context, Block* block, int* result_column_id)
const override;
const std::string& expr_name() const override;
std::string expr_label() override;
std::string debug_string() const override;
diff --git a/be/src/vec/exprs/vlambda_function_call_expr.h
b/be/src/vec/exprs/vlambda_function_call_expr.h
index cd35ff67558..655097ca3df 100644
--- a/be/src/vec/exprs/vlambda_function_call_expr.h
+++ b/be/src/vec/exprs/vlambda_function_call_expr.h
@@ -63,7 +63,7 @@ public:
return Status::OK();
}
- Status execute(VExprContext* context, Block* block, int* result_column_id)
override {
+ Status execute(VExprContext* context, Block* block, int* result_column_id)
const override {
DCHECK(_open_finished || _getting_const_col);
return _lambda_function->execute(context, block, result_column_id,
_data_type, _children);
}
diff --git a/be/src/vec/exprs/vlambda_function_expr.h
b/be/src/vec/exprs/vlambda_function_expr.h
index 9382aa78148..8b8d79bf866 100644
--- a/be/src/vec/exprs/vlambda_function_expr.h
+++ b/be/src/vec/exprs/vlambda_function_expr.h
@@ -42,7 +42,7 @@ public:
return Status::OK();
}
- Status execute(VExprContext* context, Block* block, int* result_column_id)
override {
+ Status execute(VExprContext* context, Block* block, int* result_column_id)
const override {
DCHECK(_open_finished || _getting_const_col);
return get_child(0)->execute(context, block, result_column_id);
}
diff --git a/be/src/vec/exprs/vliteral.cpp b/be/src/vec/exprs/vliteral.cpp
index 0d9647c770f..6ded1b15a56 100644
--- a/be/src/vec/exprs/vliteral.cpp
+++ b/be/src/vec/exprs/vliteral.cpp
@@ -49,7 +49,8 @@ Status VLiteral::prepare(RuntimeState* state, const
RowDescriptor& desc, VExprCo
return Status::OK();
}
-Status VLiteral::execute(VExprContext* context, vectorized::Block* block, int*
result_column_id) {
+Status VLiteral::execute(VExprContext* context, vectorized::Block* block,
+ int* result_column_id) const {
// Literal expr should return least one row.
// sometimes we just use a VLiteral without open or prepare. so can't
check it at this moment
size_t row_size = std::max(block->rows(), _column_ptr->size());
diff --git a/be/src/vec/exprs/vliteral.h b/be/src/vec/exprs/vliteral.h
index 99a190a77f8..e3b7084765a 100644
--- a/be/src/vec/exprs/vliteral.h
+++ b/be/src/vec/exprs/vliteral.h
@@ -48,7 +48,7 @@ public:
#endif
Status prepare(RuntimeState* state, const RowDescriptor& desc,
VExprContext* context) override;
- Status execute(VExprContext* context, Block* block, int* result_column_id)
override;
+ Status execute(VExprContext* context, Block* block, int* result_column_id)
const override;
const std::string& expr_name() const override { return _expr_name; }
std::string debug_string() const override;
diff --git a/be/src/vec/exprs/vmatch_predicate.cpp
b/be/src/vec/exprs/vmatch_predicate.cpp
index cfa99cffe0e..1b561ad1909 100644
--- a/be/src/vec/exprs/vmatch_predicate.cpp
+++ b/be/src/vec/exprs/vmatch_predicate.cpp
@@ -135,7 +135,7 @@ Status
VMatchPredicate::evaluate_inverted_index(VExprContext* context, uint32_t
return _evaluate_inverted_index(context, _function, segment_num_rows);
}
-Status VMatchPredicate::execute(VExprContext* context, Block* block, int*
result_column_id) {
+Status VMatchPredicate::execute(VExprContext* context, Block* block, int*
result_column_id) const {
DCHECK(_open_finished || _getting_const_col);
if (fast_execute(context, block, result_column_id)) {
return Status::OK();
diff --git a/be/src/vec/exprs/vmatch_predicate.h
b/be/src/vec/exprs/vmatch_predicate.h
index af3f0d1ddf5..68ddb4c6a9e 100644
--- a/be/src/vec/exprs/vmatch_predicate.h
+++ b/be/src/vec/exprs/vmatch_predicate.h
@@ -49,7 +49,7 @@ class VMatchPredicate final : public VExpr {
public:
VMatchPredicate(const TExprNode& node);
~VMatchPredicate() override;
- Status execute(VExprContext* context, Block* block, int* result_column_id)
override;
+ Status execute(VExprContext* context, Block* block, int* result_column_id)
const override;
Status prepare(RuntimeState* state, const RowDescriptor& desc,
VExprContext* context) override;
Status open(RuntimeState* state, VExprContext* context,
FunctionContext::FunctionStateScope scope) override;
diff --git a/be/src/vec/exprs/vruntimefilter_wrapper.cpp
b/be/src/vec/exprs/vruntimefilter_wrapper.cpp
index 9b2a40cced0..55b61309979 100644
--- a/be/src/vec/exprs/vruntimefilter_wrapper.cpp
+++ b/be/src/vec/exprs/vruntimefilter_wrapper.cpp
@@ -87,7 +87,8 @@ void VRuntimeFilterWrapper::close(VExprContext* context,
_impl->close(context, scope);
}
-Status VRuntimeFilterWrapper::execute(VExprContext* context, Block* block,
int* result_column_id) {
+Status VRuntimeFilterWrapper::execute(VExprContext* context, Block* block,
+ int* result_column_id) const {
DCHECK(_open_finished || _getting_const_col);
if (_judge_counter.fetch_sub(1) == 0) {
reset_judge_selectivity();
diff --git a/be/src/vec/exprs/vruntimefilter_wrapper.h
b/be/src/vec/exprs/vruntimefilter_wrapper.h
index 2fbdf4a2043..c0947efac77 100644
--- a/be/src/vec/exprs/vruntimefilter_wrapper.h
+++ b/be/src/vec/exprs/vruntimefilter_wrapper.h
@@ -53,7 +53,7 @@ public:
VRuntimeFilterWrapper(const TExprNode& node, VExprSPtr impl, double
ignore_thredhold,
bool null_aware, int filter_id);
~VRuntimeFilterWrapper() override = default;
- Status execute(VExprContext* context, Block* block, int* result_column_id)
override;
+ Status execute(VExprContext* context, Block* block, int* result_column_id)
const override;
Status prepare(RuntimeState* state, const RowDescriptor& desc,
VExprContext* context) override;
Status open(RuntimeState* state, VExprContext* context,
FunctionContext::FunctionStateScope scope) override;
@@ -119,7 +119,7 @@ public:
}
private:
- void reset_judge_selectivity() {
+ void reset_judge_selectivity() const {
_always_true = false;
_judge_counter = config::runtime_filter_sampling_frequency;
_judge_input_rows = 0;
@@ -135,10 +135,10 @@ private:
// is evaluated as true, the logic for always_true is applied for the rest
of that period
// without recalculating. At the beginning of the next period,
// reset_judge_selectivity is used to reset these variables.
- std::atomic_int _judge_counter = 0;
- std::atomic_uint64_t _judge_input_rows = 0;
- std::atomic_uint64_t _judge_filter_rows = 0;
- std::atomic_int _always_true = false;
+ mutable std::atomic_int _judge_counter = 0;
+ mutable std::atomic_uint64_t _judge_input_rows = 0;
+ mutable std::atomic_uint64_t _judge_filter_rows = 0;
+ mutable std::atomic_int _always_true = false;
std::shared_ptr<RuntimeProfile::Counter> _rf_input_rows =
std::make_shared<RuntimeProfile::Counter>(TUnit::UNIT, 0);
diff --git a/be/src/vec/exprs/vsearch.cpp b/be/src/vec/exprs/vsearch.cpp
index 1786aa73fa2..def87bccc81 100644
--- a/be/src/vec/exprs/vsearch.cpp
+++ b/be/src/vec/exprs/vsearch.cpp
@@ -125,7 +125,7 @@ const std::string& VSearchExpr::expr_name() const {
return name;
}
-Status VSearchExpr::execute(VExprContext* context, Block* block, int*
result_column_id) {
+Status VSearchExpr::execute(VExprContext* context, Block* block, int*
result_column_id) const {
if (fast_execute(context, block, result_column_id)) {
return Status::OK();
}
diff --git a/be/src/vec/exprs/vsearch.h b/be/src/vec/exprs/vsearch.h
index d9b5e40985c..ede53c6872a 100644
--- a/be/src/vec/exprs/vsearch.h
+++ b/be/src/vec/exprs/vsearch.h
@@ -26,7 +26,7 @@ class VSearchExpr : public VExpr {
public:
VSearchExpr(const TExprNode& node);
~VSearchExpr() override = default;
- Status execute(VExprContext* context, Block* block, int* result_column_id)
override;
+ Status execute(VExprContext* context, Block* block, int* result_column_id)
const override;
const std::string& expr_name() const override;
Status evaluate_inverted_index(VExprContext* context, uint32_t
segment_num_rows) override;
diff --git a/be/src/vec/exprs/vslot_ref.cpp b/be/src/vec/exprs/vslot_ref.cpp
index e35e9a5f958..dadc394633e 100644
--- a/be/src/vec/exprs/vslot_ref.cpp
+++ b/be/src/vec/exprs/vslot_ref.cpp
@@ -88,7 +88,7 @@ Status VSlotRef::open(RuntimeState* state, VExprContext*
context,
return Status::OK();
}
-Status VSlotRef::execute(VExprContext* context, Block* block, int*
result_column_id) {
+Status VSlotRef::execute(VExprContext* context, Block* block, int*
result_column_id) const {
if (_column_id >= 0 && _column_id >= block->columns()) {
return Status::Error<ErrorCode::INTERNAL_ERROR>(
"input block not contain slot column {}, column_id={},
block={}", *_column_name,
diff --git a/be/src/vec/exprs/vslot_ref.h b/be/src/vec/exprs/vslot_ref.h
index 7a4315c7ba0..4b60fab75a5 100644
--- a/be/src/vec/exprs/vslot_ref.h
+++ b/be/src/vec/exprs/vslot_ref.h
@@ -46,7 +46,7 @@ public:
Status prepare(RuntimeState* state, const RowDescriptor& desc,
VExprContext* context) override;
Status open(RuntimeState* state, VExprContext* context,
FunctionContext::FunctionStateScope scope) override;
- Status execute(VExprContext* context, Block* block, int* result_column_id)
override;
+ Status execute(VExprContext* context, Block* block, int* result_column_id)
const override;
const std::string& expr_name() const override;
std::string expr_label() override;
diff --git a/be/src/vec/exprs/vtopn_pred.h b/be/src/vec/exprs/vtopn_pred.h
index 6a21e62125b..953ec914817 100644
--- a/be/src/vec/exprs/vtopn_pred.h
+++ b/be/src/vec/exprs/vtopn_pred.h
@@ -81,7 +81,7 @@ public:
return Status::OK();
}
- Status execute(VExprContext* context, Block* block, int* result_column_id)
override {
+ Status execute(VExprContext* context, Block* block, int* result_column_id)
const override {
if (!_predicate->has_value()) {
block->insert({create_always_true_column(block->rows(),
_data_type->is_nullable()),
_data_type, _expr_name});
diff --git a/be/test/exprs/mock_vexpr.h b/be/test/exprs/mock_vexpr.h
index b8260dba657..720e2f0dd62 100644
--- a/be/test/exprs/mock_vexpr.h
+++ b/be/test/exprs/mock_vexpr.h
@@ -29,8 +29,8 @@ class MockVExpr : public VExpr {
public:
MOCK_CONST_METHOD0(clone, VExprSPtr());
MOCK_CONST_METHOD0(expr_name, const std::string&());
- MOCK_METHOD3(execute,
- Status(VExprContext* context, vectorized::Block* block, int*
result_column_id));
+ MOCK_CONST_METHOD3(execute, Status(VExprContext* context,
vectorized::Block* block,
+ int* result_column_id));
}; // class MockVExpr
} // namespace vectorized
diff --git a/be/test/exprs/virtual_slot_ref_test.cpp
b/be/test/exprs/virtual_slot_ref_test.cpp
index 069ade32430..420b44c32d3 100644
--- a/be/test/exprs/virtual_slot_ref_test.cpp
+++ b/be/test/exprs/virtual_slot_ref_test.cpp
@@ -168,7 +168,7 @@ TEST_F(VirtualSlotRefTest,
EqualsFunction_WithDifferentTypes) {
class MockVExpr : public VExpr {
public:
MockVExpr() : VExpr(std::make_shared<DataTypeString>(), false) {}
- Status execute(VExprContext* context, Block* block, int*
result_column_id) override {
+ Status execute(VExprContext* context, Block* block, int*
result_column_id) const override {
return Status::OK();
}
const std::string& expr_name() const override {
@@ -283,7 +283,7 @@ TEST_F(VirtualSlotRefTest, EqualsFunction_TestAllBranches) {
DifferentVExpr() : VExpr(std::make_shared<DataTypeString>(), false) {
_node_type = TExprNodeType::SLOT_REF; // Different from
VIRTUAL_SLOT_REF
}
- Status execute(VExprContext* context, Block* block, int*
result_column_id) override {
+ Status execute(VExprContext* context, Block* block, int*
result_column_id) const override {
return Status::OK();
}
const std::string& expr_name() const override {
@@ -303,7 +303,7 @@ TEST_F(VirtualSlotRefTest, EqualsFunction_TestAllBranches) {
NonVirtualSlotRefExpr() : VExpr(std::make_shared<DataTypeString>(),
false) {
_node_type = TExprNodeType::VIRTUAL_SLOT_REF; // Same type but
different class
}
- Status execute(VExprContext* context, Block* block, int*
result_column_id) override {
+ Status execute(VExprContext* context, Block* block, int*
result_column_id) const override {
return Status::OK();
}
const std::string& expr_name() const override {
diff --git a/be/test/olap/collection_statistics_test.cpp
b/be/test/olap/collection_statistics_test.cpp
index c9fafd960b0..669f041fc2f 100644
--- a/be/test/olap/collection_statistics_test.cpp
+++ b/be/test/olap/collection_statistics_test.cpp
@@ -48,7 +48,7 @@ public:
TExprNodeType::type node_type() const override { return _mock_node_type; }
Status execute(vectorized::VExprContext* context, vectorized::Block* block,
- int32_t* result_column_id) override {
+ int32_t* result_column_id) const override {
return Status::OK();
}
diff --git a/be/test/testutil/mock/mock_fn_call.h
b/be/test/testutil/mock/mock_fn_call.h
index f574a8373dc..59578909144 100644
--- a/be/test/testutil/mock/mock_fn_call.h
+++ b/be/test/testutil/mock/mock_fn_call.h
@@ -40,7 +40,7 @@ public:
return Status::OK();
}
- Status execute(VExprContext* context, Block* block, int* result_column_id)
override {
+ Status execute(VExprContext* context, Block* block, int* result_column_id)
const override {
return Status::OK();
}
Status prepare(RuntimeState* state, const RowDescriptor& desc,
VExprContext* context) override {
diff --git a/be/test/testutil/mock/mock_in_expr.h
b/be/test/testutil/mock/mock_in_expr.h
index 6976568c4ef..7f31d99c6cd 100644
--- a/be/test/testutil/mock/mock_in_expr.h
+++ b/be/test/testutil/mock/mock_in_expr.h
@@ -32,7 +32,7 @@ class MockInExpr final : public VInPredicate {
public:
MockInExpr() = default;
- Status execute(VExprContext* context, Block* block, int* result_column_id)
override {
+ Status execute(VExprContext* context, Block* block, int* result_column_id)
const override {
return Status::OK();
}
Status prepare(RuntimeState* state, const RowDescriptor& desc,
VExprContext* context) override;
diff --git a/be/test/testutil/mock/mock_slot_ref.h
b/be/test/testutil/mock/mock_slot_ref.h
index ca61c6debcd..87c909748d3 100644
--- a/be/test/testutil/mock/mock_slot_ref.h
+++ b/be/test/testutil/mock/mock_slot_ref.h
@@ -47,7 +47,7 @@ public:
_data_type = data_type;
}
- Status execute(VExprContext* context, Block* block, int* result_column_id)
override {
+ Status execute(VExprContext* context, Block* block, int* result_column_id)
const override {
*result_column_id = _column_id;
return Status::OK();
}
diff --git a/be/test/vec/exprs/try_cast_expr_test.cpp
b/be/test/vec/exprs/try_cast_expr_test.cpp
index 2021df577c0..acf66dfb4a7 100644
--- a/be/test/vec/exprs/try_cast_expr_test.cpp
+++ b/be/test/vec/exprs/try_cast_expr_test.cpp
@@ -127,7 +127,7 @@ public:
MOCK_CONST_METHOD0(clone, VExprSPtr());
MOCK_CONST_METHOD0(expr_name, const std::string&());
- Status execute(VExprContext* context, Block* block, int* result_column_id)
override {
+ Status execute(VExprContext* context, Block* block, int* result_column_id)
const override {
auto int_type = std::make_shared<DataTypeInt32>();
auto int_column = int_type->create_column();
for (int i = 0; i < 3; i++) {
diff --git a/be/test/vec/exprs/vsearch_expr_test.cpp
b/be/test/vec/exprs/vsearch_expr_test.cpp
index d356958cb87..e342b7b1645 100644
--- a/be/test/vec/exprs/vsearch_expr_test.cpp
+++ b/be/test/vec/exprs/vsearch_expr_test.cpp
@@ -69,7 +69,7 @@ public:
return kName;
}
- Status execute(VExprContext*, Block*, int*) override { return
Status::OK(); }
+ Status execute(VExprContext*, Block*, int*) const override { return
Status::OK(); }
};
const std::string& intern_column_name(const std::string& name) {
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]