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 8b10a1a3f7 [enhancement](VSlotRef) enhance column_id check in execute 
function during runtime (#11862)
8b10a1a3f7 is described below

commit 8b10a1a3f76edb341cc686087c809ec334a372e4
Author: AlexYue <yj976240...@qq.com>
AuthorDate: Thu Aug 18 09:12:26 2022 +0800

    [enhancement](VSlotRef) enhance column_id check in execute function during 
runtime (#11862)
    
    The column id check in VSlotRef::execute function before is too strict for 
fuzzy test to continuously produce random query. Temporarily loosen the check 
logic.
    Moreover, there exists some careless call to VExpr::get_const_col, it might 
return a nullptr but not every function call checks if it's valid. It's an 
underlying problem.
---
 be/src/vec/exprs/table_function/vexplode.cpp            | 4 +++-
 be/src/vec/exprs/table_function/vexplode_bitmap.cpp     | 4 +++-
 be/src/vec/exprs/table_function/vexplode_json_array.cpp | 3 ++-
 be/src/vec/exprs/table_function/vexplode_numbers.cpp    | 4 +++-
 be/src/vec/exprs/table_function/vexplode_split.cpp      | 6 ++++--
 be/src/vec/exprs/vbloom_predicate.cpp                   | 3 ++-
 be/src/vec/exprs/vcase_expr.cpp                         | 3 ++-
 be/src/vec/exprs/vcast_expr.cpp                         | 2 +-
 be/src/vec/exprs/vectorized_fn_call.cpp                 | 3 ++-
 be/src/vec/exprs/vin_predicate.cpp                      | 3 ++-
 be/src/vec/exprs/vslot_ref.cpp                          | 6 +++++-
 11 files changed, 29 insertions(+), 12 deletions(-)

diff --git a/be/src/vec/exprs/table_function/vexplode.cpp 
b/be/src/vec/exprs/table_function/vexplode.cpp
index ba33a680cc..aa0249916a 100644
--- a/be/src/vec/exprs/table_function/vexplode.cpp
+++ b/be/src/vec/exprs/table_function/vexplode.cpp
@@ -17,6 +17,7 @@
 
 #include "vec/exprs/table_function/vexplode.h"
 
+#include "common/status.h"
 #include "vec/exprs/vexpr.h"
 
 namespace doris::vectorized {
@@ -31,7 +32,8 @@ Status VExplodeTableFunction::process_init(vectorized::Block* 
block) {
             << _vexpr_context->root()->children().size();
 
     int value_column_idx = -1;
-    _vexpr_context->root()->children()[0]->execute(_vexpr_context, block, 
&value_column_idx);
+    
RETURN_IF_ERROR(_vexpr_context->root()->children()[0]->execute(_vexpr_context, 
block,
+                                                                   
&value_column_idx));
 
     _array_column =
             
block->get_by_position(value_column_idx).column->convert_to_full_column_if_const();
diff --git a/be/src/vec/exprs/table_function/vexplode_bitmap.cpp 
b/be/src/vec/exprs/table_function/vexplode_bitmap.cpp
index 0dec849980..f015ac7330 100644
--- a/be/src/vec/exprs/table_function/vexplode_bitmap.cpp
+++ b/be/src/vec/exprs/table_function/vexplode_bitmap.cpp
@@ -17,6 +17,7 @@
 
 #include "vec/exprs/table_function/vexplode_bitmap.h"
 
+#include "common/status.h"
 #include "util/bitmap_value.h"
 #include "vec/exprs/vexpr.h"
 
@@ -32,7 +33,8 @@ Status 
VExplodeBitmapTableFunction::process_init(vectorized::Block* block) {
             << _vexpr_context->root()->children().size();
 
     int value_column_idx = -1;
-    _vexpr_context->root()->children()[0]->execute(_vexpr_context, block, 
&value_column_idx);
+    
RETURN_IF_ERROR(_vexpr_context->root()->children()[0]->execute(_vexpr_context, 
block,
+                                                                   
&value_column_idx));
     _value_column = block->get_by_position(value_column_idx).column;
 
     return Status::OK();
diff --git a/be/src/vec/exprs/table_function/vexplode_json_array.cpp 
b/be/src/vec/exprs/table_function/vexplode_json_array.cpp
index aedcc53643..8ee1815117 100644
--- a/be/src/vec/exprs/table_function/vexplode_json_array.cpp
+++ b/be/src/vec/exprs/table_function/vexplode_json_array.cpp
@@ -32,7 +32,8 @@ Status 
VExplodeJsonArrayTableFunction::process_init(vectorized::Block* block) {
             << _vexpr_context->root()->children().size();
 
     int text_column_idx = -1;
-    _vexpr_context->root()->children()[0]->execute(_vexpr_context, block, 
&text_column_idx);
+    
RETURN_IF_ERROR(_vexpr_context->root()->children()[0]->execute(_vexpr_context, 
block,
+                                                                   
&text_column_idx));
     _text_column = block->get_by_position(text_column_idx).column;
 
     return Status::OK();
diff --git a/be/src/vec/exprs/table_function/vexplode_numbers.cpp 
b/be/src/vec/exprs/table_function/vexplode_numbers.cpp
index c5b6629c06..1c01653ed2 100644
--- a/be/src/vec/exprs/table_function/vexplode_numbers.cpp
+++ b/be/src/vec/exprs/table_function/vexplode_numbers.cpp
@@ -17,6 +17,7 @@
 
 #include "vec/exprs/table_function/vexplode_numbers.h"
 
+#include "common/status.h"
 #include "vec/exprs/vexpr.h"
 
 namespace doris::vectorized {
@@ -31,7 +32,8 @@ Status 
VExplodeNumbersTableFunction::process_init(vectorized::Block* block) {
             << _vexpr_context->root()->children().size();
 
     int value_column_idx = -1;
-    _vexpr_context->root()->children()[0]->execute(_vexpr_context, block, 
&value_column_idx);
+    
RETURN_IF_ERROR(_vexpr_context->root()->children()[0]->execute(_vexpr_context, 
block,
+                                                                   
&value_column_idx));
     _value_column = block->get_by_position(value_column_idx).column;
 
     return Status::OK();
diff --git a/be/src/vec/exprs/table_function/vexplode_split.cpp 
b/be/src/vec/exprs/table_function/vexplode_split.cpp
index 1e124f5781..fbd37d4d3f 100644
--- a/be/src/vec/exprs/table_function/vexplode_split.cpp
+++ b/be/src/vec/exprs/table_function/vexplode_split.cpp
@@ -40,8 +40,10 @@ Status 
VExplodeSplitTableFunction::process_init(vectorized::Block* block) {
     int text_column_idx = -1;
     int delimiter_column_idx = -1;
 
-    _vexpr_context->root()->children()[0]->execute(_vexpr_context, block, 
&text_column_idx);
-    _vexpr_context->root()->children()[1]->execute(_vexpr_context, block, 
&delimiter_column_idx);
+    
RETURN_IF_ERROR(_vexpr_context->root()->children()[0]->execute(_vexpr_context, 
block,
+                                                                   
&text_column_idx));
+    
RETURN_IF_ERROR(_vexpr_context->root()->children()[1]->execute(_vexpr_context, 
block,
+                                                                   
&delimiter_column_idx));
 
     _text_column = block->get_by_position(text_column_idx).column;
     _delimiter_column = block->get_by_position(delimiter_column_idx).column;
diff --git a/be/src/vec/exprs/vbloom_predicate.cpp 
b/be/src/vec/exprs/vbloom_predicate.cpp
index 83e1443ec6..1613d839e7 100644
--- a/be/src/vec/exprs/vbloom_predicate.cpp
+++ b/be/src/vec/exprs/vbloom_predicate.cpp
@@ -19,6 +19,7 @@
 
 #include <string_view>
 
+#include "common/status.h"
 #include "vec/data_types/data_type_nullable.h"
 
 namespace doris::vectorized {
@@ -63,7 +64,7 @@ Status VBloomPredicate::execute(VExprContext* context, Block* 
block, int* result
     doris::vectorized::ColumnNumbers arguments(_children.size());
     for (int i = 0; i < _children.size(); ++i) {
         int column_id = -1;
-        _children[i]->execute(context, block, &column_id);
+        RETURN_IF_ERROR(_children[i]->execute(context, block, &column_id));
         arguments[i] = column_id;
     }
     // call function
diff --git a/be/src/vec/exprs/vcase_expr.cpp b/be/src/vec/exprs/vcase_expr.cpp
index f11c9ef1e5..9058aa1710 100644
--- a/be/src/vec/exprs/vcase_expr.cpp
+++ b/be/src/vec/exprs/vcase_expr.cpp
@@ -17,6 +17,7 @@
 
 #include "vec/exprs/vcase_expr.h"
 
+#include "common/status.h"
 #include "vec/columns/column_nullable.h"
 
 namespace doris::vectorized {
@@ -94,7 +95,7 @@ Status VCaseExpr::execute(VExprContext* context, Block* 
block, int* result_colum
 
     for (int i = 0; i < _children.size(); i++) {
         int column_id = -1;
-        _children[i]->execute(context, block, &column_id);
+        RETURN_IF_ERROR(_children[i]->execute(context, block, &column_id));
         arguments[i] = column_id;
 
         block->replace_by_position_if_const(column_id);
diff --git a/be/src/vec/exprs/vcast_expr.cpp b/be/src/vec/exprs/vcast_expr.cpp
index b30cd14c40..e257e6fe8c 100644
--- a/be/src/vec/exprs/vcast_expr.cpp
+++ b/be/src/vec/exprs/vcast_expr.cpp
@@ -75,7 +75,7 @@ doris::Status VCastExpr::execute(VExprContext* context, 
doris::vectorized::Block
                                  int* result_column_id) {
     // for each child call execute
     int column_id = 0;
-    _children[0]->execute(context, block, &column_id);
+    RETURN_IF_ERROR(_children[0]->execute(context, block, &column_id));
 
     size_t const_param_id = VExpr::insert_param(
             block, {_cast_param, _cast_param_data_type, 
_target_data_type_name}, block->rows());
diff --git a/be/src/vec/exprs/vectorized_fn_call.cpp 
b/be/src/vec/exprs/vectorized_fn_call.cpp
index 99641090a8..f2fd7bcb5f 100644
--- a/be/src/vec/exprs/vectorized_fn_call.cpp
+++ b/be/src/vec/exprs/vectorized_fn_call.cpp
@@ -19,6 +19,7 @@
 
 #include <string_view>
 
+#include "common/status.h"
 #include "exprs/anyval_util.h"
 #include "exprs/rpc_fn.h"
 #include "fmt/format.h"
@@ -85,7 +86,7 @@ doris::Status VectorizedFnCall::execute(VExprContext* 
context, doris::vectorized
     doris::vectorized::ColumnNumbers arguments(_children.size());
     for (int i = 0; i < _children.size(); ++i) {
         int column_id = -1;
-        _children[i]->execute(context, block, &column_id);
+        RETURN_IF_ERROR(_children[i]->execute(context, block, &column_id));
         arguments[i] = column_id;
     }
     // call function
diff --git a/be/src/vec/exprs/vin_predicate.cpp 
b/be/src/vec/exprs/vin_predicate.cpp
index 5f2d321ac8..fb36206a11 100644
--- a/be/src/vec/exprs/vin_predicate.cpp
+++ b/be/src/vec/exprs/vin_predicate.cpp
@@ -19,6 +19,7 @@
 
 #include <string_view>
 
+#include "common/status.h"
 #include "exprs/create_predicate_function.h"
 #include "vec/columns/column_set.h"
 #include "vec/core/field.h"
@@ -85,7 +86,7 @@ Status VInPredicate::execute(VExprContext* context, Block* 
block, int* result_co
     doris::vectorized::ColumnNumbers arguments(_children.size());
     for (int i = 0; i < _children.size(); ++i) {
         int column_id = -1;
-        _children[i]->execute(context, block, &column_id);
+        RETURN_IF_ERROR(_children[i]->execute(context, block, &column_id));
         arguments[i] = column_id;
     }
     // call function
diff --git a/be/src/vec/exprs/vslot_ref.cpp b/be/src/vec/exprs/vslot_ref.cpp
index 0e44be9eb5..7ef39786da 100644
--- a/be/src/vec/exprs/vslot_ref.cpp
+++ b/be/src/vec/exprs/vslot_ref.cpp
@@ -55,7 +55,11 @@ Status VSlotRef::prepare(doris::RuntimeState* state, const 
doris::RowDescriptor&
 }
 
 Status VSlotRef::execute(VExprContext* context, Block* block, int* 
result_column_id) {
-    DCHECK_GE(_column_id, 0);
+    // comment DCHECK temporarily to make fuzzy test run smoothly
+    // DCHECK_GE(_column_id, 0);
+    if (_column_id < 0) {
+        return Status::InternalError("invalid column id {}", _column_id);
+    }
     *result_column_id = _column_id;
     return Status::OK();
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org
For additional commands, e-mail: commits-h...@doris.apache.org

Reply via email to