From 2e954397ec05db47f0a3e0a1e353c506f82c2c40 Mon Sep 17 00:00:00 2001 From: obdev Date: Mon, 20 Feb 2023 12:45:01 +0000 Subject: [PATCH] [BUGFIX] fix dbms lob instr when partten larger than lob --- src/sql/engine/expr/ob_expr_instr.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/sql/engine/expr/ob_expr_instr.cpp b/src/sql/engine/expr/ob_expr_instr.cpp index 266f8cff6..1383ed1ef 100644 --- a/src/sql/engine/expr/ob_expr_instr.cpp +++ b/src/sql/engine/expr/ob_expr_instr.cpp @@ -136,14 +136,21 @@ static int calc_oracle_instr_text(ObTextStringIter &haystack_iter, ObString haystack_data; ObString needle_data; int64_t needle_char_len = 0; + int64_t haystack_char_len = 0; + int64_t abs_pos_int = (pos_int > 0) ? (pos_int) : (-pos_int); if (OB_FAIL(haystack_iter.init(0, NULL, &calc_alloc))) { LOG_WARN("init haystack_iter failed ", K(ret), K(haystack_iter)); + } else if (OB_FAIL(haystack_iter.get_char_len(haystack_char_len))) { + LOG_WARN("get haystack char len failed ", K(ret), K(haystack_iter)); } else if (OB_FAIL(needle_iter.init(0, NULL, &calc_alloc))) { LOG_WARN("init needle_iter failed ", K(ret), K(needle_iter)); } else if (OB_FAIL(needle_iter.get_full_data(needle_data))) { LOG_WARN("get needle data failed ", K(ret), K(needle_iter)); } else if (OB_FAIL(needle_iter.get_char_len(needle_char_len))) { - LOG_WARN("init lob str iter failed ", K(ret), K(needle_iter)); + LOG_WARN("get needle char len failed ", K(ret), K(needle_iter)); + } else if (haystack_char_len - abs_pos_int < needle_char_len) { + // pattern length is bigger than content, just return zero + idx = 0; } else { if (haystack_iter.is_outrow_lob()) { haystack_iter.set_reserved_len(static_cast(needle_char_len) - 1);