[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:
@ -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));
|
||||
|
||||
Reference in New Issue
Block a user