From 3ecdbd20f68ccfbfc22aeb79dd248aa6ef3cbf3d Mon Sep 17 00:00:00 2001 From: kangkaisen Date: Thu, 22 Nov 2018 20:14:44 +0800 Subject: [PATCH 1/3] Fix worng query result when column value is Null --- be/src/exec/olap_common.h | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/be/src/exec/olap_common.h b/be/src/exec/olap_common.h index 3fc3d4759cba1d..55f2e103c3f70c 100644 --- a/be/src/exec/olap_common.h +++ b/be/src/exec/olap_common.h @@ -662,6 +662,8 @@ Status OlapScanKeys::extend_scan_key(ColumnValueRange& range) { return Status::OK; } + 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) { @@ -676,11 +678,13 @@ Status OlapScanKeys::extend_scan_key(ColumnValueRange& range) { if (_begin_scan_keys.empty()) { if (range.get_convertible_fixed_value_size() < config::doris_max_scan_key_num) { range.convert_to_fixed_value(); + _has_converted = true; } } else { if (range.get_convertible_fixed_value_size() * _begin_scan_keys.size() < config::doris_max_scan_key_num) { range.convert_to_fixed_value(); + _has_converted = true; } } } @@ -699,6 +703,14 @@ Status OlapScanKeys::extend_scan_key(ColumnValueRange& range) { _end_scan_keys.emplace_back(); _end_scan_keys.back().add_value(cast_to_string(*iter)); } + + //when convert to fixed values, we should add null value + 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 +735,14 @@ Status OlapScanKeys::extend_scan_key(ColumnValueRange& range) { _end_scan_keys.back().add_value(cast_to_string(*iter)); } } + + //when convert to fixed values, we should add null value + 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(); + } } } From ae1c6bedeaf61f94ba4946b7bbaa57249418a85a Mon Sep 17 00:00:00 2001 From: kangkaisen Date: Fri, 23 Nov 2018 10:50:07 +0800 Subject: [PATCH 2/3] update variable's name --- be/src/exec/olap_common.h | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/be/src/exec/olap_common.h b/be/src/exec/olap_common.h index 55f2e103c3f70c..24bc1b169f84da 100644 --- a/be/src/exec/olap_common.h +++ b/be/src/exec/olap_common.h @@ -662,7 +662,7 @@ Status OlapScanKeys::extend_scan_key(ColumnValueRange& range) { return Status::OK; } - bool _has_converted = false; + 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) @@ -678,13 +678,13 @@ Status OlapScanKeys::extend_scan_key(ColumnValueRange& range) { if (_begin_scan_keys.empty()) { if (range.get_convertible_fixed_value_size() < config::doris_max_scan_key_num) { range.convert_to_fixed_value(); - _has_converted = true; + has_converted = true; } } else { if (range.get_convertible_fixed_value_size() * _begin_scan_keys.size() < config::doris_max_scan_key_num) { range.convert_to_fixed_value(); - _has_converted = true; + has_converted = true; } } } @@ -705,7 +705,7 @@ Status OlapScanKeys::extend_scan_key(ColumnValueRange& range) { } //when convert to fixed values, we should add null value - if (_has_converted) { + if (has_converted) { _begin_scan_keys.emplace_back(); _begin_scan_keys.back().add_null(); _end_scan_keys.emplace_back(); @@ -737,7 +737,7 @@ Status OlapScanKeys::extend_scan_key(ColumnValueRange& range) { } //when convert to fixed values, we should add null value - if (_has_converted) { + 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); From 60f866ebcba22c36772731604a7e9afb1bc4a8ca Mon Sep 17 00:00:00 2001 From: kangkaisen Date: Mon, 26 Nov 2018 10:54:51 +0800 Subject: [PATCH 3/3] Add more constraint to has_converted --- be/src/exec/olap_common.h | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/be/src/exec/olap_common.h b/be/src/exec/olap_common.h index 24bc1b169f84da..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,8 @@ 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()) { @@ -677,14 +683,20 @@ 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(); - has_converted = true; } } 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(); - has_converted = true; } } } @@ -704,7 +716,6 @@ Status OlapScanKeys::extend_scan_key(ColumnValueRange& range) { _end_scan_keys.back().add_value(cast_to_string(*iter)); } - //when convert to fixed values, we should add null value if (has_converted) { _begin_scan_keys.emplace_back(); _begin_scan_keys.back().add_null(); @@ -736,7 +747,6 @@ Status OlapScanKeys::extend_scan_key(ColumnValueRange& range) { } } - //when convert to fixed values, we should add null value if (has_converted) { _begin_scan_keys.push_back(start_base_key_range); _begin_scan_keys.back().add_null();