[CP][BUGFIX] fix trim process single outrow lob
This commit is contained in:
@ -560,6 +560,14 @@ int ObTextStringIter::get_next_block_inner(ObString &str)
|
|||||||
COMMON_LOG(WARN,"Lob: falied to get first block.", K(ret));
|
COMMON_LOG(WARN,"Lob: falied to get first block.", K(ret));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
// if put backward, we should compact buffer remain and move reserved part closed to the reading value
|
||||||
|
if (output_data.remain() > 0 && ctx_->is_backward_ && ctx_->reserved_byte_len_ > 0) {
|
||||||
|
// from :[0, output_data.length_][output_data.length_, output_data.buffer_size_][reserved_part]
|
||||||
|
// to :[0, output_data.length_][reserved_part]
|
||||||
|
MEMMOVE(output_data.ptr() + output_data.length(),
|
||||||
|
output_data.ptr() + output_data.length() + output_data.remain(),
|
||||||
|
ctx_->reserved_byte_len_);
|
||||||
|
}
|
||||||
ctx_->content_byte_len_ = ctx_->reserved_byte_len_ + output_data.length();
|
ctx_->content_byte_len_ = ctx_->reserved_byte_len_ + output_data.length();
|
||||||
// ToDo: @gehao get directly from lob mngr ?
|
// ToDo: @gehao get directly from lob mngr ?
|
||||||
uint32 cur_out_len = static_cast<uint32_t>(ObCharset::strlen_char(cs_type_,
|
uint32 cur_out_len = static_cast<uint32_t>(ObCharset::strlen_char(cs_type_,
|
||||||
@ -569,7 +577,7 @@ int ObTextStringIter::get_next_block_inner(ObString &str)
|
|||||||
ctx_->last_accessed_byte_len_ = ctx_->accessed_byte_len_;
|
ctx_->last_accessed_byte_len_ = ctx_->accessed_byte_len_;
|
||||||
ctx_->last_accessed_len_ = ctx_->accessed_len_;
|
ctx_->last_accessed_len_ = ctx_->accessed_len_;
|
||||||
ctx_->accessed_byte_len_ += output_data.length();
|
ctx_->accessed_byte_len_ += output_data.length();
|
||||||
ctx_->accessed_len_ += cur_out_len;\
|
ctx_->accessed_len_ += cur_out_len;
|
||||||
ctx_->iter_count_++;
|
ctx_->iter_count_++;
|
||||||
str.assign_ptr(ctx_->buff_, ctx_->content_byte_len_);
|
str.assign_ptr(ctx_->buff_, ctx_->content_byte_len_);
|
||||||
}
|
}
|
||||||
@ -658,7 +666,7 @@ void ObTextStringIter::set_reserved_byte_len(uint32_t reserved_byte_len)
|
|||||||
|
|
||||||
void ObTextStringIter::reset_reserve_len()
|
void ObTextStringIter::reset_reserve_len()
|
||||||
{
|
{
|
||||||
if (is_valid_for_config()) {
|
if (is_valid_for_config(TEXTSTRING_ITER_NEXT)) {
|
||||||
ctx_->reserved_byte_len_ = 0;
|
ctx_->reserved_byte_len_ = 0;
|
||||||
ctx_->reserved_len_ = 0;
|
ctx_->reserved_len_ = 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -198,10 +198,10 @@ private:
|
|||||||
int get_outrow_prefix_data(uint32_t prefix_char_len);
|
int get_outrow_prefix_data(uint32_t prefix_char_len);
|
||||||
int reserve_data();
|
int reserve_data();
|
||||||
int reserve_byte_data();
|
int reserve_byte_data();
|
||||||
OB_INLINE bool is_valid_for_config()
|
OB_INLINE bool is_valid_for_config(ObTextStringIterState valid_state = TEXTSTRING_ITER_INIT)
|
||||||
{
|
{
|
||||||
return (is_init_ && is_outrow_ && has_lob_header_
|
return (is_init_ && is_outrow_ && has_lob_header_
|
||||||
&& state_ == TEXTSTRING_ITER_INIT && OB_NOT_NULL(ctx_));
|
&& state_ == valid_state && OB_NOT_NULL(ctx_));
|
||||||
}
|
}
|
||||||
private:
|
private:
|
||||||
ObObjType type_;
|
ObObjType type_;
|
||||||
|
|||||||
@ -435,12 +435,12 @@ static int text_trim2(ObTextStringIter &str_iter,
|
|||||||
int64_t result_len = output.length() + (total_byte_len - str_iter.get_accessed_byte_len());
|
int64_t result_len = output.length() + (total_byte_len - str_iter.get_accessed_byte_len());
|
||||||
if (OB_FAIL(output_result.init(result_len))) {
|
if (OB_FAIL(output_result.init(result_len))) {
|
||||||
LOG_WARN("init stringtext result failed", K(ret), K(result_len));
|
LOG_WARN("init stringtext result failed", K(ret), K(result_len));
|
||||||
} else {
|
} else if (OB_FAIL(output_result.append(output))) {
|
||||||
output_result.append(output);
|
LOG_WARN("fail to append to result", K(ret), K(output.length()), K(output_result));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else if (OB_FAIL(output_result.append(str_data))) {
|
||||||
output_result.append(str_data);
|
LOG_WARN("fail to append to result", K(ret), K(str_data.length()), K(output_result));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (trim_type == ObExprTrim::TYPE_RTRIM) {
|
} else if (trim_type == ObExprTrim::TYPE_RTRIM) {
|
||||||
@ -525,12 +525,12 @@ static int text_trim(ObTextStringIter &str_iter,
|
|||||||
int64_t result_len = output.length() + (total_byte_len - str_iter.get_accessed_byte_len());
|
int64_t result_len = output.length() + (total_byte_len - str_iter.get_accessed_byte_len());
|
||||||
if (OB_FAIL(output_result.init(result_len))) {
|
if (OB_FAIL(output_result.init(result_len))) {
|
||||||
LOG_WARN("init stringtext result failed", K(ret), K(result_len));
|
LOG_WARN("init stringtext result failed", K(ret), K(result_len));
|
||||||
} else {
|
} else if (OB_FAIL(output_result.append(output))) {
|
||||||
output_result.append(output);
|
LOG_WARN("fail to append to result", K(ret), K(output.length()), K(output_result));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else if (OB_FAIL(output_result.append(str_data))) {
|
||||||
output_result.append(str_data);
|
LOG_WARN("fail to append to result", K(ret), K(str_data.length()), K(output_result));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (trim_type == ObExprTrim::TYPE_RTRIM) {
|
} else if (trim_type == ObExprTrim::TYPE_RTRIM) {
|
||||||
@ -553,16 +553,24 @@ static int text_trim(ObTextStringIter &str_iter,
|
|||||||
LOG_WARN("stringtext result reserve buffer failed", K(ret));
|
LOG_WARN("stringtext result reserve buffer failed", K(ret));
|
||||||
} else if (OB_FAIL(output_result.lseek(result_len, 0))) {
|
} else if (OB_FAIL(output_result.lseek(result_len, 0))) {
|
||||||
LOG_WARN("result lseek failed", K(ret));
|
LOG_WARN("result lseek failed", K(ret));
|
||||||
|
} else if (buf_size < output.length()) {
|
||||||
|
ret = OB_ERR_UNEXPECTED;
|
||||||
|
LOG_WARN("buf size is wrong with data length", K(ret), K(buf_size), K(output.length()));
|
||||||
} else {
|
} else {
|
||||||
buf_pos = buf_size - output.length();
|
buf_pos = buf_size - output.length();
|
||||||
MEMCPY(buf + buf_pos, output.ptr(), output.length());
|
MEMCPY(buf + buf_pos, output.ptr(), output.length());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
if (buf_pos < str_data.length()) {
|
||||||
|
ret = OB_ERR_UNEXPECTED;
|
||||||
|
LOG_WARN("buf pos is wrong with data length", K(ret), K(buf_pos), K(str_data.length()));
|
||||||
} else {
|
} else {
|
||||||
buf_pos -= str_data.length();
|
buf_pos -= str_data.length();
|
||||||
MEMCPY(buf + buf_pos, str_data.ptr(), str_data.length());
|
MEMCPY(buf + buf_pos, str_data.ptr(), str_data.length());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
if (OB_SUCC(ret)) {
|
if (OB_SUCC(ret)) {
|
||||||
OB_ASSERT(buf_pos == 0);
|
OB_ASSERT(buf_pos == 0);
|
||||||
}
|
}
|
||||||
@ -576,23 +584,27 @@ static int text_trim(ObTextStringIter &str_iter,
|
|||||||
&& found_start == false
|
&& found_start == false
|
||||||
&& is_finished == false
|
&& is_finished == false
|
||||||
&& (state = str_iter.get_next_block(str_data)) == TEXTSTRING_ITER_NEXT) {
|
&& (state = str_iter.get_next_block(str_data)) == TEXTSTRING_ITER_NEXT) {
|
||||||
if (OB_FAIL(ObExprTrim::trim(output, trim_type, pattern, str_data))) {
|
if (OB_FAIL(ObExprTrim::trim(output, ObExprTrim::TYPE_LTRIM, pattern, str_data))) {
|
||||||
LOG_WARN("do trim failed", K(ret));
|
LOG_WARN("do front ltrim failed", K(ret), K(pattern), K(str_data));
|
||||||
} else if (str_iter.get_accessed_byte_len() == total_byte_len) { // accessed to the end of data
|
|
||||||
is_finished = true;
|
|
||||||
if (OB_FAIL(output_result.init(output.length()))) {
|
|
||||||
LOG_WARN("init stringtext result failed", K(ret), K(output.length()));
|
|
||||||
} else {
|
|
||||||
output_result.append(output);
|
|
||||||
}
|
|
||||||
} else if (output.length() != 0) {
|
} else if (output.length() != 0) {
|
||||||
found_start = true;
|
found_start = true;
|
||||||
str_iter.reset_reserve_len();
|
str_iter.reset_reserve_len();
|
||||||
start_pos = total_byte_len - str_iter.get_accessed_byte_len() + str_data.length();
|
start_pos = str_iter.get_accessed_byte_len() - output.length();
|
||||||
// output not copied
|
// output not copied
|
||||||
|
} else if (str_iter.get_accessed_byte_len() == total_byte_len) { // search to end and all output is zero
|
||||||
|
is_finished = true;
|
||||||
|
if (OB_FAIL(output_result.init(output.length()))) {
|
||||||
|
LOG_WARN("init stringtext result failed", K(ret), K(output.length()));
|
||||||
|
} else if (OB_FAIL(output_result.append(output))) {
|
||||||
|
LOG_WARN("fail to append to result", K(ret), K(output.length()), K(output_result));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (OB_FAIL(ret) || is_finished) {
|
if (OB_FAIL(ret) || is_finished) {
|
||||||
|
} else if (state != TEXTSTRING_ITER_NEXT && state != TEXTSTRING_ITER_END) {
|
||||||
|
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 {
|
} else {
|
||||||
OB_ASSERT(found_start);
|
OB_ASSERT(found_start);
|
||||||
// find end
|
// find end
|
||||||
@ -607,9 +619,9 @@ static int text_trim(ObTextStringIter &str_iter,
|
|||||||
bool found_end = false;
|
bool found_end = false;
|
||||||
while (OB_SUCC(ret)
|
while (OB_SUCC(ret)
|
||||||
&& found_end == false
|
&& found_end == false
|
||||||
&& (back_state = str_iter.get_next_block(str_data)) == TEXTSTRING_ITER_NEXT) {
|
&& (back_state = str_backward_iter.get_next_block(backward_str_data)) == TEXTSTRING_ITER_NEXT) {
|
||||||
if (OB_FAIL(ObExprTrim::trim(backward_output, ObExprTrim::TYPE_RTRIM, pattern, backward_str_data))) {
|
if (OB_FAIL(ObExprTrim::trim(backward_output, ObExprTrim::TYPE_RTRIM, pattern, backward_str_data))) {
|
||||||
LOG_WARN("do trim failed", K(ret));
|
LOG_WARN("do backward rtrim failed", K(ret), K(pattern), K(backward_str_data));
|
||||||
} else if (backward_output.length() != 0) {
|
} else if (backward_output.length() != 0) {
|
||||||
found_end = true;
|
found_end = true;
|
||||||
end_pos = total_byte_len - str_backward_iter.get_accessed_byte_len() + backward_output.length();
|
end_pos = total_byte_len - str_backward_iter.get_accessed_byte_len() + backward_output.length();
|
||||||
@ -618,6 +630,10 @@ static int text_trim(ObTextStringIter &str_iter,
|
|||||||
// copy from start to end
|
// copy from start to end
|
||||||
int result_len = end_pos - start_pos;
|
int result_len = end_pos - start_pos;
|
||||||
if (OB_FAIL(ret)) {
|
if (OB_FAIL(ret)) {
|
||||||
|
} else if (state != TEXTSTRING_ITER_NEXT && state != TEXTSTRING_ITER_END) {
|
||||||
|
ret = (str_backward_iter.get_inner_ret() != OB_SUCCESS) ?
|
||||||
|
str_backward_iter.get_inner_ret() : OB_INVALID_DATA;
|
||||||
|
LOG_WARN("str_backward_iter state invalid", K(ret), K(state), K(str_backward_iter));
|
||||||
} else if (result_len < 0) {
|
} else if (result_len < 0) {
|
||||||
ret = OB_SIZE_OVERFLOW;
|
ret = OB_SIZE_OVERFLOW;
|
||||||
LOG_WARN("init stringtext result failed", K(ret), K(start_pos), K(end_pos));
|
LOG_WARN("init stringtext result failed", K(ret), K(start_pos), K(end_pos));
|
||||||
@ -625,25 +641,23 @@ static int text_trim(ObTextStringIter &str_iter,
|
|||||||
// the same as input if it is a temp lob?
|
// the same as input if it is a temp lob?
|
||||||
} else if (OB_FAIL(output_result.init(result_len))) {
|
} else if (OB_FAIL(output_result.init(result_len))) {
|
||||||
LOG_WARN("init stringtext result failed", K(ret), K(output.length()));
|
LOG_WARN("init stringtext result failed", K(ret), K(output.length()));
|
||||||
} else if (OB_FAIL(output_result.append(output))) {
|
|
||||||
// error log
|
|
||||||
} else {
|
} else {
|
||||||
result_len -= output.length();
|
str_data = output;
|
||||||
while (OB_SUCC(ret) && (state = str_iter.get_next_block(str_data)) == TEXTSTRING_ITER_NEXT) {
|
do {
|
||||||
if (str_data.length() > result_len) {
|
if (str_data.length() > result_len) {
|
||||||
if (OB_FAIL(output_result.append(str_data.ptr(), result_len))) {
|
if (OB_FAIL(output_result.append(str_data.ptr(), result_len))) {
|
||||||
// error log
|
LOG_WARN("fail to append to result", K(ret), K(result_len), K(output_result));
|
||||||
} else {
|
} else {
|
||||||
result_len = 0;
|
result_len = 0;
|
||||||
}
|
}
|
||||||
} else if (OB_FAIL(output_result.append(str_data))) {
|
} else if (OB_FAIL(output_result.append(str_data))) {
|
||||||
// error log
|
LOG_WARN("fail to append to result", K(ret), K(str_data.length()), K(output_result));
|
||||||
} else {
|
} else {
|
||||||
result_len -= str_data.length();
|
result_len -= str_data.length();
|
||||||
}
|
}
|
||||||
}
|
} while (OB_SUCC(ret) && result_len > 0 && (state = str_iter.get_next_block(str_data)) == TEXTSTRING_ITER_NEXT);
|
||||||
if (OB_SUCC(ret)) {
|
if (OB_SUCC(ret)) {
|
||||||
OB_ASSERT(result_len = 0);
|
OB_ASSERT(result_len == 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -194,3 +194,63 @@ select TRIM(LEADING 'a' FROM TRIM(SUBSTR(REPEAT(NULL, 4 + 1), 1, LEAST(146, 20))
|
|||||||
| NULL |
|
| NULL |
|
||||||
+-----------------------------------------------------------------------------+
|
+-----------------------------------------------------------------------------+
|
||||||
|
|
||||||
|
create table t1 (c1 longtext);
|
||||||
|
insert into t1 values(concat(repeat(' ', 256*1024), 'ad'));
|
||||||
|
insert into t1 values(concat('ad', repeat(' ', 256*1024)));
|
||||||
|
insert into t1 values(concat(repeat(' ', 256*1024), 'ad', repeat(' ', 256*1024)));
|
||||||
|
select length(c1) from t1;
|
||||||
|
+------------+
|
||||||
|
| length(c1) |
|
||||||
|
+------------+
|
||||||
|
| 262146 |
|
||||||
|
| 262146 |
|
||||||
|
| 524290 |
|
||||||
|
+------------+
|
||||||
|
select length(trim(c1)), trim(c1) from t1;
|
||||||
|
+------------------+----------+
|
||||||
|
| length(trim(c1)) | trim(c1) |
|
||||||
|
+------------------+----------+
|
||||||
|
| 2 | ad |
|
||||||
|
| 2 | ad |
|
||||||
|
| 2 | ad |
|
||||||
|
+------------------+----------+
|
||||||
|
drop table t1;
|
||||||
|
|
||||||
|
create table t1 (c1 longtext);
|
||||||
|
insert into t1 values(concat(repeat('abcd', 600*1024), 'xx'));
|
||||||
|
insert into t1 values(concat('xx', repeat('abcd', 600*1024)));
|
||||||
|
insert into t1 values(concat(repeat('abcd', 600*1024), 'xx', repeat('abcd', 600*1024)));
|
||||||
|
select length(c1) from t1;
|
||||||
|
+------------+
|
||||||
|
| length(c1) |
|
||||||
|
+------------+
|
||||||
|
| 2457602 |
|
||||||
|
| 2457602 |
|
||||||
|
| 4915202 |
|
||||||
|
+------------+
|
||||||
|
select length(trim(leading 'abcd' from c1)) from t1;
|
||||||
|
+--------------------------------------+
|
||||||
|
| length(trim(leading 'abcd' from c1)) |
|
||||||
|
+--------------------------------------+
|
||||||
|
| 2 |
|
||||||
|
| 2457602 |
|
||||||
|
| 2457602 |
|
||||||
|
+--------------------------------------+
|
||||||
|
select length(trim(trailing 'abcd' from c1)) from t1;
|
||||||
|
+---------------------------------------+
|
||||||
|
| length(trim(trailing 'abcd' from c1)) |
|
||||||
|
+---------------------------------------+
|
||||||
|
| 2457602 |
|
||||||
|
| 2 |
|
||||||
|
| 2457602 |
|
||||||
|
+---------------------------------------+
|
||||||
|
select length(trim(both 'abcd' from c1)) from t1;
|
||||||
|
+-----------------------------------+
|
||||||
|
| length(trim(both 'abcd' from c1)) |
|
||||||
|
+-----------------------------------+
|
||||||
|
| 2 |
|
||||||
|
| 2 |
|
||||||
|
| 2 |
|
||||||
|
+-----------------------------------+
|
||||||
|
drop table t1;
|
||||||
|
|
||||||
|
|||||||
@ -70,5 +70,23 @@ select collation(TRIM( BOTH _binary'a' FROM _gbk'abc' )) ;
|
|||||||
|
|
||||||
select TRIM(LEADING 'a' FROM TRIM(SUBSTR(REPEAT(NULL, 4 + 1), 1, LEAST(146, 20))));
|
select TRIM(LEADING 'a' FROM TRIM(SUBSTR(REPEAT(NULL, 4 + 1), 1, LEAST(146, 20))));
|
||||||
|
|
||||||
|
create table t1 (c1 longtext);
|
||||||
|
insert into t1 values(concat(repeat(' ', 256*1024), 'ad'));
|
||||||
|
insert into t1 values(concat('ad', repeat(' ', 256*1024)));
|
||||||
|
insert into t1 values(concat(repeat(' ', 256*1024), 'ad', repeat(' ', 256*1024)));
|
||||||
|
select length(c1) from t1;
|
||||||
|
select length(trim(c1)), trim(c1) from t1;
|
||||||
|
drop table t1;
|
||||||
|
|
||||||
|
create table t1 (c1 longtext);
|
||||||
|
insert into t1 values(concat(repeat('abcd', 600*1024), 'xx'));
|
||||||
|
insert into t1 values(concat('xx', repeat('abcd', 600*1024)));
|
||||||
|
insert into t1 values(concat(repeat('abcd', 600*1024), 'xx', repeat('abcd', 600*1024)));
|
||||||
|
select length(c1) from t1;
|
||||||
|
select length(trim(leading 'abcd' from c1)) from t1;
|
||||||
|
select length(trim(trailing 'abcd' from c1)) from t1;
|
||||||
|
select length(trim(both 'abcd' from c1)) from t1;
|
||||||
|
drop table t1;
|
||||||
|
|
||||||
connection syscon;
|
connection syscon;
|
||||||
--sleep 2
|
--sleep 2
|
||||||
|
|||||||
Reference in New Issue
Block a user