185 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			185 lines
		
	
	
		
			6.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 <gtest/gtest.h>
 | |
| #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;
 | |
| }
 | 
