/** * 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 #include #include #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(ob_malloc(size)); ObDataBuffer data_buf(buf + sizeof(ObOutlineInfo), size - sizeof(ObOutlineInfo)); ASSERT_NE(static_cast(NULL), buf); new_outline = new (buf) ObOutlineInfo(&data_buf); ASSERT_NE(static_cast(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, ¶m, session, allocator, limit_sql)); ObString result("select '?' from t1 where c1 > 1 and c2 = 2 order by 1"); cout< ? 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_); } }//schema }//share }//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(); }