145 lines
4.7 KiB
C++
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();
|
|
}
|