fix do_row_gt_and bug when meeting like key or in key
This commit is contained in:
@ -4107,7 +4107,8 @@ int ObQueryRange::intersect_border_from(const ObKeyPart *l_key_part,
|
||||
const ObKeyPart *r_key_part,
|
||||
ObRowBorderType &start_border_type,
|
||||
ObRowBorderType &end_border_type,
|
||||
bool &is_always_false)
|
||||
bool &is_always_false,
|
||||
bool &has_special_key)
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
bool start_identified = true;
|
||||
@ -4120,9 +4121,11 @@ int ObQueryRange::intersect_border_from(const ObKeyPart *l_key_part,
|
||||
if (OB_ISNULL(l_key_part) || OB_ISNULL(r_key_part)) {
|
||||
ret = OB_INVALID_ARGUMENT;
|
||||
LOG_WARN("invalid argument.", K(l_key_part), K(r_key_part));
|
||||
} else if (has_special_key) {
|
||||
// do nothing
|
||||
} else if (OB_UNLIKELY(!l_key_part->is_normal_key()) || OB_UNLIKELY(!r_key_part->is_normal_key())) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("keypart isn't normal key", K(*l_key_part), K(*r_key_part));
|
||||
has_special_key = true;
|
||||
LOG_INFO("keypart isn't normal key", K(*l_key_part), K(*r_key_part));
|
||||
} else if (l_key_part->pos_.offset_ < r_key_part->pos_.offset_) {
|
||||
start_border_type = OB_FROM_LEFT;
|
||||
end_border_type = OB_FROM_LEFT;
|
||||
@ -4233,13 +4236,14 @@ int ObQueryRange::intersect_border_from(const ObKeyPart *l_key_part,
|
||||
}
|
||||
if (OB_SUCC(ret)
|
||||
&& !is_always_false
|
||||
&& !has_special_key
|
||||
&& NULL != l_key_part->and_next_
|
||||
&& NULL != r_key_part->and_next_
|
||||
&& (s_need_continue || e_need_continue)) {
|
||||
ObRowBorderType tmp_start_border = OB_FROM_NONE;
|
||||
ObRowBorderType tmp_end_border = OB_FROM_NONE;
|
||||
if (OB_FAIL(SMART_CALL(intersect_border_from(l_key_part->and_next_, r_key_part->and_next_,
|
||||
tmp_start_border, tmp_end_border, is_always_false)))) {
|
||||
tmp_start_border, tmp_end_border, is_always_false, has_special_key)))) {
|
||||
LOG_WARN("invalid argument.", K(ret), K(l_key_part), K(r_key_part));
|
||||
} else if (s_need_continue) {
|
||||
start_border_type = tmp_start_border;
|
||||
@ -4452,8 +4456,9 @@ int ObQueryRange::do_row_gt_and(ObKeyPart *l_gt, ObKeyPart *r_gt, ObKeyPart *&r
|
||||
ObRowBorderType s_border = OB_FROM_NONE;
|
||||
ObRowBorderType e_border = OB_FROM_NONE;
|
||||
bool is_always_false = false;
|
||||
bool has_special_key = false;
|
||||
if (OB_FAIL(intersect_border_from(l_cur, r_cur,
|
||||
s_border, e_border, is_always_false))) {
|
||||
s_border, e_border, is_always_false, has_special_key))) {
|
||||
LOG_WARN("Find row border failed", K(ret));
|
||||
} else if (is_always_false) {
|
||||
result->normal_keypart_->always_false_ = true;
|
||||
@ -4461,6 +4466,8 @@ int ObQueryRange::do_row_gt_and(ObKeyPart *l_gt, ObKeyPart *r_gt, ObKeyPart *&r
|
||||
result->normal_keypart_->start_.set_max_value();
|
||||
result->normal_keypart_->end_.set_min_value();
|
||||
find_false = result;
|
||||
} else if (has_special_key) {
|
||||
// do nothing
|
||||
} else if (OB_FAIL(set_partial_row_border(l_gt_next, r_gt_next,
|
||||
s_border, e_border, rest))) {
|
||||
LOG_WARN("Set row border failed", K(ret));
|
||||
|
||||
@ -685,7 +685,8 @@ private:
|
||||
const ObKeyPart *r_key_part,
|
||||
ObRowBorderType &start_border_type,
|
||||
ObRowBorderType &end_border_type,
|
||||
bool &is_always_false);
|
||||
bool &is_always_false,
|
||||
bool &has_special_key);
|
||||
int set_partial_row_border(ObKeyPart *l_gt,
|
||||
ObKeyPart *r_gt,
|
||||
ObRowBorderType start_border_type,
|
||||
|
||||
Reference in New Issue
Block a user