Skip to content

Commit

Permalink
Return error when string function generate a large column (StarRocks#…
Browse files Browse the repository at this point in the history
  • Loading branch information
mergify[bot] authored Apr 21, 2022
1 parent 60e02c6 commit 985f427
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 12 deletions.
15 changes: 10 additions & 5 deletions be/src/exprs/expr_context.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@

#include <memory>
#include <sstream>
#include <stdexcept>

#include "common/statusor.h"
#include "exprs/expr.h"
Expand Down Expand Up @@ -197,12 +198,16 @@ StatusOr<ColumnPtr> ExprContext::evaluate(Expr* e, vectorized::Chunk* chunk) {
CHECK(!chunk->is_empty());
}
#endif
auto ptr = e->evaluate(this, chunk);
DCHECK(ptr != nullptr);
if (chunk != nullptr && 0 != chunk->num_columns() && ptr->is_constant()) {
ptr->resize(chunk->num_rows());
try {
auto ptr = e->evaluate(this, chunk);
DCHECK(ptr != nullptr);
if (chunk != nullptr && 0 != chunk->num_columns() && ptr->is_constant()) {
ptr->resize(chunk->num_rows());
}
return ptr;
} catch (std::runtime_error& e) {
return Status::RuntimeError(fmt::format("Expr evaluate meet error:{}", e.what()));
}
return ptr;
}

} // namespace starrocks
28 changes: 21 additions & 7 deletions be/src/exprs/vectorized/string_functions.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

#include <algorithm>
#include <memory>
#include <stdexcept>

#include "column/binary_column.h"
#include "column/column_builder.h"
Expand All @@ -23,6 +24,17 @@

namespace starrocks::vectorized {

#define THROW_RUNTIME_ERROR_IF_EXCEED_LIMIT(col, func) \
if (col->reach_capacity_limit()) { \
col->reset_column(); \
throw std::runtime_error("binary column exceed 4G in function" #func); \
}

#define RETURN_COLUMN(col, func_name) \
auto VARNAME_LINENUM(res) = col; \
THROW_RUNTIME_ERROR_IF_EXCEED_LIMIT(col, func); \
return VARNAME_LINENUM(res);

constexpr size_t CONCAT_SMALL_OPTIMIZE_THRESHOLD = 16 << 20;

// ascii_substr_per_slice can compute substr directly via pointer arithmetics
Expand Down Expand Up @@ -817,7 +829,8 @@ struct SpaceFunction {
}
dst_bytes.resize(dst_off, ' ');
builder.set_has_null(has_null);
return builder.build(v1->is_constant());

RETURN_COLUMN(builder.build(v1->is_constant()), "space");
}
};

Expand Down Expand Up @@ -937,7 +950,7 @@ static inline ColumnPtr repeat_const_not_null(const Columns& columns, const Bina

dst_bytes.resize(dst_off);
builder.set_has_null(has_null);
return builder.build(ColumnHelper::is_all_const(columns));
RETURN_COLUMN(builder.build(ColumnHelper::is_all_const(columns)), "repeat");
}

static inline ColumnPtr repeat_const(const Columns& columns) {
Expand Down Expand Up @@ -998,7 +1011,7 @@ static inline ColumnPtr repeat_not_const(const Columns& columns) {
fast_repeat(dst_begin + dst_offsets[i], (uint8_t*)s.data, s.size, dst_slice_size / s.size);
}
builder.set_has_null(has_null);
return builder.build(ColumnHelper::is_all_const(columns));
RETURN_COLUMN(builder.build(ColumnHelper::is_all_const(columns)), "repeat");
}

// repeat
Expand Down Expand Up @@ -1400,12 +1413,12 @@ static inline ColumnPtr pad(FunctionContext* context, const Columns& columns) {

// lpad
ColumnPtr StringFunctions::lpad(FunctionContext* context, const Columns& columns) {
return pad<PAD_TYPE_LEFT>(context, columns);
RETURN_COLUMN(pad<PAD_TYPE_LEFT>(context, columns), "lpad");
}

// rpad
ColumnPtr StringFunctions::rpad(FunctionContext* context, const Columns& columns) {
return pad<PAD_TYPE_RIGHT>(context, columns);
RETURN_COLUMN(pad<PAD_TYPE_RIGHT>(context, columns), "rpad");
}

// append_trailing_char_if_absent
Expand Down Expand Up @@ -1492,7 +1505,8 @@ ColumnPtr StringFunctions::append_trailing_char_if_absent(FunctionContext* conte
if (!dst_data.empty()) {
dst_data.resize(dst_offsets.back());
}
return dst;

RETURN_COLUMN(dst, "append_trailing_char_if_absent");
} else {
ColumnViewer<TYPE_VARCHAR> src_viewer(columns[0]);
ColumnViewer<TYPE_VARCHAR> tailing_viewer(columns[1]);
Expand Down Expand Up @@ -1523,7 +1537,7 @@ ColumnPtr StringFunctions::append_trailing_char_if_absent(FunctionContext* conte
dst_builder.append(Slice(s));
}

return dst_builder.build(ColumnHelper::is_all_const(columns));
RETURN_COLUMN(dst_builder.build(ColumnHelper::is_all_const(columns)), "append_trailing_char_if_absent");
}
}

Expand Down

0 comments on commit 985f427

Please sign in to comment.