diff --git a/src/rootserver/ob_create_index_on_empty_table_helper.cpp b/src/rootserver/ob_create_index_on_empty_table_helper.cpp index 5bf970f63a0642edca8529cb22523b459cc5f6b1..b6747fb8ef73b4ee038ee721875f123014bc1627 100644 --- a/src/rootserver/ob_create_index_on_empty_table_helper.cpp +++ b/src/rootserver/ob_create_index_on_empty_table_helper.cpp @@ -26,6 +26,7 @@ namespace rootserver int ObCreateIndexOnEmptyTableHelper::check_create_index_on_empty_table_opt( rootserver::ObDDLService &ddl_service, ObMySQLTransaction &trans, + const share::schema::ObSysVariableSchema &sys_var_schema, const ObString &database_name, const share::schema::ObTableSchema &table_schema, ObIndexType index_type, @@ -36,7 +37,7 @@ int ObCreateIndexOnEmptyTableHelper::check_create_index_on_empty_table_opt( is_create_index_on_empty_table_opt = false; if (DATA_VERSION_SUPPORT_EMPTY_TABLE_CREATE_INDEX_OPT(executor_data_version)) { if (!share::schema::is_index_support_empty_table_opt(index_type) && index_type != ObIndexType::INDEX_TYPE_IS_NOT) { - } else if (OB_FAIL(ObDDLUtil::check_table_empty(database_name, + } else if (OB_FAIL(ObDDLUtil::check_table_empty(sys_var_schema, database_name, table_schema, sql_mode, is_create_index_on_empty_table_opt))) { @@ -49,13 +50,16 @@ int ObCreateIndexOnEmptyTableHelper::check_create_index_on_empty_table_opt( } else { LOG_WARN("failed to lock table", KR(ret), K(table_schema)); } - } else if (OB_FAIL(ObDDLUtil::check_table_empty(database_name, + } else if (OB_FAIL(ObDDLUtil::check_table_empty(sys_var_schema, database_name, table_schema, sql_mode, is_create_index_on_empty_table_opt))) { LOG_WARN("failed to check table empty", KR(ret), K(database_name), K(table_schema)); } } + LOG_TRACE("check_create_index_on_empty_table_opt", K(ret), K(is_create_index_on_empty_table_opt), + "name_case_mode", sys_var_schema.get_name_case_mode(), + K(database_name), "table_name", table_schema.get_table_name_str()); return ret; } diff --git a/src/rootserver/ob_create_index_on_empty_table_helper.h b/src/rootserver/ob_create_index_on_empty_table_helper.h index 72f62307237dba94f065fbbddb65893fcef58d4e..8855d222d8762a76b9299440b86745f0597b6906 100644 --- a/src/rootserver/ob_create_index_on_empty_table_helper.h +++ b/src/rootserver/ob_create_index_on_empty_table_helper.h @@ -29,6 +29,7 @@ public: static int check_create_index_on_empty_table_opt( rootserver::ObDDLService &ddl_service, ObMySQLTransaction &trans, + const share::schema::ObSysVariableSchema &sys_var_schema, const ObString &database_name, const share::schema::ObTableSchema &table_schema, ObIndexType index_type, diff --git a/src/rootserver/ob_ddl_service.cpp b/src/rootserver/ob_ddl_service.cpp index b7380279f0514e2463a33199a8564c090f948212..d7eb2c26c8645683e8b7aa8619a2b66f51f7f92d 100644 --- a/src/rootserver/ob_ddl_service.cpp +++ b/src/rootserver/ob_ddl_service.cpp @@ -15382,7 +15382,7 @@ int ObDDLService::check_need_add_progressive_round( return ret; } -int ObDDLService::check_is_only_add_index_on_empty_table(ObMySQLTransaction &trans, +int ObDDLService::check_is_only_add_index_on_empty_table(ObSchemaGetterGuard &schema_guard, ObMySQLTransaction &trans, const ObString &database_name, const share::schema::ObTableSchema &table_schema, const obrpc::ObAlterTableArg &alter_table_arg, @@ -15405,8 +15405,16 @@ int ObDDLService::check_is_only_add_index_on_empty_table(ObMySQLTransaction &tra } } if (OB_SUCC(ret) && is_only_creata_index_on_empty_table) { - if (OB_FAIL(ObCreateIndexOnEmptyTableHelper::check_create_index_on_empty_table_opt(*this, + const ObSysVariableSchema *sys_var_schema = nullptr; + const uint64_t tenant_id = table_schema.get_tenant_id(); + if (OB_FAIL(schema_guard.get_sys_variable_schema(tenant_id, sys_var_schema))) { + LOG_WARN("fail to get sysvar schema", KR(ret), K(tenant_id)); + } else if (OB_ISNULL(sys_var_schema)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("sys_var_schema is null", KR(ret)); + } else if (OB_FAIL(ObCreateIndexOnEmptyTableHelper::check_create_index_on_empty_table_opt(*this, trans, + *sys_var_schema, database_name, table_schema, ObIndexType::INDEX_TYPE_IS_NOT, @@ -15628,7 +15636,7 @@ int ObDDLService::alter_table_in_trans(obrpc::ObAlterTableArg &alter_table_arg, orig_table_schema->get_table_id(), ddl_operator, *schema_service_))) { LOG_WARN("failed to modify obj status", K(ret)); - } else if (OB_FAIL(check_is_only_add_index_on_empty_table(trans, + } else if (OB_FAIL(check_is_only_add_index_on_empty_table(schema_guard, trans, alter_table_schema.get_origin_database_name(), new_table_schema, alter_table_arg, @@ -17561,14 +17569,20 @@ int ObDDLService::add_not_null_column_default_null_to_table_schema( bool is_table_empty = false; bool is_oracle_mode = false; const uint64_t tenant_id = origin_table_schema.get_tenant_id(); + const ObSysVariableSchema *sys_var_schema = nullptr; if (OB_FAIL(origin_table_schema.check_if_oracle_compat_mode(is_oracle_mode))) { LOG_WARN("fail to check is oracle mode", K(ret), K(origin_table_schema)); + } else if (OB_FAIL(schema_guard.get_sys_variable_schema(tenant_id, sys_var_schema))) { + LOG_WARN("fail to get sysvar schema", KR(ret), K(tenant_id)); + } else if (OB_ISNULL(sys_var_schema)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("sys_var_schema is null", KR(ret)); } else if (OB_UNLIKELY(!is_oracle_mode)) { ret = OB_NOT_SUPPORTED; LOG_WARN("add column not null in mysql mode is online ddl, not offline ddl", K(ret), K(is_oracle_mode)); } else if (OB_FAIL(lock_table(trans, origin_table_schema))) { LOG_WARN("failed to lock ddl lock", K(ret)); - } else if (OB_FAIL(ObDDLUtil::check_table_empty(alter_table_arg.alter_table_schema_.get_origin_database_name(), + } else if (OB_FAIL(ObDDLUtil::check_table_empty(*sys_var_schema, alter_table_arg.alter_table_schema_.get_origin_database_name(), origin_table_schema, alter_table_arg.sql_mode_, is_table_empty))) { diff --git a/src/rootserver/ob_ddl_service.h b/src/rootserver/ob_ddl_service.h index fceb581f06cd0514cb3af362024aaa42d74c99a6..60f94fb92c046daf9b397de775b967e06b1a8f71 100644 --- a/src/rootserver/ob_ddl_service.h +++ b/src/rootserver/ob_ddl_service.h @@ -1366,7 +1366,8 @@ int check_will_be_having_domain_index_operation( common::ObMySQLTransaction &trans, const share::schema::ObSchemaOperationType operation_type, const common::ObString &ddl_stmt_str); - int check_is_only_add_index_on_empty_table(ObMySQLTransaction &trans, + int check_is_only_add_index_on_empty_table(ObSchemaGetterGuard &schema_guard, + ObMySQLTransaction &trans, const ObString &database_name, const share::schema::ObTableSchema &table_schema, const obrpc::ObAlterTableArg &alter_table_arg, diff --git a/src/rootserver/ob_index_builder.cpp b/src/rootserver/ob_index_builder.cpp index 5b2b7fd508dd0c9a7004e23c6c0c4f82670cf7c5..1f126c06eb7a701255f2a739dfc59c5075d9246c 100644 --- a/src/rootserver/ob_index_builder.cpp +++ b/src/rootserver/ob_index_builder.cpp @@ -605,6 +605,7 @@ int ObIndexBuilder::do_create_global_index( const uint64_t tenant_id = table_schema.get_tenant_id(); bool create_index_on_empty_table_opt = false; const ObString &database_name = arg.database_name_; + const ObSysVariableSchema *sys_var_schema = nullptr; if (database_name.empty()) { ret = OB_INVALID_ARGUMENT; LOG_WARN("database name is empty", K(ret), K(database_name)); @@ -622,8 +623,14 @@ int ObIndexBuilder::do_create_global_index( } else if (!new_arg.is_valid()) { ret = OB_ERR_UNEXPECTED; LOG_WARN("fail to copy create index arg", K(ret)); + } else if (OB_FAIL(schema_guard.get_sys_variable_schema(tenant_id, sys_var_schema))) { + LOG_WARN("fail to get sysvar schema", KR(ret), K(tenant_id)); + } else if (OB_ISNULL(sys_var_schema)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("sys_var_schema is null", KR(ret)); } else if (OB_FAIL(ObCreateIndexOnEmptyTableHelper::check_create_index_on_empty_table_opt(ddl_service_, trans, + *sys_var_schema, database_name, table_schema, new_arg.index_type_, @@ -1415,6 +1422,7 @@ int ObIndexBuilder::do_create_local_index( ObDocIDType type = ObDocIDType::INVALID; bool create_index_on_empty_table_opt = false; const ObString &database_name = create_index_arg.database_name_; + const ObSysVariableSchema *sys_var_schema = nullptr; if (database_name.empty()) { ret = OB_INVALID_ARGUMENT; LOG_WARN("database name is empty", K(ret), K(database_name)); @@ -1440,8 +1448,14 @@ int ObIndexBuilder::do_create_local_index( } else if (!my_arg.is_valid()) { ret = OB_ERR_UNEXPECTED; LOG_WARN("fail to copy create index arg", K(ret)); + } else if (OB_FAIL(schema_guard.get_sys_variable_schema(tenant_id, sys_var_schema))) { + LOG_WARN("fail to get sysvar schema", KR(ret), K(tenant_id)); + } else if (OB_ISNULL(sys_var_schema)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("sys_var_schema is null", KR(ret)); } else if (OB_FAIL(ObCreateIndexOnEmptyTableHelper::check_create_index_on_empty_table_opt(ddl_service_, trans, + *sys_var_schema, database_name, table_schema, my_arg.index_type_, diff --git a/src/rootserver/parallel_ddl/ob_create_index_helper.cpp b/src/rootserver/parallel_ddl/ob_create_index_helper.cpp index 5c9f063f013224cda51dd57285d500ff2851da40..34584e87aea86ea701f1d12514b998a473158a21 100644 --- a/src/rootserver/parallel_ddl/ob_create_index_helper.cpp +++ b/src/rootserver/parallel_ddl/ob_create_index_helper.cpp @@ -65,6 +65,7 @@ int ObCreateIndexHelper::lock_objects_() { int ret = OB_SUCCESS; const ObDatabaseSchema *database_schema = NULL; + const ObSysVariableSchema *sysvar_schema = nullptr; DEBUG_SYNC(BEFORE_PARALLEL_DDL_LOCK); if (OB_FAIL(check_inner_stat_())) { LOG_WARN("fail to check inner stat", KR(ret)); @@ -94,8 +95,14 @@ int ObCreateIndexHelper::lock_objects_() ret = OB_ERR_PARALLEL_DDL_CONFLICT; LOG_WARN("database_schema's database name not equal to arg", KR(ret), K(database_schema->get_database_name_str()), K_(arg_.database_name)); + } else if (OB_FAIL(latest_schema_guard_.get_sys_variable_schema(sysvar_schema))) { + LOG_WARN("fail to get sysvar schema", KR(ret), K_(tenant_id)); + } else if (OB_ISNULL(sysvar_schema)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("sysvar_schema is null", KR(ret)); } else if (OB_FAIL(ObCreateIndexOnEmptyTableHelper::check_create_index_on_empty_table_opt(*ddl_service_, get_trans_(), + *sysvar_schema, arg_.database_name_, *orig_data_table_schema_, arg_.index_type_, diff --git a/src/share/ob_ddl_common.cpp b/src/share/ob_ddl_common.cpp index 36e85a3da811d6005c9da0d087b50940a21b3e0e..710ccb4ab937775e5849f72843fad5caa5b66740 100644 --- a/src/share/ob_ddl_common.cpp +++ b/src/share/ob_ddl_common.cpp @@ -5013,12 +5013,14 @@ int ObDDLUtil::check_tablet_checksum_error( } int ObDDLUtil::check_table_empty( + const share::schema::ObSysVariableSchema &sys_var_schema, const ObString &database_name, const share::schema::ObTableSchema &table_schema, const ObSQLMode sql_mode, bool &is_table_empty) { int ret = OB_SUCCESS; + UNUSED(sql_mode); is_table_empty = false; bool is_oracle_mode = false; uint64_t table_id = OB_INVALID_ID; @@ -5032,34 +5034,46 @@ int ObDDLUtil::check_table_empty( } else if (OB_FAIL(table_schema.check_if_oracle_compat_mode(is_oracle_mode))) { LOG_WARN("fail to check is oracle mode", K(ret), K(table_schema)); } else { - const ObString &check_expr_str = "1 != 1"; const ObString &table_name = table_schema.get_table_name_str(); ObSqlString sql_string; - ObSessionParam session_param; - int64_t new_sql_mode = static_cast(sql_mode); - session_param.sql_mode_ = &new_sql_mode; - session_param.tz_info_wrap_ = nullptr; - session_param.ddl_info_.set_is_ddl(true); - session_param.ddl_info_.set_retryable_ddl(true); - session_param.ddl_info_.set_source_table_hidden(table_schema.is_user_hidden_table()); - session_param.ddl_info_.set_dest_table_hidden(false); ObTimeoutCtx timeout_ctx; - ObCommonSqlProxy *sql_proxy = nullptr; const char* format_str = nullptr; + const uint64_t tenant_id = table_schema.get_tenant_id(); + ObOracleSqlProxy oracle_sql_proxy(*GCTX.sql_proxy_); + ObSingleConnectionProxy single_conn_proxy; + sqlclient::ObISQLConnection *connection = nullptr; + const ObSysVarSchema *var_schema = nullptr; + if (is_oracle_mode) { format_str = "SELECT /*+ %.*s */ 1 FROM \"%.*s\".\"%.*s\" WHERE NOT 1 != 1 AND ROWNUM = 1"; - sql_proxy = GCTX.ddl_oracle_sql_proxy_; + if (OB_FAIL(single_conn_proxy.connect(tenant_id, 0/*group_id*/, &oracle_sql_proxy))) { + LOG_WARN("failed to get mysql connect", KR(ret), K(tenant_id)); + } } else { format_str = "SELECT /*+ %.*s */ 1 FROM `%.*s`.`%.*s` WHERE NOT 1 != 1 LIMIT 1"; - sql_proxy = GCTX.ddl_sql_proxy_; + if (OB_FAIL(single_conn_proxy.connect(tenant_id, 0/*group_id*/, GCTX.sql_proxy_))) { + LOG_WARN("failed to get mysql connect", KR(ret), K(tenant_id)); + } } + SMART_VAR(ObMySQLProxy::MySQLResult, res) { common::sqlclient::ObMySQLResult *result = nullptr; ObSqlString ddl_schema_hint_str; ObArenaAllocator allocator("ObDDLTmp"); ObString new_table_name; ObString new_database_name; - if (OB_FAIL(sql::ObSQLUtils::generate_new_name_with_escape_character( + if (OB_FAIL(ret)) { + } else if (OB_FAIL(sys_var_schema.get_sysvar_schema(SYS_VAR_LOWER_CASE_TABLE_NAMES, var_schema))) { + LOG_WARN("failed to get lower_case_table_names", KR(ret)); + } else if (OB_ISNULL(var_schema)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("var_schema is null", KR(ret)); + } else if (OB_ISNULL(connection = single_conn_proxy.get_connection())) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("unexpected null conn", K(ret)); + } else if (OB_FAIL(connection->set_session_variable(share::OB_SV_LOWER_CASE_TABLE_NAMES, var_schema->get_value()))) { + LOG_WARN("update lower_case_table_names for ddl inner sql failed", K(ret)); + } else if (OB_FAIL(sql::ObSQLUtils::generate_new_name_with_escape_character( allocator, database_name, new_database_name, @@ -5083,16 +5097,11 @@ int ObDDLUtil::check_table_empty( static_cast(new_database_name.length()), new_database_name.ptr(), static_cast(new_table_name.length()), new_table_name.ptr()))) { LOG_WARN("fail to assign format", K(ret)); - } - if (OB_FAIL(ret)) { - } else if (OB_ISNULL(sql_proxy)) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("sql proxy is null", K(ret)); - } else if (OB_FAIL(sql_proxy->read(res, table_schema.get_tenant_id(), sql_string.ptr(), &session_param))) { + } else if (OB_FAIL(single_conn_proxy.read(res, tenant_id, sql_string.ptr()))) { LOG_WARN("execute sql failed", K(ret), K(sql_string.ptr())); } else if (OB_ISNULL(result = res.get_result())) { ret = OB_ERR_UNEXPECTED; - LOG_WARN("execute sql failed", K(ret), K(table_schema.get_tenant_id()), K(sql_string)); + LOG_WARN("execute sql failed", K(ret), K(tenant_id), K(sql_string)); } else if (OB_FAIL(result->next())) { if (OB_ITER_END == ret) { ret = OB_SUCCESS; diff --git a/src/share/ob_ddl_common.h b/src/share/ob_ddl_common.h index 8c2db2d8fa6803f83a72d05fcab388552bd412ec..73a8599f6fd659e2a0ef3d662de4d9aa39de9889 100644 --- a/src/share/ob_ddl_common.h +++ b/src/share/ob_ddl_common.h @@ -1417,6 +1417,7 @@ public: const bool calc_memtable, int64_t &physical_row_count /*OUT*/); static int check_table_empty( + const share::schema::ObSysVariableSchema &sys_var_schema, const ObString &database_name, const share::schema::ObTableSchema &table_schema, const ObSQLMode sql_mode, diff --git a/src/share/schema/ob_latest_schema_guard.cpp b/src/share/schema/ob_latest_schema_guard.cpp index 267cd6a79ffab4a25147db8eada79e0a3a7e4daa..9e94a3151144af0be19c2ca1b8550d080e0255d0 100644 --- a/src/share/schema/ob_latest_schema_guard.cpp +++ b/src/share/schema/ob_latest_schema_guard.cpp @@ -1074,3 +1074,17 @@ int ObLatestSchemaGuard::get_table_id_and_table_name_in_tablegroup( } return ret; } + +int ObLatestSchemaGuard::get_sys_variable_schema(const ObSysVariableSchema *&sys_variable_schema) +{ + int ret = OB_SUCCESS; + sys_variable_schema = NULL; + if (OB_FAIL(check_inner_stat_())) { + LOG_WARN("fail to check inner stat", KR(ret)); + } else if (OB_FAIL(get_schema_(SYS_VARIABLE_SCHEMA, tenant_id_, tenant_id_/*schema_id*/, sys_variable_schema))) { + LOG_WARN("fail to get tenant system variable", KR(ret), K_(tenant_id), KPC(sys_variable_schema)); + } else if (OB_ISNULL(sys_variable_schema)) { + LOG_INFO("sys_variable_schema is null", KR(ret), K_(tenant_id)); + } + return ret; +} diff --git a/src/share/schema/ob_latest_schema_guard.h b/src/share/schema/ob_latest_schema_guard.h index 12161e92d087485c36e0f0c80388bce26c5d0d9a..b7f2a663f8ecd3d6239b826ef5985ca59d8e7277 100644 --- a/src/share/schema/ob_latest_schema_guard.h +++ b/src/share/schema/ob_latest_schema_guard.h @@ -438,6 +438,8 @@ int get_table_id_and_table_name_in_tablegroup( int get_sequence_schema(const uint64_t sequence_id, const ObSequenceSchema *&sequence_schema); + int get_sys_variable_schema(const ObSysVariableSchema *&sys_variable_schema); + /* -------------- interfaces with cache end ---------------*/ private: int check_inner_stat_();