Files
oceanbase/unittest/share/schema/test_outline_info.cpp
oceanbase-admin cea7de1475 init push
2021-05-31 22:56:52 +08:00

182 lines
6.6 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 <gtest/gtest.h>
#include <iostream>
#include <string.h>
#include "lib/allocator/ob_tc_malloc.h"
#include "lib/time/ob_time_utility.h"
#include "sql/parser/ob_parser.h"
#include "sql/ob_sql_mode_manager.h"
#include "sql/session/ob_sql_session_info.h"
#include "share/schema/ob_schema_struct.h"
namespace oceanbase {
using namespace common;
using namespace std;
using namespace sql;
namespace share {
namespace schema {
static const int64_t BUF_SIZE = 1024 * 10;
void judge_outline_info_equal(const ObOutlineInfo& info_l, const ObOutlineInfo& info_r)
{
EXPECT_EQ(info_l.get_name_str(), info_r.get_name_str());
EXPECT_EQ(info_l.get_signature_str(), info_r.get_signature_str());
EXPECT_EQ(info_l.get_outline_content_str(), info_r.get_outline_content_str());
EXPECT_EQ(info_l.get_sql_text_str(), info_r.get_sql_text_str());
EXPECT_EQ(info_l.get_owner_str(), info_r.get_owner_str());
EXPECT_EQ(info_l.get_version_str(), info_r.get_version_str());
EXPECT_EQ(info_l.get_tenant_id(), info_r.get_tenant_id());
EXPECT_EQ(info_l.get_database_id(), info_r.get_database_id());
EXPECT_EQ(info_l.get_outline_id(), info_r.get_outline_id());
EXPECT_EQ(info_l.get_schema_version(), info_r.get_schema_version());
EXPECT_EQ(info_l.get_outline_params_wrapper().get_outline_params().count(),
info_r.get_outline_params_wrapper().get_outline_params().count());
for (int64_t i = 0; i < info_l.get_outline_params_wrapper().get_outline_params().count(); i++) {
const ObMaxConcurrentParam* param_l = info_l.get_outline_params_wrapper().get_outline_params().at(i);
const ObMaxConcurrentParam* param_r = info_r.get_outline_params_wrapper().get_outline_params().at(i);
bool is_same = false;
EXPECT_EQ(OB_SUCCESS, param_l->same_param_as(*param_r, is_same));
EXPECT_EQ(true, is_same);
}
}
void init_outline_info(ObOutlineInfo& outline_info)
{
ObArenaAllocator allocator;
outline_info.set_name("outline_name");
outline_info.set_signature("signature");
outline_info.set_outline_content("outline_content");
outline_info.set_sql_text("sql_text");
outline_info.set_owner("owner_name");
outline_info.set_owner_id(1);
outline_info.set_version("version");
outline_info.set_tenant_id(1);
outline_info.set_database_id(1);
outline_info.set_outline_id(1);
outline_info.set_schema_version(1);
EXPECT_EQ(true, outline_info.is_valid());
// add param
ObFixedParam fixed_param;
fixed_param.offset_ = 90;
fixed_param.value_.set_int(80);
ObMaxConcurrentParam param(&allocator);
param.concurrent_num_ = 100;
EXPECT_EQ(OB_SUCCESS, param.fixed_param_store_.push_back(fixed_param));
EXPECT_EQ(OB_SUCCESS, outline_info.add_param(param));
}
TEST(ObSchemaStructTest, test_deep_copy_outline_info)
{
// create outline_info
ObOutlineInfo outline_info;
init_outline_info(outline_info);
// copy outline_info
ObOutlineInfo* new_outline = NULL;
const int64_t size = outline_info.get_convert_size();
char* buf = static_cast<char*>(ob_malloc(size));
ObDataBuffer data_buf(buf + sizeof(ObOutlineInfo), size - sizeof(ObOutlineInfo));
ASSERT_NE(static_cast<char*>(NULL), buf);
new_outline = new (buf) ObOutlineInfo(&data_buf);
ASSERT_NE(static_cast<ObOutlineInfo*>(NULL), new_outline);
*new_outline = outline_info;
EXPECT_EQ(true, new_outline->is_valid());
// judge equal
judge_outline_info_equal(*new_outline, outline_info);
}
TEST(ObSchemaStructTest, test_serialize_outline_info)
{
// create outline_info
ObOutlineInfo outline_info;
init_outline_info(outline_info);
// serialize outline_info
ObOutlineInfo new_outline;
const int64_t serialize_size = outline_info.get_serialize_size();
char buf[serialize_size];
int64_t buf_len = serialize_size, new_buf_len = 0;
int64_t pos = 0, new_pos = 0;
EXPECT_EQ(OB_SUCCESS, outline_info.serialize(buf, buf_len, pos));
new_buf_len = pos;
EXPECT_EQ(OB_SUCCESS, new_outline.deserialize(buf, new_buf_len, new_pos));
// judge equal
judge_outline_info_equal(new_outline, outline_info);
}
TEST(ObSchemaStructTest, test_gen_limit_sql)
{
ObString visible_signature("select '?' from t1 where c1 > ? and c2 = ? order by 1");
ObString limit_sql;
ObArenaAllocator allocator;
ObMaxConcurrentParam param(&allocator);
ObFixedParam fixed_param1;
ObSQLSessionInfo session;
fixed_param1.offset_ = 0;
fixed_param1.value_.set_int(1);
EXPECT_EQ(OB_SUCCESS, param.fixed_param_store_.push_back(fixed_param1));
ObFixedParam fixed_param2;
fixed_param2.offset_ = 1;
fixed_param2.value_.set_int(2);
EXPECT_EQ(OB_SUCCESS, param.fixed_param_store_.push_back(fixed_param2));
// test
EXPECT_EQ(OB_SUCCESS, ObOutlineInfo::gen_limit_sql(visible_signature, &param, session, allocator, limit_sql));
ObString result("select '?' from t1 where c1 > 1 and c2 = 2 order by 1");
cout << result.ptr() << endl;
cout << limit_sql.ptr() << endl;
EXPECT_EQ(0, strncmp(result.ptr(), limit_sql.ptr(), limit_sql.length()));
// test
EXPECT_EQ(OB_SUCCESS, ObOutlineInfo::gen_limit_sql(visible_signature, &param, session, allocator, limit_sql));
cout << result.ptr() << endl;
cout << limit_sql.ptr() << endl;
EXPECT_EQ(0, strncmp(result.ptr(), limit_sql.ptr(), limit_sql.length()));
// test
EXPECT_EQ(OB_SUCCESS, ObOutlineInfo::gen_limit_sql(visible_signature, &param, session, allocator, limit_sql));
cout << result.ptr() << endl;
cout << limit_sql.ptr() << endl;
EXPECT_EQ(0, strncmp(result.ptr(), limit_sql.ptr(), limit_sql.length()));
}
TEST(ObSchemaStructTest, test_question_makr_pos)
{
ObArenaAllocator allocator;
ObSQLModeManager mod_mgr;
ObString sql("select * from t1 where c1 > ? and c2 = ? and c3 = '?'");
ObParser parser(allocator, mod_mgr.get_sql_mode());
ParseResult parse_result;
EXPECT_EQ(OB_SUCCESS, parser.parse(sql, parse_result, FP_MODE));
EXPECT_EQ(3, parse_result.param_node_num_);
}
} // namespace schema
} // namespace share
} // namespace oceanbase
int main(int argc, char** argv)
{
system("rm -rf test_outline_info.log");
oceanbase::common::ObLogger::get_logger().set_log_level("INFO");
OB_LOGGER.set_file_name("test_outline_info.log", true);
::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}