[FEAT MERGE] materialized view

Co-authored-by: suz-yang <suz.yang@foxmail.com>
Co-authored-by: leftgeek <1094669802@qq.com>
Co-authored-by: chimyue <chimyue@gmail.com>
This commit is contained in:
coolfishchen
2023-12-14 07:42:51 +00:00
committed by ob-robot
parent 0f946e55fb
commit f7cd32be94
257 changed files with 35700 additions and 4337 deletions

View File

@ -46,7 +46,6 @@ namespace share
namespace schema
{
bool ObMultiVersionSchemaService::g_skip_resolve_materialized_view_definition_ = false;
const char *ObMultiVersionSchemaService::print_refresh_schema_mode(const RefreshSchemaMode mode)
{
@ -311,68 +310,6 @@ int ObMultiVersionSchemaService::update_schema_cache(
return ret;
}
// for materialized view, construct the 'full schema' with 'column generated rules'
int ObMultiVersionSchemaService::build_full_materalized_view_schema(
ObSchemaGetterGuard &schema_guard,
ObIAllocator &allocator,
ObTableSchema *&view_schema)
{
int ret = OB_SUCCESS;
const uint64_t tenant_id = view_schema->get_tenant_id();
const ObTenantSchema *tenant_schema = NULL;
if (OB_FAIL(schema_guard.get_tenant_info(tenant_id, tenant_schema))) {
LOG_WARN("fail to get tenant schema", K(tenant_id), K(ret));
} else if (OB_ISNULL(tenant_schema)) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("NULL ptr", K(tenant_schema), K(ret));
} else {
ObParser parser(allocator, DEFAULT_MYSQL_MODE);
ParseResult view_result;
// parse view define
const ObString &view_def = view_schema->get_view_schema().get_view_definition();
if (OB_FAIL(parser.parse(view_def, view_result))) {
LOG_WARN("parse view defination failed", K(view_def), K(ret));
} else {
// resolve params
ObResolverParams resolver_ctx;
ObSchemaChecker schema_checker;
ObStmtFactory stmt_factory(allocator);
ObRawExprFactory expr_factory(allocator);
SMART_VAR(ObSQLSessionInfo, default_session) {
if (OB_FAIL(schema_checker.init(schema_guard))) {
LOG_WARN("fail to init schema_checker", K(ret));
} else if (OB_FAIL(default_session.init(0, 0, &allocator))) {
LOG_WARN("init empty session failed", K(ret));
} else if (OB_FAIL(default_session.load_default_sys_variable(false, false))) {
LOG_WARN("session load default system variable failed", K(ret));
} else if (OB_FAIL(default_session.init_tenant(tenant_schema->get_tenant_name(), tenant_id))) {
LOG_WARN("fail to set tenant", "tenant", tenant_schema->get_tenant_name(),
"id", tenant_id, K(ret));
} else {
resolver_ctx.allocator_ = &allocator;
resolver_ctx.schema_checker_ = &schema_checker;
resolver_ctx.session_info_ = &default_session;
resolver_ctx.stmt_factory_ = &stmt_factory;
resolver_ctx.expr_factory_ = &expr_factory;
resolver_ctx.query_ctx_ = stmt_factory.get_query_ctx();
ObSelectResolver view_resolver(resolver_ctx);
ParseNode *view_stmt_node = view_result.result_tree_->children_[0];
if (!view_stmt_node) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("unexpected children for view result after parse", K(ret));
} else if (OB_FAIL(view_resolver.resolve(*view_stmt_node))) {
LOG_WARN("resolve view definition failed", K(ret));
} else { /*do nothing*/ }
}
}
}
}
return ret;
}
// for ObLatestSchemaGuard
int ObMultiVersionSchemaService::get_latest_schema(
common::ObIAllocator &allocator,
@ -664,29 +601,8 @@ int ObMultiVersionSchemaService::get_schema(const ObSchemaMgr *mgr,
LOG_WARN("get aux lob meta table schemas failed", K(ret), KPC(table_schema));
} else if (OB_FAIL(add_aux_schema_from_mgr(*mgr, *table_schema, AUX_LOB_PIECE))) {
LOG_WARN("get aux lob data table schemas failed", K(ret), KPC(table_schema));
}
}
// process mv
if (OB_FAIL(ret)) {
} else if (MATERIALIZED_VIEW == table_schema->get_table_type()
&& !g_skip_resolve_materialized_view_definition_) {
// Ideally, the current function should no longer rely on schema_guard,
// but in order to deal with compatibility, it has to be used here
ObSchemaGetterGuard schema_guard;
const ObSimpleTableSchemaV2 *mv_schema = NULL;
if (OB_FAIL(get_tenant_schema_guard(tenant_id, schema_guard))) {
LOG_WARN("get schema guard failed", K(ret), K(tenant_id));
} else if (OB_FAIL(schema_guard.get_simple_table_schema(
tenant_id, schema_id, mv_schema))) {
LOG_WARN("get table schema failed", K(tenant_id), K(schema_id), K(ret));
} else if (mv_schema != NULL && mv_schema->get_schema_version() == schema_version) {
// do-nothing
} else if (OB_FAIL(get_tenant_schema_guard(tenant_id, schema_guard, schema_version, true))) {
LOG_WARN("get schema guard failed", K(tenant_id), K(schema_id), K(schema_version), K(ret));
}
if (FAILEDx(build_full_materalized_view_schema(schema_guard, allocator, table_schema))) {
LOG_WARN("fail to make columns for materialized table schema",
K(ret), K(tenant_id), K(schema_id));
} else if (OB_FAIL(add_aux_schema_from_mgr(*mgr, *table_schema, MATERIALIZED_VIEW_LOG))) {
LOG_WARN("get materialized view log schemas failed", K(ret), KPC(table_schema));
}
}
}
@ -793,7 +709,7 @@ int ObMultiVersionSchemaService::add_aux_schema_from_mgr(
ret = OB_ERR_UNEXPECTED;
LOG_WARN("NULL ptr", K(ret));
} else {
if (simple_aux_table->is_index_table() || simple_aux_table->is_materialized_view()) {
if (simple_aux_table->is_index_table()) {
if (OB_FAIL(table_schema.add_simple_index_info(ObAuxTableMetaInfo(
simple_aux_table->get_table_id(),
simple_aux_table->get_table_type(),
@ -808,6 +724,8 @@ int ObMultiVersionSchemaService::add_aux_schema_from_mgr(
table_schema.set_aux_lob_meta_tid(simple_aux_table->get_table_id());
} else if (simple_aux_table->is_aux_lob_piece_table()) {
table_schema.set_aux_lob_piece_tid(simple_aux_table->get_table_id());
} else if (simple_aux_table->is_mlog_table()) {
table_schema.set_mlog_tid(simple_aux_table->get_table_id());
} else {
ret = OB_ERR_UNEXPECTED;
LOG_ERROR("unexpected", K(ret));