fix charset bug in dblink & modify mysqltest case
This commit is contained in:
parent
2845ff51d8
commit
129d7c85c6
@ -536,7 +536,7 @@ int ObDbLinkProxy::execute_init_sql(const sqlclient::dblink_param_ctx ¶m_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 ¶m_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 ¶m_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())) {
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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();
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user