[CP] fix generate wrong query range for rowid

This commit is contained in:
obdev
2024-04-16 05:16:13 +00:00
committed by ob-robot
parent c5a94ea0e2
commit c3d1b921e7

View File

@ -1515,6 +1515,7 @@ int ObQueryRange::get_rowid_key_part(const ObRawExpr *l_expr,
const ObRawExpr *const_expr = NULL; const ObRawExpr *const_expr = NULL;
ObObj const_val; ObObj const_val;
bool is_valid = false; bool is_valid = false;
ObItemType ori_c_type = cmp_type;
ObItemType c_type = cmp_type; ObItemType c_type = cmp_type;
bool is_physical_rowid = false; bool is_physical_rowid = false;
uint64_t table_id = common::OB_INVALID_ID; uint64_t table_id = common::OB_INVALID_ID;
@ -1523,14 +1524,28 @@ int ObQueryRange::get_rowid_key_part(const ObRawExpr *l_expr,
const ObRawExpr *calc_urowid_expr = NULL; const ObRawExpr *calc_urowid_expr = NULL;
if (OB_UNLIKELY(r_expr->has_flag(IS_ROWID) && l_expr->is_const_expr())) { if (OB_UNLIKELY(r_expr->has_flag(IS_ROWID) && l_expr->is_const_expr())) {
const_expr = l_expr; const_expr = l_expr;
c_type = (T_OP_LE == cmp_type ? T_OP_GE : (T_OP_GE == cmp_type ? T_OP_LE : ori_c_type = (T_OP_LE == cmp_type ? T_OP_GE : (T_OP_GE == cmp_type ? T_OP_LE :
(T_OP_LT == cmp_type ? T_OP_GT : (T_OP_GT == cmp_type ? T_OP_LT : cmp_type)))); (T_OP_LT == cmp_type ? T_OP_GT : (T_OP_GT == cmp_type ? T_OP_LT : cmp_type))));
calc_urowid_expr = r_expr; calc_urowid_expr = r_expr;
} else if (l_expr->has_flag(IS_ROWID) && r_expr->is_const_expr()) { } else if (l_expr->has_flag(IS_ROWID) && r_expr->is_const_expr()) {
const_expr = r_expr; const_expr = r_expr;
c_type = cmp_type; ori_c_type = cmp_type;
calc_urowid_expr = l_expr; calc_urowid_expr = l_expr;
} }
switch (ori_c_type) {
case T_OP_LT:
case T_OP_LE:
c_type = T_OP_LE;
break;
case T_OP_GT:
case T_OP_GE:
c_type = T_OP_GE;
break;
default:
c_type = ori_c_type;
break;
}
if (!const_expr->is_immutable_const_expr()) { if (!const_expr->is_immutable_const_expr()) {
query_range_ctx_->need_final_extract_ = true; query_range_ctx_->need_final_extract_ = true;
} }
@ -1620,7 +1635,8 @@ int ObQueryRange::get_rowid_key_part(const ObRawExpr *l_expr,
} }
} }
if (OB_FAIL(ret) || is_inconsistent_rowid) { if (OB_FAIL(ret) || is_inconsistent_rowid) {
} else if (OB_FAIL(get_normal_cmp_keypart(c_type, tmp_val, *tmp_key_part))) { } else if (OB_FAIL(get_normal_cmp_keypart(pk_column_items.count() - 1 == i ? ori_c_type : c_type,
tmp_val, *tmp_key_part))) {
LOG_WARN("get normal cmp keypart failed", K(ret)); LOG_WARN("get normal cmp keypart failed", K(ret));
} }
} }
@ -1633,6 +1649,16 @@ int ObQueryRange::get_rowid_key_part(const ObRawExpr *l_expr,
LOG_WARN("and basic query key part failed", K(ret)); LOG_WARN("and basic query key part failed", K(ret));
} }
} }
if (OB_SUCC(ret)) {
if (out_key_part != NULL &&
!out_key_part->is_always_true() &&
!out_key_part->is_always_false() &&
pk_column_items.count() > 1) {
if (!contain_row_ && T_OP_EQ != cmp_type) {
contain_row_ = true;
}
}
}
} }
} }
LOG_TRACE("succeed to get rowid key part", KPC(out_key_part)); LOG_TRACE("succeed to get rowid key part", KPC(out_key_part));