fix load data bug

This commit is contained in:
wjhh2008
2023-08-17 11:28:01 +00:00
committed by ob-robot
parent 90ae6c4e43
commit 7a833991a5
4 changed files with 32 additions and 8 deletions

View File

@ -43,6 +43,7 @@
#include "share/backup/ob_backup_io_adapter.h"
#include "storage/tx_storage/ob_tenant_freezer.h"
#include "sql/rewrite/ob_transform_utils.h"
#include "observer/omt/ob_tenant_timezone_mgr.h"
using namespace oceanbase::sql;
using namespace oceanbase::common;
@ -518,7 +519,7 @@ int ObInsertValueGenerator::gen_insert_values(ObIArray<ObString> &insert_values,
}
}
if (OB_SUCC(ret)) {
ObHexEscapeSqlStr escape_str(const_string);
ObHexEscapeSqlStr escape_str(const_string, !!(SMO_NO_BACKSLASH_ESCAPES & sql_mode_));
int64_t len = escape_str.to_string(data_buffer_->current_ptr() + 1, data_buffer_->get_remain_len() - 1);
if (OB_UNLIKELY(len + 2 >= data_buffer_->get_remain_len())) {
ret = OB_SIZE_OVERFLOW;
@ -571,10 +572,11 @@ int ObInsertValueGenerator::gen_insert_sql(ObSqlString &insert_sql)
return ret;
}
int ObInsertValueGenerator::set_params(ObString &insert_header, ObCollationType cs_type)
int ObInsertValueGenerator::set_params(ObString &insert_header, ObCollationType cs_type, int64_t sql_mode)
{
insert_header_ = insert_header;
cs_type_ = cs_type;
sql_mode_ = sql_mode;
return OB_SUCCESS;
}
@ -1226,10 +1228,22 @@ int ObLoadDataSPImpl::exec_insert(ObInsertTask &task, ObInsertResult& result)
K(ret), K(deserialized_rows), K(task.row_count_));
}
if (OB_SUCC(ret)) {
ObTZMapWrap tz_map_wrap;
if (OB_FAIL(OTTZ_MGR.get_tenant_tz(task.tenant_id_, tz_map_wrap))) {
LOG_WARN("get tenant timezone map failed", K(ret));
} else {
task.timezone_.set_tz_info_map(tz_map_wrap.get_tz_map());
}
}
int64_t affected_rows = 0;
ObSessionParam param;
param.is_load_data_exec_ = true;
param.sql_mode_ = &task.sql_mode_;
param.tz_info_wrap_ = &task.timezone_;
if (OB_SUCC(ret) && OB_FAIL(GCTX.sql_proxy_->write(task.tenant_id_,
sql_str.string(),
affected_rows,
@ -2747,7 +2761,8 @@ int ObLoadDataSPImpl::ToolBox::init(ObExecContext &ctx, ObLoadDataStmt &load_stm
ObLoadFileBuffer::MAX_BUFFER_SIZE - sizeof(ObLoadFileBuffer)))) {
} else if (OB_FAIL(generator.init(*session, expr_buffer, ctx.get_sql_ctx()->schema_guard_))) {
LOG_WARN("fail to init generator", K(ret));
} else if (OB_FAIL(generator.set_params(insert_stmt_head_buff, load_args.file_cs_type_))) {
} else if (OB_FAIL(generator.set_params(insert_stmt_head_buff, load_args.file_cs_type_,
session->get_sql_mode()))) {
LOG_WARN("fail to set pararms", K(ret));
} else if (OB_FAIL(copy_exprs_for_shuffle_task(ctx, load_stmt, insert_infos,
generator.get_field_exprs(),
@ -2881,7 +2896,7 @@ int ObLoadDataSPImpl::ToolBox::init(ObExecContext &ctx, ObLoadDataStmt &load_stm
LOG_WARN("fail to deserialize", K(ret));
} else if (OB_FAIL(handle->parser.init(file_formats, num_of_file_column, load_args.file_cs_type_))) {
LOG_WARN("fail to init parser", K(ret));
} else if (OB_FAIL(handle->generator.set_params(insert_stmt_head_buff, load_args.file_cs_type_))) {
} else if (OB_FAIL(handle->generator.set_params(insert_stmt_head_buff, load_args.file_cs_type_, session->get_sql_mode()))) {
LOG_WARN("fail to set params", K(ret));
} else if (OB_FAIL(copy_exprs_for_shuffle_task(ctx, load_stmt, insert_infos,
handle->generator.get_field_exprs(),
@ -2920,6 +2935,8 @@ int ObLoadDataSPImpl::ToolBox::init(ObExecContext &ctx, ObLoadDataStmt &load_stm
if (OB_ISNULL(insert_task = OB_NEWx(ObInsertTask, (&ctx.get_allocator())))) {
ret = OB_ALLOCATE_MEMORY_FAILED;
LOG_WARN("Failed to alloc", K(ret));
} else if (OB_FAIL(insert_task->timezone_.deep_copy(ctx.get_my_session()->get_tz_info_wrap()))) {
LOG_WARN("fail to copy timezone", K(ret));
} else {
//insert的column name都是一样的,所有的task共用一块儿buf做序列化就可以了
insert_task->insert_stmt_head_ = insert_stmt_head_buff;
@ -2927,6 +2944,7 @@ int ObLoadDataSPImpl::ToolBox::init(ObExecContext &ctx, ObLoadDataStmt &load_stm
insert_task->row_count_ = batch_row_count;
insert_task->tenant_id_ = ctx.get_my_session()->get_effective_tenant_id();
insert_task->token_server_idx_ = server_j;
insert_task->sql_mode_ = ctx.get_my_session()->get_sql_mode();
if (OB_FAIL(insert_resource.push_back(insert_task))) {
insert_task->~ObInsertTask();
LOG_WARN("fail to push back", K(ret));