diff --git a/be/src/exec/olap_common.h b/be/src/exec/olap_common.h index 3fc3d4759cba1d..a0d0bb356af4ca 100644 --- a/be/src/exec/olap_common.h +++ b/be/src/exec/olap_common.h @@ -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; } @@ -662,6 +666,10 @@ Status OlapScanKeys::extend_scan_key(ColumnValueRange& 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) { @@ -675,11 +683,19 @@ Status OlapScanKeys::extend_scan_key(ColumnValueRange& 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(); } } @@ -699,6 +715,13 @@ Status OlapScanKeys::extend_scan_key(ColumnValueRange& 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& fixed_value_set = range.get_fixed_value_set(); @@ -723,6 +746,13 @@ Status OlapScanKeys::extend_scan_key(ColumnValueRange& 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(); + } } }