Files
oceanbase/unittest/storage/test_logic_row_producer.cpp
wangzelin.wzl 93a1074b0c patch 4.0
2022-10-24 17:57:12 +08:00

145 lines
4.7 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 "storage/ob_multi_version_sstable_test.h"
#include <gtest/gtest.h>
#define private public
#include "storage/ob_partition_base_data_ob_reader.h"
namespace oceanbase
{
using namespace storage;
using namespace share::schema;
using namespace common;
namespace unittest
{
class ObLogicRowProducerWrapper : public ObIStoreRowIterator
{
public:
ObLogicRowProducerWrapper(ObLogicRowProducer &producer) : producer_(producer) {}
int get_next_row(const ObStoreRow *&row)
{
int ret = OB_SUCCESS;
if (OB_FAIL(producer_.get_next_row(row))) {
if (OB_ITER_END != ret) {
STORAGE_LOG(WARN, "failed to get next row", K(ret));
}
}
return ret;
}
private:
ObLogicRowProducer& producer_;
};
class TestLogicRowProducer : public ObMultiVersionSSTableTest
{
public:
TestLogicRowProducer() : ObMultiVersionSSTableTest("test_logic_row_producer") {}
~TestLogicRowProducer() {}
void SetUp()
{
ObMultiVersionSSTableTest::SetUp();
}
void TearDown()
{
ObMultiVersionSSTableTest::TearDown();
}
};
TEST_F(TestLogicRowProducer, bug16079910)
{
ObTableSchema table_schema;
ObColumnSchemaV2 column;
table_schema.set_tenant_id(TENANT_ID);
table_schema.set_table_id(combine_id(TENANT_ID, TABLE_ID));
table_schema.set_rowkey_column_num(1);
table_schema.set_tablegroup_id(1);
table_schema.set_database_id(1);
table_schema.set_compress_func_name("none");
table_schema.set_table_type(USER_TABLE);
table_schema.set_schema_version(SCHEMA_VERSION);
table_schema.set_table_name(ObString("test_table"));
column.reset();
column.set_table_id(combine_id(TENANT_ID, TABLE_ID));
column.set_column_id(16);
column.set_data_type(ObVarcharType);
column.set_collation_type(CS_TYPE_UTF8MB4_GENERAL_CI);
column.set_rowkey_position(1);
column.set_data_length(1);
ASSERT_EQ(OB_SUCCESS, table_schema.add_column(column));
const int64_t rowkey_cnt = 2;
const char *micro_data[2];
micro_data[0] =
"var bigint flag multi_version_row_flag\n"
"hesitati -8 EXIST CL\n"
"zappedspa -2 EXIST CL\n"
"zappedverifying -7 EXIST CL\n"
"zapping -8 EXIST CL\n";
micro_data[1] =
"var bigint flag multi_version_row_flag\n"
"zappingc -8 EXIST CL\n"
"zappingd -2 EXIST CL\n"
"zappingf -7 EXIST CL\n"
"zappingi -8 EXIST CL\n";
prepare_data(micro_data, 2, rowkey_cnt);
const char *result =
"var bigint flag multi_version_row_flag\n"
"zappedspa -2 EXIST CL\n"
"zappedverifying -7 EXIST CL\n"
"zapping -8 EXIST CL\n"
"zappingc -8 EXIST CL\n"
"zappingd -2 EXIST CL\n"
"zappingf -7 EXIST CL\n"
"zappingi -8 EXIST CL\n";
ObLogicRowProducer producer;
ObTablesHandle tables_handle;
ObVersionRange version_range;
const ObStoreRow *row;
version_range.base_version_ = 0;
version_range.multi_version_start_ = 0;
version_range.snapshot_version_ = 10;
ASSERT_EQ(OB_SUCCESS, tables_handle.add_table(&sstable_));
producer.arg_.table_key_.table_id_ = combine_id(TENANT_ID, TABLE_ID);
producer.arg_.key_range_.set_whole_range();
producer.is_inited_ = true;
OK(producer.data_buffer_.ensure_space(2<<20));
producer.table_schema_ = &table_schema;
ASSERT_EQ(OB_SUCCESS, producer.ms_row_iterator_.init(tables_handle, table_schema, producer.arg_.key_range_, version_range));
ASSERT_EQ(OB_SUCCESS, producer.get_next_row(row));
ObStoreRange new_key_range;
producer.ms_row_iterator_.reuse();
ASSERT_EQ(OB_SUCCESS, producer.set_new_key_range(new_key_range));
ASSERT_EQ(OB_SUCCESS, producer.ms_row_iterator_.init(tables_handle, table_schema, new_key_range, version_range));
ObLogicRowProducerWrapper producer_wrapper(producer);
ObMockIterator res_iter;
OK(res_iter.from(result));
ASSERT_TRUE(res_iter.equals(producer_wrapper, true));
}
}
}
int main(int argc, char **argv)
{
STORAGE_LOG(INFO, "begin unittest: test_logic_row_producer");
oceanbase::common::ObLogger::get_logger().set_log_level("DEBUG");
testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}