/** * 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 "sql/ob_sql_init.h" #include "sql/engine/table/ob_fake_table.h" #include "sql/engine/dml/ob_table_insert.h" #include "sql/engine/basic/ob_expr_values.h" #include "observer/ob_server.h" #include "observer/ob_server_struct.h" #include "sql/engine/test_engine_util.h" using namespace oceanbase::common; using namespace oceanbase::sql; using namespace oceanbase::observer; class ObTableInsertTest: public ::testing::Test { public: ObTableInsertTest(); virtual ~ObTableInsertTest(); virtual void SetUp(); virtual void TearDown(); int create_const_expr(ObObj &obj, ObSqlExpression *&expr); int create_expr_values(ObExprValues *&expr_values); private: // disallow copy ObTableInsertTest(const ObTableInsertTest &other); ObTableInsertTest& operator=(const ObTableInsertTest &other); protected: // data members ObPhysicalPlan physical_plan_; }; ObTableInsertTest::ObTableInsertTest() { } ObTableInsertTest::~ObTableInsertTest() { } void ObTableInsertTest::SetUp() { } void ObTableInsertTest::TearDown() { } int ObTableInsertTest::create_const_expr(ObObj &obj, ObSqlExpression *&expr) { int ret = OB_SUCCESS; ObPostExprItem expr_item; if (OB_SUCCESS != (ret = ObSqlExpressionUtil::make_sql_expr(&physical_plan_, expr))) { SQL_ENG_LOG(WARN, "make expression failed", K(ret)); } else if (OB_SUCCESS != (ret = expr_item.assign(obj))) { SQL_ENG_LOG(WARN, "assign expr item failed", K(ret)); } else if (OB_FAIL(expr->set_item_count(1))) { SQL_ENG_LOG(WARN, "fail to set item count", K(ret)); } else if (OB_SUCCESS != (ret = expr->add_expr_item(expr_item))) { SQL_ENG_LOG(WARN, "add expression item failed", K(ret)); } return ret; } int ObTableInsertTest::create_expr_values(ObExprValues *&expr_values) { return physical_plan_.alloc_operator_by_type(PHY_EXPR_VALUES, expr_values); } TEST_F(ObTableInsertTest, test_operator_serialize) { ObExprValues *expr_values = NULL; ASSERT_EQ(OB_SUCCESS, create_expr_values(expr_values)); expr_values->set_column_count(4); expr_values->set_id(0); ASSERT_EQ(OB_SUCCESS, expr_values->init_value_count(4)); for (int64_t i = 0; i < 4; ++i) { ObSqlExpression *expr = NULL; ObObj obj; obj.set_int(i); ObAccuracy accuracy; ASSERT_EQ(OB_SUCCESS, create_const_expr(obj, expr)); ASSERT_EQ(OB_SUCCESS, expr_values->add_value(expr)); } ObExprValues *dec_values = NULL; char buf[1024] = {'\0'}; int64_t pos = 0; ObPhyOpSeriCtx seri_ctx; ASSERT_EQ(OB_SUCCESS, expr_values->serialize(buf, sizeof(buf), pos, seri_ctx)); int64_t data_len = pos; pos = 0; ASSERT_EQ(OB_SUCCESS, create_expr_values(dec_values)); ASSERT_EQ(OB_SUCCESS, dec_values->deserialize(buf, data_len, pos)); _OB_LOG(INFO, "expr_values: %s", to_cstring(*expr_values)); _OB_LOG(INFO, "dec_values: %s", to_cstring(*dec_values)); ASSERT_EQ(0, strcmp(to_cstring(*expr_values), to_cstring(*dec_values))); int ret = OB_SUCCESS; uint64_t app_column_id = 16; ObTableInsert *table_insert = NULL; ASSERT_EQ(OB_SUCCESS, physical_plan_.alloc_operator_by_type(PHY_INSERT, table_insert)); table_insert->set_column_count(4); table_insert->set_id(1); table_insert->set_table_id(3003); table_insert->set_index_tid(3003); ASSERT_EQ(OB_SUCCESS, table_insert->set_child(0, *expr_values)); expr_values->set_parent(table_insert); table_insert->init_column_ids_count(4); for (int64_t i = 0; OB_SUCC(ret) && i < 4; ++i) { ASSERT_EQ(OB_SUCCESS, table_insert->add_column_id(app_column_id + i)); } pos = 0; ASSERT_EQ(OB_SUCCESS, table_insert->serialize(buf, sizeof(buf), pos)); data_len = pos; ObTableInsert *dec_insert = NULL; ASSERT_EQ(OB_SUCCESS, physical_plan_.alloc_operator_by_type(PHY_INSERT, dec_insert)); pos = 0; ASSERT_EQ(OB_SUCCESS, dec_insert->deserialize(buf, data_len, pos)); _OB_LOG(INFO, "table_insert: %s", to_cstring(*table_insert)); _OB_LOG(INFO, "dec_insert: %s", to_cstring(*dec_insert)); ASSERT_EQ(0, strcmp(to_cstring(*table_insert), to_cstring(*dec_insert))); } /* TEST_F(ObTableInsertTest, test_insert_basic) { ObPhysicalPlan *phy_plan = ObPhysicalPlan::alloc();; ObTableInsert *table_insert = NULL; ObExprValues *expr_values = NULL; CREATE_PHY_OPERATOR(table_insert, ObTableInsert, PHY_INSERT, phy_plan); CREATE_PHY_OPERATOR(expr_values, ObExprValues, PHY_EXPR_VALUES, phy_plan); OB_ASSERT(phy_plan); OB_ASSERT(expr_values); OB_ASSERT(table_insert); expr_values->set_id(0); expr_values->set_column_count(4); for (int64_t i = 0; i < 4; ++i) { ObSqlExpression *expr = NULL; ObObj obj; obj.set_int(i); ASSERT_EQ(OB_SUCCESS, create_const_expr(obj, expr)); ASSERT_EQ(OB_SUCCESS, expr_values->add_value(expr)); } table_insert->set_id(1); table_insert->set_column_count(4); table_insert->set_table_id(3003); ASSERT_EQ(OB_SUCCESS, table_insert->set_child(0, *expr_values)); ObExecContext ctx; ObPhysicalPlanCtx *plan_ctx = NULL; ObSQLSessionInfo *my_session = NULL; ASSERT_EQ(OB_SUCCESS, ctx.init(4)); ASSERT_EQ(OB_SUCCESS, ctx.create_physical_plan_ctx(plan_ctx)); ASSERT_EQ(OB_SUCCESS, ctx.create_my_session(my_session)); ASSERT_FALSE(NULL == plan_ctx); ASSERT_FALSE(NULL == my_session); plan_ctx->set_phy_plan(phy_plan); ASSERT_EQ(OB_SUCCESS, table_insert->open(ctx)); ASSERT_EQ(OB_SUCCESS, table_insert->close(ctx)); } */ int main(int argc, char **argv) { init_global_memory_pool(); init_sql_factories(); oceanbase::common::ObLogger::get_logger().set_log_level("DEBUG"); ::testing::InitGoogleTest(&argc,argv); int ret = RUN_ALL_TESTS(); return ret; }