[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.
This commit is contained in:
AlexYue
2022-08-18 09:12:26 +08:00
committed by GitHub
parent 582be130dd
commit 8b10a1a3f7
11 changed files with 29 additions and 12 deletions

View File

@ -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();

View File

@ -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();

View File

@ -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();

View File

@ -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();

View File

@ -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;

View File

@ -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

View File

@ -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);

View File

@ -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());

View File

@ -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

View File

@ -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

View File

@ -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();
}