fix charset bug in dblink & modify mysqltest case

This commit is contained in:
cqliang1995 2024-12-13 08:44:48 +00:00 committed by ob-robot
parent 2845ff51d8
commit 129d7c85c6
7 changed files with 48 additions and 68 deletions

View File

@ -536,7 +536,7 @@ int ObDbLinkProxy::execute_init_sql(const sqlclient::dblink_param_ctx &param_ctx
} else if (OB_FAIL(stmt.execute_update())) {
LOG_WARN("execute sql failed", K(ret), K(param_ctx));
} else {
// do nothing
LOG_TRACE("succ to excute initial dblink sql", K(sql_ptr[i]), K(ret));
}
}
} else if (DBLINK_DRV_OB == param_ctx.link_type_) {
@ -559,6 +559,8 @@ int ObDbLinkProxy::execute_init_sql(const sqlclient::dblink_param_ctx &param_ctx
LOG_WARN("create statement failed", K(ret), K(param_ctx));
} else if (OB_FAIL(stmt.execute_update())) {
LOG_WARN("execute sql failed", K(ret), K(param_ctx));
} else {
LOG_TRACE("succ to excute initial dblink sql", K(sql_ptr[i]), K(ret));
}
}
}
@ -584,6 +586,8 @@ int ObDbLinkProxy::execute_init_sql(const sqlclient::dblink_param_ctx &param_ctx
LOG_WARN("failed to set sql text", K(ret), K(ObString(sql_ptr_ora[i])));
} else if (OB_FAIL(stmt.execute_update(affected_rows))) {
LOG_WARN("execute sql failed", K(ret), K(param_ctx));
} else {
LOG_TRACE("succ to excute initial dblink sql", K(sql_ptr_ora[i]), K(ret));
}
int tmp_ret = OB_SUCCESS;
if (OB_SUCCESS != (tmp_ret = stmt.terminate())) {

View File

@ -106,7 +106,7 @@ int ObDblinkService::get_charset_id(ObSQLSessionInfo *session_info,
} else {
charset_id = static_cast<uint16_t>(ObCharset::charset_type_to_ora_charset_id(cs_type));
ncharset_id = static_cast<uint16_t>(ObCharset::charset_type_to_ora_charset_id(ncs_type));
LOG_DEBUG("get charset id", K(ret), K(charset_id), K(ncharset_id),
LOG_TRACE("succ to get dblink charset id", K(ret), K(charset_id), K(ncharset_id),
K(cs_type), K(ncs_type), K(coll_type), K(ncoll_type));
}
}
@ -126,10 +126,10 @@ int ObDblinkService::init_dblink_param_ctx(common::sqlclient::dblink_param_ctx &
if (OB_ISNULL(session_info)) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("unexpected null ptr", K(ret));
} else if (OB_FAIL(get_charset_id(session_info, charset_id, ncharset_id))) {
LOG_WARN("failed to get session charset id", K(ret), K(dblink_id));
} else if (OB_FAIL(get_local_session_vars(session_info, allocator, param_ctx))) {
LOG_WARN("failed to get local session vars", K(ret), K(dblink_id));
} else if (OB_FAIL(get_charset_id(session_info, charset_id, ncharset_id))) {
LOG_WARN("failed to get session charset id", K(ret), K(dblink_id));
} else {
param_ctx.charset_id_ = charset_id;
param_ctx.ncharset_id_ = ncharset_id;
@ -272,59 +272,29 @@ int ObDblinkService::get_set_names_cstr(sql::ObSQLSessionInfo *session_info,
const char *&set_results_charset)
{
int ret = OB_SUCCESS;
int64_t client = -1;
int64_t connection = -1;
int64_t results = -1;
set_client_charset = NULL;
set_connection_charset = NULL;
set_results_charset = "set character_set_results = NULL";
set_results_charset = NULL;
if (OB_ISNULL(session_info)) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("unexpected null ptr", K(ret));
} else if (OB_FAIL(session_info->get_sys_variable(share::SYS_VAR_CHARACTER_SET_CLIENT, client))) {
LOG_WARN("failed to get client characterset", K(ret));
} else if (OB_FAIL(session_info->get_sys_variable(share::SYS_VAR_CHARACTER_SET_CONNECTION, connection))) {
LOG_WARN("failed to get connection characterset", K(ret));
} else if (OB_FAIL(session_info->get_sys_variable(share::SYS_VAR_CHARACTER_SET_CLIENT, results))) {
LOG_WARN("failed to get results characterset", K(ret));
} else {
switch(ObCharset::charset_type_by_coll(ObCollationType(client))) {
ObCollationType tenant_collation = is_oracle_mode() ? session_info->get_nls_collation() : ObCollationType::CS_TYPE_UTF8MB4_BIN;
switch(ObCharset::charset_type_by_coll(tenant_collation)) {
case ObCharsetType::CHARSET_UTF8MB4:
set_client_charset = ObDblinkService::SET_CLIENT_CHARSET_UTF8MB4;
set_client_charset = "set character_set_client = utf8mb4";
set_connection_charset = "set character_set_connection = utf8mb4";
set_results_charset = "set character_set_results = utf8mb4";
break;
case ObCharsetType::CHARSET_GBK:
set_client_charset = ObDblinkService::SET_CLIENT_CHARSET_GBK;
set_client_charset = "set character_set_client = gbk";
set_connection_charset = "set character_set_connection = gbk";
set_results_charset = "set character_set_results = gbk";
break;
case ObCharsetType::CHARSET_BINARY:
set_client_charset = ObDblinkService::SET_CLIENT_CHARSET_BINARY;
break;
default:
// do nothing
break;
}
switch(ObCharset::charset_type_by_coll(ObCollationType(connection))) {
case ObCharsetType::CHARSET_UTF8MB4:
set_connection_charset = ObDblinkService::SET_CONNECTION_CHARSET_UTF8MB4;
break;
case ObCharsetType::CHARSET_GBK:
set_connection_charset = ObDblinkService::SET_CONNECTION_CHARSET_GBK;
break;
case ObCharsetType::CHARSET_BINARY:
set_connection_charset = ObDblinkService::SET_CONNECTION_CHARSET_BINARY;
break;
default:
// do nothing
break;
}
switch(ObCharset::charset_type_by_coll(ObCollationType(results))) {
case ObCharsetType::CHARSET_UTF8MB4:
set_results_charset = ObDblinkService::SET_RESULTS_CHARSET_UTF8MB4;
break;
case ObCharsetType::CHARSET_GBK:
set_results_charset = ObDblinkService::SET_RESULTS_CHARSET_GBK;
break;
case ObCharsetType::CHARSET_BINARY:
set_results_charset = ObDblinkService::SET_RESULTS_CHARSET_BINARY;
set_client_charset = "set character_set_client = binary";
set_connection_charset = "set character_set_connection = binary";
set_results_charset = "set character_set_results = binary";
break;
default:
// do nothing
@ -341,30 +311,35 @@ int ObDblinkService::get_local_session_vars(sql::ObSQLSessionInfo *session_info,
int ret = OB_SUCCESS;
if (lib::is_mysql_mode() && OB_FAIL(get_set_sql_mode_cstr(session_info, param_ctx.set_sql_mode_cstr_, allocator))) {
LOG_WARN("failed to get set_sql_mode_cstr", K(ret));
} else if (OB_FAIL(get_set_transaction_isolation_cstr(session_info,
param_ctx.set_transaction_isolation_cstr_))) {
LOG_WARN("failed to get set_transaction_isolation_cstr", K(ret));
} else if (OB_FAIL(get_set_names_cstr(session_info,
param_ctx.set_client_charset_cstr_,
param_ctx.set_connection_charset_cstr_,
param_ctx.set_results_charset_cstr_))) {
LOG_WARN("failed to get set_names_cstr", K(ret));
} else if (OB_FAIL(get_set_transaction_isolation_cstr(session_info,
param_ctx.set_transaction_isolation_cstr_))) {
LOG_WARN("failed to get set_transaction_isolation_cstr", K(ret));
} else {
LOG_TRACE("succ to get local session vars", K(param_ctx.set_client_charset_cstr_),
K(param_ctx.set_connection_charset_cstr_),
K(param_ctx.set_results_charset_cstr_),
K(param_ctx.set_sql_mode_cstr_),
K(param_ctx.dblink_id_),
K(ret));
}
return ret;
}
int ObDblinkService::get_spell_collation_type(ObSQLSessionInfo *session, ObCollationType &spell_coll) {
int ObDblinkService::get_spell_collation_type(ObSQLSessionInfo *session, ObCollationType &spell_coll)
{
int ret = OB_SUCCESS;
common::ObCharsetType database_cs = ObCharsetType::CHARSET_UTF8MB4;
if (OB_ISNULL(session)) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("unexpected null ptr", K(ret));
} else if (lib::is_oracle_mode()) {
spell_coll = session->get_nls_collation();
} else if (OB_FAIL(session->get_character_set_database(database_cs))) {
LOG_WARN("failed to get character_set_database", K(ret));
} else {
spell_coll = ObCharset::get_default_collation_by_mode(database_cs, false);
spell_coll = ObCollationType::CS_TYPE_UTF8MB4_BIN;
}
return ret;
}

View File

@ -321,7 +321,7 @@ int ObLinkOp::combine_link_stmt(const ObString &link_stmt_fmt,
if (OB_SUCC(ret)) {
stmt_buf_pos_ = link_stmt_pos;
}
LOG_WARN("succ to combine link sql", KP(stmt_buf_), K(stmt_buf_pos_), K(ObString(stmt_buf_pos_, stmt_buf_)));
LOG_TRACE("succ to combine dblink sql", KP(stmt_buf_), K(stmt_buf_pos_), K(ObString(stmt_buf_pos_, stmt_buf_)));
}
return ret;
}

View File

@ -162,13 +162,13 @@ int ObLinkScanOp::inner_execute_link_stmt(const ObString &link_stmt)
if (OB_FAIL(tm_rm_connection_->execute_read(OB_INVALID_TENANT_ID, link_stmt, res_))) {
LOG_WARN("failed to read table data by tm_rm_connection", K(ret), K(link_stmt), K(tm_rm_connection_->get_dblink_driver_proto()));
} else {
LOG_DEBUG("succ to read table data by tm_rm_connection", K(link_stmt), K(tm_rm_connection_->get_dblink_driver_proto()));
LOG_TRACE("succ to read table data by tm_rm_connection", K(link_stmt), K(tm_rm_connection_->get_dblink_driver_proto()));
}
} else if (sql::DblinkGetConnType::TEMP_CONN == conn_type_) {
if (OB_FAIL(reverse_link_->read(link_stmt, res_))) {
LOG_WARN("failed to read table data by reverse_link", K(ret));
} else {
LOG_DEBUG("succ to read table data by reverse_link");
LOG_TRACE("succ to read table data by reverse_link");
}
} else if (OB_ISNULL(dblink_proxy_) || OB_ISNULL(my_session)) {
ret = OB_ERR_UNEXPECTED;
@ -209,7 +209,7 @@ int ObLinkScanOp::inner_execute_link_stmt(const ObString &link_stmt)
} else if (OB_FAIL(result_->set_expected_charset_id(charset_id, ncharset_id))) {// for oci dblink set expected result charset, actually useless...
LOG_WARN("failed to set result set expected charset", K(ret), K(charset_id), K(ncharset_id));
} else {
LOG_DEBUG("succ to dblink read", K(link_stmt), KP(dblink_conn_));
LOG_TRACE("succ to dblink read", K(link_stmt), KP(dblink_conn_), K(charset_id), K(ncharset_id));
}
return ret;
}

View File

@ -710,8 +710,6 @@ bool print_log = false;
int ObSqlTransControl::dblink_xa_prepare(ObExecContext &exec_ctx)
{
int ret = OB_SUCCESS;
uint16_t charset_id = 0;
uint16_t ncharset_id = 0;
uint64_t tenant_id = -1;
uint32_t sessid = -1;
uint32_t tm_sessid = 0;
@ -728,9 +726,7 @@ int ObSqlTransControl::dblink_xa_prepare(ObExecContext &exec_ctx)
} else if (lib::is_oracle_mode() &&
!plan_ctx->get_dblink_ids().empty() &&
plan_ctx->get_main_xa_trans_branch()) {
if (OB_FAIL(ObDblinkService::get_charset_id(session, charset_id, ncharset_id))) {
LOG_WARN("failed to get session charset id", K(ret));
} else if (OB_FAIL(GCTX.schema_service_->get_tenant_schema_guard(session->get_effective_tenant_id(), schema_guard))) {
if (OB_FAIL(GCTX.schema_service_->get_tenant_schema_guard(session->get_effective_tenant_id(), schema_guard))) {
LOG_WARN("failed to get schema guard", K(ret), K(session->get_effective_tenant_id()));
} else {
ObIArray<uint64_t> &dblink_ids = plan_ctx->get_dblink_ids();

View File

@ -209,6 +209,7 @@ int ObLogLink::set_link_stmt(const ObDMLStmt* stmt)
ObString sql;
ObObjPrintParams print_param;
print_param.for_dblink_ = 1;
//print_param.cs_type_ = ObCollationType::CS_TYPE_UTF8MB4_BIN;
// only link scan need print flashback query for dblink table
ObOptimizerContext *opt_ctx = NULL;
ObSQLSessionInfo *session = NULL;
@ -229,7 +230,7 @@ int ObLogLink::set_link_stmt(const ObDMLStmt* stmt)
} else {
stmt_fmt_buf_ = sql.ptr();
stmt_fmt_len_ = sql.length();
LOG_DEBUG("loglink succ to reconstruct link sql", K(sql));
LOG_TRACE("succ to reconstruct dblink sql", K(sql), KP(stmt_fmt_buf_), K(stmt_fmt_len_), K(ret), K(spell_coll));
}
return ret;
}

View File

@ -296,8 +296,10 @@ int ObDMLStmtPrinter::print_table(const TableItem *table_item,
if (OB_FAIL(print_base_table(table_item))) {
LOG_WARN("failed to print base table", K(ret), K(*table_item));
} else if (!no_print_alias && !table_item->alias_name_.empty()) {
DATA_PRINTF(lib::is_oracle_mode() ? " \"%.*s\"" : " `%.*s`",
LEN_AND_PTR(table_item->alias_name_));
//DATA_PRINTF(lib::is_oracle_mode() ? " \"%.*s\"" : " `%.*s`",
// LEN_AND_PTR(table_item->alias_name_));
DATA_PRINTF(" ");
PRINT_IDENT_WITH_QUOT(table_item->alias_name_);
}
break;
}
@ -305,8 +307,10 @@ int ObDMLStmtPrinter::print_table(const TableItem *table_item,
if (OB_FAIL(print_base_table(table_item))) {
LOG_WARN("failed to print base table", K(ret), K(*table_item));
} else if (!no_print_alias && !table_item->alias_name_.empty()) {
DATA_PRINTF(lib::is_oracle_mode() ? " \"%.*s\"" : " `%.*s`",
LEN_AND_PTR(table_item->alias_name_));
//DATA_PRINTF(lib::is_oracle_mode() ? " \"%.*s\"" : " `%.*s`",
// LEN_AND_PTR(table_item->alias_name_));
DATA_PRINTF(" ");
PRINT_IDENT_WITH_QUOT(table_item->alias_name_);
}
break;
}