github-actions[bot] commented on code in PR #18310:
URL: https://github.com/apache/doris/pull/18310#discussion_r1159859338
##########
be/src/vec/functions/function_conv.cpp:
##########
@@ -49,58 +52,92 @@ 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;
- 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);
+ default_preprocess_parameter_columns(argument_columns, col_const, {1,
2}, block, arguments);
+
+ 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) {
+ // check out of bound.
+ static bool _check_oob(const Int8 src_base, const Int8 dst_base) {
+ return 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;
+ }
+ 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_oob(src_base, dst_base)) {
result_null_map[i] = true;
result_column->insert_default();
+ } else {
+ 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 (_check_oob(src_base, dst_base)) {
+ result_null_map.assign(input_rows_count, true);
Review Comment:
warning: no matching member function for call to 'assign'
[clang-diagnostic-error]
```cpp
result_null_map.assign(input_rows_count, true);
^
```
**be/src/vec/functions/function_conv.cpp:71:** in instantiation of member
function
'doris::vectorized::FunctionConv<doris::vectorized::ConvStringImpl>::execute_scalar_args'
requested here
```cpp
execute_scalar_args(
^
```
**/usr/include/c++/11/ext/new_allocator.h:161:** in instantiation of member
function
'doris::vectorized::FunctionConv<doris::vectorized::ConvStringImpl>::execute_impl'
requested here
```cpp
{ ::new((void *)__p) _Up(std::forward<_Args>(__args)...); }
^
```
**/usr/include/c++/11/bits/alloc_traits.h:515:** in instantiation of
function template specialization
'__gnu_cxx::new_allocator<doris::vectorized::FunctionConv<doris::vectorized::ConvStringImpl>>::construct<doris::vectorized::FunctionConv<doris::vectorized::ConvStringImpl>>'
requested here
```cpp
__a.construct(__p, std::forward<_Args>(__args)...);
^
```
**/usr/include/c++/11/bits/shared_ptr_base.h:518:** in instantiation of
function template specialization
'std::allocator_traits<std::allocator<doris::vectorized::FunctionConv<doris::vectorized::ConvStringImpl>>>::construct<doris::vectorized::FunctionConv<doris::vectorized::ConvStringImpl>>'
requested here
```cpp
allocator_traits<_Alloc>::construct(__a, _M_ptr(),
^
```
**/usr/include/c++/11/bits/shared_ptr_base.h:650:** in instantiation of
function template specialization
'std::_Sp_counted_ptr_inplace<doris::vectorized::FunctionConv<doris::vectorized::ConvStringImpl>,
std::allocator<doris::vectorized::FunctionConv<doris::vectorized::ConvStringImpl>>,
__gnu_cxx::_S_atomic>::_Sp_counted_ptr_inplace<>' requested here
```cpp
_Sp_cp_type(__a._M_a, std::forward<_Args>(__args)...);
^
```
**/usr/include/c++/11/bits/shared_ptr_base.h:1341:** (skipping 3 contexts in
backtrace; use -ftemplate-backtrace-limit=0 to see all)
```cpp
: _M_ptr(), _M_refcount(_M_ptr, __tag, std::forward<_Args>(__args)...)
^
```
**/usr/include/c++/11/bits/shared_ptr.h:877:** in instantiation of function
template specialization
'std::allocate_shared<doris::vectorized::FunctionConv<doris::vectorized::ConvStringImpl>,
std::allocator<doris::vectorized::FunctionConv<doris::vectorized::ConvStringImpl>>>'
requested here
```cpp
return std::allocate_shared<_Tp>(std::allocator<_Tp_nc>(),
^
```
**be/src/vec/functions/function_conv.cpp:33:** in instantiation of function
template specialization
'std::make_shared<doris::vectorized::FunctionConv<doris::vectorized::ConvStringImpl>>'
requested here
```cpp
static FunctionPtr create() { return
std::make_shared<FunctionConv<Impl>>(); }
^
```
**be/src/vec/functions/simple_function_factory.h:171:** in instantiation of
member function
'doris::vectorized::FunctionConv<doris::vectorized::ConvStringImpl>::create'
requested here
```cpp
return std::make_shared<DefaultFunctionBuilder>(Function::create());
^
```
**be/src/vec/functions/simple_function_factory.h:121:** in instantiation of
function template specialization
'doris::vectorized::SimpleFunctionFactory::createDefaultFunction<doris::vectorized::FunctionConv<doris::vectorized::ConvStringImpl>>'
requested here
```cpp
register_function(Function::name,
&createDefaultFunction<Function>);
^
```
**be/src/vec/functions/function_conv.cpp:200:** in instantiation of function
template specialization
'doris::vectorized::SimpleFunctionFactory::register_function<doris::vectorized::FunctionConv<doris::vectorized::ConvStringImpl>>'
requested here
```cpp
factory.register_function<FunctionConv<ConvStringImpl>>();
^
```
**be/src/vec/common/pod_array.h:573:** candidate template ignored:
substitution failure [with It1 = unsigned long, It2 = bool]
```cpp
void assign(It1 from_begin, It2 from_end) {
^
```
--
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]