fix optimizer stats bug in gb18030 tenant.

This commit is contained in:
wangt1xiuyi
2023-02-06 23:23:08 +08:00
committed by ob-robot
parent ec9eeebfb5
commit 1207963134
2 changed files with 257 additions and 114 deletions

View File

@ -27,6 +27,7 @@
#include "share/stat/ob_index_stats_estimator.h"
#include "lib/timezone/ob_time_convert.h"
#include "sql/das/ob_das_location_router.h"
#include "sql/ob_sql_utils.h"
namespace oceanbase
{
@ -841,7 +842,7 @@ int ObDbmsStats::delete_column_stats(ObExecContext &ctx, ParamStore &params, ObO
params.at(3),
stat_param))) {
LOG_WARN("failed to parse owner", K(ret));
} else if (OB_FAIL(parse_column_info(params.at(2), stat_param))) {
} else if (OB_FAIL(parse_column_info(ctx, params.at(2), stat_param))) {
LOG_WARN("failed to parse export column info", K(ret));
} else if (!params.at(6).is_null() && OB_FAIL(params.at(6).get_bool(cascade_parts))) {
LOG_WARN("failed to get cascade partition", K(ret));
@ -851,6 +852,11 @@ int ObDbmsStats::delete_column_stats(ObExecContext &ctx, ParamStore &params, ObO
LOG_WARN("failed to get no invalidate", K(ret));
} else if (!params.at(10).is_null() && OB_FAIL(params.at(10).get_varchar(col_stat_type))) {
LOG_WARN("failed to get no invalidate", K(ret));
} else if (!params.at(10).is_null() &&
OB_FAIL(convert_vaild_ident_name(ctx.get_allocator(),
ctx.get_my_session()->get_dtc_params(),
col_stat_type))) {
LOG_WARN("failed to convert vaild ident name", K(ret));
} else if (0 == col_stat_type.case_compare("ALL")) {
only_histogram = false;
} else if (0 == col_stat_type.case_compare("HISTOGRAM")) {
@ -992,7 +998,6 @@ int ObDbmsStats::delete_index_stats(ObExecContext &ctx, ParamStore &params, ObOb
obrpc::ObCommonRpcProxy *proxy = NULL;
ObTableStatParam index_stat_param;
index_stat_param.is_index_stat_ = true;
ObString col_stat_type("ALL");
bool cascade_parts = false;
bool only_histogram = false;
if (OB_FAIL(check_statistic_table_writeable(ctx))) {
@ -1125,29 +1130,43 @@ int ObDbmsStats::create_stat_table(ObExecContext &ctx, ParamStore &params, ObObj
param.tenant_id_ = session->get_effective_tenant_id();
if (!params.at(0).is_null() && OB_FAIL(params.at(0).get_varchar(param.db_name_))) {
LOG_WARN("failed to get db_name", K(ret));
} else if (!params.at(0).is_null() &&
OB_FAIL(convert_vaild_ident_name(ctx.get_allocator(),
session->get_dtc_params(),
param.db_name_,
lib::is_oracle_mode()))) {
LOG_WARN("failed to convert vaild ident name", K(ret));
} else if (!params.at(1).is_null() && OB_FAIL(params.at(1).get_varchar(param.tab_name_))) {
LOG_WARN("failed to get tab_name", K(ret));
} else if (!params.at(1).is_null() &&
OB_FAIL(convert_vaild_ident_name(ctx.get_allocator(),
session->get_dtc_params(),
param.tab_name_,
lib::is_oracle_mode()))) {
LOG_WARN("failed to convert vaild ident name", K(ret));
} else if (!params.at(2).is_null() && OB_FAIL(params.at(2).get_varchar(param.tab_group_))) {
LOG_WARN("failed to get tblspace", K(ret));
} else if (!params.at(2).is_null() &&
OB_FAIL(convert_vaild_ident_name(ctx.get_allocator(),
session->get_dtc_params(),
param.tab_group_,
lib::is_oracle_mode()))) {
LOG_WARN("failed to convert vaild ident name", K(ret));
} else if (!params.at(3).is_null() && OB_FAIL(params.at(3).get_bool(is_temp_table))) {
LOG_WARN("failed to get global_temporary", K(ret));
} else if (param.tab_name_.empty()) {
ret = OB_ERR_DBMS_STATS_PL;
LOG_WARN("Statistics table must be specified", K(ret));
LOG_USER_ERROR(OB_ERR_DBMS_STATS_PL, "Statistics table must be specified");
} else if (FALSE_IT(try_caseup(params.at(1).get_collation_type(), param.tab_name_))) {
} else if (is_temp_table) {
ret = OB_NOT_SUPPORTED;
LOG_WARN("dbms_stats with temp table not support", K(ret));
LOG_USER_ERROR(OB_NOT_SUPPORTED, "dbms_stats with temp table");
} else if (param.db_name_.empty()) {
param.db_name_ = session->get_user_name();
} else if (FALSE_IT(try_caseup(params.at(0).get_collation_type(), param.db_name_))) {
}
if (OB_SUCC(ret)) {
if (lib::is_oracle_mode() && !param.tab_group_.empty() &&
FALSE_IT(try_caseup(params.at(2).get_collation_type(), param.tab_group_))) {
} else if (OB_FAIL(ObDbmsStatsExportImport::create_stat_table(ctx, param))) {
if (OB_FAIL(ObDbmsStatsExportImport::create_stat_table(ctx, param))) {
LOG_WARN("failed to create table stats", K(ret));
} else {
LOG_TRACE("succeed to create table stat", K(param));
@ -1179,16 +1198,26 @@ int ObDbmsStats::drop_stat_table(ObExecContext &ctx, ParamStore &params, ObObj &
param.tenant_id_ = session->get_effective_tenant_id();
if (!params.at(0).is_null() && OB_FAIL(params.at(0).get_varchar(param.db_name_))) {
LOG_WARN("failed to get db_name", K(ret));
} else if (!params.at(0).is_null() &&
OB_FAIL(convert_vaild_ident_name(ctx.get_allocator(),
session->get_dtc_params(),
param.db_name_,
lib::is_oracle_mode()))) {
LOG_WARN("failed to convert vaild ident name", K(ret));
} else if (!params.at(1).is_null() && OB_FAIL(params.at(1).get_varchar(param.tab_name_))) {
LOG_WARN("failed to get tab_name", K(ret));
} else if (!params.at(1).is_null() &&
OB_FAIL(convert_vaild_ident_name(ctx.get_allocator(),
session->get_dtc_params(),
param.tab_name_,
lib::is_oracle_mode()))) {
LOG_WARN("failed to convert vaild ident name", K(ret));
} else if (param.tab_name_.empty()) {
ret = OB_ERR_DBMS_STATS_PL;
LOG_WARN("Statistics table must be specified", K(ret));
LOG_USER_ERROR(OB_ERR_DBMS_STATS_PL, "Statistics table must be specified");
} else if (FALSE_IT(try_caseup(params.at(1).get_collation_type(), param.tab_name_))) {
} else if (param.db_name_.empty()) {
param.db_name_ = session->get_user_name();
} else if (FALSE_IT(try_caseup(params.at(0).get_collation_type(), param.db_name_))) {
}
if (OB_SUCC(ret)) {
if (OB_FAIL(ObDbmsStatsExportImport::drop_stat_table(ctx, param))) {
@ -1252,6 +1281,11 @@ int ObDbmsStats::export_table_stats(ObExecContext &ctx, ParamStore &params, ObOb
} else if (!params.at(7).is_null() &&
OB_FAIL(params.at(7).get_varchar(stat_param.stat_category_))) {
LOG_WARN("failed to get stat category ", K(ret));
} else if (!params.at(7).is_null() &&
OB_FAIL(convert_vaild_ident_name(ctx.get_allocator(),
ctx.get_my_session()->get_dtc_params(),
stat_param.stat_category_))) {
LOG_WARN("failed to convert vaild ident name", K(ret));
} else if (OB_FAIL(parse_stat_category(stat_param.stat_category_))) {
LOG_WARN("failed to parse stat category", K(ret), K(stat_param.stat_category_));
} else {
@ -1303,7 +1337,7 @@ int ObDbmsStats::export_column_stats(sql::ObExecContext &ctx,
params.at(3),
stat_param))) {
LOG_WARN("failed to parse owner", K(ret));
} else if (OB_FAIL(parse_column_info(params.at(2), stat_param))) {
} else if (OB_FAIL(parse_column_info(ctx, params.at(2), stat_param))) {
LOG_WARN("failed to parse export column info", K(ret));
} else if (OB_FAIL(parse_table_info(ctx,
params.at(6).is_null() ? params.at(0) : params.at(6),
@ -1558,6 +1592,11 @@ int ObDbmsStats::import_table_stats(ObExecContext &ctx, ParamStore &params, ObOb
} else if (!params.at(9).is_null() &&
OB_FAIL(params.at(9).get_varchar(stat_param.stat_category_))) {
LOG_WARN("failed to get stat stat_category ", K(ret));
} else if (!params.at(9).is_null() &&
OB_FAIL(convert_vaild_ident_name(ctx.get_allocator(),
ctx.get_my_session()->get_dtc_params(),
stat_param.stat_category_))) {
LOG_WARN("failed to convert vaild ident name", K(ret));
} else if (OB_FAIL(parse_stat_category(stat_param.stat_category_))) {
LOG_WARN("failed to parse stat category", K(ret), K(stat_param.stat_category_));
} else {
@ -1644,7 +1683,7 @@ int ObDbmsStats::import_column_stats(sql::ObExecContext &ctx,
params.at(3),
stat_param))) {
LOG_WARN("failed to parse owner", K(ret));
} else if (OB_FAIL(parse_column_info(params.at(2), stat_param))) {
} else if (OB_FAIL(parse_column_info(ctx, params.at(2), stat_param))) {
LOG_WARN("failed to parse column info", K(ret));
} else if (OB_FAIL(parse_table_info(ctx,
params.at(6).is_null() ? params.at(0) : params.at(6),
@ -1969,6 +2008,10 @@ int ObDbmsStats::lock_table_stats(sql::ObExecContext &ctx,
LOG_WARN("failed to parse owner", K(ret));
} else if (OB_FAIL(params.at(2).get_varchar(stat_type_str))) {
LOG_WARN("failed to get stattype", K(ret));
} else if (OB_FAIL(convert_vaild_ident_name(ctx.get_allocator(),
ctx.get_my_session()->get_dtc_params(),
stat_type_str))) {
LOG_WARN("failed to convert vaild ident name", K(ret));
} else if (OB_FAIL(parse_stat_type(stat_type_str, stat_param.stattype_))) {
LOG_WARN("failed to parse stat type", K(ret), K(stat_type_str));
} else {
@ -2054,6 +2097,10 @@ int ObDbmsStats::lock_schema_stats(sql::ObExecContext &ctx,
LOG_WARN("failed to get all table ids in database", K(ret));
} else if (OB_FAIL(params.at(1).get_varchar(stat_type_str))) {
LOG_WARN("failed to get stattype", K(ret));
} else if (OB_FAIL(convert_vaild_ident_name(ctx.get_allocator(),
ctx.get_my_session()->get_dtc_params(),
stat_type_str))) {
LOG_WARN("failed to convert vaild ident name", K(ret));
} else if (OB_FAIL(parse_stat_type(stat_type_str, global_param.stattype_))) {
LOG_WARN("failed to parse stat type", K(ret), K(stat_type_str));
} else {
@ -2146,6 +2193,11 @@ int ObDbmsStats::unlock_table_stats(sql::ObExecContext &ctx,
LOG_WARN("failed to parse owner", K(ret));
} else if (!params.at(2).is_null() && OB_FAIL(params.at(2).get_varchar(stat_type_str))) {
LOG_WARN("failed to get stattype", K(ret));
} else if (!params.at(2).is_null() &&
OB_FAIL(convert_vaild_ident_name(ctx.get_allocator(),
ctx.get_my_session()->get_dtc_params(),
stat_type_str))) {
LOG_WARN("failed to convert vaild ident name", K(ret));
} else if (OB_FAIL(parse_stat_type(stat_type_str, stat_param.stattype_))) {
LOG_WARN("failed to parse stat type", K(ret), K(stat_type_str));
} else {
@ -2230,6 +2282,11 @@ int ObDbmsStats::unlock_schema_stats(sql::ObExecContext &ctx,
LOG_WARN("failed to get all table ids in database", K(ret));
} else if (!params.at(1).is_null() && OB_FAIL(params.at(1).get_varchar(stat_type_str))) {
LOG_WARN("failed to get stattype", K(ret));
} else if (!params.at(1).is_null() &&
OB_FAIL(convert_vaild_ident_name(ctx.get_allocator(),
ctx.get_my_session()->get_dtc_params(),
stat_type_str))) {
LOG_WARN("failed to convert vaild ident name", K(ret));
} else if (OB_FAIL(parse_stat_type(stat_type_str, global_param.stattype_))) {
LOG_WARN("failed to parse stat type", K(ret), K(stat_type_str));
} else {
@ -2243,8 +2300,8 @@ int ObDbmsStats::unlock_schema_stats(sql::ObExecContext &ctx,
} else {
stat_param.need_global_ = true;
stat_param.need_approx_global_ = false;
stat_param.need_part_ = false;
stat_param.need_subpart_ = false;
stat_param.need_part_ = true;
stat_param.need_subpart_ = true;
if (OB_FAIL(ObDbmsStatsLockUnlock::set_table_stats_lock(ctx, stat_param, false))) {
LOG_WARN("failed to lock table stats", K(ret));
} else if (OB_FAIL(lock_or_unlock_index_stats(ctx, stat_param, false))) {
@ -2682,6 +2739,11 @@ int ObDbmsStats::get_prefs(sql::ObExecContext &ctx,
LOG_WARN("failed to check tenant is restore", K(ret));
} else if (!params.at(0).is_null() && OB_FAIL(params.at(0).get_string(opt_name))) {
LOG_WARN("failed to get string", K(ret));
} else if (!params.at(0).is_null() &&
OB_FAIL(convert_vaild_ident_name(ctx.get_allocator(),
ctx.get_my_session()->get_dtc_params(),
opt_name))) {
LOG_WARN("failed to convert vaild ident name", K(ret));
} else if (!params.at(2).is_null() &&
OB_FAIL(parse_table_part_info(ctx, params.at(1), params.at(2), dummy_param, param))) {
LOG_WARN("failed to get string", K(ret), K(params.at(2)));
@ -2720,8 +2782,18 @@ int ObDbmsStats::set_global_prefs(sql::ObExecContext &ctx,
LOG_WARN("failed to check tenant is restore", K(ret));
} else if (!params.at(0).is_null() && OB_FAIL(params.at(0).get_string(opt_name))) {
LOG_WARN("failed to get string", K(ret), K(params.at(0)));
} else if (!params.at(0).is_null() &&
OB_FAIL(convert_vaild_ident_name(ctx.get_allocator(),
ctx.get_my_session()->get_dtc_params(),
opt_name))) {
LOG_WARN("failed to convert vaild ident name", K(ret));
} else if (!params.at(1).is_null() && OB_FAIL(params.at(1).get_string(opt_value))) {
LOG_WARN("failed to get string", K(ret), K(params.at(1)));
} else if (!params.at(1).is_null() &&
OB_FAIL(convert_vaild_ident_name(ctx.get_allocator(),
ctx.get_my_session()->get_dtc_params(),
opt_value))) {
LOG_WARN("failed to convert vaild ident name", K(ret));
} else if (OB_FAIL(get_new_stat_pref(ctx, opt_name, opt_value, true, stat_pref))) {
LOG_WARN("failed to get new stat pref", K(ret));
} else if (OB_ISNULL(stat_pref)) {
@ -2765,8 +2837,18 @@ int ObDbmsStats::set_schema_prefs(sql::ObExecContext &ctx,
LOG_WARN("failed to get all table ids in database", K(ret));
} else if (!params.at(1).is_null() && OB_FAIL(params.at(1).get_string(opt_name))) {
LOG_WARN("failed to get string", K(ret), K(params.at(1)));
} else if (!params.at(1).is_null() &&
OB_FAIL(convert_vaild_ident_name(ctx.get_allocator(),
ctx.get_my_session()->get_dtc_params(),
opt_name))) {
LOG_WARN("failed to convert vaild ident name", K(ret));
} else if (!params.at(2).is_null() && OB_FAIL(params.at(2).get_string(opt_value))) {
LOG_WARN("failed to get string", K(ret), K(params.at(2)));
} else if (!params.at(2).is_null() &&
OB_FAIL(convert_vaild_ident_name(ctx.get_allocator(),
ctx.get_my_session()->get_dtc_params(),
opt_value))) {
LOG_WARN("failed to convert vaild ident name", K(ret));
} else if (OB_FAIL(get_new_stat_pref(ctx, opt_name, opt_value, false, stat_pref))) {
LOG_WARN("failed to get new stat pref", K(ret));
} else if (OB_ISNULL(stat_pref)) {
@ -2815,8 +2897,18 @@ int ObDbmsStats::set_table_prefs(sql::ObExecContext &ctx,
LOG_WARN("failed to push back", K(ret));
} else if (!params.at(2).is_null() && OB_FAIL(params.at(2).get_string(opt_name))) {
LOG_WARN("failed to get string", K(ret), K(params.at(2)));
} else if (!params.at(2).is_null() &&
OB_FAIL(convert_vaild_ident_name(ctx.get_allocator(),
ctx.get_my_session()->get_dtc_params(),
opt_name))) {
LOG_WARN("failed to convert vaild ident name", K(ret));
} else if (!params.at(3).is_null() && OB_FAIL(params.at(3).get_string(opt_value))) {
LOG_WARN("failed to get string", K(ret), K(params.at(3)));
} else if (!params.at(3).is_null() &&
OB_FAIL(convert_vaild_ident_name(ctx.get_allocator(),
ctx.get_my_session()->get_dtc_params(),
opt_value))) {
LOG_WARN("failed to convert vaild ident name", K(ret));
} else if (OB_FAIL(get_new_stat_pref(ctx, opt_name, opt_value, false, stat_pref))) {
LOG_WARN("failed to get new stat pref", K(ret));
} else if (OB_ISNULL(stat_pref)) {
@ -2840,8 +2932,7 @@ int ObDbmsStats::set_table_prefs(sql::ObExecContext &ctx,
* @param ctx
* @param params
* ownname VARCHAR2,
* pname VARCHAR2,
* pvalue VARCHAR2
* pname VARCHAR2
* @param result
* @return
*/
@ -2864,6 +2955,10 @@ int ObDbmsStats::delete_schema_prefs(sql::ObExecContext &ctx,
// if pname is null, do not check stat prefs.
} else if (OB_FAIL(params.at(1).get_string(opt_name))) {
LOG_WARN("failed to get string", K(ret), K(params.at(1)));
} else if (OB_FAIL(convert_vaild_ident_name(ctx.get_allocator(),
ctx.get_my_session()->get_dtc_params(),
opt_name))) {
LOG_WARN("failed to convert vaild ident name", K(ret));
} else if (OB_FAIL(get_new_stat_pref(ctx, opt_name, dummy_name, false, stat_pref))) {
LOG_WARN("failed to get new stat pref", K(ret));
} else if (OB_ISNULL(stat_pref)) {
@ -2909,6 +3004,10 @@ int ObDbmsStats::delete_table_prefs(sql::ObExecContext &ctx,
//if pname is null, skip check prefs.
} else if (OB_FAIL(params.at(2).get_string(opt_name))) {
LOG_WARN("failed to get string", K(ret), K(params.at(2)));
} else if (OB_FAIL(convert_vaild_ident_name(ctx.get_allocator(),
ctx.get_my_session()->get_dtc_params(),
opt_name))) {
LOG_WARN("failed to convert vaild ident name", K(ret));
} else if (OB_FAIL(get_new_stat_pref(ctx, opt_name, dummy_name, false, stat_pref))) {
LOG_WARN("failed to get new stat pref", K(ret));
} else if (OB_ISNULL(stat_pref)) {
@ -3002,7 +3101,7 @@ int ObDbmsStats::parse_table_part_info(ObExecContext &ctx,
param.table_id_ = table_schema->get_table_id();
param.part_level_ = table_schema->get_part_level();
param.total_part_cnt_ = table_schema->get_all_part_num();
if (OB_FAIL(parse_partition_name(table_schema, part_name, param))) {
if (OB_FAIL(parse_partition_name(ctx, table_schema, part_name, param))) {
LOG_WARN("failed to parse partition name", K(ret));
}
} else {
@ -3119,7 +3218,7 @@ int ObDbmsStats::parse_index_part_info(ObExecContext &ctx,
OB_FAIL(param.all_subpart_infos_.assign(param.subpart_infos_))) {
LOG_WARN("failed to assign", K(ret));
} else if (!part_name.is_null()) {
if (OB_FAIL(parse_partition_name(index_schema, part_name, param))) {
if (OB_FAIL(parse_partition_name(ctx, index_schema, part_name, param))) {
LOG_WARN("failed to parse partition name", K(ret));
} else {/*do nothing*/}
}
@ -3307,7 +3406,7 @@ int ObDbmsStats::parse_set_table_info(ObExecContext &ctx,
ret = OB_TABLE_NOT_EXIST;
LOG_WARN("table schema is null", K(ret), K(table_schema), K(param.db_name_), K(param.tab_name_));
LOG_USER_ERROR(OB_TABLE_NOT_EXIST, to_cstring(param.db_name_), to_cstring(param.tab_name_));
} else if (OB_FAIL(parse_set_partition_name(table_schema, part_name, param))) {
} else if (OB_FAIL(parse_set_partition_name(ctx, table_schema, part_name, param))) {
LOG_WARN("failed to parser part info", K(ret));
} else if (OB_FAIL(init_column_stat_params(ctx.get_allocator(),
*schema_guard,
@ -3360,22 +3459,24 @@ int ObDbmsStats::parse_set_column_stats(ObExecContext &ctx,
LOG_USER_ERROR(OB_TABLE_NOT_EXIST, to_cstring(param.db_name_), to_cstring(param.tab_name_));
} else if (OB_FAIL(colname.get_string(column_name))) {
LOG_WARN("failed to get column name", K(ret));
} else if (OB_FAIL(convert_vaild_ident_name(ctx.get_allocator(),
ctx.get_my_session()->get_dtc_params(),
column_name,
lib::is_oracle_mode()))) {
LOG_WARN("failed to convert vaild ident name", K(ret));
} else if (OB_UNLIKELY(column_name.empty())) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("get unexpected error", K(colname), K(ret));
} else {
int32_t pre_len = column_name.length();
try_caseup(colname.get_collation_type(), column_name);
bool is_sensitive_compare = (pre_len != column_name.length());
bool find_it = false;
for (int64_t i = 0; OB_SUCC(ret) && !find_it && i < table_schema->get_column_count(); ++i) {
const share::schema::ObColumnSchemaV2 *tmp_col = table_schema->get_column_schema_by_idx(i);
if (OB_ISNULL(tmp_col)) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("get unexpected null", K(ret), K(tmp_col));
} else if ((is_sensitive_compare &&
} else if ((lib::is_oracle_mode() &&
ObCharset::case_sensitive_equal(column_name, tmp_col->get_column_name_str())) ||
(!is_sensitive_compare &&
(!lib::is_oracle_mode() &&
ObCharset::case_insensitive_equal(column_name, tmp_col->get_column_name_str()))) {
if (OB_FAIL(ob_write_string(ctx.get_allocator(),
tmp_col->get_column_name_str(),
@ -3406,7 +3507,7 @@ int ObDbmsStats::parse_set_column_stats(ObExecContext &ctx,
// col_param.is_hidden_col_ = col->is_generated_column();
if (OB_FAIL(param.column_params_.push_back(col_param))) {
LOG_WARN("failed to push back column param", K(ret));
} else if (OB_FAIL(parse_set_partition_name(table_schema, part_name, param))) {
} else if (OB_FAIL(parse_set_partition_name(ctx, table_schema, part_name, param))) {
LOG_WARN("failed to parser part info", K(ret));
} else {
param.table_id_ = table_schema->get_table_id();
@ -3437,7 +3538,8 @@ int ObDbmsStats::parse_set_column_stats(ObExecContext &ctx,
return ret;
}
int ObDbmsStats::parse_set_partition_name(const share::schema::ObTableSchema *&table_schema,
int ObDbmsStats::parse_set_partition_name(ObExecContext &ctx,
const share::schema::ObTableSchema *&table_schema,
const ObObjParam &part_name,
ObTableStatParam &param)
{
@ -3451,6 +3553,11 @@ int ObDbmsStats::parse_set_partition_name(const share::schema::ObTableSchema *&t
/*do nothing*/
} else if (OB_FAIL(part_name.get_string(param.part_name_))) {
LOG_WARN("failed to get part name", K(ret));
} else if (OB_FAIL(convert_vaild_ident_name(ctx.get_allocator(),
ctx.get_my_session()->get_dtc_params(),
param.part_name_,
lib::is_oracle_mode()))) {
LOG_WARN("failed to convert vaild ident name", K(ret));
} else if (!table_schema->is_partitioned_table()) {
ret = OB_ERR_NOT_PARTITIONED;
LOG_WARN("the target table is not partitioned", K(ret));
@ -3463,60 +3570,56 @@ int ObDbmsStats::parse_set_partition_name(const share::schema::ObTableSchema *&t
} else if (OB_FAIL(param.all_part_infos_.assign(param.part_infos_)) ||
OB_FAIL(param.all_subpart_infos_.assign(param.subpart_infos_))) {
LOG_WARN("failed to assign", K(ret));
} else {
int32_t pre_len = param.part_name_.length();
try_caseup(part_name.get_collation_type(), param.part_name_);
bool is_sensitive_compare = (pre_len != param.part_name_.length());
if (OB_FAIL(find_selected_part_infos(param.part_name_,
param.part_infos_,
param.subpart_infos_,
is_sensitive_compare,
part_infos,
subpart_infos,
param.is_subpart_name_))) {
LOG_WARN("failed to find selected partition infos");
} else if (OB_FAIL(param.part_infos_.assign(part_infos))) {
LOG_WARN("failed to assign part infos", K(ret));
} else if (OB_FAIL(param.subpart_infos_.assign(subpart_infos))) {
LOG_WARN("failed to assign new subpart infos", K(ret));
} else {/*do nothing*/}
}
} else if (OB_FAIL(find_selected_part_infos(param.part_name_,
param.part_infos_,
param.subpart_infos_,
lib::is_oracle_mode(),
part_infos,
subpart_infos,
param.is_subpart_name_))) {
LOG_WARN("failed to find selected partition infos");
} else if (OB_FAIL(param.part_infos_.assign(part_infos))) {
LOG_WARN("failed to assign part infos", K(ret));
} else if (OB_FAIL(param.subpart_infos_.assign(subpart_infos))) {
LOG_WARN("failed to assign new subpart infos", K(ret));
} else {/*do nothing*/}
return ret;
}
int ObDbmsStats::parse_partition_name(const share::schema::ObTableSchema *&table_schema,
int ObDbmsStats::parse_partition_name(ObExecContext &ctx,
const share::schema::ObTableSchema *&table_schema,
const ObObjParam &part_name,
ObTableStatParam &param)
{
int ret = OB_SUCCESS;
ObSEArray<PartInfo, 1> part_infos;
ObSEArray<PartInfo, 32> subpart_infos;
if (OB_ISNULL(table_schema)) {
if (OB_ISNULL(table_schema) || OB_ISNULL(ctx.get_my_session())) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("get unexpected null", K(table_schema), K(ret));
LOG_WARN("get unexpected null", K(table_schema), K(ctx.get_my_session()), K(ret));
} else if (OB_FAIL(part_name.get_string(param.part_name_))) {
LOG_WARN("failed to get part name", K(ret));
} else if (OB_FAIL(convert_vaild_ident_name(ctx.get_allocator(),
ctx.get_my_session()->get_dtc_params(),
param.part_name_,
lib::is_oracle_mode()))) {
LOG_WARN("failed to convert vaild ident name", K(ret));
} else if (!table_schema->is_partitioned_table()) {
ret = OB_ERR_NOT_PARTITIONED;
LOG_WARN("the target table is not partitioned", K(ret));
} else {
int32_t pre_len = param.part_name_.length();
try_caseup(part_name.get_collation_type(), param.part_name_);
bool is_sensitive_compare = (pre_len != param.part_name_.length());
if (OB_FAIL(find_selected_part_infos(param.part_name_,
param.part_infos_,
param.subpart_infos_,
is_sensitive_compare,
part_infos,
subpart_infos,
param.is_subpart_name_))) {
LOG_WARN("failed to find selected partition infos");
} else if (OB_FAIL(param.part_infos_.assign(part_infos))) {
LOG_WARN("failed to assign part infos", K(ret));
} else if (OB_FAIL(param.subpart_infos_.assign(subpart_infos))) {
LOG_WARN("failed to assign new subpart infos", K(ret));
} else {/*do nothing*/}
}
} else if (OB_FAIL(find_selected_part_infos(param.part_name_,
param.part_infos_,
param.subpart_infos_,
lib::is_oracle_mode(),
part_infos,
subpart_infos,
param.is_subpart_name_))) {
LOG_WARN("failed to find selected partition infos");
} else if (OB_FAIL(param.part_infos_.assign(part_infos))) {
LOG_WARN("failed to assign part infos", K(ret));
} else if (OB_FAIL(param.subpart_infos_.assign(subpart_infos))) {
LOG_WARN("failed to assign new subpart infos", K(ret));
} else {/*do nothing*/}
return ret;
}
@ -3541,8 +3644,11 @@ int ObDbmsStats::parse_table_info(ObExecContext &ctx,
param.db_name_ = session->get_database_name();
} else if (OB_FAIL(owner.get_string(param.db_name_))) {
LOG_WARN("failed to get db name", K(ret));
} else {
try_caseup(owner.get_collation_type(), param.db_name_);
} else if (OB_FAIL(convert_vaild_ident_name(ctx.get_allocator(),
session->get_dtc_params(),
param.db_name_,
lib::is_oracle_mode()))) {
LOG_WARN("failed to convert vaild ident name", K(ret));
}
}
if (OB_SUCC(ret)) {
@ -3550,8 +3656,11 @@ int ObDbmsStats::parse_table_info(ObExecContext &ctx,
is_valid = false;
} else if (OB_FAIL(tab_name.get_string(param.tab_name_))) {
LOG_WARN("failed to get table name", K(ret));
} else {
try_caseup(tab_name.get_collation_type(), param.tab_name_);
} else if (OB_FAIL(convert_vaild_ident_name(ctx.get_allocator(),
session->get_dtc_params(),
param.tab_name_,
lib::is_oracle_mode()))) {
LOG_WARN("failed to convert vaild ident name", K(ret));
}
}
// parse owner/database info
@ -3662,32 +3771,32 @@ int ObDbmsStats::parse_index_table_info(ObExecContext &ctx,
to_cstring(data_table_param.tab_name_));
} else if (OB_FAIL(idx_name.get_string(index_name))) {
LOG_WARN("failed to get string", K(ret), K(idx_name));
} else if (OB_FAIL(convert_vaild_ident_name(ctx.get_allocator(),
ctx.get_my_session()->get_dtc_params(),
index_name,
lib::is_oracle_mode()))) {
LOG_WARN("failed to convert vaild ident name", K(ret));
} else if (OB_FAIL(get_index_schema(ctx,
table_schema->get_table_id(),
lib::is_oracle_mode(),
index_name,
index_schema))) {
LOG_WARN("failed to get index schema", K(ret), K(index_name));
} else if (OB_ISNULL(index_schema)) {
ret = OB_TABLE_NOT_EXIST;
LOG_WARN("index schema is null", K(ret), K(index_schema), K(data_table_param.db_name_),
K(index_name));
LOG_USER_ERROR(OB_TABLE_NOT_EXIST, to_cstring(data_table_param.db_name_),
to_cstring(index_name));
} else {
int32_t pre_len = index_name.length();
try_caseup(idx_name.get_collation_type(), index_name);
bool is_sensitive_compare = (pre_len != index_name.length());
if (OB_FAIL(get_index_schema(ctx,
table_schema->get_table_id(),
is_sensitive_compare,
index_name,
index_schema))) {
LOG_WARN("failed to get index schema", K(ret), K(index_name));
} else if (OB_ISNULL(index_schema)) {
ret = OB_TABLE_NOT_EXIST;
LOG_WARN("index schema is null", K(ret), K(index_schema), K(data_table_param.db_name_),
K(index_name));
LOG_USER_ERROR(OB_TABLE_NOT_EXIST, to_cstring(data_table_param.db_name_),
to_cstring(index_name));
} else {
param.tab_name_ = index_name;
param.db_name_ = data_table_param.db_name_;
param.tenant_id_ = data_table_param.tenant_id_;
param.db_id_ = data_table_param.db_id_;
param.table_id_ = index_schema->get_table_id();
param.part_level_ = index_schema->get_part_level();
if (OB_FAIL(set_param_global_part_id(ctx, param))) {
LOG_WARN("failed to set param globa part id", K(ret));
}
param.tab_name_ = index_name;
param.db_name_ = data_table_param.db_name_;
param.tenant_id_ = data_table_param.tenant_id_;
param.db_id_ = data_table_param.db_id_;
param.table_id_ = index_schema->get_table_id();
param.part_level_ = index_schema->get_part_level();
if (OB_FAIL(set_param_global_part_id(ctx, param))) {
LOG_WARN("failed to set param globa part id", K(ret));
}
}
return ret;
@ -3742,6 +3851,10 @@ int ObDbmsStats::parse_gather_stat_options(ObExecContext &ctx,
// do nothing
} else if (OB_FAIL(method_opt.get_varchar(param.method_opt_))) {
LOG_WARN("failed to get method opt", K(ret));
} else if (OB_FAIL(convert_vaild_ident_name(ctx.get_allocator(),
ctx.get_my_session()->get_dtc_params(),
param.method_opt_))) {
LOG_WARN("failed to convert vaild ident name", K(ret));
} else if (0 == param.method_opt_.case_compare("Z")) {
stat_options |= StatOptionFlags::OPT_METHOD_OPT;
}
@ -3765,6 +3878,10 @@ int ObDbmsStats::parse_gather_stat_options(ObExecContext &ctx,
" PARTITION | SUBPARTITION | GLOBAL AND PARTITION | APPROX_GLOBAL AND PARTITION");
} else if (OB_FAIL(granularity.get_varchar(param.granularity_))) {
LOG_WARN("failed to get granularity", K(ret));
} else if (OB_FAIL(convert_vaild_ident_name(ctx.get_allocator(),
ctx.get_my_session()->get_dtc_params(),
param.granularity_))) {
LOG_WARN("failed to convert vaild ident name", K(ret));
} else if (0 == param.granularity_.case_compare("Z")) {
stat_options |= StatOptionFlags::OPT_GRANULARITY;
}
@ -4924,7 +5041,8 @@ int ObDbmsStats::check_statistic_table_writeable(sql::ObExecContext &ctx)
// return ret;
// }
int ObDbmsStats::parse_column_info(const ObObjParam &column_name,
int ObDbmsStats::parse_column_info(sql::ObExecContext &ctx,
const ObObjParam &column_name,
ObTableStatParam &param)
{
int ret = OB_SUCCESS;
@ -4933,16 +5051,18 @@ int ObDbmsStats::parse_column_info(const ObObjParam &column_name,
/*do nothing*/
} else if (OB_FAIL(column_name.get_varchar(col_name))) {
LOG_WARN("failed to get varchar", K(ret));
} else if (OB_FAIL(convert_vaild_ident_name(ctx.get_allocator(),
ctx.get_my_session()->get_dtc_params(),
col_name,
lib::is_oracle_mode()))) {
LOG_WARN("failed to convert vaild ident name", K(ret));
} else {
ObSEArray<ObColumnStatParam, 1> new_col_params;
bool find_it = false;
int32_t pre_len = col_name.length();
try_caseup(column_name.get_collation_type(), col_name);
bool is_sensitive_compare = (pre_len != col_name.length());
for (int64_t i = 0; OB_SUCC(ret) && !find_it && i < param.column_params_.count(); ++i) {
if ((is_sensitive_compare &&
if ((lib::is_oracle_mode() &&
ObCharset::case_sensitive_equal(col_name, param.column_params_.at(i).column_name_)) ||
(!is_sensitive_compare &&
(!lib::is_oracle_mode() &&
ObCharset::case_insensitive_equal(col_name, param.column_params_.at(i).column_name_))) {
if (OB_FAIL(new_col_params.push_back(param.column_params_.at(i)))) {
LOG_WARN("failed to push back column params", K(ret));
@ -5073,8 +5193,11 @@ int ObDbmsStats::get_all_table_ids_in_database(ObExecContext &ctx,
stat_param.db_name_ = session->get_user_name();
} else if (OB_FAIL(owner.get_string(stat_param.db_name_))) {
LOG_WARN("failed to get db name", K(ret));
} else {
try_caseup(owner.get_collation_type(), stat_param.db_name_);
} else if (OB_FAIL(convert_vaild_ident_name(ctx.get_allocator(),
session->get_dtc_params(),
stat_param.db_name_,
lib::is_oracle_mode()))) {
LOG_WARN("failed to convert vaild ident name", K(ret));
}
if (OB_SUCC(ret)) {
if (OB_FAIL(schema_guard->get_database_id(stat_param.tenant_id_,
@ -5723,18 +5846,31 @@ int ObDbmsStats::get_table_stale_percent_threshold(sql::ObExecContext &ctx,
return ret;
}
void ObDbmsStats::try_caseup(ObCollationType cs_type, ObString &str_val)
int ObDbmsStats::convert_vaild_ident_name(common::ObIAllocator &allocator,
const common::ObDataTypeCastParams &dtc_params,
ObString &ident_name,
bool need_extra_conv/*default false*/)
{
if (!str_val.empty()) {
//oracle support lowercase name to gather and manager stats, eg:
// create table "t1"(c1 int);
// call dbms_stats.gather_table_stats(NULL, '"t1"');
if (str_val.ptr()[0] == '\"' && str_val.ptr()[str_val.length() - 1] == '\"') {
str_val.assign(str_val.ptr() + 1, str_val.length() - 2);
} else {
ObCharset::caseup(cs_type, str_val);
int ret = OB_SUCCESS;
if (!ident_name.empty()) {
if (OB_FAIL(ObSQLUtils::convert_sql_text_to_schema_for_storing(allocator,
dtc_params,
ident_name))) {
LOG_WARN("fail to convert charset", K(ret));
} else if (need_extra_conv) {
//oracle support lowercase name to gather and manager stats, eg:
// create table "t1"(c1 int);
// call dbms_stats.gather_table_stats(NULL, '"t1"');
if (ident_name.length() > 1 &&
ident_name.ptr()[0] == '\"' &&
ident_name.ptr()[ident_name.length() - 1] == '\"') {
ident_name.assign(ident_name.ptr() + 1, ident_name.length() - 2);
} else {
ObCharset::caseup(CS_TYPE_UTF8MB4_BIN, ident_name);
}
}
}
return ret;
}
bool ObDbmsStats::is_table_gather_global_stats(const int64_t global_id,

View File

@ -247,7 +247,8 @@ public:
ObIArray<ObColumnStatParam> &column_params,
common::ObIArray<ObString> &record_cols);
static int parse_partition_name(const share::schema::ObTableSchema *&table_schema,
static int parse_partition_name(ObExecContext &ctx,
const share::schema::ObTableSchema *&table_schema,
const ObObjParam &part_name,
ObTableStatParam &param);
@ -432,7 +433,8 @@ public:
static int process_not_size_manual_column(sql::ObExecContext &ctx, ObTableStatParam &table_param);
static int parse_set_partition_name(const share::schema::ObTableSchema *&table_schema,
static int parse_set_partition_name(ObExecContext &ctx,
const share::schema::ObTableSchema *&table_schema,
const ObObjParam &part_name,
ObTableStatParam &param);
@ -476,7 +478,8 @@ public:
private:
static int check_statistic_table_writeable(sql::ObExecContext &ctx);
static int parse_column_info(const ObObjParam &column_name,
static int parse_column_info(sql::ObExecContext &ctx,
const ObObjParam &column_name,
ObTableStatParam &param);
static int parse_stat_category(const ObString &stat_category);
@ -499,7 +502,11 @@ private:
const StatTable &stat_table,
double &stale_percent_threshold);
static void try_caseup(ObCollationType cs_type, ObString &str_val);
static int convert_vaild_ident_name(common::ObIAllocator &allocator,
const common::ObDataTypeCastParams &dtc_params,
ObString &ident_name,
bool need_extra_conv = false);
static int get_common_table_stale_percent(sql::ObExecContext &ctx,
const uint64_t tenant_id,