HappenLee commented on code in PR #18310:
URL: https://github.com/apache/doris/pull/18310#discussion_r1156874192
##########
be/src/vec/functions/function_conv.cpp:
##########
@@ -49,58 +52,99 @@ class FunctionConv : public IFunction {
auto result_column = ColumnString::create();
auto result_null_map_column = ColumnUInt8::create(input_rows_count, 0);
+ bool col_const[3];
ColumnPtr argument_columns[3];
-
for (int i = 0; i < 3; ++i) {
- argument_columns[i] =
-
block.get_by_position(arguments[i]).column->convert_to_full_column_if_const();
- if (auto* nullable =
check_and_get_column<ColumnNullable>(*argument_columns[i])) {
- // Danger: Here must dispose the null map data first! Because
- // argument_columns[i]=nullable->get_nested_column_ptr(); will
release the mem
- // of column nullable mem of null map
-
VectorizedUtils::update_null_map(result_null_map_column->get_data(),
-
nullable->get_null_map_data());
- argument_columns[i] = nullable->get_nested_column_ptr();
- }
+ col_const[i] =
is_column_const(*block.get_by_position(arguments[i]).column);
}
+ argument_columns[0] = col_const[0] ? static_cast<const ColumnConst&>(
+
*block.get_by_position(arguments[0]).column)
+ .convert_to_full_column()
+ :
block.get_by_position(arguments[0]).column;
+
+ default_preprocess_parameter_columns(argument_columns, col_const, {1,
2}, block, arguments);
- execute_straight(
- context,
- assert_cast<const typename
Impl::DataType::ColumnType*>(argument_columns[0].get()),
- assert_cast<const ColumnInt8*>(argument_columns[1].get()),
- assert_cast<const ColumnInt8*>(argument_columns[2].get()),
- assert_cast<ColumnString*>(result_column.get()),
-
assert_cast<ColumnUInt8*>(result_null_map_column.get())->get_data(),
- input_rows_count);
+ for (int i = 0; i < 3; i++) {
+ check_set_nullable(argument_columns[i], result_null_map_column);
+ }
+
+ if (col_const[1] && col_const[2]) {
+ execute_scalar_args(
+ context,
+ assert_cast<const typename Impl::DataType::ColumnType*>(
+ argument_columns[0].get()),
+ assert_cast<const
ColumnInt8*>(argument_columns[1].get())->get_element(0),
+ assert_cast<const
ColumnInt8*>(argument_columns[2].get())->get_element(0),
+ assert_cast<ColumnString*>(result_column.get()),
+
assert_cast<ColumnUInt8*>(result_null_map_column.get())->get_data(),
+ input_rows_count);
+ } else {
+ execute_straight(context,
+ assert_cast<const typename
Impl::DataType::ColumnType*>(
+ argument_columns[0].get()),
+ assert_cast<const
ColumnInt8*>(argument_columns[1].get()),
+ assert_cast<const
ColumnInt8*>(argument_columns[2].get()),
+ assert_cast<ColumnString*>(result_column.get()),
+
assert_cast<ColumnUInt8*>(result_null_map_column.get())->get_data(),
+ input_rows_count);
+ }
block.get_by_position(result).column =
ColumnNullable::create(std::move(result_column),
std::move(result_null_map_column));
return Status::OK();
}
private:
- void execute_straight(FunctionContext* context,
- const typename Impl::DataType::ColumnType*
data_column,
- const ColumnInt8* src_base_column, const ColumnInt8*
dst_base_column,
- ColumnString* result_column, NullMap&
result_null_map,
- size_t input_rows_count) {
+ static bool _check_set_oob(const Int8 src_base, const Int8 dst_base,
+ ColumnString* result_column, UInt8&
result_null) {
+ if (std::abs(src_base) < MathFunctions::MIN_BASE ||
+ std::abs(src_base) > MathFunctions::MAX_BASE ||
+ std::abs(dst_base) < MathFunctions::MIN_BASE ||
+ std::abs(dst_base) > MathFunctions::MAX_BASE) { //out of bound
+ result_null = true;
+ result_column->insert_default();
+ return true;
+ }
+ return false;
+ }
+ static void execute_straight(FunctionContext* context,
+ const typename Impl::DataType::ColumnType*
data_column,
+ const ColumnInt8* src_base_column,
+ const ColumnInt8* dst_base_column,
ColumnString* result_column,
+ NullMap& result_null_map, size_t
input_rows_count) {
for (size_t i = 0; i < input_rows_count; i++) {
if (result_null_map[i]) {
result_column->insert_default();
continue;
}
-
Int8 src_base = src_base_column->get_element(i);
Int8 dst_base = dst_base_column->get_element(i);
- if (std::abs(src_base) < MathFunctions::MIN_BASE ||
- std::abs(src_base) > MathFunctions::MAX_BASE ||
- std::abs(dst_base) < MathFunctions::MIN_BASE ||
- std::abs(dst_base) > MathFunctions::MAX_BASE) {
+ if (!_check_set_oob(src_base, dst_base, result_column,
result_null_map[i])) {
+ Impl::calculate_cell(context, data_column, src_base, dst_base,
result_column,
+ result_null_map, i);
+ }
+ }
+ }
+ static void execute_scalar_args(FunctionContext* context,
+ const typename Impl::DataType::ColumnType*
data_column,
+ const Int8 src_base, const Int8 dst_base,
+ ColumnString* result_column, NullMap&
result_null_map,
+ size_t input_rows_count) {
+ if (std::abs(src_base) < MathFunctions::MIN_BASE ||
+ std::abs(src_base) > MathFunctions::MAX_BASE ||
+ std::abs(dst_base) < MathFunctions::MIN_BASE ||
+ std::abs(dst_base) > MathFunctions::MAX_BASE) { //out of bound
+ for (int i = 0; i < input_rows_count; i++) {
result_null_map[i] = true;
result_column->insert_default();
Review Comment:
do not use for loop
```
memset->result_null_map
result_column->insert_many_default
```
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]