Files
oceanbase/unittest/storage/mock_multi_version_schema_service.cpp
wangzelin.wzl 93a1074b0c patch 4.0
2022-10-24 17:57:12 +08:00

120 lines
4.0 KiB
C++

/**
* Copyright (c) 2021 OceanBase
* OceanBase CE is licensed under Mulan PubL v2.
* You can use this software according to the terms and conditions of the Mulan PubL v2.
* You may obtain a copy of Mulan PubL v2 at:
* http://license.coscl.org.cn/MulanPubL-2.0
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
* See the Mulan PubL v2 for more details.
*/
#include "sql/resolver/ob_schema_checker.h"
#include "sql/resolver/ob_stmt.h"
#include "sql/resolver/ob_stmt_resolver.h"
#include "sql/resolver/ob_resolver.h"
#include "sql/resolver/ddl/ob_create_table_stmt.h"
#include "sql/parser/ob_parser.h"
#include "lib/oblog/ob_log_module.h"
#include <gmock/gmock.h>
#include <fstream>
#include "./mock_multi_version_schema_service.h"
using namespace oceanbase;
using namespace share;
using namespace sql;
#define OK(value) ASSERT_EQ(OB_SUCCESS, (value))
namespace oceanbase
{
namespace storage
{
void MockMultiVersionSchemaService::do_resolve(ObArenaAllocator &allocator,
schema::ObSchemaManager *schema_mgr,
const char *query_str, ObStmt *&stmt)
{
ObParser parser(allocator);
ObString query = ObString::make_string(query_str);
ParseResult parse_result;
OK(parser.parse(query, parse_result));
// _LOG_DEBUG("%s", SJ(ObParserResultPrintWrapper(*parse_result.result_tree_)));
parser.free_result(parse_result);
ObSchemaChecker schema_checker;
schema_checker.init(*schema_mgr);
ObResolverParams resolver_ctx;
resolver_ctx.allocator_ = &allocator;
resolver_ctx.schema_checker_ = &schema_checker;
OK(resolver_ctx.create_query_ctx());
ObResolver resolver(resolver_ctx);
OK(resolver.resolve(ObResolver::IS_NOT_PREPARED_STMT, *parse_result.result_tree_, stmt));
//_LOG_DEBUG("%s", SJ(*stmt)); // segv
}
void MockMultiVersionSchemaService::do_create_table(common::ObArenaAllocator &allocator,
share::schema::ObSchemaManager *schema_mgr,
const char *query_str,
uint64_t table_id)
{
ObStmt *stmt = NULL;
do_resolve(allocator, schema_mgr, query_str, stmt);
// add the created table schema
ObCreateTableStmt *create_table_stmt = dynamic_cast<ObCreateTableStmt *>(stmt);
OB_ASSERT(NULL != create_table_stmt);
/*
schema::ObTableSchema table_schema;
table_schema.set_tenant_id(0);
table_schema.set_database_id(0);
table_schema.set_tablegroup_id(0);
table_schema.set_table_name(create_table_stmt->get_table_name());
table_schema.set_table_id(table_id);
int64_t N = create_table_stmt->get_column_count();
for (int64_t i = 0; i < N; ++i) {
create_table_stmt->get_column_schema(i).set_column_id(i + 1);
OK(table_schema.add_column(create_table_stmt->get_column_schema(i)));
}
table_schema.set_max_used_column_id(N);
*/
create_table_stmt->get_create_table_arg().schema_.set_block_size(16384);
create_table_stmt->get_create_table_arg().schema_.set_table_id(table_id);
OK(schema_mgr->add_new_table_schema(create_table_stmt->get_create_table_arg().schema_));
}
int MockMultiVersionSchemaService::parse_from_file(const char *path)
{
int ret = OB_SUCCESS;
/**
* 1. get schema manager
*/
ObArenaAllocator allocator(ObModIds::TEST);
if (OB_SUCCESS != (ret = schema_manager_->init())) {
return ret;
}
// create schema
std::ifstream if_schema(path);
//ASSERT_TRUE(if_schema.is_open());
std::string line;
uint64_t tid = 1;
while (std::getline(if_schema, line)) {
do_create_table(allocator, schema_manager_, line.c_str(), tid++);
}
return ret;
}
const share::schema::ObSchemaManager *MockMultiVersionSchemaService::get_user_schema_manager(
const int64_t version)
{
UNUSED(version);
return schema_manager_;
}
}
}