oceanbase/unittest/sql/optimizer/test_join_order.cpp
wangzelin.wzl 93a1074b0c patch 4.0
2022-10-24 17:57:12 +08:00

110 lines
3.4 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.
*/
#define USING_LOG_PREFIX SQL_OPT
#include "sql/optimizer/ob_join_order.h"
#include "observer/ob_req_time_service.h"
#include "test_optimizer_utils.h"
namespace oceanbase
{
namespace sql
{
class Path;
}
}
namespace test
{
class TestJoinOrder: public TestOptimizerUtils
{
public:
TestJoinOrder(){}
~TestJoinOrder(){}
};
TEST_F(TestJoinOrder, ob_join_order_select)
{
const char* test_file = "./test_join_order_case.sql";
const char* result_file = "./test_join_order_case.result";
const char* tmp_file = "./test_join_order_case.tmp";
run_test(test_file, result_file, tmp_file);
}
class TestPath : public oceanbase::sql::Path
{
virtual void get_name_internal(char *buf, const int64_t buf_len, int64_t &pos) const
{ UNUSED(buf), UNUSED(buf_len), UNUSED(pos);}
virtual int estimate_cost() override { return OB_SUCCESS; }
virtual int re_estimate_cost(double need_row_count, double &cost) { UNUSED(need_row_count); cost = 0; return OB_SUCCESS; }
virtual int contain_fake_cte(bool &contains) const { contains = false; return OB_SUCCESS; }
};
TEST_F(TestJoinOrder, ob_join_order_src)
{
ObArenaAllocator allocator(ObModIds::OB_BUFFER);
JoinInfo out_join(LEFT_OUTER_JOIN);
char buf[256] = {0};
AccessPath a_path(123, 123, 456, NULL, oceanbase::sql::NULLS_FIRST_ASC);
a_path.op_cost_ = 100;
a_path.cost_ = 100;
int64_t pos = 0;
int ret = a_path.get_name(buf, 256, pos);
ASSERT_EQ(OB_SUCCESS, ret);
ASSERT_EQ(a_path.get_cost(), 100);
memset(buf, '\0', 256);
a_path.get_name_internal(buf, 256, pos);
JoinPath join_path;
memset(buf, '\0', 256);
join_path.get_name_internal(buf, 256, pos);
SubQueryPath sp_path;
memset(buf, '\0', 256);
sp_path.get_name_internal(buf, 256, pos);
ObGlobalHint global_hint;
ObAddr addr;
ObRawExprFactory expr_factory(allocator);
ObOptimizerContext ctx(NULL, NULL, NULL, NULL, NULL,
allocator, NULL, NULL, addr, NULL,
global_hint, expr_factory, NULL, false, NULL);
ObSelectLogPlan plan(ctx, NULL);
ObJoinOrder join_order(NULL, &plan, sql::INVALID);
TestPath test_path;
LOG_INFO("test to string func", K(test_path), K(join_order));
pos = join_order.get_name(buf, 256);
//case: test reset()
ret = join_order.interesting_paths_.push_back(&sp_path);
ASSERT_EQ(OB_SUCCESS, ret);
join_order.join_info_ = &out_join;
ObSysFunRawExpr raw_expr;
ret = join_order.restrict_info_set_.push_back(&raw_expr);
ASSERT_EQ(OB_SUCCESS, ret);
}
}//end of namespace test
int main(int argc, char **argv)
{
OB_LOGGER.set_file_name("test_join_order.log", true);
observer::ObReqTimeGuard req_timeinfo_guard;
init_sql_factories();
::testing::InitGoogleTest(&argc,argv);
if(argc >= 2)
{
if (strcmp("DEBUG", argv[1]) == 0
|| strcmp("INFO", argv[1]) == 0
|| strcmp("WARN", argv[1]) == 0)
OB_LOGGER.set_log_level(argv[1]);
}
test::parse_cmd_line_param(argc, argv, test::clp);
return RUN_ALL_TESTS();
}