120 lines
4.0 KiB
C++
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_;
|
|
}
|
|
|
|
}
|
|
}
|
|
|