adjust in memcmp && fix mysqltest
This commit is contained in:
@ -1078,11 +1078,6 @@ int ObExprInOrNotIn::eval_batch_in_without_row_fallback(const ObExpr &expr,
|
|||||||
*/
|
*/
|
||||||
bool can_cmp_mem = expr.args_[0]->obj_meta_.is_string_type()
|
bool can_cmp_mem = expr.args_[0]->obj_meta_.is_string_type()
|
||||||
&& CS_TYPE_UTF8MB4_BIN == expr.args_[0]->obj_meta_.get_collation_type();
|
&& CS_TYPE_UTF8MB4_BIN == expr.args_[0]->obj_meta_.get_collation_type();
|
||||||
bool is_calc_with_end_space = expr.inner_func_cnt_ <= 0 ? true : common::is_calc_with_end_space(expr.args_[0]->obj_meta_.get_type(),
|
|
||||||
expr.args_[1]->args_[0]->obj_meta_.get_type(),
|
|
||||||
lib::is_oracle_mode(),
|
|
||||||
expr.args_[0]->obj_meta_.get_collation_type(),
|
|
||||||
expr.args_[1]->args_[0]->obj_meta_.get_collation_type());
|
|
||||||
//eval all right params
|
//eval all right params
|
||||||
for (int64_t j = 0; OB_SUCC(ret) && j < expr.inner_func_cnt_; ++j) {
|
for (int64_t j = 0; OB_SUCC(ret) && j < expr.inner_func_cnt_; ++j) {
|
||||||
if (OB_FAIL(expr.args_[1]->args_[j]->eval(ctx, right_store[j]))) {
|
if (OB_FAIL(expr.args_[1]->args_[j]->eval(ctx, right_store[j]))) {
|
||||||
@ -1093,6 +1088,7 @@ int ObExprInOrNotIn::eval_batch_in_without_row_fallback(const ObExpr &expr,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (OB_SUCC(ret)) {
|
if (OB_SUCC(ret)) {
|
||||||
|
static const char SPACE = ' ';
|
||||||
check_left_can_cmp_mem(expr, input_left, skip, eval_flags, batch_size, can_cmp_mem);
|
check_left_can_cmp_mem(expr, input_left, skip, eval_flags, batch_size, can_cmp_mem);
|
||||||
if (can_cmp_mem) {
|
if (can_cmp_mem) {
|
||||||
const char *ptr0 = right_store[0]->ptr_;
|
const char *ptr0 = right_store[0]->ptr_;
|
||||||
@ -1102,18 +1098,26 @@ int ObExprInOrNotIn::eval_batch_in_without_row_fallback(const ObExpr &expr,
|
|||||||
for (int64_t i = 0; i < batch_size; ++i) {
|
for (int64_t i = 0; i < batch_size; ++i) {
|
||||||
if (input_left[i].is_null()) {
|
if (input_left[i].is_null()) {
|
||||||
results[i].set_null();
|
results[i].set_null();
|
||||||
|
} else if (input_left[i].len_ > 0 && SPACE == input_left[i].ptr_[input_left[i].len_ - 1]) {
|
||||||
|
can_cmp_mem = false;
|
||||||
|
break;
|
||||||
} else {
|
} else {
|
||||||
bool is_equal = false;
|
bool is_equal = false;
|
||||||
left = &input_left[i];
|
left = &input_left[i];
|
||||||
is_equal = ((left->len_ == len0 && 0 == MEMCMP(ptr0, left->ptr_, len0))
|
is_equal = (left->len_ >= len0
|
||||||
|| (!is_calc_with_end_space && left->len_ > len0 && is_all_space(left->ptr_ + len0, left->len_ - len0)));
|
&& 0 == MEMCMP(ptr0, left->ptr_, len0)
|
||||||
is_equal = is_equal || ((left->len_ == len1 && 0 == MEMCMP(ptr1, left->ptr_, len1))
|
&& is_all_space(left->ptr_ + len0, left->len_ - len0));
|
||||||
|| (!is_calc_with_end_space && left->len_ > len1 && is_all_space(left->ptr_ + len1, left->len_ - len1)));
|
is_equal = is_equal || (left->len_ >= len1
|
||||||
|
&& 0 == MEMCMP(ptr1, left->ptr_, len1)
|
||||||
|
&& is_all_space(left->ptr_ + len1, left->len_ - len1));
|
||||||
results[i].set_int(is_equal);
|
results[i].set_int(is_equal);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
eval_flags.set_all(batch_size);
|
if (can_cmp_mem) {
|
||||||
} else {
|
eval_flags.set_all(batch_size);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!can_cmp_mem) {
|
||||||
for (int64_t i = 0; i < batch_size; ++i) {
|
for (int64_t i = 0; i < batch_size; ++i) {
|
||||||
if (skip.at(i) || eval_flags.at(i)) {
|
if (skip.at(i) || eval_flags.at(i)) {
|
||||||
continue;
|
continue;
|
||||||
@ -1789,7 +1793,6 @@ void ObExprInOrNotIn::check_left_can_cmp_mem(const ObExpr &expr,
|
|||||||
bool &can_cmp_mem)
|
bool &can_cmp_mem)
|
||||||
{
|
{
|
||||||
UNUSED(datum);
|
UNUSED(datum);
|
||||||
static const char SPACE = ' ';
|
|
||||||
can_cmp_mem = can_cmp_mem && T_OP_IN == expr.type_ && 2 == expr.inner_func_cnt_
|
can_cmp_mem = can_cmp_mem && T_OP_IN == expr.type_ && 2 == expr.inner_func_cnt_
|
||||||
&& ObBitVector::bit_op_zero(skip, eval_flags, batch_size,
|
&& ObBitVector::bit_op_zero(skip, eval_flags, batch_size,
|
||||||
[](const uint64_t l, const uint64_t r) { return (l | r); });
|
[](const uint64_t l, const uint64_t r) { return (l | r); });
|
||||||
|
|||||||
Reference in New Issue
Block a user