fix load data bug
This commit is contained in:
@ -43,6 +43,7 @@
|
|||||||
#include "share/backup/ob_backup_io_adapter.h"
|
#include "share/backup/ob_backup_io_adapter.h"
|
||||||
#include "storage/tx_storage/ob_tenant_freezer.h"
|
#include "storage/tx_storage/ob_tenant_freezer.h"
|
||||||
#include "sql/rewrite/ob_transform_utils.h"
|
#include "sql/rewrite/ob_transform_utils.h"
|
||||||
|
#include "observer/omt/ob_tenant_timezone_mgr.h"
|
||||||
|
|
||||||
using namespace oceanbase::sql;
|
using namespace oceanbase::sql;
|
||||||
using namespace oceanbase::common;
|
using namespace oceanbase::common;
|
||||||
@ -518,7 +519,7 @@ int ObInsertValueGenerator::gen_insert_values(ObIArray<ObString> &insert_values,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (OB_SUCC(ret)) {
|
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);
|
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())) {
|
if (OB_UNLIKELY(len + 2 >= data_buffer_->get_remain_len())) {
|
||||||
ret = OB_SIZE_OVERFLOW;
|
ret = OB_SIZE_OVERFLOW;
|
||||||
@ -571,10 +572,11 @@ int ObInsertValueGenerator::gen_insert_sql(ObSqlString &insert_sql)
|
|||||||
return ret;
|
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;
|
insert_header_ = insert_header;
|
||||||
cs_type_ = cs_type;
|
cs_type_ = cs_type;
|
||||||
|
sql_mode_ = sql_mode;
|
||||||
return OB_SUCCESS;
|
return OB_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1226,10 +1228,22 @@ int ObLoadDataSPImpl::exec_insert(ObInsertTask &task, ObInsertResult& result)
|
|||||||
K(ret), K(deserialized_rows), K(task.row_count_));
|
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;
|
int64_t affected_rows = 0;
|
||||||
ObSessionParam param;
|
ObSessionParam param;
|
||||||
param.is_load_data_exec_ = true;
|
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_,
|
if (OB_SUCC(ret) && OB_FAIL(GCTX.sql_proxy_->write(task.tenant_id_,
|
||||||
sql_str.string(),
|
sql_str.string(),
|
||||||
affected_rows,
|
affected_rows,
|
||||||
@ -2747,7 +2761,8 @@ int ObLoadDataSPImpl::ToolBox::init(ObExecContext &ctx, ObLoadDataStmt &load_stm
|
|||||||
ObLoadFileBuffer::MAX_BUFFER_SIZE - sizeof(ObLoadFileBuffer)))) {
|
ObLoadFileBuffer::MAX_BUFFER_SIZE - sizeof(ObLoadFileBuffer)))) {
|
||||||
} else if (OB_FAIL(generator.init(*session, expr_buffer, ctx.get_sql_ctx()->schema_guard_))) {
|
} else if (OB_FAIL(generator.init(*session, expr_buffer, ctx.get_sql_ctx()->schema_guard_))) {
|
||||||
LOG_WARN("fail to init generator", K(ret));
|
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));
|
LOG_WARN("fail to set pararms", K(ret));
|
||||||
} else if (OB_FAIL(copy_exprs_for_shuffle_task(ctx, load_stmt, insert_infos,
|
} else if (OB_FAIL(copy_exprs_for_shuffle_task(ctx, load_stmt, insert_infos,
|
||||||
generator.get_field_exprs(),
|
generator.get_field_exprs(),
|
||||||
@ -2881,7 +2896,7 @@ int ObLoadDataSPImpl::ToolBox::init(ObExecContext &ctx, ObLoadDataStmt &load_stm
|
|||||||
LOG_WARN("fail to deserialize", K(ret));
|
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_))) {
|
} 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));
|
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));
|
LOG_WARN("fail to set params", K(ret));
|
||||||
} else if (OB_FAIL(copy_exprs_for_shuffle_task(ctx, load_stmt, insert_infos,
|
} else if (OB_FAIL(copy_exprs_for_shuffle_task(ctx, load_stmt, insert_infos,
|
||||||
handle->generator.get_field_exprs(),
|
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())))) {
|
if (OB_ISNULL(insert_task = OB_NEWx(ObInsertTask, (&ctx.get_allocator())))) {
|
||||||
ret = OB_ALLOCATE_MEMORY_FAILED;
|
ret = OB_ALLOCATE_MEMORY_FAILED;
|
||||||
LOG_WARN("Failed to alloc", K(ret));
|
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 {
|
} else {
|
||||||
//insert的column name都是一样的,所有的task共用一块儿buf做序列化就可以了
|
//insert的column name都是一样的,所有的task共用一块儿buf做序列化就可以了
|
||||||
insert_task->insert_stmt_head_ = insert_stmt_head_buff;
|
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->row_count_ = batch_row_count;
|
||||||
insert_task->tenant_id_ = ctx.get_my_session()->get_effective_tenant_id();
|
insert_task->tenant_id_ = ctx.get_my_session()->get_effective_tenant_id();
|
||||||
insert_task->token_server_idx_ = server_j;
|
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))) {
|
if (OB_FAIL(insert_resource.push_back(insert_task))) {
|
||||||
insert_task->~ObInsertTask();
|
insert_task->~ObInsertTask();
|
||||||
LOG_WARN("fail to push back", K(ret));
|
LOG_WARN("fail to push back", K(ret));
|
||||||
|
|||||||
@ -91,9 +91,9 @@ struct ObLoadTableColumnDesc
|
|||||||
class ObInsertValueGenerator
|
class ObInsertValueGenerator
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
ObInsertValueGenerator() : cs_type_(common::CS_TYPE_INVALID), data_buffer_(NULL) {}
|
ObInsertValueGenerator() : cs_type_(common::CS_TYPE_INVALID), data_buffer_(NULL), sql_mode_(0) {}
|
||||||
int init(ObSQLSessionInfo &session, ObLoadFileBuffer* data_buffer, ObSchemaGetterGuard *schema_guard);
|
int init(ObSQLSessionInfo &session, ObLoadFileBuffer* data_buffer, ObSchemaGetterGuard *schema_guard);
|
||||||
int set_params(common::ObString &insert_header, common::ObCollationType cs_type);
|
int set_params(common::ObString &insert_header, common::ObCollationType cs_type, int64_t sql_mode);
|
||||||
int fill_field_expr(common::ObIArray<ObCSVGeneralParser::FieldValue> &field_values,
|
int fill_field_expr(common::ObIArray<ObCSVGeneralParser::FieldValue> &field_values,
|
||||||
const common::ObBitSet<> &string_values);
|
const common::ObBitSet<> &string_values);
|
||||||
int gen_insert_values(common::ObIArray<common::ObString> &insert_values,
|
int gen_insert_values(common::ObIArray<common::ObString> &insert_values,
|
||||||
@ -110,7 +110,7 @@ private:
|
|||||||
ObRawExprPrinter expr_printer_;
|
ObRawExprPrinter expr_printer_;
|
||||||
common::ObSEArray<ObRawExpr *, 16> insert_exprs_;
|
common::ObSEArray<ObRawExpr *, 16> insert_exprs_;
|
||||||
common::ObSEArray<ObRawExpr *, 16> field_exprs_;
|
common::ObSEArray<ObRawExpr *, 16> field_exprs_;
|
||||||
|
int64_t sql_mode_;
|
||||||
};
|
};
|
||||||
|
|
||||||
//存储row_cnt行序列化的数据,每行的序列化数据是一个SEArray
|
//存储row_cnt行序列化的数据,每行的序列化数据是一个SEArray
|
||||||
|
|||||||
@ -750,7 +750,9 @@ OB_SERIALIZE_MEMBER(ObInsertTask,
|
|||||||
row_count_,
|
row_count_,
|
||||||
column_count_,
|
column_count_,
|
||||||
insert_stmt_head_,
|
insert_stmt_head_,
|
||||||
insert_value_data_);
|
insert_value_data_,
|
||||||
|
timezone_,
|
||||||
|
sql_mode_);
|
||||||
OB_SERIALIZE_MEMBER(ObInsertResult,
|
OB_SERIALIZE_MEMBER(ObInsertResult,
|
||||||
flags_,
|
flags_,
|
||||||
exec_ret_,
|
exec_ret_,
|
||||||
|
|||||||
@ -172,6 +172,8 @@ struct ObInsertTask
|
|||||||
insert_stmt_head_.reset();
|
insert_stmt_head_.reset();
|
||||||
insert_value_data_.reset();
|
insert_value_data_.reset();
|
||||||
source_frag_.reset();
|
source_frag_.reset();
|
||||||
|
timezone_.reset();
|
||||||
|
sql_mode_ = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool is_empty_task()
|
bool is_empty_task()
|
||||||
@ -208,6 +210,8 @@ struct ObInsertTask
|
|||||||
int64_t retry_times_;
|
int64_t retry_times_;
|
||||||
int64_t token_server_idx_;
|
int64_t token_server_idx_;
|
||||||
int64_t data_size_;
|
int64_t data_size_;
|
||||||
|
ObTimeZoneInfoWrap timezone_;
|
||||||
|
int64_t sql_mode_;
|
||||||
|
|
||||||
OB_UNIS_VERSION(1);
|
OB_UNIS_VERSION(1);
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user