[BUGFIX] fix lob text iter get next return err code

This commit is contained in:
obdev
2023-03-22 05:12:11 +00:00
committed by ob-robot
parent 2a2b0d41c5
commit 26b981973d
12 changed files with 62 additions and 42 deletions

View File

@ -123,8 +123,9 @@ int ObExprConcat::calc_text(common::ObObj &result,
}
if (OB_FAIL(ret)) {
} else if (state != TEXTSTRING_ITER_NEXT && state != TEXTSTRING_ITER_END) {
ret = OB_INVALID_DATA;
LOG_WARN("iter state invalid", K(ret), K(state));
ret = (str_iter1.get_inner_ret() != OB_SUCCESS) ?
str_iter1.get_inner_ret() : OB_INVALID_DATA;
LOG_WARN("iter state invalid", K(ret), K(state), K(str_iter1));
}
while (OB_SUCC(ret)
&& (state = str_iter2.get_next_block(src_block_data)) == TEXTSTRING_ITER_NEXT) {
@ -134,8 +135,9 @@ int ObExprConcat::calc_text(common::ObObj &result,
}
if (OB_FAIL(ret)) {
} else if (state != TEXTSTRING_ITER_NEXT && state != TEXTSTRING_ITER_END) {
ret = OB_INVALID_DATA;
LOG_WARN("iter state invalid", K(ret), K(state));
ret = (str_iter2.get_inner_ret() != OB_SUCCESS) ?
str_iter2.get_inner_ret() : OB_INVALID_DATA;
LOG_WARN("iter state invalid", K(ret), K(state), K(str_iter2));
}
}
if (OB_SUCC(ret)) {
@ -384,8 +386,9 @@ static int eval_concat_text(const ObExpr &expr, ObEvalCtx &ctx, ObDatum &expr_da
}
if (OB_FAIL(ret)) {
} else if (state != TEXTSTRING_ITER_NEXT && state != TEXTSTRING_ITER_END) {
ret = OB_INVALID_DATA;
LOG_WARN("iter state invalid", K(ret), K(state));
ret = (input_iter.get_inner_ret() != OB_SUCCESS) ?
input_iter.get_inner_ret() : OB_INVALID_DATA;
LOG_WARN("iter state invalid", K(ret), K(state), K(input_iter));
}
}
}

View File

@ -186,8 +186,9 @@ static int calc_oracle_instr_text(ObTextStringIter &haystack_iter,
not_first_search = true;
}
if (state != TEXTSTRING_ITER_NEXT && state != TEXTSTRING_ITER_END) {
ret = OB_INVALID_DATA;
LOG_WARN("get_calc_cs_type failed", K(ret), K(state));
ret = (haystack_iter.get_inner_ret() != OB_SUCCESS) ?
haystack_iter.get_inner_ret() : OB_INVALID_DATA;
LOG_WARN("iter state invalid", K(ret), K(state), K(haystack_iter));
} else {
if (idx != 0) {
// 需要加上get next block实际访问过的长度
@ -238,7 +239,7 @@ static int calc_oracle_instr_text(ObTextStringIter &haystack_iter,
haystack_data.assign_ptr(haystack_data.ptr(), accessed_byte_len);
}
}
for (; count < occ_int; ++count) {
for (; count < occ_int && OB_SUCC(ret); ++count) {
if (OB_FAIL(ObExprOracleInstr::slow_reverse_search(calc_alloc, calc_cs_type, haystack_data,
needle_data, pos_int, 1, idx))) {
LOG_WARN("slow_reverse_search failed", K(ret), K(calc_cs_type),
@ -258,8 +259,9 @@ static int calc_oracle_instr_text(ObTextStringIter &haystack_iter,
}
if (OB_FAIL(ret)) {
} else if (state != TEXTSTRING_ITER_NEXT && state != TEXTSTRING_ITER_END) {
ret = OB_INVALID_DATA;
LOG_WARN("get_calc_cs_type failed", K(ret), K(state));
ret = (haystack_iter.get_inner_ret() != OB_SUCCESS) ?
haystack_iter.get_inner_ret() : OB_INVALID_DATA;
LOG_WARN("iter state invalid", K(ret), K(state), K(haystack_iter));
} else {
if (idx != 0 && !access_inrow_lob_prefix) {
// need to count accessed length by get_next_block

View File

@ -122,12 +122,13 @@ static int calc_instrb_text(ObTextStringIter &haystack_iter,
bool not_first_search = false;
if (pos_int > 0) {
int64_t count = 0;
while (count < occ_int && (state = haystack_iter.get_next_block(haystack_data)) == TEXTSTRING_ITER_NEXT) {
while (OB_SUCC(ret) && count < occ_int &&
(state = haystack_iter.get_next_block(haystack_data)) == TEXTSTRING_ITER_NEXT) {
if (not_first_search) {
ret_idx = -1;
pos_int = 1;
}
for (; count < occ_int; ++count) {
for (; count < occ_int && OB_SUCC(ret); ++count) {
if (OB_FAIL(kmp_ctx->instrb_search(haystack_data, pos_int, 1, ret_idx))) {
LOG_WARN("search needle in haystack failed", K(ret), K(haystack_data), K(needle_data));
} else {
@ -140,9 +141,11 @@ static int calc_instrb_text(ObTextStringIter &haystack_iter,
}
not_first_search = true;
}
if (state != TEXTSTRING_ITER_NEXT && state != TEXTSTRING_ITER_END) {
ret = OB_INVALID_DATA;
LOG_WARN("get_calc_cs_type failed", K(ret), K(state));
if (OB_FAIL(ret)) {
} else if (state != TEXTSTRING_ITER_NEXT && state != TEXTSTRING_ITER_END) {
ret = (haystack_iter.get_inner_ret() != OB_SUCCESS) ?
haystack_iter.get_inner_ret() : OB_INVALID_DATA;
LOG_WARN("iter state invalid", K(ret), K(state), K(haystack_iter));
} else {
if (ret_idx != 0) { // add accessed length by get_next_block()
ret_idx += haystack_iter.get_last_accessed_byte_len() + haystack_iter.get_start_offset();
@ -172,7 +175,7 @@ static int calc_instrb_text(ObTextStringIter &haystack_iter,
ret_idx = -1;
pos_int = -1;
}
for (; count < occ_int; ++count) {
for (; count < occ_int && OB_SUCC(ret); ++count) {
if (OB_FAIL(kmp_ctx->instrb_search(haystack_data, pos_int, 1, ret_idx))) {
LOG_WARN("search needle in haystack failed", K(ret), K(haystack_data), K(needle_data));
} else {
@ -187,8 +190,9 @@ static int calc_instrb_text(ObTextStringIter &haystack_iter,
}
if (OB_FAIL(ret)) {
} else if (state != TEXTSTRING_ITER_NEXT && state != TEXTSTRING_ITER_END) {
ret = OB_INVALID_DATA;
LOG_WARN("get_calc_cs_type failed", K(ret), K(state));
ret = (haystack_iter.get_inner_ret() != OB_SUCCESS) ?
haystack_iter.get_inner_ret() : OB_INVALID_DATA;
LOG_WARN("iter state invalid", K(ret), K(state), K(haystack_iter));
} else {
if (ret_idx != 0) { // add accessed length by get_next_block()
ret_idx += (max_access_byte_len - static_cast<int64_t>(haystack_iter.get_accessed_byte_len()));

View File

@ -437,8 +437,9 @@ int ObExprLowerUpper::calc_common(const ObExpr &expr, ObEvalCtx &ctx,
}
if (OB_FAIL(ret)) {
} else if (state != TEXTSTRING_ITER_NEXT && state != TEXTSTRING_ITER_END) {
ret = OB_INVALID_DATA;
LOG_WARN("get_calc_cs_type failed", K(ret), K(state));
ret = (src_iter.get_inner_ret() != OB_SUCCESS) ?
src_iter.get_inner_ret() : OB_INVALID_DATA;
LOG_WARN("iter state invalid", K(ret), K(state), K(src_iter));
} else {
output_result.get_result_buffer(str_result);
}

View File

@ -5355,8 +5355,9 @@ int ObLocationExprOperator::calc_(const ObExpr &expr, const ObExpr &sub_arg,
sub_str_data.ptr(), sub_str_data.length(), pos_int);
}
if (state != TEXTSTRING_ITER_NEXT && state != TEXTSTRING_ITER_END) {
ret = OB_INVALID_DATA;
LOG_WARN("get_calc_cs_type failed", K(ret), K(state));
ret = (ori_str_iter.get_inner_ret() != OB_SUCCESS) ?
ori_str_iter.get_inner_ret() : OB_INVALID_DATA;
LOG_WARN("iter state invalid", K(ret), K(state), K(ori_str_iter));
} else {
if (idx != 0) {
// need to add length accessed by get_next_block

View File

@ -138,8 +138,9 @@ int calc_reverse_expr(const ObExpr &expr, ObEvalCtx &ctx, ObDatum &res_datum)
}
if (OB_FAIL(ret)) {
} else if (state != TEXTSTRING_ITER_NEXT && state != TEXTSTRING_ITER_END) {
ret = OB_INVALID_DATA;
LOG_WARN("iter state invalid", K(ret), K(state));
ret = (input_iter.get_inner_ret() != OB_SUCCESS) ?
input_iter.get_inner_ret() : OB_INVALID_DATA;
LOG_WARN("iter state invalid", K(ret), K(state), K(input_iter));
} else {
output_result.set_result();
}

View File

@ -586,8 +586,9 @@ static int eval_substr_text(const ObCollationType &cs_type,
}
if (OB_FAIL(ret)) {
} else if (state != TEXTSTRING_ITER_NEXT && state != TEXTSTRING_ITER_END) {
ret = OB_INVALID_DATA;
LOG_WARN("iter state invalid", K(ret), K(state));
ret = (input_iter.get_inner_ret() != OB_SUCCESS) ?
input_iter.get_inner_ret() : OB_INVALID_DATA;
LOG_WARN("iter state invalid", K(ret), K(state), K(input_iter));
} else {
output_result.set_result();
}

View File

@ -485,8 +485,9 @@ int ObExprSubstrb::calc_substrb_expr(const ObExpr &expr, ObEvalCtx &ctx, ObDatum
}
if (OB_FAIL(ret)) {
} else if (state != TEXTSTRING_ITER_NEXT && state != TEXTSTRING_ITER_END) {
ret = OB_INVALID_DATA;
LOG_WARN("iter state invalid", K(ret), K(state));
ret = (input_iter.get_inner_ret() != OB_SUCCESS) ?
input_iter.get_inner_ret() : OB_INVALID_DATA;
LOG_WARN("iter state invalid", K(ret), K(state), K(input_iter));
} else {
output_result.set_result();
}

View File

@ -114,8 +114,9 @@ int ObExprToBlob::eval_to_blob(const ObExpr &expr, ObEvalCtx &ctx, ObDatum &res)
}
if (OB_FAIL(ret)) {
} else if (state != TEXTSTRING_ITER_NEXT && state != TEXTSTRING_ITER_END) {
ret = OB_INVALID_DATA;
LOG_WARN("iter state invalid", K(ret), K(state));
ret = (input_iter.get_inner_ret() != OB_SUCCESS) ?
input_iter.get_inner_ret() : OB_INVALID_DATA;
LOG_WARN("iter state invalid", K(ret), K(state), K(input_iter));
} else {
str_result.set_result();
OB_ASSERT(off == res_len);

View File

@ -483,8 +483,9 @@ static int text_trim2(ObTextStringIter &str_iter,
}
if (OB_FAIL(ret)) {
} else if (state != TEXTSTRING_ITER_NEXT && state != TEXTSTRING_ITER_END) {
ret = OB_INVALID_DATA;
LOG_WARN("iter state invalid", K(ret), K(state));
ret = (str_iter.get_inner_ret() != OB_SUCCESS) ?
str_iter.get_inner_ret() : OB_INVALID_DATA;
LOG_WARN("iter state invalid", K(ret), K(state), K(str_iter));
} else if (!output_result.is_init() && OB_FAIL(output_result.init(0))) { // nothing found build empty lob
LOG_WARN("init stringtext result for empty lob failed", K(ret));
} else {
@ -650,8 +651,9 @@ static int text_trim(ObTextStringIter &str_iter,
}
if (OB_FAIL(ret)) {
} else if (state != TEXTSTRING_ITER_NEXT && state != TEXTSTRING_ITER_END) {
ret = OB_INVALID_DATA;
LOG_WARN("iter state invalid", K(ret), K(state));
ret = (str_iter.get_inner_ret() != OB_SUCCESS) ?
str_iter.get_inner_ret() : OB_INVALID_DATA;
LOG_WARN("iter state invalid", K(ret), K(state), K(str_iter));
} else if (!output_result.is_init() && OB_FAIL(output_result.init(0))) { // nothing found build empty lob
LOG_WARN("init stringtext result for empty lob failed", K(ret));
} else {