[fix](like)prevent null pointer by unimplemented like_vec functions (#12910)

* [fix](like)prevent null pointer by unimplemented like_vec functions

* fix pushed like predicate on dict encoded column bug
This commit is contained in:
starocean999
2022-09-27 10:02:10 +08:00
committed by GitHub
parent e040dccbec
commit c4341d3d43
3 changed files with 107 additions and 44 deletions

View File

@ -88,7 +88,7 @@ uint16_t LikeColumnPredicate<is_vectorized>::evaluate(const vectorized::IColumn&
continue;
}
StringValue cell_value = nested_col_ptr->get_value(data_array[idx]);
StringValue cell_value = nested_col_ptr->get_shrink_value(data_array[idx]);
unsigned char flag = 0;
(_state->function)(const_cast<vectorized::LikeSearchState*>(&_like_state),
cell_value, pattern, &flag);
@ -115,45 +115,78 @@ uint16_t LikeColumnPredicate<is_vectorized>::evaluate(const vectorized::IColumn&
}
} else {
if (column.is_column_dictionary()) {
if (LIKELY(_like_state.search_string_sv.len > 0)) {
if (_state->function_vec_dict) {
if (LIKELY(_like_state.search_string_sv.len > 0)) {
auto* nested_col_ptr = vectorized::check_and_get_column<
vectorized::ColumnDictionary<vectorized::Int32>>(column);
auto& data_array = nested_col_ptr->get_data();
StringValue values[size];
unsigned char flags[size];
for (uint16_t i = 0; i != size; i++) {
values[i] = nested_col_ptr->get_shrink_value(data_array[sel[i]]);
}
(_state->function_vec_dict)(
const_cast<vectorized::LikeSearchState*>(&_like_state), pattern,
values, size, flags);
for (uint16_t i = 0; i != size; i++) {
uint16_t idx = sel[i];
sel[new_size] = idx;
new_size += _opposite ^ flags[i];
}
} else {
for (uint16_t i = 0; i != size; i++) {
uint16_t idx = sel[i];
sel[new_size] = idx;
new_size += _opposite ^ true;
}
}
} else {
auto* nested_col_ptr = vectorized::check_and_get_column<
vectorized::ColumnDictionary<vectorized::Int32>>(column);
auto& data_array = nested_col_ptr->get_data();
StringValue values[size];
unsigned char flags[size];
for (uint16_t i = 0; i != size; i++) {
values[i] = nested_col_ptr->get_value(data_array[sel[i]]);
}
(_state->function_vec_dict)(
const_cast<vectorized::LikeSearchState*>(&_like_state), pattern, values,
size, flags);
for (uint16_t i = 0; i != size; i++) {
uint16_t idx = sel[i];
sel[new_size] = idx;
new_size += _opposite ^ flags[i];
}
} else {
for (uint16_t i = 0; i != size; i++) {
uint16_t idx = sel[i];
sel[new_size] = idx;
new_size += _opposite ^ true;
StringValue cell_value = nested_col_ptr->get_value(data_array[idx]);
unsigned char flag = 0;
(_state->function)(const_cast<vectorized::LikeSearchState*>(&_like_state),
cell_value, pattern, &flag);
new_size += _opposite ^ flag;
}
}
} else {
if (LIKELY(_like_state.search_string_sv.len > 0)) {
if (_state->function_vec) {
if (LIKELY(_like_state.search_string_sv.len > 0)) {
auto* data_array =
vectorized::check_and_get_column<
vectorized::PredicateColumnType<TYPE_STRING>>(column)
->get_data()
.data();
(_state->function_vec)(
const_cast<vectorized::LikeSearchState*>(&_like_state), pattern,
data_array, sel, size, _opposite, &new_size);
} else {
for (uint16_t i = 0; i < size; i++) {
uint16_t idx = sel[i];
sel[new_size] = idx;
new_size += _opposite ^ true;
}
}
} else {
auto* data_array = vectorized::check_and_get_column<
vectorized::PredicateColumnType<TYPE_STRING>>(column)
->get_data()
.data();
(_state->function_vec)(const_cast<vectorized::LikeSearchState*>(&_like_state),
pattern, data_array, sel, size, _opposite, &new_size);
} else {
for (uint16_t i = 0; i < size; i++) {
for (uint16_t i = 0; i != size; i++) {
uint16_t idx = sel[i];
sel[new_size] = idx;
new_size += _opposite ^ true;
unsigned char flag = 0;
(_state->function)(const_cast<vectorized::LikeSearchState*>(&_like_state),
data_array[idx], pattern, &flag);
new_size += _opposite ^ flag;
}
}
}

View File

@ -98,7 +98,7 @@ private:
continue;
}
StringValue cell_value = nested_col_ptr->get_value(data_array[i]);
StringValue cell_value = nested_col_ptr->get_shrink_value(data_array[i]);
if constexpr (is_and) {
unsigned char flag = 0;
(_state->function)(
@ -118,31 +118,53 @@ private:
}
} else {
if (column.is_column_dictionary()) {
if (LIKELY(_like_state.search_string_sv.len > 0)) {
auto* nested_col_ptr = vectorized::check_and_get_column<
vectorized::ColumnDictionary<vectorized::Int32>>(column);
auto& data_array = nested_col_ptr->get_data();
StringValue values[size];
unsigned char temp_flags[size];
for (uint16_t i = 0; i != size; i++) {
values[i] = nested_col_ptr->get_value(data_array[i]);
}
(_state->function_vec_dict)(
const_cast<vectorized::LikeSearchState*>(&_like_state), pattern,
values, size, temp_flags);
for (uint16_t i = 0; i < size; i++) {
if constexpr (is_and) {
flags[i] &= _opposite ^ temp_flags[i];
} else {
flags[i] = _opposite ^ temp_flags[i];
if (_state->function_vec_dict) {
if (LIKELY(_like_state.search_string_sv.len > 0)) {
auto* nested_col_ptr = vectorized::check_and_get_column<
vectorized::ColumnDictionary<vectorized::Int32>>(column);
auto& data_array = nested_col_ptr->get_data();
StringValue values[size];
unsigned char temp_flags[size];
for (uint16_t i = 0; i != size; i++) {
values[i] = nested_col_ptr->get_shrink_value(data_array[i]);
}
(_state->function_vec_dict)(
const_cast<vectorized::LikeSearchState*>(&_like_state), pattern,
values, size, temp_flags);
for (uint16_t i = 0; i < size; i++) {
if constexpr (is_and) {
flags[i] &= _opposite ^ temp_flags[i];
} else {
flags[i] = _opposite ^ temp_flags[i];
}
}
} else {
for (uint16_t i = 0; i < size; i++) {
if constexpr (is_and) {
flags[i] &= _opposite ^ true;
} else {
flags[i] = _opposite ^ true;
}
}
}
} else {
auto* nested_col_ptr = vectorized::check_and_get_column<
vectorized::ColumnDictionary<vectorized::Int32>>(column);
auto& data_array = nested_col_ptr->get_data();
for (uint16_t i = 0; i < size; i++) {
StringValue cell_value = nested_col_ptr->get_value(data_array[i]);
if constexpr (is_and) {
flags[i] &= _opposite ^ true;
unsigned char flag = 0;
(_state->function)(
const_cast<vectorized::LikeSearchState*>(&_like_state),
cell_value, pattern, &flag);
flags[i] &= _opposite ^ flag;
} else {
flags[i] = _opposite ^ true;
unsigned char flag = 0;
(_state->function)(
const_cast<vectorized::LikeSearchState*>(&_like_state),
cell_value, pattern, &flag);
flags[i] = _opposite ^ flag;
}
}
}

View File

@ -281,6 +281,14 @@ public:
inline const StringValue& get_value(value_type code) const { return _dict.get_value(code); }
inline StringValue get_shrink_value(value_type code) const {
StringValue result = _dict.get_value(code);
if (_type == OLAP_FIELD_TYPE_CHAR) {
result.len = strnlen(result.ptr, result.len);
}
return result;
}
class Dictionary {
public:
Dictionary() : _dict_data(new DictContainer()), _total_str_len(0) {};