Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 30 additions & 0 deletions be/src/exec/olap_common.h
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,10 @@ class ColumnValueRange {
return _low_value == _type_min;
}

bool is_high_value_maximum() const {
return _high_value == _type_max;
}

bool is_begin_include() const {
return _low_op == FILTER_LARGER_OR_EQUAL;
}
Expand Down Expand Up @@ -662,6 +666,10 @@ Status OlapScanKeys::extend_scan_key(ColumnValueRange<T>& range) {
return Status::OK;
}

//if a column doesn't have any predicate, we will try converting the range to fixed values
//for this case, we need to add null value to fixed values
bool has_converted = false;

if (range.is_fixed_value_range()) {
if ((_begin_scan_keys.empty() && range.get_fixed_value_size() > config::doris_max_scan_key_num)
|| range.get_fixed_value_size() * _begin_scan_keys.size() > config::doris_max_scan_key_num) {
Expand All @@ -675,11 +683,19 @@ Status OlapScanKeys::extend_scan_key(ColumnValueRange<T>& range) {
if (range.is_fixed_value_convertible() && _is_convertible) {
if (_begin_scan_keys.empty()) {
if (range.get_convertible_fixed_value_size() < config::doris_max_scan_key_num) {
if (range.is_low_value_mininum() && range.is_high_value_maximum()) {
has_converted = true;
}

range.convert_to_fixed_value();
}
} else {
if (range.get_convertible_fixed_value_size() * _begin_scan_keys.size()
< config::doris_max_scan_key_num) {
if (range.is_low_value_mininum() && range.is_high_value_maximum()) {
has_converted = true;
}

range.convert_to_fixed_value();
}
}
Expand All @@ -699,6 +715,13 @@ Status OlapScanKeys::extend_scan_key(ColumnValueRange<T>& range) {
_end_scan_keys.emplace_back();
_end_scan_keys.back().add_value(cast_to_string(*iter));
}

if (has_converted) {
_begin_scan_keys.emplace_back();
_begin_scan_keys.back().add_null();
_end_scan_keys.emplace_back();
_end_scan_keys.back().add_null();
}
} // 3.1.2 produces the Cartesian product of ScanKey and fixed_value
else {
const set<T>& fixed_value_set = range.get_fixed_value_set();
Expand All @@ -723,6 +746,13 @@ Status OlapScanKeys::extend_scan_key(ColumnValueRange<T>& range) {
_end_scan_keys.back().add_value(cast_to_string(*iter));
}
}

if (has_converted) {
_begin_scan_keys.push_back(start_base_key_range);
_begin_scan_keys.back().add_null();
_end_scan_keys.push_back(end_base_key_range);
_end_scan_keys.back().add_null();
}
}
}

Expand Down