Skip to content

Commit e1ab165

Browse files
authored
[feature](exec) support short circuit evaluation for condition expr (#59830)
```mysql mysql> set enable_strict_cast = true; Query OK, 0 rows affected (0.00 sec) mysql> select count( -> if(number < 128 , -> cast(number as tinyint), -> cast(number as String)) -> ) from numbers("number" = "300"); ERROR 1105 (HY000): errCode = 2, detailMessage = (127.0.0.1)[INVALID_ARGUMENT]Value 128 out of range for type tinyint mysql> set short_circuit_evaluation = true; Query OK, 0 rows affected (0.00 sec) mysql> select count( -> if(number < 128 , -> cast(number as tinyint), -> cast(number as String)) -> ) from numbers("number" = "300"); +-----------------------------------------------------------------------------------------------------------------+ | count( if(number < 128 , cast(number as tinyint), cast(number as String)) ) | +-----------------------------------------------------------------------------------------------------------------+ | 300 | +-----------------------------------------------------------------------------------------------------------------+ ```
1 parent b15a6de commit e1ab165

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

59 files changed

+3330
-174
lines changed

be/src/vec/columns/column_const.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,8 @@ class ColumnConst final : public COWHelper<IColumn, ColumnConst> {
162162

163163
void insert_indices_from(const IColumn& src, const uint32_t* indices_begin,
164164
const uint32_t* indices_end) override {
165-
if (!is_column_const(src) || compare_at(0, 0, src, 0) != 0) {
165+
if (this->s != 0 /*not empty*/ &&
166+
(!is_column_const(src) || compare_at(0, 0, src, 0) != 0)) {
166167
throw Exception(
167168
ErrorCode::INTERNAL_ERROR,
168169
"ColumnConst::insert_indices_from: src is not const or not equal to dst");

be/src/vec/exprs/lambda_function/lambda_function.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121

2222
#include "common/status.h"
2323
#include "vec/core/block.h"
24+
#include "vec/exprs/vexpr.h"
2425
#include "vec/exprs/vexpr_context.h"
2526

2627
namespace doris::vectorized {
@@ -37,7 +38,7 @@ class LambdaFunction {
3738
}
3839

3940
virtual doris::Status execute(VExprContext* context, const doris::vectorized::Block* block,
40-
size_t count, ColumnPtr& result_column,
41+
Selector* selector, size_t count, ColumnPtr& result_column,
4142
const DataTypePtr& result_type,
4243
const VExprSPtrs& children) const = 0;
4344

be/src/vec/exprs/lambda_function/varray_filter_function.cpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ class ArrayFilterFunction : public LambdaFunction {
5353
std::string get_name() const override { return name; }
5454

5555
doris::Status execute(VExprContext* context, const doris::vectorized::Block* block,
56-
size_t output_count, ColumnPtr& result_column,
56+
Selector* expr_selector, size_t output_count, ColumnPtr& result_column,
5757
const DataTypePtr& result_type,
5858
const VExprSPtrs& children) const override {
5959
///* array_filter(array, array<boolean>) *///
@@ -62,9 +62,11 @@ class ArrayFilterFunction : public LambdaFunction {
6262

6363
DCHECK_EQ(children.size(), 2);
6464
ColumnPtr column_ptr_0;
65-
RETURN_IF_ERROR(children[0]->execute_column(context, block, output_count, column_ptr_0));
65+
RETURN_IF_ERROR(children[0]->execute_column(context, block, expr_selector, output_count,
66+
column_ptr_0));
6667
ColumnPtr column_ptr_1;
67-
RETURN_IF_ERROR(children[1]->execute_column(context, block, output_count, column_ptr_1));
68+
RETURN_IF_ERROR(children[1]->execute_column(context, block, expr_selector, output_count,
69+
column_ptr_1));
6870

6971
//2. get first and second array column
7072
auto first_column = column_ptr_0->convert_to_full_column_if_const();

be/src/vec/exprs/lambda_function/varray_map_function.cpp

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -77,8 +77,8 @@ class ArrayMapFunction : public LambdaFunction {
7777

7878
std::string get_name() const override { return name; }
7979

80-
Status execute(VExprContext* context, const vectorized::Block* block, size_t count,
81-
ColumnPtr& result_column, const DataTypePtr& result_type,
80+
Status execute(VExprContext* context, const vectorized::Block* block, Selector* expr_selector,
81+
size_t count, ColumnPtr& result_column, const DataTypePtr& result_type,
8282
const VExprSPtrs& children) const override {
8383
LambdaArgs args_info;
8484
// collect used slot ref in lambda function body
@@ -112,7 +112,8 @@ class ArrayMapFunction : public LambdaFunction {
112112
ColumnsWithTypeAndName arguments(children.size() - 1);
113113
for (int i = 1; i < children.size(); ++i) {
114114
ColumnPtr column;
115-
RETURN_IF_ERROR(children[i]->execute_column(context, block, count, column));
115+
RETURN_IF_ERROR(
116+
children[i]->execute_column(context, block, expr_selector, count, column));
116117
arguments[i - 1].column = column;
117118
arguments[i - 1].type = children[i]->execute_type(block);
118119
arguments[i - 1].name = children[i]->expr_name();
@@ -284,8 +285,8 @@ class ArrayMapFunction : public LambdaFunction {
284285
//3. child[0]->execute(new_block)
285286

286287
ColumnPtr res_col;
287-
RETURN_IF_ERROR(children[0]->execute_column(context, &lambda_block, lambda_block.rows(),
288-
res_col));
288+
RETURN_IF_ERROR(children[0]->execute_column(context, &lambda_block, expr_selector,
289+
lambda_block.rows(), res_col));
289290
res_col = res_col->convert_to_full_column_if_const();
290291
res_type = children[0]->execute_type(&lambda_block);
291292

be/src/vec/exprs/lambda_function/varray_sort_function.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -67,16 +67,17 @@ class ArraySortFunction : public LambdaFunction {
6767

6868
std::string get_name() const override { return name; }
6969

70-
Status execute(VExprContext* context, const vectorized::Block* block, size_t count,
71-
ColumnPtr& result_column, const DataTypePtr& result_type,
70+
Status execute(VExprContext* context, const vectorized::Block* block, Selector* expr_selector,
71+
size_t count, ColumnPtr& result_column, const DataTypePtr& result_type,
7272
const VExprSPtrs& children) const override {
7373
///* array_sort(lambda, arg) *///
7474

7575
DCHECK_EQ(children.size(), 2);
7676

7777
// 1. get data, we need to obtain this actual data and type.
7878
ColumnPtr column_ptr;
79-
RETURN_IF_ERROR(children[1]->execute_column(context, block, count, column_ptr));
79+
RETURN_IF_ERROR(
80+
children[1]->execute_column(context, block, expr_selector, count, column_ptr));
8081
DataTypePtr type_ptr = children[1]->execute_type(block);
8182

8283
auto column = column_ptr->convert_to_full_column_if_const();

0 commit comments

Comments
 (0)