[FEAT MERGE] DML stong type refactoring and optimization

This commit is contained in:
mjhmllover 2024-08-27 08:31:08 +00:00 committed by ob-robot
parent 24f761a6da
commit 4edb7b4b37
82 changed files with 4340 additions and 2806 deletions

View File

@ -769,7 +769,6 @@ void TestSSTableRowMultiScanner::test_multi_scan_multi_get_with_scan(
// first half multi scan, second half multi get
ranges.reuse();
test_allocator.reuse();
for (int64_t i = 0; i < TEST_MULTI_GET_CNT; ++i) {
ObDatumRowkey tmp_rowkey;
mget_ranges[i].border_flag_.set_inclusive_start();
@ -824,7 +823,6 @@ void TestSSTableRowMultiScanner::test_multi_scan_multi_get_with_scan(
// first half multi get, second half multi scan
ranges.reuse();
test_allocator.reuse();
for (int64_t i = 0; i < TEST_MULTI_GET_CNT; ++i) {
ObDatumRowkey tmp_rowkey;
mget_ranges[i].border_flag_.set_inclusive_start();
@ -883,7 +881,6 @@ void TestSSTableRowMultiScanner::test_multi_scan_multi_get_with_scan(
// first one multi get, others multi scan
ranges.reuse();
test_allocator.reuse();
for (int64_t i = 0; i < TEST_MULTI_GET_CNT; ++i) {
ObDatumRowkey tmp_rowkey;
mget_ranges[i].border_flag_.set_inclusive_start();
@ -938,7 +935,6 @@ void TestSSTableRowMultiScanner::test_multi_scan_multi_get_with_scan(
// first one multi scan, others multi get
ranges.reuse();
test_allocator.reuse();
for (int64_t i = 0; i < TEST_MULTI_GET_CNT; ++i) {
ObDatumRowkey tmp_rowkey;
mget_ranges[i].border_flag_.set_inclusive_start();
@ -994,7 +990,6 @@ void TestSSTableRowMultiScanner::test_multi_scan_multi_get_with_scan(
// multi scan not exist row
STORAGE_LOG(DEBUG, "multi_scan_not_exist_row");
ranges.reuse();
test_allocator.reuse();
for (int64_t i = 0; i < TEST_MULTI_GET_CNT; ++i) {
ObDatumRowkey tmp_rowkey;
mget_ranges[i].border_flag_.set_inclusive_start();

View File

@ -620,7 +620,8 @@ TEST_F(TestCOMerge, test_merge_default_row_store_with_empty_major)
ASSERT_EQ(OB_SUCCESS, res_iter.from(result1));
ObMockDirectReadIterator sstable_iter;
ASSERT_EQ(OB_SUCCESS, sstable_iter.init(scanner, allocator_, full_read_info_));
ASSERT_TRUE(res_iter.equals(sstable_iter, false/*cmp multi version row flag*/));
bool is_equal = res_iter.equals<ObMockDirectReadIterator, ObStoreRow>(sstable_iter, false/*cmp multi version row flag*/);
ASSERT_TRUE(is_equal);
scanner->~ObStoreRowIterator();
handle1.reset();
handle2.reset();
@ -722,7 +723,8 @@ TEST_F(TestCOMerge, test_merge_default_row_store_with_empty_major)
// ASSERT_EQ(OB_SUCCESS, res_iter.from(result1));
// ObMockDirectReadIterator sstable_iter;
// ASSERT_EQ(OB_SUCCESS, sstable_iter.init(scanner, allocator_, full_read_info_));
// ASSERT_TRUE(res_iter.equals(sstable_iter, false/*cmp multi version row flag*/));
// bool is_equal = res_iter.equals<ObMockDirectReadIterator, ObStoreRow>(sstable_iter, false/*cmp multi version row flag*/);
// ASSERT_TRUE(is_equal);
// scanner->~ObStoreRowIterator();
// handle1.reset();
// handle2.reset();
@ -819,7 +821,8 @@ TEST_F(TestCOMerge, test_column_store_merge_with_empty_co_table)
ASSERT_EQ(OB_SUCCESS, res_iter.from(result1));
ObMockDirectReadIterator sstable_iter;
ASSERT_EQ(OB_SUCCESS, sstable_iter.init(scanner, allocator_, *cg_read_info));
ASSERT_TRUE(res_iter.equals(sstable_iter, false/*cmp multi version row flag*/));
bool is_equal = res_iter.equals<ObMockDirectReadIterator, ObStoreRow>(sstable_iter, false/*cmp multi version row flag*/);
ASSERT_TRUE(is_equal);
scanner->~ObStoreRowIterator();
handle1.reset();
merger.reset();
@ -946,7 +949,8 @@ TEST_F(TestCOMerge, test_co_merge_with_twice_major)
ObMockIterator res_iter;
res_iter.reset();
ASSERT_EQ(OB_SUCCESS, res_iter.from(result[i]));
ASSERT_TRUE(res_iter.equals(sstable_iter, false/*cmp multi version row flag*/));
bool is_equal = res_iter.equals<ObMockDirectReadIterator, ObStoreRow>(sstable_iter, false/*cmp multi version row flag*/);
ASSERT_TRUE(is_equal);
scanner->~ObStoreRowIterator();
}
handle1.reset();
@ -1049,7 +1053,8 @@ TEST_F(TestCOMerge, test_co_merge_with_twice_major)
ObMockIterator res_iter;
res_iter.reset();
ASSERT_EQ(OB_SUCCESS, res_iter.from(new_result[i]));
ASSERT_TRUE(res_iter.equals(sstable_iter, false/*cmp multi version row flag*/));
bool is_equal = res_iter.equals<ObMockDirectReadIterator, ObStoreRow>(sstable_iter, false/*cmp multi version row flag*/);
ASSERT_TRUE(is_equal);
scanner->~ObStoreRowIterator();
}
}
@ -1205,7 +1210,8 @@ TEST_F(TestCOMerge, test_merge_range)
ObMockIterator res_iter;
res_iter.reset();
ASSERT_EQ(OB_SUCCESS, res_iter.from(result[i]));
ASSERT_TRUE(res_iter.equals(sstable_iter, false/*cmp multi version row flag*/));
bool is_equal = res_iter.equals<ObMockDirectReadIterator, ObStoreRow>(sstable_iter, false/*cmp multi version row flag*/);
ASSERT_TRUE(is_equal);
scanner->~ObStoreRowIterator();
}
}
@ -1355,7 +1361,8 @@ TEST_F(TestCOMerge, test_merge_range_with_open)
ObMockIterator res_iter;
res_iter.reset();
ASSERT_EQ(OB_SUCCESS, res_iter.from(result[i]));
ASSERT_TRUE(res_iter.equals(sstable_iter, false/*cmp multi version row flag*/));
bool is_equal = res_iter.equals<ObMockDirectReadIterator, ObStoreRow>(sstable_iter, false/*cmp multi version row flag*/);
ASSERT_TRUE(is_equal);
scanner->~ObStoreRowIterator();
}
}
@ -1508,7 +1515,8 @@ TEST_F(TestCOMerge, test_merge_range_with_left_open)
ObMockIterator res_iter;
res_iter.reset();
ASSERT_EQ(OB_SUCCESS, res_iter.from(result[i]));
ASSERT_TRUE(res_iter.equals(sstable_iter, false/*cmp multi version row flag*/));
bool is_equal = res_iter.equals<ObMockDirectReadIterator, ObStoreRow>(sstable_iter, false/*cmp multi version row flag*/);
ASSERT_TRUE(is_equal);
scanner->~ObStoreRowIterator();
}
}
@ -1661,7 +1669,8 @@ TEST_F(TestCOMerge, test_merge_range_with_right_open)
ObMockIterator res_iter;
res_iter.reset();
ASSERT_EQ(OB_SUCCESS, res_iter.from(result[i]));
ASSERT_TRUE(res_iter.equals(sstable_iter, false/*cmp multi version row flag*/));
bool is_equal = res_iter.equals<ObMockDirectReadIterator, ObStoreRow>(sstable_iter, false/*cmp multi version row flag*/);
ASSERT_TRUE(is_equal);
scanner->~ObStoreRowIterator();
}
}
@ -1823,7 +1832,8 @@ TEST_F(TestCOMerge, test_merge_range_left_is_min)
ObMockIterator res_iter;
res_iter.reset();
ASSERT_EQ(OB_SUCCESS, res_iter.from(result[i]));
ASSERT_TRUE(res_iter.equals(sstable_iter, false/*cmp multi version row flag*/));
bool is_equal = res_iter.equals<ObMockDirectReadIterator, ObStoreRow>(sstable_iter, false/*cmp multi version row flag*/);
ASSERT_TRUE(is_equal);
scanner->~ObStoreRowIterator();
}
}
@ -1988,7 +1998,8 @@ TEST_F(TestCOMerge, test_merge_range_with_right_max)
ObMockIterator res_iter;
res_iter.reset();
ASSERT_EQ(OB_SUCCESS, res_iter.from(result[i]));
ASSERT_TRUE(res_iter.equals(sstable_iter, false/*cmp multi version row flag*/));
bool is_equal = res_iter.equals<ObMockDirectReadIterator, ObStoreRow>(sstable_iter, false/*cmp multi version row flag*/);
ASSERT_TRUE(is_equal);
scanner->~ObStoreRowIterator();
}
}
@ -2268,7 +2279,8 @@ TEST_F(TestCOMerge, test_merge_range_is_whole_range)
ObMockIterator res_iter;
res_iter.reset();
ASSERT_EQ(OB_SUCCESS, res_iter.from(result[i]));
ASSERT_TRUE(res_iter.equals(sstable_iter, false/*cmp multi version row flag*/));
bool is_equal = res_iter.equals<ObMockDirectReadIterator, ObStoreRow>(sstable_iter, false/*cmp multi version row flag*/);
ASSERT_TRUE(is_equal);
scanner->~ObStoreRowIterator();
}
}
@ -2568,7 +2580,8 @@ TEST_F(TestCOMerge, test_rebuild_sstable)
ObMockIterator res_iter;
res_iter.reset();
ASSERT_EQ(OB_SUCCESS, res_iter.from(result[i]));
ASSERT_TRUE(res_iter.equals(sstable_iter, false/*cmp multi version row flag*/));
bool is_equal = res_iter.equals<ObMockDirectReadIterator, ObStoreRow>(sstable_iter, false/*cmp multi version row flag*/);
ASSERT_TRUE(is_equal);
scanner->~ObStoreRowIterator();
}
}

View File

@ -328,7 +328,7 @@ void TestLobManager::insert_lob_piece(
ASSERT_NE(nullptr, tablet);
// insert rows
ObMockNewRowIterator mock_iter;
ObMockDatumRowIterator mock_iter;
ObSEArray<uint64_t, 512> column_ids;
column_ids.push_back(OB_APP_MIN_COLUMN_ID + 0); // pk
column_ids.push_back(OB_APP_MIN_COLUMN_ID + 1); // c1
@ -452,7 +452,7 @@ void TestLobManager::insert_lob_meta(
ASSERT_NE(nullptr, tablet);
// insert rows
ObMockNewRowIterator mock_iter;
ObMockDatumRowIterator mock_iter;
ObSEArray<uint64_t, 512> column_ids;
for (int i = 0; i < ObLobMetaUtil::LOB_META_COLUMN_CNT; i++) {
column_ids.push_back(OB_APP_MIN_COLUMN_ID + i);

View File

@ -467,7 +467,7 @@ public:
void write_tx(ObStoreCtx *wtx,
ObMemtable *memtable,
const int64_t snapshot,
const ObStoreRow &write_row,
ObDatumRow &write_row,
const int expect_ret = OB_SUCCESS,
const int64_t expire_time = 10000000000)
{
@ -737,20 +737,23 @@ public:
int mock_row(const int64_t key,
const int64_t value,
ObDatumRowkey &rowkey,
ObStoreRow &row)
ObDatumRow &row)
{
rowkey_datums_[0].set_int(key);
rowkey_datums_[1].set_int(value);
rowkey.assign(rowkey_datums_, 1);
ObStorageDatum *datum = new ObStorageDatum[2];
datum[0].set_int(key);
datum[1].set_int(value);
ObObj *obj = new ObObj[2];
obj[0].set_int(key);
obj[1].set_int(value);
row.row_val_.cells_ = obj;
row.row_val_.count_ = 2;
row.row_val_.projector_ = NULL;
row.flag_.set_flag(ObDmlFlag::DF_INSERT);
row.storage_datums_ = datum;
row.count_ = 2;
row.row_flag_.set_flag(ObDmlFlag::DF_INSERT);
rowkey.store_rowkey_.assign(obj, 1);
return OB_SUCCESS;
@ -758,18 +761,20 @@ public:
int mock_delete(const int64_t key,
ObDatumRowkey &rowkey,
ObStoreRow &row)
ObDatumRow &row)
{
rowkey_datums_[0].set_int(key);
rowkey.assign(rowkey_datums_, 1);
ObStorageDatum *datum = new ObStorageDatum[1];
datum[0].set_int(key);
ObObj *obj = new ObObj[1];
obj[0].set_int(key);
row.row_val_.cells_ = obj;
row.row_val_.count_ = 2;
row.row_val_.projector_ = NULL;
row.flag_.set_flag(ObDmlFlag::DF_DELETE);
row.storage_datums_ = datum;
row.count_ = 2;
row.row_flag_.set_flag(ObDmlFlag::DF_DELETE);
rowkey.store_rowkey_.assign(obj, 1);
return OB_SUCCESS;
@ -1240,7 +1245,7 @@ TEST_F(TestMemtableV2, test_write_read_conflict)
TRANS_LOG(INFO, "######## CASE1: write row into memtable");
ObDatumRowkey rowkey;
ObStoreRow write_row;
ObDatumRow write_row;
EXPECT_EQ(OB_SUCCESS, mock_row(1, /*key*/
2, /*value*/
rowkey,
@ -1384,7 +1389,7 @@ TEST_F(TestMemtableV2, test_tx_abort)
TRANS_LOG(INFO, "######## CASE1: write row into memtable");
ObDatumRowkey rowkey;
ObStoreRow write_row;
ObDatumRow write_row;
EXPECT_EQ(OB_SUCCESS, mock_row(1, /*key*/
2, /*value*/
rowkey,
@ -1497,7 +1502,7 @@ TEST_F(TestMemtableV2, test_write_write_conflict)
TRANS_LOG(INFO, "######## CASE1: txn1 write row into memtable");
ObDatumRowkey rowkey;
ObStoreRow write_row;
ObDatumRow write_row;
EXPECT_EQ(OB_SUCCESS, mock_row(1, /*key*/
2, /*value*/
rowkey,
@ -1542,7 +1547,7 @@ TEST_F(TestMemtableV2, test_write_write_conflict)
TRANS_LOG(INFO, "######## CASE2: txn2 write row into memtable, lock for write failed");
ObDatumRowkey rowkey2;
ObStoreRow write_row2;
ObDatumRow write_row2;
EXPECT_EQ(OB_SUCCESS, mock_row(1, /*key*/
3, /*value*/
rowkey2,
@ -1564,7 +1569,7 @@ TEST_F(TestMemtableV2, test_write_write_conflict)
TRANS_LOG(INFO, "######## CASE3: txn1 write row into memtable, lock for write succeed");
ObDatumRowkey rowkey3;
ObStoreRow write_row3;
ObDatumRow write_row3;
EXPECT_EQ(OB_SUCCESS, mock_row(1, /*key*/
4, /*value*/
rowkey3,
@ -1713,7 +1718,7 @@ TEST_F(TestMemtableV2, test_lock)
TRANS_LOG(INFO, "######## CASE1: txn1 lock row in memtable");
ObDatumRowkey rowkey;
ObStoreRow tmp_row;
ObDatumRow tmp_row;
EXPECT_EQ(OB_SUCCESS, mock_row(1, /*key*/
2, /*value*/
rowkey,
@ -1768,7 +1773,7 @@ TEST_F(TestMemtableV2, test_lock)
TRANS_LOG(INFO, "######## CASE3: txn2 write row in memtable with lock for write failed");
ObDatumRowkey rowkey2;
ObStoreRow write_row2;
ObDatumRow write_row2;
EXPECT_EQ(OB_SUCCESS, mock_row(1, /*key*/
3, /*value*/
rowkey2,
@ -1889,7 +1894,7 @@ TEST_F(TestMemtableV2, test_lock)
ObTransID write_tx_id3 = ObTransID(3);
ObStoreCtx *wtx3 = start_tx(write_tx_id3);
ObDatumRowkey rowkey3;
ObStoreRow write_row3;
ObDatumRow write_row3;
EXPECT_EQ(OB_SUCCESS, mock_row(1, /*key*/
4, /*value*/
rowkey3,
@ -1975,7 +1980,7 @@ TEST_F(TestMemtableV2, test_sstable_lock)
is_sstable_contains_lock_ = true;
ObDatumRowkey rowkey;
ObStoreRow write_row;
ObDatumRow write_row;
EXPECT_EQ(OB_SUCCESS, mock_row(1, /*key*/
2, /*value*/
rowkey,
@ -2007,8 +2012,8 @@ TEST_F(TestMemtableV2, test_rollback_to)
TRANS_LOG(INFO, "######## CASE1: write row into memtable");
ObDatumRowkey rowkey;
ObStoreRow write_row;
ObStoreRow write_row2;
ObDatumRow write_row;
ObDatumRow write_row2;
EXPECT_EQ(OB_SUCCESS, mock_row(1, /*key*/
2, /*value*/
rowkey,
@ -2070,7 +2075,7 @@ TEST_F(TestMemtableV2, test_rollback_to)
wtx_seq_no1 + 1 /*to*/);
ObDatumRowkey rowkey3;
ObStoreRow write_row3;
ObDatumRow write_row3;
EXPECT_EQ(OB_SUCCESS, mock_row(1, /*key*/
4, /*value*/
rowkey3,
@ -2099,11 +2104,11 @@ TEST_F(TestMemtableV2, test_replay)
TRANS_LOG(INFO, "######## CASE1: txn1 and txn3 write row in lmemtable");
ObDatumRowkey rowkey;
ObStoreRow write_row;
ObDatumRow write_row;
ObDatumRowkey rowkey2;
ObStoreRow write_row2;
ObDatumRow write_row2;
ObDatumRowkey rowkey3;
ObStoreRow write_row3;
ObDatumRow write_row3;
EXPECT_EQ(OB_SUCCESS, mock_row(1, /*key*/
2, /*value*/
@ -2286,9 +2291,9 @@ TEST_F(TestMemtableV2, test_replay)
// TRANS_LOG(INFO, "######## CASE1: txn1 write row in lmemtable");
// ObDatumRowkey rowkey;
// ObStoreRow write_row;
// ObDatumRow write_row;
// ObDatumRowkey rowkey2;
// ObStoreRow write_row2;
// ObDatumRow write_row2;
// EXPECT_EQ(OB_SUCCESS, mock_row(1, /*key*/
// 2, /*value*/
@ -2421,11 +2426,11 @@ TEST_F(TestMemtableV2, test_compact)
TRANS_LOG(INFO, "######## CASE1: txn1 and txn3 write row in lmemtable");
ObDatumRowkey rowkey;
ObStoreRow write_row;
ObDatumRow write_row;
ObDatumRowkey rowkey2;
ObStoreRow write_row2;
ObDatumRow write_row2;
ObDatumRowkey rowkey3;
ObStoreRow write_row3;
ObDatumRow write_row3;
EXPECT_EQ(OB_SUCCESS, mock_row(1, /*key*/
2, /*value*/
@ -2653,11 +2658,11 @@ TEST_F(TestMemtableV2, test_compact_v2)
TRANS_LOG(INFO, "######## CASE1: txn1 write two rows and txn3 write a row in memtable");
ObDatumRowkey rowkey;
ObStoreRow write_row;
ObDatumRow write_row;
ObDatumRowkey rowkey2;
ObStoreRow write_row2;
ObDatumRow write_row2;
ObDatumRowkey rowkey3;
ObStoreRow write_row3;
ObDatumRow write_row3;
EXPECT_EQ(OB_SUCCESS, mock_row(1, /*key*/
2, /*value*/
@ -2820,13 +2825,13 @@ TEST_F(TestMemtableV2, test_compact_v3)
TRANS_LOG(INFO, "######## CASE1: txn1 write two row and txn2 write row in lmemtable");
ObDatumRowkey rowkey;
ObStoreRow write_row;
ObDatumRow write_row;
ObDatumRowkey rowkey2;
ObStoreRow write_row2;
ObDatumRow write_row2;
ObDatumRowkey rowkey3;
ObStoreRow write_row3;
ObDatumRow write_row3;
ObDatumRowkey rowkey4;
ObStoreRow write_row4;
ObDatumRow write_row4;
EXPECT_EQ(OB_SUCCESS, mock_row(1, /*key*/
2, /*value*/
@ -2958,11 +2963,11 @@ TEST_F(TestMemtableV2, test_dml_flag)
TRANS_LOG(INFO, "######## CASE1: txns write and row in lmemtable, test its dml flag");
ObDatumRowkey rowkey;
ObStoreRow write_row1;
ObDatumRow write_row1;
ObDatumRowkey rowkey2;
ObStoreRow write_row2;
ObDatumRow write_row2;
ObDatumRowkey rowkey3;
ObStoreRow write_row3;
ObDatumRow write_row3;
EXPECT_EQ(OB_SUCCESS, mock_row(1, /*key*/
2, /*value*/
@ -3121,7 +3126,7 @@ TEST_F(TestMemtableV2, test_fast_commit)
TRANS_LOG(INFO, "######## CASE1: write row into memtable and fast commit, then check result is ok");
ObDatumRowkey rowkey;
ObStoreRow write_row;
ObDatumRow write_row;
EXPECT_EQ(OB_SUCCESS, mock_row(1, /*key*/
2, /*value*/
rowkey,
@ -3241,7 +3246,7 @@ TEST_F(TestMemtableV2, test_fast_commit_with_no_delay_cleanout)
TRANS_LOG(INFO, "######## CASE1: write row into memtable and not fast commit, then check result is ok");
ObDatumRowkey rowkey;
ObStoreRow write_row;
ObDatumRow write_row;
EXPECT_EQ(OB_SUCCESS, mock_row(1, /*key*/
2, /*value*/
rowkey,
@ -3369,8 +3374,8 @@ TEST_F(TestMemtableV2, test_seq_set_violation)
TRANS_LOG(INFO, "######## CASE1: write row into memtable");
ObDatumRowkey rowkey;
ObStoreRow write_row;
ObStoreRow write_row2;
ObDatumRow write_row;
ObDatumRow write_row2;
EXPECT_EQ(OB_SUCCESS, mock_row(1, /*key*/
2, /*value*/
rowkey,
@ -3427,7 +3432,7 @@ TEST_F(TestMemtableV2, test_parallel_lock_with_same_txn)
TRANS_LOG(INFO, "######## CASE1: lock row into memtable parallelly");
ObDatumRowkey rowkey;
ObStoreRow write_row;
ObDatumRow write_row;
EXPECT_EQ(OB_SUCCESS, mock_row(1, /*key*/
2, /*value*/
rowkey,
@ -3490,14 +3495,14 @@ TEST_F(TestMemtableV2, test_sync_log_fail_on_frozen_memtable)
ObStoreCtx *tx_1 = start_tx(txid_1);
int i = 1;
for (; i <= 10; i++) {
ObStoreRow row1;
ObDatumRow row1;
EXPECT_EQ(OB_SUCCESS, mock_row(i, i*2, rowkey, row1));
write_tx(tx_1, memtable, 10000, row1);
}
ObTransID txid_2 = ObTransID(2);
ObStoreCtx *tx_2 = start_tx(txid_2);
for (; i <= 20; i++) {
ObStoreRow row1;
ObDatumRow row1;
EXPECT_EQ(OB_SUCCESS, mock_row(i, i*4, rowkey, row1));
write_tx(tx_2, memtable, 10000, row1);
}

View File

@ -305,7 +305,8 @@ TEST_F(TestMultiVersionMergeRecycle, recycle_macro)
ASSERT_EQ(OB_SUCCESS, res_iter.from(result1));
ObMockDirectReadIterator sstable_iter;
ASSERT_EQ(OB_SUCCESS, sstable_iter.init(scanner, allocator_, full_read_info_));
ASSERT_TRUE(res_iter.equals(sstable_iter, true/*cmp multi version row flag*/));
bool is_equal = res_iter.equals<ObMockDirectReadIterator, ObStoreRow>(sstable_iter, true/*cmp multi version row flag*/);
ASSERT_TRUE(is_equal);
scanner->~ObStoreRowIterator();
handle1.reset();
handle2.reset();
@ -403,7 +404,8 @@ TEST_F(TestMultiVersionMergeRecycle, recycle_after_reuse)
ASSERT_EQ(OB_SUCCESS, res_iter.from(result1));
ObMockDirectReadIterator sstable_iter;
ASSERT_EQ(OB_SUCCESS, sstable_iter.init(scanner, allocator_, full_read_info_));
ASSERT_TRUE(res_iter.equals(sstable_iter, true/*cmp multi version row flag*/));
bool is_equal = res_iter.equals<ObMockDirectReadIterator, ObStoreRow>(sstable_iter, true/*cmp multi version row flag*/);
ASSERT_TRUE(is_equal);
scanner->~ObStoreRowIterator();
handle1.reset();
handle2.reset();
@ -499,7 +501,8 @@ TEST_F(TestMultiVersionMergeRecycle, reuse_after_recycle)
ASSERT_EQ(OB_SUCCESS, res_iter.from(result1));
ObMockDirectReadIterator sstable_iter;
ASSERT_EQ(OB_SUCCESS, sstable_iter.init(scanner, allocator_, full_read_info_));
ASSERT_TRUE(res_iter.equals(sstable_iter, true/*cmp multi version row flag*/));
bool is_equal = res_iter.equals<ObMockDirectReadIterator, ObStoreRow>(sstable_iter, true/*cmp multi version row flag*/);
ASSERT_TRUE(is_equal);
scanner->~ObStoreRowIterator();
handle1.reset();
handle2.reset();
@ -599,7 +602,8 @@ TEST_F(TestMultiVersionMergeRecycle, recycled_micros_after_reuse)
ASSERT_EQ(OB_SUCCESS, res_iter.from(result1));
ObMockDirectReadIterator sstable_iter;
ASSERT_EQ(OB_SUCCESS, sstable_iter.init(scanner, allocator_, full_read_info_));
ASSERT_TRUE(res_iter.equals(sstable_iter, true/*cmp multi version row flag*/));
bool is_equal = res_iter.equals<ObMockDirectReadIterator, ObStoreRow>(sstable_iter, true/*cmp multi version row flag*/);
ASSERT_TRUE(is_equal);
scanner->~ObStoreRowIterator();
handle1.reset();
handle2.reset();
@ -708,7 +712,8 @@ TEST_F(TestMultiVersionMergeRecycle, rowkeys_across_micros)
ASSERT_EQ(OB_SUCCESS, res_iter.from(result1));
ObMockDirectReadIterator sstable_iter;
ASSERT_EQ(OB_SUCCESS, sstable_iter.init(scanner, allocator_, full_read_info_));
ASSERT_TRUE(res_iter.equals(sstable_iter, true/*cmp multi version row flag*/));
bool is_equal = res_iter.equals<ObMockDirectReadIterator, ObStoreRow>(sstable_iter, true/*cmp multi version row flag*/);
ASSERT_TRUE(is_equal);
scanner->~ObStoreRowIterator();
handle1.reset();
handle2.reset();
@ -828,7 +833,8 @@ TEST_F(TestMultiVersionMergeRecycle, rowkeys_across_macro)
ASSERT_EQ(OB_SUCCESS, res_iter.from(result1));
ObMockDirectReadIterator sstable_iter;
ASSERT_EQ(OB_SUCCESS, sstable_iter.init(scanner, allocator_, full_read_info_));
ASSERT_TRUE(res_iter.equals(sstable_iter, true/*cmp multi version row flag*/));
bool is_equal = res_iter.equals<ObMockDirectReadIterator, ObStoreRow>(sstable_iter, true/*cmp multi version row flag*/);
ASSERT_TRUE(is_equal);
scanner->~ObStoreRowIterator();
handle1.reset();
handle2.reset();
@ -925,7 +931,8 @@ TEST_F(TestMultiVersionMergeRecycle, recycle_macro_with_last_row)
ASSERT_EQ(OB_SUCCESS, res_iter.from(result1));
ObMockDirectReadIterator sstable_iter;
ASSERT_EQ(OB_SUCCESS, sstable_iter.init(scanner, allocator_, full_read_info_));
ASSERT_TRUE(res_iter.equals(sstable_iter, true/*cmp multi version row flag*/));
bool is_equal = res_iter.equals<ObMockDirectReadIterator, ObStoreRow>(sstable_iter, true/*cmp multi version row flag*/);
ASSERT_TRUE(is_equal);
scanner->~ObStoreRowIterator();
handle1.reset();
handle2.reset();
@ -1025,7 +1032,8 @@ TEST_F(TestMultiVersionMergeRecycle, reuse_after_recycle_with_last)
ASSERT_EQ(OB_SUCCESS, res_iter.from(result1));
ObMockDirectReadIterator sstable_iter;
ASSERT_EQ(OB_SUCCESS, sstable_iter.init(scanner, allocator_, full_read_info_));
ASSERT_TRUE(res_iter.equals(sstable_iter, true/*cmp multi version row flag*/));
bool is_equal = res_iter.equals<ObMockDirectReadIterator, ObStoreRow>(sstable_iter, true/*cmp multi version row flag*/);
ASSERT_TRUE(is_equal);
scanner->~ObStoreRowIterator();
handle1.reset();
handle2.reset();

View File

@ -345,7 +345,8 @@ TEST_F(TestMultiVersionMerge, rowkey_cross_two_macro_and_second_macro_is_filtere
ASSERT_EQ(OB_SUCCESS, res_iter.from(result1));
ObMockDirectReadIterator sstable_iter;
ASSERT_EQ(OB_SUCCESS, sstable_iter.init(scanner, allocator_, full_read_info_));
ASSERT_TRUE(res_iter.equals(sstable_iter, true/*cmp multi version row flag*/));
bool is_equal = res_iter.equals<ObMockDirectReadIterator, ObStoreRow>(sstable_iter, true/*cmp multi version row flag*/);
ASSERT_TRUE(is_equal);
scanner->~ObStoreRowIterator();
handle1.reset();
handle2.reset();
@ -452,7 +453,8 @@ TEST_F(TestMultiVersionMerge, rowkey_cross_three_macro_inc_merge)
ASSERT_EQ(OB_SUCCESS, res_iter.from(result1));
ObMockDirectReadIterator sstable_iter;
ASSERT_EQ(OB_SUCCESS, sstable_iter.init(scanner, allocator_, full_read_info_));
ASSERT_TRUE(res_iter.equals(sstable_iter, true/*cmp multi version row flag*/));
bool is_equal = res_iter.equals<ObMockDirectReadIterator, ObStoreRow>(sstable_iter, true/*cmp multi version row flag*/);
ASSERT_TRUE(is_equal);
scanner->~ObStoreRowIterator();
handle1.reset();
handle2.reset();
@ -575,7 +577,8 @@ TEST_F(TestMultiVersionMerge, uncommit_rowkey_committed_in_minor)
ASSERT_EQ(OB_SUCCESS, res_iter.from(result1));
ObMockDirectReadIterator sstable_iter;
ASSERT_EQ(OB_SUCCESS, sstable_iter.init(scanner, allocator_, full_read_info_));
ASSERT_TRUE(res_iter.equals(sstable_iter, true/*cmp multi version row flag*/));
bool is_equal = res_iter.equals<ObMockDirectReadIterator, ObStoreRow>(sstable_iter, true/*cmp multi version row flag*/);
ASSERT_TRUE(is_equal);
ASSERT_EQ(OB_SUCCESS, clear_tx_data());
scanner->~ObStoreRowIterator();
handle1.reset();
@ -667,7 +670,8 @@ TEST_F(TestMultiVersionMerge, uncommit_rowkey_in_one_macro_committed_is_last)
ASSERT_EQ(OB_SUCCESS, res_iter.from(result1));
ObMockDirectReadIterator sstable_iter;
ASSERT_EQ(OB_SUCCESS, sstable_iter.init(scanner, allocator_, full_read_info_));
ASSERT_TRUE(res_iter.equals(sstable_iter, true/*cmp multi version row flag*/));
bool is_equal = res_iter.equals<ObMockDirectReadIterator, ObStoreRow>(sstable_iter, true/*cmp multi version row flag*/);
ASSERT_TRUE(is_equal);
scanner->~ObStoreRowIterator();
handle1.reset();
handle2.reset();
@ -787,7 +791,8 @@ TEST_F(TestMultiVersionMerge, uncommit_rowkey_in_one_macro_committed_following_l
ASSERT_EQ(OB_SUCCESS, res_iter.from(result1));
ObMockDirectReadIterator sstable_iter;
ASSERT_EQ(OB_SUCCESS, sstable_iter.init(scanner, allocator_, full_read_info_));
ASSERT_TRUE(res_iter.equals(sstable_iter, true/*cmp multi version row flag*/));
bool is_equal = res_iter.equals<ObMockDirectReadIterator, ObStoreRow>(sstable_iter, true/*cmp multi version row flag*/);
ASSERT_TRUE(is_equal);
ASSERT_EQ(OB_SUCCESS, clear_tx_data());
scanner->~ObStoreRowIterator();
handle1.reset();
@ -913,7 +918,8 @@ TEST_F(TestMultiVersionMerge, uncommit_rowkey_in_one_macro_committed_following_s
ASSERT_EQ(OB_SUCCESS, res_iter.from(result1));
ObMockDirectReadIterator sstable_iter;
ASSERT_EQ(OB_SUCCESS, sstable_iter.init(scanner, allocator_, full_read_info_));
ASSERT_TRUE(res_iter.equals(sstable_iter, true/*cmp multi version row flag*/));
bool is_equal = res_iter.equals<ObMockDirectReadIterator, ObStoreRow>(sstable_iter, true/*cmp multi version row flag*/);
ASSERT_TRUE(is_equal);
ASSERT_EQ(OB_SUCCESS, clear_tx_data());
scanner->~ObStoreRowIterator();
handle1.reset();
@ -1021,7 +1027,8 @@ TEST_F(TestMultiVersionMerge, rowkey_cross_three_macro_full_merge)
ASSERT_EQ(OB_SUCCESS, res_iter.from(result1));
ObMockDirectReadIterator sstable_iter;
ASSERT_EQ(OB_SUCCESS, sstable_iter.init(scanner, allocator_, full_read_info_));
ASSERT_TRUE(res_iter.equals(sstable_iter, true/*cmp multi version row flag*/));
bool is_equal = res_iter.equals<ObMockDirectReadIterator, ObStoreRow>(sstable_iter, true/*cmp multi version row flag*/);
ASSERT_TRUE(is_equal);
scanner->~ObStoreRowIterator();
handle1.reset();
handle2.reset();
@ -1175,7 +1182,8 @@ TEST_F(TestMultiVersionMerge, test_merge_with_multi_trans)
ASSERT_EQ(OB_SUCCESS, res_iter.from(result1));
ObMockDirectReadIterator sstable_iter;
ASSERT_EQ(OB_SUCCESS, sstable_iter.init(scanner, allocator_, full_read_info_));
ASSERT_TRUE(res_iter.equals(sstable_iter, true));
bool is_equal = res_iter.equals<ObMockDirectReadIterator, ObStoreRow>(sstable_iter, true/*cmp multi version row flag*/);
ASSERT_TRUE(is_equal);
ASSERT_EQ(OB_SUCCESS, clear_tx_data());
scanner->~ObStoreRowIterator();
handle1.reset();
@ -1337,7 +1345,8 @@ TEST_F(TestMultiVersionMerge, test_merge_with_multi_trans_can_compact)
ASSERT_EQ(OB_SUCCESS, res_iter.from(result1));
ObMockDirectReadIterator sstable_iter;
ASSERT_EQ(OB_SUCCESS, sstable_iter.init(scanner, allocator_, full_read_info_));
ASSERT_TRUE(res_iter.equals(sstable_iter, true));
bool is_equal = res_iter.equals<ObMockDirectReadIterator, ObStoreRow>(sstable_iter, true/*cmp multi version row flag*/);
ASSERT_TRUE(is_equal);
ASSERT_EQ(OB_SUCCESS, clear_tx_data());
scanner->~ObStoreRowIterator();
handle1.reset();
@ -1504,7 +1513,8 @@ TEST_F(TestMultiVersionMerge, test_merge_with_multi_trans_can_not_compact)
ASSERT_EQ(OB_SUCCESS, res_iter.from(result1));
ObMockDirectReadIterator sstable_iter;
ASSERT_EQ(OB_SUCCESS, sstable_iter.init(scanner, allocator_, full_read_info_));
ASSERT_TRUE(res_iter.equals(sstable_iter, true));
bool is_equal = res_iter.equals<ObMockDirectReadIterator, ObStoreRow>(sstable_iter, true/*cmp multi version row flag*/);
ASSERT_TRUE(is_equal);
ASSERT_EQ(OB_SUCCESS, clear_tx_data());
scanner->~ObStoreRowIterator();
handle1.reset();
@ -1610,7 +1620,8 @@ TEST_F(TestMultiVersionMerge, test_merge_with_macro_reused_with_shadow)
ASSERT_EQ(OB_SUCCESS, res_iter.from(result1));
ObMockDirectReadIterator sstable_iter;
ASSERT_EQ(OB_SUCCESS, sstable_iter.init(scanner, allocator_, full_read_info_));
ASSERT_TRUE(res_iter.equals(sstable_iter, true));
bool is_equal = res_iter.equals<ObMockDirectReadIterator, ObStoreRow>(sstable_iter, true/*cmp multi version row flag*/);
ASSERT_TRUE(is_equal);
ASSERT_EQ(OB_SUCCESS, clear_tx_data());
scanner->~ObStoreRowIterator();
handle1.reset();
@ -1736,7 +1747,8 @@ TEST_F(TestMultiVersionMerge, test_merge_with_macro_reused_without_shadow)
ASSERT_EQ(OB_SUCCESS, res_iter.from(result1));
ObMockDirectReadIterator sstable_iter;
ASSERT_EQ(OB_SUCCESS, sstable_iter.init(scanner, allocator_, full_read_info_));
ASSERT_TRUE(res_iter.equals(sstable_iter, true));
bool is_equal = res_iter.equals<ObMockDirectReadIterator, ObStoreRow>(sstable_iter, true/*cmp multi version row flag*/);
ASSERT_TRUE(is_equal);
ASSERT_EQ(OB_SUCCESS, clear_tx_data());
scanner->~ObStoreRowIterator();
handle1.reset();
@ -1820,7 +1832,8 @@ TEST_F(TestMultiVersionMerge, test_merge_with_greater_multi_version)
ASSERT_EQ(OB_SUCCESS, res_iter.from(result1));
ObMockDirectReadIterator sstable_iter;
ASSERT_EQ(OB_SUCCESS, sstable_iter.init(scanner, allocator_, full_read_info_));
ASSERT_TRUE(res_iter.equals(sstable_iter, true));
bool is_equal = res_iter.equals<ObMockDirectReadIterator, ObStoreRow>(sstable_iter, true/*cmp multi version row flag*/);
ASSERT_TRUE(is_equal);
scanner->~ObStoreRowIterator();
handle1.reset();
handle2.reset();
@ -1931,7 +1944,8 @@ TEST_F(TestMultiVersionMerge, test_merge_with_greater_multi_version_and_uncommit
ASSERT_EQ(OB_SUCCESS, res_iter.from(result1));
ObMockDirectReadIterator sstable_iter;
ASSERT_EQ(OB_SUCCESS, sstable_iter.init(scanner, allocator_, full_read_info_));
ASSERT_TRUE(res_iter.equals(sstable_iter, true));
bool is_equal = res_iter.equals<ObMockDirectReadIterator, ObStoreRow>(sstable_iter, true/*cmp multi version row flag*/);
ASSERT_TRUE(is_equal);
ASSERT_EQ(OB_SUCCESS, clear_tx_data());
scanner->~ObStoreRowIterator();
handle1.reset();
@ -2066,7 +2080,8 @@ TEST_F(TestMultiVersionMerge, test_merge_with_ghost_row)
ASSERT_EQ(OB_SUCCESS, res_iter.from(result1));
ObMockDirectReadIterator sstable_iter;
ASSERT_EQ(OB_SUCCESS, sstable_iter.init(scanner, allocator_, full_read_info_));
ASSERT_TRUE(res_iter.equals(sstable_iter, true));
bool is_equal = res_iter.equals<ObMockDirectReadIterator, ObStoreRow>(sstable_iter, true/*cmp multi version row flag*/);
ASSERT_TRUE(is_equal);
ASSERT_EQ(OB_SUCCESS, clear_tx_data());
scanner->~ObStoreRowIterator();
handle1.reset();
@ -2151,7 +2166,8 @@ TEST_F(TestMultiVersionMerge, compare_dml_flag)
ASSERT_EQ(OB_SUCCESS, res_iter.from(result1));
ObMockDirectReadIterator sstable_iter;
ASSERT_EQ(OB_SUCCESS, sstable_iter.init(scanner, allocator_, full_read_info_));
ASSERT_TRUE(res_iter.equals(sstable_iter, true/*cmp multi version row flag*/));
bool is_equal = res_iter.equals<ObMockDirectReadIterator, ObStoreRow>(sstable_iter, true/*cmp multi version row flag*/);
ASSERT_TRUE(is_equal);
scanner->~ObStoreRowIterator();
handle1.reset();
handle2.reset();
@ -2250,7 +2266,8 @@ TEST_F(TestMultiVersionMerge, get_last_after_reuse)
ASSERT_EQ(OB_SUCCESS, res_iter.from(result1));
ObMockDirectReadIterator sstable_iter;
ASSERT_EQ(OB_SUCCESS, sstable_iter.init(scanner, allocator_, full_read_info_));
ASSERT_TRUE(res_iter.equals(sstable_iter, true/*cmp multi version row flag*/));
bool is_equal = res_iter.equals<ObMockDirectReadIterator, ObStoreRow>(sstable_iter, true/*cmp multi version row flag*/);
ASSERT_TRUE(is_equal);
scanner->~ObStoreRowIterator();
handle1.reset();
handle2.reset();
@ -2340,7 +2357,8 @@ TEST_F(TestMultiVersionMerge, rowkey_cross_two_macro_with_commit_scn_less_multi_
ASSERT_EQ(OB_SUCCESS, res_iter.from(result1));
ObMockDirectReadIterator sstable_iter;
ASSERT_EQ(OB_SUCCESS, sstable_iter.init(scanner, allocator_, full_read_info_));
ASSERT_TRUE(res_iter.equals(sstable_iter, true/*cmp multi version row flag*/));
bool is_equal = res_iter.equals<ObMockDirectReadIterator, ObStoreRow>(sstable_iter, true/*cmp multi version row flag*/);
ASSERT_TRUE(is_equal);
scanner->~ObStoreRowIterator();
handle1.reset();
handle2.reset();
@ -2461,7 +2479,8 @@ TEST_F(TestMultiVersionMerge, rowkey_cross_macro_with_last_shadow_version_less_t
ASSERT_EQ(OB_SUCCESS, res_iter.from(result1));
ObMockDirectReadIterator sstable_iter;
ASSERT_EQ(OB_SUCCESS, sstable_iter.init(scanner, allocator_, full_read_info_));
ASSERT_TRUE(res_iter.equals(sstable_iter, true/*cmp multi version row flag*/));
bool is_equal = res_iter.equals<ObMockDirectReadIterator, ObStoreRow>(sstable_iter, true/*cmp multi version row flag*/);
ASSERT_TRUE(is_equal);
ASSERT_EQ(OB_SUCCESS, clear_tx_data());
scanner->~ObStoreRowIterator();
handle1.reset();
@ -2562,7 +2581,8 @@ TEST_F(TestMultiVersionMerge, shadow_row_is_last_in_macro)
ASSERT_EQ(OB_SUCCESS, res_iter.from(result1));
ObMockDirectReadIterator sstable_iter;
ASSERT_EQ(OB_SUCCESS, sstable_iter.init(scanner, allocator_, full_read_info_));
ASSERT_TRUE(res_iter.equals(sstable_iter, true/*cmp multi version row flag*/));
bool is_equal = res_iter.equals<ObMockDirectReadIterator, ObStoreRow>(sstable_iter, true/*cmp multi version row flag*/);
ASSERT_TRUE(is_equal);
scanner->~ObStoreRowIterator();
handle1.reset();
handle2.reset();
@ -2684,7 +2704,8 @@ TEST_F(TestMultiVersionMerge, rowkey_cross_macro_without_open_next_macro)
ASSERT_EQ(OB_SUCCESS, res_iter.from(result1));
ObMockDirectReadIterator sstable_iter;
ASSERT_EQ(OB_SUCCESS, sstable_iter.init(scanner, allocator_, full_read_info_));
ASSERT_TRUE(res_iter.equals(sstable_iter, true/*cmp multi version row flag*/));
bool is_equal = res_iter.equals<ObMockDirectReadIterator, ObStoreRow>(sstable_iter, true/*cmp multi version row flag*/);
ASSERT_TRUE(is_equal);
ASSERT_EQ(OB_SUCCESS, clear_tx_data());
scanner->~ObStoreRowIterator();
handle1.reset();
@ -2792,7 +2813,8 @@ TEST_F(TestMultiVersionMerge, range_cross_macro)
ASSERT_EQ(OB_SUCCESS, res_iter.from(result1));
ObMockDirectReadIterator sstable_iter;
ASSERT_EQ(OB_SUCCESS, sstable_iter.init(scanner, allocator_, full_read_info_));
ASSERT_TRUE(res_iter.equals(sstable_iter, true/*cmp multi version row flag*/));
bool is_equal = res_iter.equals<ObMockDirectReadIterator, ObStoreRow>(sstable_iter, true/*cmp multi version row flag*/);
ASSERT_TRUE(is_equal);
scanner->~ObStoreRowIterator();
handle1.reset();
handle2.reset();
@ -2933,7 +2955,8 @@ TEST_F(TestMultiVersionMerge, test_merge_base_iter_have_ghost_row)
ASSERT_EQ(OB_SUCCESS, res_iter.from(result1));
ObMockDirectReadIterator sstable_iter;
ASSERT_EQ(OB_SUCCESS, sstable_iter.init(scanner, allocator_, full_read_info_));
ASSERT_TRUE(res_iter.equals(sstable_iter, true));
bool is_equal = res_iter.equals<ObMockDirectReadIterator, ObStoreRow>(sstable_iter, true/*cmp multi version row flag*/);
ASSERT_TRUE(is_equal);
ASSERT_EQ(OB_SUCCESS, clear_tx_data());
scanner->~ObStoreRowIterator();
handle1.reset();
@ -3033,7 +3056,8 @@ TEST_F(TestMultiVersionMerge, test_major_range_cross_macro)
ASSERT_EQ(OB_SUCCESS, res_iter.from(result1));
ObMockDirectReadIterator sstable_iter;
ASSERT_EQ(OB_SUCCESS, sstable_iter.init(scanner, allocator_, full_read_info_));
ASSERT_TRUE(res_iter.equals(sstable_iter, true/*cmp multi version row flag*/));
bool is_equal = res_iter.equals<ObMockDirectReadIterator, ObStoreRow>(sstable_iter, true/*cmp multi version row flag*/);
ASSERT_TRUE(is_equal);
scanner->~ObStoreRowIterator();
handle1.reset();
handle2.reset();
@ -3150,7 +3174,8 @@ TEST_F(TestMultiVersionMerge, test_trans_cross_macro_with_ghost_row)
ASSERT_EQ(OB_SUCCESS, res_iter.from(result1));
ObMockDirectReadIterator sstable_iter;
ASSERT_EQ(OB_SUCCESS, sstable_iter.init(scanner, allocator_, full_read_info_));
ASSERT_TRUE(res_iter.equals(sstable_iter, true/*cmp multi version row flag*/));
bool is_equal = res_iter.equals<ObMockDirectReadIterator, ObStoreRow>(sstable_iter, true/*cmp multi version row flag*/);
ASSERT_TRUE(is_equal);
ASSERT_EQ(OB_SUCCESS, clear_tx_data());
scanner->~ObStoreRowIterator();
handle1.reset();
@ -3272,7 +3297,8 @@ TEST_F(TestMultiVersionMerge, test_trans_cross_macro_with_ghost_row2)
ASSERT_EQ(OB_SUCCESS, res_iter.from(result1));
ObMockDirectReadIterator sstable_iter;
ASSERT_EQ(OB_SUCCESS, sstable_iter.init(scanner, allocator_, full_read_info_));
ASSERT_TRUE(res_iter.equals(sstable_iter, true/*cmp multi version row flag*/));
bool is_equal = res_iter.equals<ObMockDirectReadIterator, ObStoreRow>(sstable_iter, true/*cmp multi version row flag*/);
ASSERT_TRUE(is_equal);
ASSERT_EQ(OB_SUCCESS, clear_tx_data());
scanner->~ObStoreRowIterator();
handle1.reset();
@ -3387,7 +3413,8 @@ TEST_F(TestMultiVersionMerge, test_running_trans_cross_macro_with_abort_sql_seq)
ASSERT_EQ(OB_SUCCESS, res_iter.from(result1));
ObMockDirectReadIterator sstable_iter;
ASSERT_EQ(OB_SUCCESS, sstable_iter.init(scanner, allocator_, full_read_info_));
ASSERT_TRUE(res_iter.equals(sstable_iter, true/*cmp multi version row flag*/));
bool is_equal = res_iter.equals<ObMockDirectReadIterator, ObStoreRow>(sstable_iter, true/*cmp multi version row flag*/);
ASSERT_TRUE(is_equal);
ASSERT_EQ(OB_SUCCESS, clear_tx_data());
scanner->~ObStoreRowIterator();
handle1.reset();

View File

@ -97,7 +97,7 @@ void TestTableScanPureDataTable::insert_data_to_tablet(MockObAccessService *acce
ASSERT_NE(nullptr, tablet);
// insert rows
ObMockNewRowIterator mock_iter;
ObMockDatumRowIterator mock_iter;
ObSEArray<uint64_t, 512> column_ids;
column_ids.push_back(OB_APP_MIN_COLUMN_ID + 0); // pk
column_ids.push_back(OB_APP_MIN_COLUMN_ID + 1); // c1
@ -105,7 +105,7 @@ void TestTableScanPureDataTable::insert_data_to_tablet(MockObAccessService *acce
column_ids.push_back(OB_APP_MIN_COLUMN_ID + 3); // c3
column_ids.push_back(OB_APP_MIN_COLUMN_ID + 4); // c4
ASSERT_EQ(OB_SUCCESS, mock_iter.from(TestDmlCommon::data_row_str));
ASSERT_EQ(OB_SUCCESS, mock_iter.from_for_datum(TestDmlCommon::data_row_str));
transaction::ObTransService *tx_service = MTL(transaction::ObTransService*);
// 1. get tx desc

View File

@ -164,8 +164,8 @@ void TestTrans::create_ls(uint64_t tenant_id, ObLSID &ls_id, ObLS *&ls)
void TestTrans::insert_rows(ObLSID &ls_id, ObTabletID &tablet_id, ObTxDesc &tx_desc, ObTxReadSnapshot snapshot, const char* ins_str)
{
int64_t affected_rows = 0;
ObMockNewRowIterator ins_iter;
ASSERT_EQ(OB_SUCCESS, ins_iter.from(ins_str));
ObMockDatumRowIterator ins_iter;
ASSERT_EQ(OB_SUCCESS, ins_iter.from_for_datum(ins_str));
ObArenaAllocator allocator;
share::schema::ObTableDMLParam table_dml_param(allocator);

View File

@ -36,7 +36,7 @@ int ObLSTabletService::insert_tablet_rows(
const int64_t row_count,
ObTabletHandle &tablet_handle,
ObDMLRunningCtx &run_ctx,
ObStoreRow *rows,
ObDatumRow *rows,
ObRowsInfo &rows_info)
{
int ret = OB_SUCCESS;

View File

@ -321,11 +321,11 @@ int ObTableApiModifyExecutor::get_next_conflict_rowkey(DASTaskIter &task_iter,
bool got_row = false;
while (OB_SUCC(ret) && !got_row) {
ObNewRow *dup_row = nullptr;
ObDatumRow *dup_row = nullptr;
ObChunkDatumStore::StoredRow *stored_row = nullptr;
ObDASWriteBuffer::DmlShadowRow ssr;
ObDASInsertOp *ins_op = static_cast<ObDASInsertOp*>(*task_iter);
ObNewRowIterator *conflict_result = ins_op->get_duplicated_result();
ObDatumRowIterator *conflict_result = ins_op->get_duplicated_result();
const ObDASInsCtDef *ins_ctdef = static_cast<const ObDASInsCtDef*>(ins_op->get_ctdef());
if (OB_ISNULL(conflict_result)) {
ret = OB_ERR_UNEXPECTED;

View File

@ -186,7 +186,7 @@ int ObTableLoadStoreTransPXWriter::check_status()
return ret;
}
int ObTableLoadStoreTransPXWriter::write(const ObNewRow &row)
int ObTableLoadStoreTransPXWriter::write(const blocksstable::ObDatumRow &row)
{
int ret = OB_SUCCESS;
if (IS_NOT_INIT) {
@ -199,11 +199,13 @@ int ObTableLoadStoreTransPXWriter::write(const ObNewRow &row)
ret = OB_INVALID_ARGUMENT;
LOG_WARN("invalid args", KR(ret), K(row), K(column_count_));
} else {
ObNewRow new_row;
ObDatumRow new_row;
if (is_heap_table_) {
new_row.assign(row.cells_ + 1, row.count_ - 1);
new_row.storage_datums_ = row.storage_datums_ + 1;
new_row.count_ = row.count_ - 1;
} else {
new_row.assign(row.cells_, row.count_);
new_row.storage_datums_ = row.storage_datums_;
new_row.count_ = row.count_;
}
if (OB_FAIL(writer_->px_write(tablet_id_, new_row))) {
LOG_WARN("fail to px write", KR(ret), K(row), K(new_row));

View File

@ -38,7 +38,7 @@ public:
ObTableLoadTransStoreWriter *writer);
int prepare_write(const common::ObTabletID &tablet_id,
const common::ObIArray<uint64_t> &column_ids);
int write(const common::ObNewRow &row);
int write(const blocksstable::ObDatumRow &row);
TO_STRING_KV(KP_(store_ctx),
KP_(trans),

View File

@ -317,7 +317,7 @@ int ObTableLoadTransStoreWriter::write(int32_t session_id,
return ret;
}
int ObTableLoadTransStoreWriter::px_write(const ObTabletID &tablet_id, const ObNewRow &row)
int ObTableLoadTransStoreWriter::px_write(const ObTabletID &tablet_id, const blocksstable::ObDatumRow &row)
{
int ret = OB_SUCCESS;
if (IS_NOT_INIT) {
@ -330,22 +330,13 @@ int ObTableLoadTransStoreWriter::px_write(const ObTabletID &tablet_id, const ObN
} else {
ObTableLoadSequenceNo seq_no(0); // pdml导入的行目前不存在主键冲突,先都用一个默认的seq_no
SessionContext &session_ctx = session_ctx_array_[0];
for (int64_t i = 0; OB_SUCC(ret) && i < table_data_desc_->column_count_; ++i) {
ObStorageDatum &datum = session_ctx.datum_row_.storage_datums_[i];
const ObObj &obj = row.cells_[i];
if (OB_FAIL(datum.from_obj_enhance(obj))) {
LOG_WARN("fail to from obj enhance", KR(ret), K(obj));
}
}
if (OB_SUCC(ret)) {
if (OB_FAIL(write_row_to_table_store(session_ctx.table_store_,
tablet_id,
seq_no,
session_ctx.datum_row_))) {
LOG_WARN("fail to write row", KR(ret), K(tablet_id));
} else {
ATOMIC_AAF(&trans_ctx_->ctx_->job_stat_->store_.processed_rows_, 1);
}
if (OB_FAIL(write_row_to_table_store(session_ctx.table_store_,
tablet_id,
seq_no,
row))) {
LOG_WARN("fail to write row", KR(ret), K(tablet_id), K(row));
} else {
ATOMIC_AAF(&trans_ctx_->ctx_->job_stat_->store_.processed_rows_, 1);
}
}
return ret;

View File

@ -74,7 +74,7 @@ public:
public:
// 只在对应工作线程中调用, 串行执行
int write(int32_t session_id, const table::ObTableLoadTabletObjRowArray &row_array);
int px_write(const ObTabletID &tablet_id, const common::ObNewRow &row);
int px_write(const ObTabletID &tablet_id, const blocksstable::ObDatumRow &row);
int flush(int32_t session_id);
int clean_up(int32_t session_id);
public:

View File

@ -128,6 +128,7 @@ struct ObDatumPtr {
const char *inner_enumset_;
const ObLobCommon *lob_data_;
const ObLobLocator *lob_locator_;
const ObMemLobCommon *mem_lob_;
const ObObj *extend_obj_; // for extend type
const ObDecimalInt *decimal_int_;
};
@ -283,6 +284,10 @@ public:
return ObURowIDData(pack_, (const uint8_t *)ptr_);
}
inline const ObLobLocator &get_lob_locator() const { return *lob_locator_; }
inline void get_mem_lob(ObLobLocatorV2 &lob_locator) const
{
lob_locator.assign_ptr(mem_lob_, len_, has_lob_header());
}
inline const ObLobCommon &get_lob_data() const { return *lob_data_; }
inline const ObDecimalInt *get_decimal_int() const { return decimal_int_; }
@ -389,11 +394,6 @@ public:
ptr_ = reinterpret_cast<const char *>(urowid_data.rowid_content_);
pack_ = static_cast<uint32_t>(urowid_data.rowid_len_);
}
inline void set_urowid(const char *ptr, const int64_t size)
{
ptr_ = ptr;
pack_ = static_cast<uint32_t>(size);
}
inline void set_lob_locator(const ObLobLocator &value)
{
lob_locator_ = &value;

View File

@ -19,6 +19,7 @@
#include "sql/engine/dml/ob_dml_service.h"
#include "sql/engine/expr/ob_expr_lob_utils.h"
#include "storage/access/ob_dml_param.h"
#include "storage/blocksstable/ob_datum_row_utils.h"
namespace oceanbase
{
namespace sql
@ -107,7 +108,7 @@ ObDASDMLIterator::~ObDASDMLIterator()
}
}
int ObDASDMLIterator::get_next_domain_index_row(ObNewRow *&row)
int ObDASDMLIterator::get_next_domain_index_row(ObDatumRow *&row)
{
int ret = OB_SUCCESS;
if (OB_ISNULL(domain_iter_) && OB_FAIL(ObDomainDMLIterator::create_domain_dml_iterator(
@ -121,7 +122,7 @@ int ObDASDMLIterator::get_next_domain_index_row(ObNewRow *&row)
return ret;
}
int ObDASDMLIterator::get_next_domain_index_rows(ObNewRow *&rows, int64_t &row_count)
int ObDASDMLIterator::get_next_domain_index_rows(ObDatumRow *&rows, int64_t &row_count)
{
int ret = OB_SUCCESS;
if (OB_ISNULL(domain_iter_) && OB_FAIL(ObDomainDMLIterator::create_domain_dml_iterator(
@ -135,25 +136,25 @@ int ObDASDMLIterator::get_next_domain_index_rows(ObNewRow *&rows, int64_t &row_c
return ret;
}
int ObDASDMLIterator::get_next_row(ObNewRow *&row)
int ObDASDMLIterator::get_next_row(blocksstable::ObDatumRow *&datum_row)
{
int ret = OB_SUCCESS;
if (OB_ISNULL(cur_row_)) {
if (OB_FAIL(ob_create_row(allocator_, row_projector_->count(), cur_row_))) {
LOG_WARN("create current row failed", K(ret), K(row_projector_));
if (OB_ISNULL(cur_datum_row_)) {
if (OB_FAIL(blocksstable::ObDatumRowUtils::ob_create_row(allocator_, row_projector_->count(), cur_datum_row_))) {
LOG_WARN("create current datum row failed", K(ret), K(row_projector_));
} else if (OB_FAIL(write_buffer_.begin(write_iter_))) {
LOG_WARN("begin write iterator failed", K(ret));
}
}
if (OB_SUCC(ret) && das_ctdef_->table_param_.get_data_table().is_domain_index()) {
if (OB_FAIL(get_next_domain_index_row(row))) {
if (OB_ITER_END != ret) {
LOG_WARN("get next domain index row", K(ret), K(das_ctdef_->table_param_.get_data_table()));
if (OB_SUCC(ret)) {
if (das_ctdef_->table_param_.get_data_table().is_domain_index()) {
if (OB_FAIL(get_next_domain_index_row(datum_row))) {
if (OB_ITER_END != ret) {
LOG_WARN("get next domain index row", K(ret), K(das_ctdef_->table_param_.get_data_table()));
}
}
}
} else {
if (OB_SUCC(ret)) {
} else {
const ObChunkDatumStore::StoredRow *sr = nullptr;
if (OB_FAIL(write_iter_.get_next_row(sr))) {
if (OB_ITER_END != ret) {
@ -163,23 +164,18 @@ int ObDASDMLIterator::get_next_row(ObNewRow *&row)
*sr,
*row_projector_,
allocator_,
*cur_row_))) {
*cur_datum_row_))) {
LOG_WARN("project storage row failed", K(ret));
} else {
row = cur_row_;
LOG_TRACE("get next row from dml das iterator", KPC(sr), KPC(row), K(das_ctdef_));
datum_row = cur_datum_row_;
LOG_TRACE("get next row from dml das iterator", KPC(sr), KPC(datum_row), K(das_ctdef_));
}
}
}
return ret;
}
int ObDASDMLIterator::get_next_row()
{
return OB_NOT_IMPLEMENT;
}
int ObDASDMLIterator::get_next_rows(ObNewRow *&rows, int64_t &row_count)
int ObDASDMLIterator::get_next_rows(blocksstable::ObDatumRow *&rows, int64_t &row_count)
{
int ret = OB_SUCCESS;
const bool is_domain_index = das_ctdef_->table_param_.get_data_table().is_domain_index();
@ -193,8 +189,8 @@ int ObDASDMLIterator::get_next_rows(ObNewRow *&rows, int64_t &row_count)
row_count = 1;
}
} else {
if (OB_ISNULL(cur_rows_)) {
if (OB_FAIL(ob_create_rows(allocator_, batch_size_, row_projector_->count(), cur_rows_))) {
if (OB_ISNULL(cur_datum_rows_)) {
if (OB_FAIL(blocksstable::ObDatumRowUtils::ob_create_rows(allocator_, batch_size_, row_projector_->count(), cur_datum_rows_))) {
LOG_WARN("Failed to create rows", K(ret), K_(row_projector));
} else if (OB_FAIL(write_buffer_.begin(write_iter_))) {
LOG_WARN("Failed to begin write iterator", K(ret));
@ -215,18 +211,18 @@ int ObDASDMLIterator::get_next_rows(ObNewRow *&rows, int64_t &row_count)
*sr,
*row_projector_,
allocator_,
cur_rows_[row_count]))) {
cur_datum_rows_[row_count]))) {
LOG_WARN("Failed to project storage row", K(ret));
} else {
++row_count;
LOG_TRACE("Get next rows from dml das iterator", KPC(sr), K(cur_rows_[row_count - 1]), K_(das_ctdef));
LOG_TRACE("Get next rows from dml das iterator", KPC(sr), K(cur_datum_rows_[row_count - 1]), K_(das_ctdef));
}
}
if (OB_SUCC(ret) || OB_LIKELY(OB_ITER_END == ret)) {
if (0 == row_count) {
ret = OB_ITER_END;
} else {
rows = cur_rows_;
rows = cur_datum_rows_;
ret = OB_SUCCESS;
}
}
@ -238,8 +234,8 @@ int ObDASDMLIterator::get_next_rows(ObNewRow *&rows, int64_t &row_count)
int ObDASDMLIterator::rewind(const ObDASDMLBaseCtDef *das_ctdef)
{
int ret = common::OB_SUCCESS;
cur_row_ = nullptr;
cur_rows_ = nullptr;
cur_datum_row_ = nullptr;
cur_datum_rows_ = nullptr;
set_ctdef(das_ctdef);
if (OB_NOT_NULL(domain_iter_)) {
if (OB_FAIL(domain_iter_->rewind())) {
@ -269,7 +265,7 @@ void ObDASDMLIterator::set_ctdef(const ObDASDMLBaseCtDef *das_ctdef)
}
}
int ObDASMLogDMLIterator::get_next_row(ObNewRow *&row)
int ObDASMLogDMLIterator::get_next_row(blocksstable::ObDatumRow *&row)
{
int ret = OB_SUCCESS;
if (OB_ISNULL(row_iter_)) {
@ -368,27 +364,29 @@ int ObDASWriteBuffer::DmlShadowRow::shadow_copy(const ObIArray<ObExpr*> &exprs,
return ret;
}
int ObDASWriteBuffer::DmlShadowRow::shadow_copy(const ObNewRow &row)
int ObDASWriteBuffer::DmlShadowRow::shadow_copy(const blocksstable::ObDatumRow &row)
{
int ret = OB_SUCCESS;
if (OB_ISNULL(store_row_) || OB_UNLIKELY(store_row_->cnt_ != row.get_count())) {
if (OB_ISNULL(store_row_) || OB_UNLIKELY(store_row_->cnt_ != row.get_column_count())) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("NULL datums or count mismatch", K(ret), KPC(store_row_), K(row));
} else {
ObDatum *cells = store_row_->cells();
for (int64_t i = 0; OB_SUCC(ret) && i < row.get_count(); ++i) {
if (lib::is_oracle_mode() && row.get_cell(i).is_lob_locator() && strip_lob_locator_) {
ObObjDatumMapType map_type = OBJ_DATUM_MAPPING_MAX;
for (int64_t i = 0; OB_SUCC(ret) && i < row.get_column_count(); ++i) {
if (lib::is_oracle_mode() && column_types_ != nullptr && column_types_->at(i).is_lob_locator() && strip_lob_locator_) {
ObString payload;
if (column_types_ != nullptr && !column_types_->at(i).is_lob()) {
if (!column_types_->at(i).is_lob()) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("invalid column type", K(ret), K(column_types_->at(i)));
} else if (OB_FAIL(row.get_cell(i).get_lob_locator()->get_payload(payload))) {
} else if (OB_FAIL(row.storage_datums_[i].get_lob_locator().get_payload(payload))) {
LOG_WARN("get lob payload failed", K(ret));
} else {
cells[i].set_string(payload);
}
} else if (OB_FAIL(cells[i].from_obj(row.get_cell(i)))) {
LOG_WARN("shadow copy obj failed", K(ret), K(i), K(row));
} else if (FALSE_IT(map_type = ObDatum::get_obj_datum_map_type(column_types_->at(i).get_type()))) {
} else if (OB_FAIL(cells[i].from_storage_datum(row.storage_datums_[i], map_type))) {
LOG_WARN("shadow copy storage datum failed", K(ret), K(i), K(row));
}
if (OB_SUCC(ret)) {
//add the data length of datum
@ -671,7 +669,7 @@ int ObDASWriteBuffer::begin(NewRowIterator &it, const ObIArray<ObObjMeta> &col_t
}
}
if (OB_SUCC(ret)) {
if (OB_FAIL(ob_create_row(*das_alloc_, col_types.count(), it.cur_new_row_))) {
if (OB_FAIL(blocksstable::ObDatumRowUtils::ob_create_row(*das_alloc_, col_types.count(), it.cur_new_row_))) {
LOG_WARN("create new row failed", K(ret));
} else {
it.col_types_ = &col_types;
@ -683,8 +681,8 @@ int ObDASWriteBuffer::begin(NewRowIterator &it, const ObIArray<ObObjMeta> &col_t
int ObDASWriteBuffer::dump_data(const ObDASDMLBaseCtDef &das_base_ctdef) const
{
int ret = OB_SUCCESS;
ObNewRow *new_row = NULL;
ObNewRow *old_row = NULL;
blocksstable::ObDatumRow *new_row = NULL;
blocksstable::ObDatumRow *old_row = NULL;
const ObChunkDatumStore::StoredRow *store_row = NULL;
int64_t rownum = 0;
ObArenaAllocator tmp_alloc;
@ -705,7 +703,7 @@ int ObDASWriteBuffer::dump_data(const ObDASDMLBaseCtDef &das_base_ctdef) const
if (!das_base_ctdef.old_row_projector_.empty()) {
// create old row
if (OB_ISNULL(old_row)
&& OB_FAIL(ob_create_row(tmp_alloc, das_base_ctdef.old_row_projector_.count(), old_row))) {
&& OB_FAIL(blocksstable::ObDatumRowUtils::ob_create_row(tmp_alloc, das_base_ctdef.old_row_projector_.count(), old_row))) {
LOG_WARN("create old row buffer failed", K(ret), K(das_base_ctdef.old_row_projector_.count()));
} else if (OB_FAIL(ObDASUtils::project_storage_row(das_base_ctdef,
*store_row,
@ -720,7 +718,7 @@ int ObDASWriteBuffer::dump_data(const ObDASDMLBaseCtDef &das_base_ctdef) const
if (OB_SUCC(ret)) {
if (!das_base_ctdef.new_row_projector_.empty()) {
if (OB_ISNULL(new_row)
&& OB_FAIL(ob_create_row(tmp_alloc, das_base_ctdef.new_row_projector_.count(), new_row))) {
&& OB_FAIL(blocksstable::ObDatumRowUtils::ob_create_row(tmp_alloc, das_base_ctdef.new_row_projector_.count(), new_row))) {
LOG_WARN("create new row buffer failed", K(ret), K(das_base_ctdef.new_row_projector_.count()));
} else if (OB_FAIL(ObDASUtils::project_storage_row(das_base_ctdef,
*store_row,
@ -905,7 +903,7 @@ int ObDASWriteBuffer::Iterator::get_next_row_skip_const(ObEvalCtx &ctx, const Ob
return ret;
}
int ObDASWriteBuffer::NewRowIterator::get_next_row(ObNewRow *&row)
int ObDASWriteBuffer::NewRowIterator::get_next_row(blocksstable::ObDatumRow *&row)
{
int ret = OB_SUCCESS;
const DmlRow *sr = nullptr;
@ -924,9 +922,7 @@ int ObDASWriteBuffer::NewRowIterator::get_next_row(ObNewRow *&row)
if (OB_SUCC(ret) && sr != nullptr) {
for (int64_t i = 0; OB_SUCC(ret) && i < sr->cnt_; ++i) {
if (OB_FAIL(sr->cells()[i].to_obj(cur_new_row_->cells_[i], col_types_->at(i)))) {
LOG_WARN("convert datum to ObNewRow failed", K(ret));
}
cur_new_row_->storage_datums_[i].shallow_copy_from_datum(sr->cells()[i]);
}
if (OB_SUCC(ret)) {
row = cur_new_row_;

View File

@ -22,6 +22,7 @@
#include "sql/engine/ob_operator.h"
#include "sql/resolver/dml/ob_hint.h"
#include "storage/fts/ob_fts_plugin_helper.h"
#include "storage/blocksstable/ob_datum_row_iterator.h"
namespace oceanbase
{
namespace storage
@ -33,7 +34,8 @@ namespace sql
typedef common::ObFixedArray<common::ObObjMeta, common::ObIAllocator> ObjMetaFixedArray;
typedef common::ObFixedArray<common::ObAccuracy, common::ObIAllocator> AccuracyFixedArray;
static const int64_t SAPTIAL_INDEX_DEFAULT_ROW_COUNT = 32; // 一个wkb生成的cellid数量(设定值)
typedef common::ObSEArray<common::ObNewRow, SAPTIAL_INDEX_DEFAULT_ROW_COUNT> ObDomainIndexRow;
static const int64_t SAPTIAL_INDEX_DEFAULT_COL_COUNT = 2;
typedef common::ObSEArray<blocksstable::ObDatumRow*, SAPTIAL_INDEX_DEFAULT_ROW_COUNT> ObDomainIndexRow;
class ObDomainDMLIterator;
struct ObDASDMLBaseRtDef;
@ -286,7 +288,7 @@ public:
const common::ObIArray<common::ObObjMeta> &col_types,
bool strip_lob_locator);
virtual int shadow_copy(const common::ObIArray<ObExpr*> &exprs, ObEvalCtx &ctx) override;
int shadow_copy(const common::ObNewRow &row);
int shadow_copy(const blocksstable::ObDatumRow &row);
// reset && release referenced memory
virtual void reset()
{
@ -355,13 +357,13 @@ public:
{ }
~NewRowIterator() { }
int get_next_row(ObNewRow *&row);
int get_next_row(blocksstable::ObDatumRow *&row);
inline bool is_inited() { return nullptr != col_types_; }
private:
DmlRow *cur_row_;
ObChunkDatumStore::Iterator *datum_iter_;
const common::ObIArray<ObObjMeta> *col_types_;
ObNewRow *cur_new_row_;
blocksstable::ObDatumRow *cur_new_row_;
};
OB_UNIS_VERSION(1);
@ -459,7 +461,7 @@ private:
uint32_t row_extend_size_;
};
class ObDASDMLIterator : public common::ObNewRowIterator
class ObDASDMLIterator : public blocksstable::ObDatumRowIterator
{
public:
static const int64_t DEFAULT_BATCH_SIZE = 256;
@ -471,8 +473,8 @@ public:
das_ctdef_(das_ctdef),
row_projector_(nullptr),
allocator_(alloc),
cur_row_(nullptr),
cur_rows_(nullptr),
cur_datum_row_(nullptr),
cur_datum_rows_(nullptr),
main_ctdef_(das_ctdef),
domain_iter_(nullptr)
{
@ -480,37 +482,37 @@ public:
batch_size_ = MIN(write_buffer_.get_row_cnt(), DEFAULT_BATCH_SIZE);
}
virtual ~ObDASDMLIterator();
virtual int get_next_row(common::ObNewRow *&row) override;
virtual int get_next_row() override;
virtual int get_next_rows(ObNewRow *&rows, int64_t &row_count);
virtual int get_next_row(blocksstable::ObDatumRow *&datum_row) override;
virtual int get_next_rows(blocksstable::ObDatumRow *&rows, int64_t &row_count);
ObDASWriteBuffer &get_write_buffer() { return write_buffer_; }
virtual void reset() override { }
int rewind(const ObDASDMLBaseCtDef *das_ctdef);
private:
void set_ctdef(const ObDASDMLBaseCtDef *das_ctdef);
int get_next_domain_index_row(ObNewRow *&row);
int get_next_domain_index_rows(ObNewRow *&rows, int64_t &row_count);
int get_next_domain_index_row(blocksstable::ObDatumRow *&row);
int get_next_domain_index_rows(blocksstable::ObDatumRow *&rows, int64_t &row_count);
private:
ObDASWriteBuffer &write_buffer_;
const ObDASDMLBaseCtDef *das_ctdef_;
const IntFixedArray *row_projector_;
ObDASWriteBuffer::Iterator write_iter_;
common::ObIAllocator &allocator_;
common::ObNewRow *cur_row_;
common::ObNewRow *cur_rows_;
blocksstable::ObDatumRow *cur_datum_row_;
blocksstable::ObDatumRow *cur_datum_rows_;
const ObDASDMLBaseCtDef *main_ctdef_;
ObDomainDMLIterator *domain_iter_;
int64_t batch_size_;
};
class ObDASMLogDMLIterator : public ObNewRowIterator
class ObDASMLogDMLIterator : public blocksstable::ObDatumRowIterator
{
public:
// support get next datum row
ObDASMLogDMLIterator(
const ObTabletID &tablet_id,
const storage::ObDMLBaseParam &dml_param,
ObNewRowIterator *iter,
ObDatumRowIterator *iter,
ObDASOpType op_type)
: tablet_id_(tablet_id),
dml_param_(dml_param),
@ -524,14 +526,12 @@ public:
}
}
virtual ~ObDASMLogDMLIterator() {}
virtual int get_next_row(ObNewRow *&row) override;
virtual int get_next_row() override { return OB_NOT_IMPLEMENT; }
virtual void reset() override {}
virtual int get_next_row(blocksstable::ObDatumRow *&datum_row) override;
private:
const ObTabletID &tablet_id_;
const storage::ObDMLBaseParam &dml_param_;
ObNewRowIterator *row_iter_;
ObDatumRowIterator *row_iter_;
ObDASOpType op_type_;
bool is_old_row_;
};

View File

@ -19,6 +19,7 @@
#include "sql/das/ob_das_utils.h"
#include "sql/engine/expr/ob_expr_lob_utils.h"
#include "observer/omt/ob_tenant_srs.h"
#include "storage/blocksstable/ob_datum_row_utils.h"
using namespace oceanbase::common;
@ -59,10 +60,11 @@ int ObDASDomainUtils::generate_spatial_index_rows(
} else {
ObS2Adapter s2object(&allocator, srid != 0 ? srs_item->is_geographical_srs() : false);
ObSpatialMBR spa_mbr;
ObObj *obj_arr = NULL;
ObS2Cellids cellids;
char *mbr = NULL;
char *mbr = nullptr;
int64_t mbr_len = 0;
void *rows_buf = nullptr;
blocksstable::ObDatumRow *rows = nullptr;
if (OB_FAIL(s2object.init(wkb_str, srs_bound))) {
LOG_WARN("Init s2object failed", K(ret));
} else if (OB_FAIL(s2object.get_cellids(cellids, false))) {
@ -81,38 +83,35 @@ int ObDASDomainUtils::generate_spatial_index_rows(
LOG_WARN("failed to alloc memory for spatial index row mbr", K(ret));
} else if (OB_FAIL(spa_mbr.to_char(mbr, mbr_len))) {
LOG_WARN("failed transform ObSpatialMBR to string", K(ret));
} else if (OB_ISNULL(rows_buf = reinterpret_cast<char *>(allocator.alloc(cellids.size() * sizeof(blocksstable::ObDatumRow))))) {
ret = OB_ALLOCATE_MEMORY_FAILED;
LOG_WARN("failed to alloc memory for spatial index rows buffer", K(ret));
} else {
rows = new (rows_buf) blocksstable::ObDatumRow[cellids.size()];
int64_t cellid_col_idx = 0;
int64_t mbr_col_idx = 1;
for (uint64_t i = 0; OB_SUCC(ret) && i < cellids.size(); i++) {
if (OB_ISNULL(obj_arr = reinterpret_cast<ObObj *>(allocator.alloc(sizeof(ObObj) * rowkey_num)))) {
ret = OB_ALLOCATE_MEMORY_FAILED;
LOG_WARN("failed to alloc memory for spatial index row cells", K(ret));
if (OB_FAIL(rows[i].init(allocator, rowkey_num))) {
LOG_WARN("init datum row failed", K(ret), K(rowkey_num));
} else {
// 索引行[cellid_obj][mbr_obj][rowkey_obj]
for(uint64_t j = 0; OB_SUCC(ret) && j < rowkey_num; j++) {
obj_arr[j].set_nop_value();
const ObObjMeta &col_type = das_ctdef.column_types_.at(j);
const ObAccuracy &col_accuracy = das_ctdef.column_accuracys_.at(j);
int64_t projector_idx = row_projector.at(j);
if (OB_FAIL(dml_row.cells()[projector_idx].to_obj(obj_arr[j], col_type))) {
LOG_WARN("stored row to new row obj failed", K(ret),
K(dml_row.cells()[projector_idx]), K(col_type), K(projector_idx), K(j));
} else if (OB_FAIL(ObDASUtils::reshape_storage_value(col_type, col_accuracy, allocator, obj_arr[j]))) {
if (FALSE_IT(rows[i].storage_datums_[j].shallow_copy_from_datum(dml_row.cells()[projector_idx]))) {
} else if (rows[i].storage_datums_[j].is_null()) {
} else if (OB_FAIL(ObDASUtils::reshape_datum_value(col_type, col_accuracy, true, allocator, rows[i].storage_datums_[j]))) {
LOG_WARN("reshape storage value failed", K(ret), K(col_type), K(projector_idx), K(j));
}
}
if (OB_SUCC(ret)) {
int64_t cellid_col_idx = 0;
int64_t mbr_col_idx = 1;
obj_arr[cellid_col_idx].set_uint64(cellids.at(i));
rows[i].storage_datums_[cellid_col_idx].set_uint(cellids.at(i));
ObString mbr_val(mbr_len, mbr);
obj_arr[mbr_col_idx].set_varchar(mbr_val);
obj_arr[mbr_col_idx].set_collation_type(CS_TYPE_BINARY);
obj_arr[mbr_col_idx].set_collation_level(CS_LEVEL_IMPLICIT);
ObNewRow row;
row.cells_ = obj_arr;
row.count_ = rowkey_num;
if (OB_FAIL(spat_rows.push_back(row))) {
LOG_WARN("failed to push back spatial index row", K(ret), K(row));
rows[i].storage_datums_[mbr_col_idx].set_string(mbr_val);
// not set_collation_type(CS_TYPE_BINARY) and set_collation_level(CS_LEVEL_IMPLICIT)
if (OB_FAIL(spat_rows.push_back(&rows[i]))) {
LOG_WARN("failed to push back spatial index row", K(ret), K(rows[i]));
}
}
}
@ -137,7 +136,8 @@ int ObDASDomainUtils::generate_spatial_index_rows(
const int64_t ft_word_bkt_cnt = MAX(fulltext.length() / 10, 2);
int64_t doc_length = 0;
ObFTWordMap ft_word_map;
ObObj *obj_arr = nullptr;
void *rows_buf = nullptr;
blocksstable::ObDatumRow *rows = nullptr;
if (OB_ISNULL(helper)
|| OB_UNLIKELY(!ft_obj_meta.is_valid())
|| OB_UNLIKELY(doc_id.length() != sizeof(ObDocId) || doc_id.empty()) ) {
@ -153,47 +153,41 @@ int ObDASDomainUtils::generate_spatial_index_rows(
K(ft_obj_meta.get_collation_type()), K(fulltext));
} else if (0 == ft_word_map.size()) {
ret = OB_ITER_END;
} else {
const int64_t obj_cnt = ft_word_map.size() * FT_WORD_DOC_COL_CNT;
const int64_t obj_arr_size = sizeof(ObObj) * obj_cnt;
if (OB_ISNULL(obj_arr = reinterpret_cast<ObObj *>(allocator.alloc(obj_arr_size)))) {
} else if (OB_ISNULL(rows_buf = reinterpret_cast<char *>(allocator.alloc(ft_word_map.size() * sizeof(blocksstable::ObDatumRow))))) {
ret = OB_ALLOCATE_MEMORY_FAILED;
LOG_WARN("fail to allocate obj array", K(ret), K(obj_arr_size));
} else {
for (int64_t i = 0; i < obj_cnt; ++i) {
new (obj_arr + i) ObObj();
}
}
LOG_WARN("failed to alloc memory for full text index rows buffer", K(ret));
} else {
int64_t i = 0;
rows = new (rows_buf) blocksstable::ObDatumRow[ft_word_map.size()];
for (ObFTWordMap::const_iterator iter = ft_word_map.begin();
OB_SUCC(ret) && iter != ft_word_map.end();
++iter) {
const ObFTWord &ft_word = iter->first;
const int64_t word_cnt = iter->second;
// index row format
// - FTS_INDEX: [WORD], [DOC_ID], [WORD_COUNT]
// - FTS_DOC_WORD: [DOC_ID], [WORD], [WORD_COUNT]
const int64_t word_idx = is_fts_index_aux ? 0 : 1;
const int64_t doc_id_idx = is_fts_index_aux ? 1 : 0;
const int64_t word_cnt_idx = 2;
const int64_t doc_len_idx = 3;
obj_arr[i * FT_WORD_DOC_COL_CNT + word_idx].set_varchar(ft_word.get_word());
obj_arr[i * FT_WORD_DOC_COL_CNT + word_idx].set_meta_type(ft_obj_meta);
obj_arr[i * FT_WORD_DOC_COL_CNT + doc_id_idx].set_varbinary(doc_id);
obj_arr[i * FT_WORD_DOC_COL_CNT + word_cnt_idx].set_uint64(word_cnt);
obj_arr[i * FT_WORD_DOC_COL_CNT + doc_len_idx].set_uint64(doc_length);
ObNewRow row;
row.cells_ = &(obj_arr[i * FT_WORD_DOC_COL_CNT]);
row.count_ = FT_WORD_DOC_COL_CNT;
if (OB_FAIL(word_rows.push_back(row))) {
LOG_WARN("fail to push back row", K(ret), K(row));
if (OB_FAIL(rows[i].init(allocator, FT_WORD_DOC_COL_CNT))) {
LOG_WARN("init datum row failed", K(ret), K(FT_WORD_DOC_COL_CNT));
} else {
ObDocId tmp_doc_id;
tmp_doc_id.tablet_id_ = ((const uint64_t *)doc_id.ptr())[0];
tmp_doc_id.seq_id_ = ((const uint64_t *)doc_id.ptr())[1];
STORAGE_FTS_LOG(DEBUG, "succeed to add word row", K(ret), K(is_fts_index_aux), "doc_id", tmp_doc_id,
K(ft_word), K(word_cnt), K(i), K(row));
++i;
const ObFTWord &ft_word = iter->first;
const int64_t word_cnt = iter->second;
// index row format
// - FTS_INDEX: [WORD], [DOC_ID], [WORD_COUNT]
// - FTS_DOC_WORD: [DOC_ID], [WORD], [WORD_COUNT]
const int64_t word_idx = is_fts_index_aux ? 0 : 1;
const int64_t doc_id_idx = is_fts_index_aux ? 1 : 0;
const int64_t word_cnt_idx = 2;
const int64_t doc_len_idx = 3;
rows[i].storage_datums_[word_idx].set_string(ft_word.get_word());
rows[i].storage_datums_[doc_id_idx].set_string(doc_id);
rows[i].storage_datums_[word_cnt_idx].set_uint(word_cnt);
rows[i].storage_datums_[doc_len_idx].set_uint(doc_length);
if (OB_FAIL(word_rows.push_back(&rows[i]))) {
LOG_WARN("fail to push back row", K(ret), K(rows[i]));
} else {
ObDocId tmp_doc_id;
tmp_doc_id.tablet_id_ = ((const uint64_t *)doc_id.ptr())[0];
tmp_doc_id.seq_id_ = ((const uint64_t *)doc_id.ptr())[1];
STORAGE_FTS_LOG(DEBUG, "succeed to add word row", K(ret), K(is_fts_index_aux), "doc_id", tmp_doc_id,
K(ft_word), K(word_cnt), K(i), K(rows[i]));
++i;
}
}
}
}
@ -332,65 +326,66 @@ int ObDASDomainUtils::generate_multivalue_index_rows(ObIAllocator &allocator,
uint64_t rowkey_column_start = column_num - 1 - data_table_rowkey_cnt;
uint64_t rowkey_column_end = column_num - 1;
void *rows_buf = nullptr;
if (OB_FAIL(get_pure_mutivalue_data(json_str, data, data_len, record_num))) {
LOG_WARN("failed to parse binary.", K(ret), K(json_str));
} else if (record_num == 0 && (is_unique_index && rowkey_column_start == 1)) {
} else if (OB_FAIL(calc_save_rowkey_policy(allocator, das_ctdef, row_projector,
dml_row, record_num, is_save_rowkey))) {
LOG_WARN("failed to calc store policy.", K(ret), K(data_table_rowkey_cnt));
} else if (OB_ISNULL(rows_buf = reinterpret_cast<char *>(allocator.alloc(record_num * sizeof(blocksstable::ObDatumRow))))) {
ret = OB_ALLOCATE_MEMORY_FAILED;
LOG_WARN("failed to alloc memory for multi value index rows buffer", K(ret));
} else {
ObObj *obj_arr = nullptr;
int64_t pos = sizeof(uint32_t);
blocksstable::ObDatumRow *rows = new (rows_buf) blocksstable::ObDatumRow[record_num];
ObObj obj;
for (int i = 0; OB_SUCC(ret) && (i < record_num || !is_none_unique_done) ; ++i) {
if (OB_ISNULL(obj_arr = reinterpret_cast<ObObj *>(allocator.alloc(sizeof(ObObj) * column_num)))) {
ret = OB_ALLOCATE_MEMORY_FAILED;
LOG_WARN("failed to alloc memory for multivalue index row cells", K(ret));
}
for(uint64_t j = 0; OB_SUCC(ret) && j < column_num; j++) {
obj_arr[j].set_nop_value();
ObObjMeta col_type = das_ctdef.column_types_.at(j);
const ObAccuracy &col_accuracy = das_ctdef.column_accuracys_.at(j);
int64_t projector_idx = row_projector.at(j);
if (OB_FAIL(rows[i].init(allocator, column_num))) {
LOG_WARN("init datum row failed", K(ret), K(column_num));
} else {
for(uint64_t j = 0; OB_SUCC(ret) && j < column_num; j++) {
ObObjMeta col_type = das_ctdef.column_types_.at(j);
const ObAccuracy &col_accuracy = das_ctdef.column_accuracys_.at(j);
int64_t projector_idx = row_projector.at(j);
if (multivalue_idx == projector_idx) {
if (OB_FAIL(obj_arr[j].deserialize(data, data_len, pos))) {
LOG_WARN("failed to deserialize datum.", K(ret), K(json_str));
} else {
if (ob_is_number_or_decimal_int_tc(col_type.get_type()) || ob_is_temporal_type(col_type.get_type())) {
col_type.set_collation_level(CS_LEVEL_NUMERIC);
if (multivalue_idx == projector_idx) {
// TODO: change obj to datum when do deserialize@xuanxi
obj.set_nop_value();
if (OB_FAIL(obj.deserialize(data, data_len, pos))) {
LOG_WARN("failed to deserialize datum", K(ret), K(json_str));
} else if (OB_FAIL(rows[i].storage_datums_[j].from_obj_enhance(obj))) {
LOG_WARN("failed to convert datum from obj", K(ret), K(obj));
} else {
col_type.set_collation_level(CS_LEVEL_IMPLICIT);
if (ob_is_number_or_decimal_int_tc(col_type.get_type()) || ob_is_temporal_type(col_type.get_type())) {
col_type.set_collation_level(CS_LEVEL_NUMERIC);
} else {
col_type.set_collation_level(CS_LEVEL_IMPLICIT);
}
is_none_unique_done = true;
}
obj_arr[j].set_collation_level(col_type.get_collation_level());
obj_arr[j].set_collation_type(col_type.get_collation_type());
obj_arr[j].set_type(col_type.get_type());
is_none_unique_done = true;
} else if (!is_save_rowkey && (rowkey_column_start >= j && j < rowkey_column_end)) {
rows[i].storage_datums_[j].set_null();
} else if (multivalue_arr_idx == projector_idx) {
rows[i].storage_datums_[j].set_null();
} else {
rows[i].storage_datums_[j].shallow_copy_from_datum(dml_row.cells()[projector_idx]);
}
if (OB_SUCC(ret) && OB_FAIL(ObDASUtils::reshape_datum_value(col_type, col_accuracy, true, allocator, rows[i].storage_datums_[j]))) {
LOG_WARN("reshape storage value failed", K(ret), K(col_type), K(projector_idx), K(j));
}
} else if (!is_save_rowkey && (rowkey_column_start >= j && j < rowkey_column_end)) {
obj_arr[j].set_null();
} else if (multivalue_arr_idx == projector_idx) {
obj_arr[j].set_null();
} else if (OB_FAIL(dml_row.cells()[projector_idx].to_obj(obj_arr[j], col_type))) {
LOG_WARN("stored row to new row obj failed", K(ret),
K(dml_row.cells()[projector_idx]), K(col_type), K(projector_idx), K(j));
}
if (OB_SUCC(ret) && OB_FAIL(ObDASUtils::reshape_storage_value(col_type, col_accuracy, allocator, obj_arr[j]))) {
LOG_WARN("reshape storage value failed", K(ret), K(col_type), K(projector_idx), K(j));
}
if (OB_SUCC(ret)) {
if (OB_FAIL(mvi_rows.push_back(&rows[i]))) {
LOG_WARN("failed to push back spatial index row", K(ret), K(rows[i]));
}
} // end if (OB_SUCC(ret))
}
if (OB_SUCC(ret)) {
ObNewRow row;
row.cells_ = obj_arr;
row.count_ = column_num;
if (OB_FAIL(mvi_rows.push_back(row))) {
LOG_WARN("failed to push back spatial index row", K(ret), K(row));
}
} // end if (OB_SUCC(ret))
}
}
@ -501,7 +496,7 @@ bool ObDomainDMLIterator::is_same_domain_type(const ObDASDMLBaseCtDef *das_ctdef
return is_same_domain_type;
}
int ObDomainDMLIterator::get_next_domain_row(ObNewRow *&row)
int ObDomainDMLIterator::get_next_domain_row(blocksstable::ObDatumRow *&row)
{
int ret = OB_SUCCESS;
const ObChunkDatumStore::StoredRow *sr = nullptr;
@ -529,7 +524,7 @@ int ObDomainDMLIterator::get_next_domain_row(ObNewRow *&row)
}
}
if (OB_SUCC(ret) && row_idx_ < rows_.count()) {
row = &(rows_[row_idx_]);
row = rows_[row_idx_];
++row_idx_;
got_row = true;
}
@ -538,7 +533,7 @@ int ObDomainDMLIterator::get_next_domain_row(ObNewRow *&row)
return ret;
}
int ObDomainDMLIterator::get_next_domain_rows(ObNewRow *&row, int64_t &row_count)
int ObDomainDMLIterator::get_next_domain_rows(blocksstable::ObDatumRow *&row, int64_t &row_count)
{
int ret = OB_SUCCESS;
const ObChunkDatumStore::StoredRow *sr = nullptr;
@ -572,7 +567,7 @@ int ObDomainDMLIterator::get_next_domain_rows(ObNewRow *&row, int64_t &row_count
}
}
if (OB_SUCC(ret) && row_idx_ < rows_.count()) {
row = &(rows_[row_idx_]);
row = rows_[row_idx_];
row_count = rows_.count() - row_idx_;
row_idx_ = rows_.count();
got_row = true;

View File

@ -84,7 +84,7 @@ class ObDomainDMLIterator
{
public:
static const int64_t DEFAULT_DOMAIN_ROW_COUNT = 32;
typedef common::ObSEArray<common::ObNewRow, DEFAULT_DOMAIN_ROW_COUNT> ObDomainIndexRow;
typedef common::ObSEArray<blocksstable::ObDatumRow*, DEFAULT_DOMAIN_ROW_COUNT> ObDomainIndexRow;
static int create_domain_dml_iterator(
common::ObIAllocator &allocator,
@ -104,8 +104,8 @@ public:
}
void set_ctdef(const ObDASDMLBaseCtDef *das_ctdef, const IntFixedArray *row_projector);
void set_row_projector(const IntFixedArray *row_projector) { row_projector_ = row_projector; }
int get_next_domain_row(ObNewRow *&row);
int get_next_domain_rows(ObNewRow *&row, int64_t &row_count);
int get_next_domain_row(blocksstable::ObDatumRow *&row);
int get_next_domain_rows(blocksstable::ObDatumRow *&row, int64_t &row_count);
bool is_same_domain_type(const ObDASDMLBaseCtDef *das_ctdef) const;
TO_STRING_KV(K_(row_idx), K_(rows), KPC_(row_projector), KPC_(das_ctdef), K_(main_ctdef));

View File

@ -149,7 +149,7 @@ int ObDASInsertOp::insert_rows()
}
int ObDASInsertOp::insert_index_with_fetch(ObDMLBaseParam &dml_param,
ObAccessService *as,
ObNewRowIterator &dml_iter,
ObDatumRowIterator &dml_iter,
ObDASConflictIterator *result_iter,
const ObDASInsCtDef *ins_ctdef,
ObDASInsRtDef *ins_rtdef,
@ -158,7 +158,7 @@ int ObDASInsertOp::insert_index_with_fetch(ObDMLBaseParam &dml_param,
common::ObTabletID tablet_id)
{
int ret = OB_SUCCESS;
ObNewRow *insert_row = NULL;
blocksstable::ObDatumRow *insert_row = NULL;
int64_t affected_rows = 0;
if (OB_FAIL(ObDMLService::init_dml_param(*ins_ctdef,
*ins_rtdef,
@ -170,7 +170,7 @@ int ObDASInsertOp::insert_index_with_fetch(ObDMLBaseParam &dml_param,
LOG_WARN("init index dml param failed", K(ret), KPC(ins_ctdef), KPC(ins_rtdef));
}
while (OB_SUCC(ret) && OB_SUCC(dml_iter.get_next_row(insert_row))) {
ObNewRowIterator *duplicated_rows = NULL;
blocksstable::ObDatumRowIterator *duplicated_rows = NULL;
if (OB_ISNULL(insert_row)) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("insert_row is null", K(ret));
@ -297,7 +297,7 @@ int ObDASInsertOp::insert_row_with_fetch()
LOG_WARN("rewind dml iter failed", K(ret));
} else {
ObDASMLogDMLIterator mlog_iter(index_tablet_id, dml_param, &dml_iter, DAS_OP_TABLE_INSERT);
ObNewRowIterator *new_iter = nullptr;
ObDatumRowIterator *new_iter = nullptr;
if (index_ins_ctdef->table_param_.get_data_table().is_mlog_table()
&& !index_ins_ctdef->is_access_mlog_as_master_table_) {
new_iter = &mlog_iter;
@ -331,7 +331,7 @@ int ObDASInsertOp::store_conflict_row(ObDASInsertResult &ins_result)
{
int ret = OB_SUCCESS;
bool added = false;
ObNewRow *dup_row = nullptr;
ObDatumRow *dup_row = nullptr;
ObDASWriteBuffer &result_buffer = ins_result.get_result_buffer();
ObDASWriteBuffer::DmlShadowRow ssr;
if (OB_ISNULL(result_)) {
@ -483,10 +483,10 @@ ObDASInsertResult::~ObDASInsertResult()
{
}
int ObDASInsertResult::get_next_row(ObNewRow *&row)
int ObDASInsertResult::get_next_row(ObDatumRow *&row)
{
int ret = OB_SUCCESS;
ObNewRow *result_row = NULL;
ObDatumRow *result_row = NULL;
if (OB_FAIL(result_newrow_iter_.get_next_row(result_row))) {
if (OB_ITER_END != ret) {
LOG_WARN("get next row from result iter failed", K(ret));
@ -497,19 +497,6 @@ int ObDASInsertResult::get_next_row(ObNewRow *&row)
return ret;
}
int ObDASInsertResult::get_next_rows(int64_t &count, int64_t capacity)
{
UNUSED(count);
UNUSED(capacity);
return OB_NOT_IMPLEMENT;
}
int ObDASInsertResult::get_next_row()
{
int ret = OB_NOT_IMPLEMENT;
return ret;
}
int ObDASInsertResult::link_extra_result(ObDASExtraData &extra_result)
{
UNUSED(extra_result);
@ -585,11 +572,11 @@ void ObDASConflictIterator::reset()
duplicated_iter_list_.reset();
}
int ObDASConflictIterator::get_next_row(common::ObNewRow *&row)
int ObDASConflictIterator::get_next_row(ObDatumRow *&row)
{
int ret = OB_SUCCESS;
bool find_next_iter = false;
ObNewRow *dup_row = NULL;
ObDatumRow *dup_row = NULL;
do {
if (find_next_iter) {
++curr_iter_;
@ -599,7 +586,7 @@ int ObDASConflictIterator::get_next_row(common::ObNewRow *&row)
ret = OB_ITER_END;
LOG_DEBUG("fetch conflict row iterator end");
} else {
ObNewRowIterator *dup_row_iter = *curr_iter_;
blocksstable::ObDatumRowIterator *dup_row_iter = *curr_iter_;
if (OB_ISNULL(dup_row_iter)) {
find_next_iter = true;
} else if (OB_FAIL(dup_row_iter->get_next_row(dup_row))) {
@ -624,11 +611,5 @@ int ObDASConflictIterator::get_next_row(common::ObNewRow *&row)
return ret;
}
int ObDASConflictIterator::get_next_row()
{
int ret = OB_NOT_IMPLEMENT;
return ret;
}
} // namespace sql
} // namespace oceanbase

View File

@ -22,8 +22,8 @@ namespace sql
{
class ObDASInsertResult;
typedef common::ObList<ObNewRowIterator *, common::ObIAllocator> ObDuplicatedIterList;
class ObDASConflictIterator : public common::ObNewRowIterator
typedef common::ObList<blocksstable::ObDatumRowIterator *, common::ObIAllocator> ObDuplicatedIterList;
class ObDASConflictIterator : public blocksstable::ObDatumRowIterator
{
public:
ObDASConflictIterator(const ObjMetaFixedArray &output_types,
@ -36,9 +36,8 @@ public:
~ObDASConflictIterator() {};
virtual int get_next_row(common::ObNewRow *&row) override;
virtual int get_next_row() override;
virtual void reset() override;
void reset();
virtual int get_next_row(blocksstable::ObDatumRow *&row) override;
void init_curr_iter()
{ curr_iter_ = duplicated_iter_list_.begin(); }
@ -78,7 +77,7 @@ public:
return insert_buffer_.dump_data(*ins_ctdef_);
}
common::ObNewRowIterator *get_duplicated_result()
blocksstable::ObDatumRowIterator *get_duplicated_result()
{ return result_; }
INHERIT_TO_STRING_KV("parent", ObIDASTaskOp,
@ -93,7 +92,7 @@ private:
int insert_index_with_fetch(ObDMLBaseParam &dml_param,
ObAccessService *as,
common::ObNewRowIterator &dml_iter,
blocksstable::ObDatumRowIterator &dml_iter,
ObDASConflictIterator *result_iter,
const ObDASInsCtDef *ins_ctdef,
ObDASInsRtDef *ins_rtdef,
@ -105,12 +104,12 @@ private:
const ObDASInsCtDef *ins_ctdef_;
ObDASInsRtDef *ins_rtdef_;
ObDASWriteBuffer insert_buffer_;
common::ObNewRowIterator *result_;
blocksstable::ObDatumRowIterator *result_;
int64_t affected_rows_; // local execute result, no need to serialize
bool is_duplicated_; // local execute result, no need to serialize
};
class ObDASInsertResult : public ObIDASTaskResult, public common::ObNewRowIterator
class ObDASInsertResult : public ObIDASTaskResult, public blocksstable::ObDatumRowIterator
{
OB_UNIS_VERSION_V(1);
public:
@ -118,10 +117,8 @@ public:
virtual ~ObDASInsertResult();
virtual int init(const ObIDASTaskOp &op, common::ObIAllocator &alloc) override;
virtual int reuse() override;
virtual int get_next_row(ObNewRow *&row) override;
virtual int get_next_row() override;
virtual int get_next_rows(int64_t &count, int64_t capacity) override;
virtual void reset() override;
virtual int get_next_row(blocksstable::ObDatumRow *&row) override;
virtual void reset();
virtual int link_extra_result(ObDASExtraData &extra_result) override;
int init_result_newrow_iter(const ObjMetaFixedArray *output_types);
ObDASWriteBuffer &get_result_buffer() { return result_buffer_; }

View File

@ -18,6 +18,7 @@
#include "sql/das/ob_das_utils.h"
#include "sql/das/ob_das_domain_utils.h"
#include "storage/tx_storage/ob_access_service.h"
#include "storage/blocksstable/ob_datum_row_utils.h"
#include "sql/engine/expr/ob_expr_lob_utils.h"
namespace oceanbase
{
@ -43,7 +44,7 @@ using namespace share;
namespace sql
{
class ObDASUpdIterator : public ObNewRowIterator
class ObDASUpdIterator : public blocksstable::ObDatumRowIterator
{
public:
ObDASUpdIterator(const ObDASUpdCtDef *das_ctdef,
@ -60,10 +61,8 @@ public:
{
}
virtual ~ObDASUpdIterator();
virtual int get_next_row(ObNewRow *&row) override;
virtual int get_next_row() override { return OB_NOT_IMPLEMENT; }
virtual int get_next_row(blocksstable::ObDatumRow *&row) override;
ObDASWriteBuffer &get_write_buffer() { return write_buffer_; }
virtual void reset() override { }
int rewind(const ObDASDMLBaseCtDef *das_ctdef)
{
int ret = common::OB_SUCCESS;
@ -92,12 +91,12 @@ public:
}
private:
// domain index
int get_next_domain_index_row(ObNewRow *&row);
int get_next_domain_index_row(blocksstable::ObDatumRow *&row);
private:
const ObDASUpdCtDef *das_ctdef_;
ObDASWriteBuffer &write_buffer_;
ObNewRow *old_row_;
ObNewRow *new_row_;
blocksstable::ObDatumRow *old_row_;
blocksstable::ObDatumRow *new_row_;
ObDASWriteBuffer::Iterator result_iter_;
ObDomainDMLIterator *domain_iter_;
bool got_old_row_;
@ -105,7 +104,7 @@ private:
common::ObIAllocator &allocator_;
};
int ObDASUpdIterator::get_next_row(ObNewRow *&row)
int ObDASUpdIterator::get_next_row(blocksstable::ObDatumRow *&row)
{
int ret = OB_SUCCESS;
const ObChunkDatumStore::StoredRow *sr = NULL;
@ -119,7 +118,7 @@ int ObDASUpdIterator::get_next_row(ObNewRow *&row)
} else if (!got_old_row_) {
got_old_row_ = true;
if (OB_ISNULL(old_row_)) {
if (OB_FAIL(ob_create_row(allocator_, das_ctdef_->old_row_projector_.count(), old_row_))) {
if (OB_FAIL(blocksstable::ObDatumRowUtils::ob_create_row(allocator_, das_ctdef_->old_row_projector_.count(), old_row_))) {
LOG_WARN("create row buffer failed", K(ret), K(das_ctdef_->old_row_projector_.count()));
} else if (OB_FAIL(write_buffer_.begin(result_iter_))) {
LOG_WARN("begin datum result iterator failed", K(ret));
@ -127,7 +126,7 @@ int ObDASUpdIterator::get_next_row(ObNewRow *&row)
}
if (OB_SUCC(ret) && OB_ISNULL(new_row_)) {
if (OB_FAIL(ob_create_row(allocator_, das_ctdef_->new_row_projector_.count(), new_row_))) {
if (OB_FAIL(blocksstable::ObDatumRowUtils::ob_create_row(allocator_, das_ctdef_->new_row_projector_.count(), new_row_))) {
LOG_WARN("create row buffer failed", K(ret), K(das_ctdef_->new_row_projector_.count()));
}
}
@ -182,7 +181,7 @@ ObDASUpdIterator::~ObDASUpdIterator()
}
}
int ObDASUpdIterator::get_next_domain_index_row(ObNewRow *&row)
int ObDASUpdIterator::get_next_domain_index_row(ObDatumRow *&row)
{
int ret = OB_SUCCESS;
if (!iter_has_built_) {

View File

@ -23,6 +23,7 @@
#include "observer/omt/ob_tenant_srs.h"
#include "share/ob_tablet_autoincrement_service.h"
#include "storage/access/ob_dml_param.h"
#include "storage/blocksstable/ob_datum_row_utils.h"
namespace oceanbase
{
using namespace common;
@ -203,7 +204,7 @@ int ObDASUtils::project_storage_row(const ObDASDMLBaseCtDef &dml_ctdef,
const ObDASWriteBuffer::DmlRow &dml_row,
const IntFixedArray &row_projector,
ObIAllocator &allocator,
ObNewRow &storage_row)
blocksstable::ObDatumRow &storage_row)
{
int ret = OB_SUCCESS;
for (int64_t i = 0; OB_SUCC(ret) && i < row_projector.count(); ++i) {
@ -212,14 +213,17 @@ int ObDASUtils::project_storage_row(const ObDASDMLBaseCtDef &dml_ctdef,
const ObAccuracy &col_accuracy = dml_ctdef.column_accuracys_.at(i);
if (projector_idx < 0) {
//this column is not touched by query, only need to be marked as nop
storage_row.cells_[i].set_nop_value();
} else if (OB_FAIL(dml_row.cells()[projector_idx].to_obj(storage_row.cells_[i], col_type))) {
LOG_WARN("stored row to new row obj failed", K(ret),
K(dml_row.cells()[projector_idx]), K(col_type), K(projector_idx), K(i));
} else if (OB_FAIL(reshape_storage_value(col_type, col_accuracy, allocator, storage_row.cells_[i]))) {
storage_row.storage_datums_[i].set_nop();
} else if (FALSE_IT(storage_row.storage_datums_[i].shallow_copy_from_datum(dml_row.cells()[projector_idx]))) {
} else if (storage_row.storage_datums_[i].is_null()) {
//nothing to do
} else if (OB_FAIL(reshape_datum_value(col_type, col_accuracy, true, allocator, storage_row.storage_datums_[i]))) {
LOG_WARN("reshape storage value failed", K(ret));
} else if (col_type.is_lob_storage() && col_type.has_lob_header()) {
storage_row.storage_datums_[i].set_has_lob_header();
}
}
//to project shadow rowkey with unique index
if (OB_SUCC(ret) && dml_ctdef.spk_cnt_) {
bool need_shadow_columns = false;
@ -229,7 +233,7 @@ int ObDASUtils::project_storage_row(const ObDASDMLBaseCtDef &dml_ctdef,
//need to fill shadow pk with the real pk value
bool rowkey_has_null = false;
for (int64_t i = 0; !rowkey_has_null && i < index_key_cnt; i++) {
rowkey_has_null = storage_row.cells_[i].is_null();
rowkey_has_null = storage_row.storage_datums_[i].is_null();
}
need_shadow_columns = rowkey_has_null;
} else {
@ -237,14 +241,14 @@ int ObDASUtils::project_storage_row(const ObDASDMLBaseCtDef &dml_ctdef,
//need to fill shadow pk with the real pk value
bool is_rowkey_all_null = true;
for (int64_t i = 0; is_rowkey_all_null && i < index_key_cnt; i++) {
is_rowkey_all_null = storage_row.cells_[i].is_null();
is_rowkey_all_null = storage_row.storage_datums_[i].is_null();
}
need_shadow_columns = is_rowkey_all_null;
}
if (!need_shadow_columns) {
for (int64_t i = 0; i < dml_ctdef.spk_cnt_; ++i) {
int64_t spk_idx = index_key_cnt + i;
storage_row.cells_[spk_idx].set_null();
storage_row.storage_datums_[spk_idx].set_null();
}
}
}
@ -398,7 +402,7 @@ int ObDASUtils::find_child_das_def(const ObDASBaseCtDef *root_ctdef,
int ObDASUtils::generate_mlog_row(const ObTabletID &tablet_id,
const storage::ObDMLBaseParam &dml_param,
ObNewRow &row,
blocksstable::ObDatumRow &row,
ObDASOpType op_type,
bool is_old_row)
{
@ -432,23 +436,26 @@ int ObDASUtils::generate_mlog_row(const ObTabletID &tablet_id,
}
}
row.cells_[sequence_col].set_int(ObObjType::ObIntType, static_cast<int64_t>(autoinc_seq));
row.storage_datums_[sequence_col].reuse();
row.storage_datums_[dmltype_col].reuse();
row.storage_datums_[old_new_col].reuse();
row.storage_datums_[sequence_col].set_int(static_cast<int64_t>(autoinc_seq));
if (sql::DAS_OP_TABLE_DELETE == op_type) {
row.cells_[dmltype_col].set_varchar("D");
row.cells_[old_new_col].set_varchar("O");
row.storage_datums_[dmltype_col].set_string(ObString("D"));
row.storage_datums_[old_new_col].set_string(ObString("O"));
} else if (sql::DAS_OP_TABLE_UPDATE == op_type) {
row.cells_[dmltype_col].set_varchar("U");
row.storage_datums_[dmltype_col].set_string(ObString("U"));
if (is_old_row) {
row.cells_[old_new_col].set_varchar("O");
row.storage_datums_[old_new_col].set_string(ObString("O"));
} else {
row.cells_[old_new_col].set_varchar("N");
row.storage_datums_[old_new_col].set_string(ObString("N"));
}
} else {
row.cells_[dmltype_col].set_varchar("I");
row.cells_[old_new_col].set_varchar("N");
row.storage_datums_[dmltype_col].set_string(ObString("I"));
row.storage_datums_[old_new_col].set_string(ObString("N"));
}
row.cells_[dmltype_col].set_collation_type(ObCollationType::CS_TYPE_UTF8MB4_GENERAL_CI);
row.cells_[old_new_col].set_collation_type(ObCollationType::CS_TYPE_UTF8MB4_GENERAL_CI);
// TODO: if we need to update col_type_ in col_descs with ObCollationType::CS_TYPE_UTF8MB4_GENERAL_CI ?@xuanxi
}
return ret;
}

View File

@ -53,7 +53,7 @@ public:
const ObDASWriteBuffer::DmlRow &dml_row,
const IntFixedArray &row_projector,
common::ObIAllocator &allocator,
common::ObNewRow &storage_row);
blocksstable::ObDatumRow &storage_row);
static int reshape_storage_value(const common::ObObjMeta &col_type,
const common::ObAccuracy &col_accuracy,
common::ObIAllocator &allocator,
@ -93,7 +93,7 @@ public:
}
static int generate_mlog_row(const common::ObTabletID &tablet_id,
const storage::ObDMLBaseParam &dml_param,
common::ObNewRow &row,
blocksstable::ObDatumRow &row,
ObDASOpType op_type,
bool is_old_row);
};

View File

@ -981,11 +981,11 @@ int ObTableInsertUpOp::get_next_conflict_rowkey(DASTaskIter &task_iter)
int ret = OB_SUCCESS;
bool got_row = false;
while (OB_SUCC(ret) && !got_row) {
ObNewRow *dup_row = nullptr;
ObDatumRow *dup_row = nullptr;
ObChunkDatumStore::StoredRow *stored_row = nullptr;
ObDASWriteBuffer::DmlShadowRow ssr;
ObDASInsertOp *ins_op = static_cast<ObDASInsertOp*>(*task_iter);
ObNewRowIterator *conflict_result = ins_op->get_duplicated_result();
ObDatumRowIterator *conflict_result = ins_op->get_duplicated_result();
const ObDASInsCtDef *ins_ctdef = static_cast<const ObDASInsCtDef*>(ins_op->get_ctdef());
// 因为返回的都是主表的主键,主表的主键一定是在存储层有储存的,是不需要再收起来层再做运算的,
// 所以这里不需要clear eval flag

View File

@ -413,11 +413,11 @@ int ObTableReplaceOp::get_next_conflict_rowkey(DASTaskIter &task_iter)
int ret = OB_SUCCESS;
bool got_row = false;
while (OB_SUCC(ret) && !got_row) {
ObNewRow *dup_row = nullptr;
ObDatumRow *dup_row = nullptr;
ObChunkDatumStore::StoredRow *stored_row = nullptr;
ObDASWriteBuffer::DmlShadowRow ssr;
ObDASInsertOp *ins_op = static_cast<ObDASInsertOp*>(*task_iter);
ObNewRowIterator *conflict_result = ins_op->get_duplicated_result();
ObDatumRowIterator *conflict_result = ins_op->get_duplicated_result();
const ObDASInsCtDef *ins_ctdef = static_cast<const ObDASInsCtDef*>(ins_op->get_ctdef());
// 因为返回的都是主表的主键,主表的主键一定是在存储层有储存的,是不需要再收起来层再做运算的,
// 所以这里不需要clear eval flag

View File

@ -292,7 +292,7 @@ int ObExprPLGetCursorAttr::calc_pl_get_cursor_attr(
} else if (OB_UNLIKELY(rowid.empty())) {
expr_datum.set_null();
} else {
expr_datum.set_urowid(rowid.ptr(), rowid.length());
expr_datum.set_string(rowid.ptr(), rowid.length());
}
}
break;

View File

@ -3135,25 +3135,17 @@ int ObTableScanOp::inner_get_next_spatial_index_row()
} else if (cellids.size() > SAPTIAL_INDEX_DEFAULT_ROW_COUNT) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("cellid over size", K(ret), K(cellids.size()));
} else if (OB_ISNULL(spat_index_.obj_buffer_)) {
} else if (OB_ISNULL(spat_index_.rows_)) {
ret = OB_ALLOCATE_MEMORY_FAILED;
LOG_WARN("failed to alloc memory for spatial index row cells", K(ret));
LOG_WARN("failed to alloc memory for spatial index datum row", K(ret));
} else {
ObObj *obj_arr = reinterpret_cast<ObObj *>(spat_index_.obj_buffer_);
uint64_t obj_idx = 0;
for (uint64_t i = 0; OB_SUCC(ret) && i < cellids.size(); i++) {
obj_arr[obj_idx].set_nop_value();
obj_arr[obj_idx].set_uint64(cellids.at(i));
obj_arr[obj_idx + 1].set_nop_value();
obj_arr[obj_idx + 1].set_varchar(mbr_val);
obj_arr[obj_idx + 1].set_collation_type(CS_TYPE_BINARY);
obj_arr[obj_idx + 1].set_collation_level(CS_LEVEL_IMPLICIT);
ObNewRow row;
row.cells_ = &obj_arr[obj_idx];
row.count_ = 2;
obj_idx += 2;
if (OB_FAIL(spat_index_.spat_rows_->push_back(row))) {
LOG_WARN("failed to push back spatial index row", K(ret), K(row));
for (uint64_t i = 0, datum_idx = 0; OB_SUCC(ret) && i < cellids.size(); i++) {
spat_index_.rows_[i].reuse();
spat_index_.rows_[i].storage_datums_[datum_idx].set_uint(cellids.at(i));
spat_index_.rows_[i].storage_datums_[datum_idx + 1].set_string(mbr_val);
// not set_collation_type(CS_TYPE_BINARY) and set_collation_level(CS_LEVEL_IMPLICIT)
if (OB_FAIL(spat_index_.spat_rows_->push_back(spat_index_.rows_ + i))) {
LOG_WARN("failed to push back spatial index row", K(ret), K(spat_index_.rows_[i]));
}
}
}
@ -3162,10 +3154,10 @@ int ObTableScanOp::inner_get_next_spatial_index_row()
}
}
}
if (OB_SUCC(ret) && !need_ignore_null) {
ObNewRow &row = (*(spat_index_.spat_rows_))[spat_index_.spat_row_index_++];
ObObj &cellid= row.get_cell(0);
ObObj &mbr = row.get_cell(1);
if (OB_SUCC(ret)) {
ObDatumRow *row = (*(spat_index_.spat_rows_))[spat_index_.spat_row_index_++];
ObStorageDatum &cellid = row->storage_datums_[0];
ObStorageDatum &mbr = row->storage_datums_[1];
if (OB_FAIL(fill_generated_cellid_mbr(cellid, mbr))) {
LOG_WARN("fill cellid mbr failed", K(ret), K(cellid), K(mbr));
}
@ -3178,19 +3170,24 @@ int ObTableScanOp::init_spatial_index_rows()
{
int ret = OB_SUCCESS;
void *buf = ctx_.get_allocator().alloc(sizeof(ObDomainIndexRow));
void *row_buf = ctx_.get_allocator().alloc(sizeof(blocksstable::ObDatumRow) * SAPTIAL_INDEX_DEFAULT_ROW_COUNT);
void *mbr_buffer = ctx_.get_allocator().alloc(OB_DEFAULT_MBR_SIZE);
void *obj_buf = ctx_.get_allocator().alloc(sizeof(ObObj) * 2 * SAPTIAL_INDEX_DEFAULT_ROW_COUNT);
if (OB_ISNULL(buf) || OB_ISNULL(mbr_buffer) || OB_ISNULL(obj_buf)) {
if (OB_ISNULL(buf) || OB_ISNULL(mbr_buffer) || OB_ISNULL(row_buf)) {
ret = OB_ALLOCATE_MEMORY_FAILED;
LOG_WARN("allocate spatial row store failed", K(ret), K(buf), K(mbr_buffer));
} else {
spat_index_.spat_rows_ = new(buf) ObDomainIndexRow();
spat_index_.rows_ = new(row_buf) blocksstable::ObDatumRow[SAPTIAL_INDEX_DEFAULT_ROW_COUNT];
spat_index_.mbr_buffer_ = mbr_buffer;
spat_index_.obj_buffer_ = obj_buf;
const ObExprPtrIArray &exprs = MY_SPEC.output_;
const uint8_t spatial_expr_cnt = 3;
uint8_t cnt = 0;
for (uint32_t i = 0; i < exprs.count() && cnt < spatial_expr_cnt; i++) {
for (uint32_t i = 0; OB_SUCC(ret) && i < SAPTIAL_INDEX_DEFAULT_ROW_COUNT; i++) {
if (OB_FAIL(spat_index_.rows_[i].init(SAPTIAL_INDEX_DEFAULT_COL_COUNT))) {
LOG_WARN("init datum row failed", K(ret));
}
}
for (uint32_t i = 0; OB_SUCC(ret) && i < exprs.count() && cnt < spatial_expr_cnt; i++) {
if (exprs.at(i)->type_ == T_FUN_SYS_SPATIAL_CELLID) {
spat_index_.cell_idx_ = i;
cnt++;
@ -3202,7 +3199,7 @@ int ObTableScanOp::init_spatial_index_rows()
cnt++;
}
}
if (cnt != spatial_expr_cnt) {
if (OB_FAIL(ret) || cnt != spatial_expr_cnt) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("invalid spatial index exprs", K(ret), K(cnt));
}
@ -3210,7 +3207,7 @@ int ObTableScanOp::init_spatial_index_rows()
return ret;
}
int ObTableScanOp::fill_generated_cellid_mbr(const ObObj &cellid, const ObObj &mbr)
int ObTableScanOp::fill_generated_cellid_mbr(const ObStorageDatum &cellid, const ObStorageDatum &mbr)
{
int ret = OB_SUCCESS;
const ObExprPtrIArray &exprs = MY_SPEC.output_;
@ -3220,12 +3217,12 @@ int ObTableScanOp::fill_generated_cellid_mbr(const ObObj &cellid, const ObObj &m
} else {
for (uint8_t i = 0; i < 2 && OB_SUCC(ret); i++) {
ObObjDatumMapType type = i == 0 ? OBJ_DATUM_8BYTE_DATA : OBJ_DATUM_STRING;
const ObObj &value = i == 0 ? cellid : mbr;
const ObStorageDatum &value = i == 0 ? cellid : mbr;
uint32_t idx = i == 0 ? spat_index_.cell_idx_ : spat_index_.mbr_idx_;
ObExpr *expr = exprs.at(idx);
ObDatum *datum = &expr->locate_datum_for_write(get_eval_ctx());
ObEvalInfo *eval_info = &expr->get_eval_info(get_eval_ctx());
if (OB_FAIL(datum->from_obj(value, type))) {
if (OB_FAIL(datum->from_storage_datum(value, type))) {
LOG_WARN("fill spatial index row failed", K(ret));
} else {
eval_info->evaluated_ = true;

View File

@ -71,18 +71,18 @@ struct ObSpatialIndexCache
public:
ObSpatialIndexCache() :
spat_rows_(nullptr),
rows_(nullptr),
spat_row_index_(0),
mbr_buffer_(nullptr),
obj_buffer_(nullptr),
geo_idx_(0),
cell_idx_(0),
mbr_idx_(0)
{}
~ObSpatialIndexCache() {};
ObDomainIndexRow *spat_rows_;
blocksstable::ObDatumRow *rows_;
uint8_t spat_row_index_;
void *mbr_buffer_;
void *obj_buffer_;
uint32_t geo_idx_;
uint32_t cell_idx_;
uint32_t mbr_idx_;
@ -509,7 +509,7 @@ protected:
ObTableScanStat &scan_stat) const;
void set_cache_stat(const ObPlanStat &plan_stat);
int inner_get_next_row_implement();
int fill_generated_cellid_mbr(const ObObj &cellid, const ObObj &mbr);
int fill_generated_cellid_mbr(const ObStorageDatum &cellid, const ObStorageDatum &mbr);
int inner_get_next_spatial_index_row();
int init_spatial_index_rows();
void set_real_rescan_cnt(int64_t real_rescan_cnt) { group_rescan_cnt_ = real_rescan_cnt; }

View File

@ -43,8 +43,11 @@ ob_set_subtarget(ob_storage blocksstable
blocksstable/ob_sstable_printer.cpp
blocksstable/ob_storage_cache_suite.cpp
blocksstable/ob_super_block_buffer_holder.cpp
blocksstable/ob_storage_datum.cpp
blocksstable/ob_datum_row.cpp
blocksstable/ob_datum_rowkey.cpp
blocksstable/ob_datum_row_store.cpp
blocksstable/ob_datum_row_utils.cpp
blocksstable/ob_data_store_desc.cpp
blocksstable/ob_table_flag.cpp
blocksstable/ob_datum_rowkey_vector.cpp

View File

@ -14,6 +14,7 @@
#include "storage/ob_storage_struct.h"
#include "storage/ob_relative_table.h"
#include "storage/ob_storage_schema.h"
#include "storage/blocksstable/ob_datum_row_utils.h"
#include "ob_store_row_iterator.h"
namespace oceanbase
@ -93,6 +94,7 @@ ObRowsInfo::ObRowsInfo()
tablet_id_(),
datum_utils_(nullptr),
min_key_(),
col_descs_(nullptr),
conflict_rowkey_idx_(-1),
error_code_(0),
delete_count_(0),
@ -124,9 +126,11 @@ void ObRowsInfo::reset()
error_code_ = 0;
conflict_rowkey_idx_ = -1;
is_inited_ = false;
col_descs_ = nullptr;
}
int ObRowsInfo::init(
const ObColDescIArray &column_descs,
const ObRelativeTable &table,
ObStoreCtx &store_ctx,
const ObITableReadInfo &rowkey_read_info)
@ -139,6 +143,7 @@ int ObRowsInfo::init(
} else if (OB_FAIL(exist_helper_.init(table, store_ctx, rowkey_read_info, exist_allocator_, scan_mem_allocator_))) {
STORAGE_LOG(WARN, "Failed to init exist helper", K(ret));
} else {
col_descs_ = &column_descs;
datum_utils_ = &rowkey_read_info.get_datum_utils();
tablet_id_ = table.get_tablet_id();
rowkey_column_num_ = table.get_rowkey_column_num();
@ -160,7 +165,7 @@ void ObRowsInfo::reuse()
}
//not only checking duplicate, but also assign rowkeys
int ObRowsInfo::check_duplicate(ObStoreRow *rows, const int64_t row_count, ObRelativeTable &table)
int ObRowsInfo::check_duplicate(ObDatumRow *rows, const int64_t row_count, ObRelativeTable &table)
{
int ret = OB_SUCCESS;
int tmp_ret = OB_SUCCESS;
@ -192,10 +197,9 @@ int ObRowsInfo::check_duplicate(ObStoreRow *rows, const int64_t row_count, ObRel
} else {
ObMarkedRowkeyAndLockState marked_rowkey_and_lock_state;
marked_rowkey_and_lock_state.row_idx_ = i;
ObRowkey rowkey(rows_[i].row_val_.cells_, rowkey_column_num_);
if (OB_FAIL(marked_rowkey_and_lock_state.marked_rowkey_.get_rowkey().from_rowkey(rowkey,
key_allocator_))) {
STORAGE_LOG(WARN, "Failed to transfer rowkey", K(ret), K(rowkey));
ObDatumRowkey &datum_rowkey = marked_rowkey_and_lock_state.marked_rowkey_.get_rowkey();
if (OB_FAIL(blocksstable::ObDatumRowUtils::prepare_rowkey(rows[i], rowkey_column_num_, *col_descs_, key_allocator_, datum_rowkey))) {
STORAGE_LOG(WARN, "Failed to prepare rowkey", K(ret), K(rowkey_column_num_), K(rows_[i]));
} else if (OB_FAIL(rowkeys_.push_back(marked_rowkey_and_lock_state))) {
STORAGE_LOG(WARN, "Failed to push back rowkey", K(ret), K(marked_rowkey_and_lock_state));
}

View File

@ -90,10 +90,11 @@ public:
return delete_count_ == rowkeys_.count();
}
int init(
const ObColDescIArray &column_descs,
const ObRelativeTable &table,
ObStoreCtx &store_ctx,
const ObITableReadInfo &rowkey_read_info);
int check_duplicate(ObStoreRow *rows, const int64_t row_count, ObRelativeTable &table);
int check_duplicate(blocksstable::ObDatumRow *rows, const int64_t row_count, ObRelativeTable &table);
blocksstable::ObDatumRowkey& get_duplicate_rowkey()
{
return min_key_;
@ -265,12 +266,13 @@ private:
public:
ObRowkeyAndLockStates rowkeys_;
ObPermutation permutation_;
ObStoreRow *rows_;
blocksstable::ObDatumRow *rows_;
ExistHelper exist_helper_;
ObTabletID tablet_id_;
private:
const blocksstable::ObStorageDatumUtils *datum_utils_;
blocksstable::ObDatumRowkey min_key_;
const ObColDescIArray *col_descs_;
int64_t conflict_rowkey_idx_;
int error_code_;
int64_t delete_count_;

View File

@ -266,10 +266,12 @@ int ObTableAccessContext::init(const common::ObQueryFlag &query_flag,
}
return ret;
}
int ObTableAccessContext::init(const common::ObQueryFlag &query_flag,
ObStoreCtx &ctx,
common::ObIAllocator &allocator,
const common::ObVersionRange &trans_version_range)
const common::ObVersionRange &trans_version_range,
CachedIteratorNode *cached_iter_node)
{
int ret = OB_SUCCESS;
if (is_inited_) {
@ -288,6 +290,7 @@ int ObTableAccessContext::init(const common::ObQueryFlag &query_flag,
ls_id_ = ctx.ls_id_;
tablet_id_ = ctx.tablet_id_;
lob_locator_helper_ = nullptr;
cached_iter_node_ = cached_iter_node;
if (!micro_block_handle_mgr_.is_valid()
&& OB_FAIL(micro_block_handle_mgr_.init(enable_limit, table_store_stat_, query_flag_))) {
LOG_WARN("Fail to init micro block handle mgr", K(ret));

View File

@ -199,7 +199,8 @@ struct ObTableAccessContext
int init(const common::ObQueryFlag &query_flag,
ObStoreCtx &ctx,
common::ObIAllocator &allocator,
const common::ObVersionRange &trans_version_range);
const common::ObVersionRange &trans_version_range,
CachedIteratorNode *cached_iter_node = nullptr);
int alloc_iter_pool(const bool use_column_store);
void inc_micro_access_cnt();
int init_scan_allocator(ObTableScanParam &scan_param);

View File

@ -22,73 +22,6 @@ namespace oceanbase
using namespace common;
namespace blocksstable
{
static int nonext_nonext_compare(const ObStorageDatum &left, const ObStorageDatum &right, const common::ObCmpFunc &cmp_func, int &cmp_ret)
{
int ret = cmp_func.cmp_func_(left, right, cmp_ret);
STORAGE_LOG(DEBUG, "chaser debug compare datum", K(ret), K(left), K(right), K(cmp_ret));
return ret;
}
static int nonext_ext_compare(const ObStorageDatum &left, const ObStorageDatum &right, const common::ObCmpFunc &cmp_func, int &cmp_ret)
{
int ret = OB_SUCCESS;
UNUSEDx(left, cmp_func);
if (right.is_max()) {
cmp_ret = -1;
} else if (right.is_min()) {
cmp_ret = 1;
} else {
ret = OB_ERR_SYS;
STORAGE_LOG(ERROR, "Unexpected datum in rowkey to compare", K(ret), K(right));
}
STORAGE_LOG(DEBUG, "chaser debug compare datum", K(ret), K(left), K(right), K(cmp_ret));
return ret;
}
static int ext_nonext_compare(const ObStorageDatum &left, const ObStorageDatum &right, const common::ObCmpFunc &cmp_func, int &cmp_ret)
{
int ret = OB_SUCCESS;
UNUSEDx(right, cmp_func);
if (left.is_max()) {
cmp_ret = 1;
} else if (left.is_min()) {
cmp_ret = -1;
} else {
ret = OB_ERR_SYS;
STORAGE_LOG(ERROR, "Unexpected datum in rowkey to compare", K(ret), K(left));
}
STORAGE_LOG(DEBUG, "chaser debug compare datum", K(ret), K(left), K(right), K(cmp_ret));
return ret;
}
static int ext_ext_compare(const ObStorageDatum &left, const ObStorageDatum &right, const common::ObCmpFunc &cmp_func, int &cmp_ret)
{
int ret = OB_SUCCESS;
UNUSEDx(cmp_func);
int64_t lv = left.is_max() - left.is_min();
int64_t rv = right.is_max() - right.is_min();
if (OB_UNLIKELY(0 == lv || 0 == rv)) {
ret = OB_ERR_SYS;
STORAGE_LOG(ERROR, "Unexpected datum in rowkey to compare", K(ret), K(left), K(right));
} else {
cmp_ret = lv - rv;
}
STORAGE_LOG(DEBUG, "chaser debug compare datum", K(ret), K(left), K(right), K(cmp_ret));
return ret;
}
typedef int (*ExtSafeCompareFunc)(const ObStorageDatum &left, const ObStorageDatum &right, const common::ObCmpFunc &cmp_func, int &cmp_ret);
static ExtSafeCompareFunc ext_safe_cmp_funcs[2][2] = {
{nonext_nonext_compare, nonext_ext_compare},
{ext_nonext_compare, ext_ext_compare}
};
int ObStorageDatumCmpFunc::compare(const ObStorageDatum &left, const ObStorageDatum &right, int &cmp_ret) const
{
return ext_safe_cmp_funcs[left.is_ext()][right.is_ext()](left, right, cmp_func_, cmp_ret);
}
const char *get_dml_str(ObDmlFlag dml_flag)
{
@ -106,86 +39,6 @@ OB_SERIALIZE_MEMBER(ObDmlRowFlag, whole_flag_);
OB_SERIALIZE_MEMBER(ObMultiVersionRowFlag, flag_);
/*
*ObStorageDatumBuffer
*/
ObStorageDatumBuffer::ObStorageDatumBuffer(common::ObIAllocator *allocator)
: capacity_(LOCAL_BUFFER_ARRAY),
local_datums_(),
datums_(local_datums_),
allocator_(allocator),
is_inited_(nullptr != allocator)
{}
ObStorageDatumBuffer::~ObStorageDatumBuffer()
{
if (datums_ != local_datums_ && nullptr != allocator_) {
allocator_->free(datums_);
}
}
void ObStorageDatumBuffer::reset()
{
if (datums_ != local_datums_ && nullptr != allocator_) {
allocator_->free(datums_);
}
allocator_ = nullptr;
datums_ = local_datums_;
capacity_ = LOCAL_BUFFER_ARRAY;
for (int64_t i = 0; i < capacity_; i++) {
datums_[i].reuse();
}
is_inited_ = false;
}
int ObStorageDatumBuffer::init(common::ObIAllocator &allocator)
{
int ret = OB_SUCCESS;
if (IS_INIT) {
ret = OB_INIT_TWICE;
STORAGE_LOG(WARN, "ObStorageDatumBuffer init twice", K(ret), K(*this));
} else {
OB_ASSERT(datums_ == local_datums_);
allocator_ = &allocator;
is_inited_ = true;
}
return ret;
}
int ObStorageDatumBuffer::reserve(const int64_t count, const bool keep_data)
{
int ret = OB_SUCCESS;
void *buf = nullptr;
if (IS_NOT_INIT) {
ret = OB_NOT_INIT;
STORAGE_LOG(WARN, "ObStorageDatumBuffer is not inited", K(ret), K(*this));
} else if (OB_UNLIKELY(count <= 0)) {
ret = OB_INVALID_ARGUMENT;
STORAGE_LOG(WARN, "Invalid argument to reserve datum buffer", K(ret), K(count));
} else if (count <= capacity_){
} else if (OB_ISNULL(buf = allocator_->alloc(sizeof(ObStorageDatum) * count))) {
ret = OB_ALLOCATE_MEMORY_FAILED;
STORAGE_LOG(WARN, "Failed to alloc memory", K(ret), K(count));
} else {
ObStorageDatum *new_datums = new (buf) ObStorageDatum [count];
if (keep_data) {
for (int64_t i = 0; i < capacity_; i++) {
new_datums[i] = datums_[i];
}
}
if (nullptr != datums_ && datums_ != local_datums_) {
allocator_->free(datums_);
}
datums_ = new_datums;
capacity_ = count;
}
return ret;
}
/*
*ObConstDatumRow
*/
@ -232,8 +85,7 @@ ObDatumRow::ObDatumRow(const uint64_t tenant_id)
}
ObDatumRow::~ObDatumRow()
{
}
{}
int ObDatumRow::init(ObIAllocator &allocator, const int64_t capacity, char *trans_info_ptr)
{
@ -256,7 +108,9 @@ int ObDatumRow::init(ObIAllocator &allocator, const int64_t capacity, char *tran
}
return ret;
}
int ObDatumRow::init(const int64_t capacity)
{
int ret = OB_SUCCESS;
@ -442,6 +296,27 @@ int ObDatumRow::is_datums_changed(const ObDatumRow &other, bool &is_changed) con
return ret;
}
int ObDatumRow::shallow_copy(const ObDatumRow &other)
{
int ret = OB_SUCCESS;
if (!other.is_valid()) {
ret = OB_ERR_UNEXPECTED;
STORAGE_LOG(WARN, "Unexpected error for shallow copy invalid datum row", K(ret), K(*this), K(other));
} else {
trans_info_ = nullptr;
fast_filter_skipped_ = other.fast_filter_skipped_;
storage_datums_ = other.storage_datums_;
snapshot_version_ = other.snapshot_version_;
group_idx_ = other.group_idx_;
scan_index_ = other.scan_index_;
trans_id_ = other.trans_id_;
mvcc_row_flag_ = other.mvcc_row_flag_;
row_flag_ = other.row_flag_;
count_ = other.count_;
}
return ret;
}
OB_DEF_SERIALIZE(ObDatumRow)
{
int ret = OB_SUCCESS;
@ -503,8 +378,8 @@ DEF_TO_STRING(ObDatumRow)
{
int64_t pos = 0;
J_OBJ_START();
J_KV(K_(row_flag), K_(trans_id), K_(scan_index), K_(mvcc_row_flag),
K_(snapshot_version), K_(fast_filter_skipped), K_(have_uncommited_row), K_(group_idx), K_(count), K_(datum_buffer));
J_KV(K_(row_flag), K_(trans_id), K_(scan_index), K_(mvcc_row_flag), K_(snapshot_version), K_(fast_filter_skipped),
K_(have_uncommited_row), K_(group_idx), K_(count), K_(datum_buffer));
if (NULL != buf && buf_len >= 0) {
if (NULL != storage_datums_) {
J_COMMA();
@ -615,219 +490,6 @@ int ObNewRowBuilder::build_store_row(
return ret;
}
/*
*ObStorageDatumUtils
*/
ObStorageDatumUtils::ObStorageDatumUtils()
: rowkey_cnt_(0),
cmp_funcs_(),
hash_funcs_(),
ext_hash_func_(),
is_oracle_mode_(false),
is_inited_(false)
{}
ObStorageDatumUtils::~ObStorageDatumUtils()
{}
int ObStorageDatumUtils::transform_multi_version_col_desc(const ObIArray<share::schema::ObColDesc> &col_descs,
const int64_t schema_rowkey_cnt,
ObIArray<share::schema::ObColDesc> &mv_col_descs)
{
int ret = OB_SUCCESS;
if (OB_UNLIKELY(schema_rowkey_cnt > col_descs.count())) {
ret = OB_INVALID_ARGUMENT;
STORAGE_LOG(WARN, "Invalid argument to transform mv col descs", K(ret), K(schema_rowkey_cnt), K(col_descs));
} else {
mv_col_descs.reuse();
for (int64_t i = 0; OB_SUCC(ret) && i < schema_rowkey_cnt; i++) {
if (OB_FAIL(mv_col_descs.push_back(col_descs.at(i)))) {
STORAGE_LOG(WARN, "Failed to push back col desc", K(ret), K(i));
}
}
if (OB_FAIL(ret)) {
} else if (OB_FAIL(storage::ObMultiVersionRowkeyHelpper::add_extra_rowkey_cols(mv_col_descs))) {
STORAGE_LOG(WARN, "Fail to add extra_rowkey_cols", K(ret), K(schema_rowkey_cnt));
} else {
for (int64_t i = schema_rowkey_cnt; OB_SUCC(ret) && i < col_descs.count(); i++) {
const share::schema::ObColDesc &col_desc = col_descs.at(i);
if (col_desc.col_id_ == common::OB_HIDDEN_TRANS_VERSION_COLUMN_ID
|| col_desc.col_id_ == common::OB_HIDDEN_SQL_SEQUENCE_COLUMN_ID) {
continue;
} else if (OB_FAIL(mv_col_descs.push_back(col_desc))) {
STORAGE_LOG(WARN, "Failed to push back col desc", K(ret), K(col_desc));
}
}
}
}
return ret;
}
int ObStorageDatumUtils::init(const ObIArray<share::schema::ObColDesc> &col_descs,
const int64_t schema_rowkey_cnt,
const bool is_oracle_mode,
ObIAllocator &allocator,
const bool is_column_store)
{
int ret = OB_SUCCESS;
ObSEArray<share::schema::ObColDesc, 32> mv_col_descs;
int64_t mv_rowkey_cnt = 0;
int64_t mv_column_cnt = 0;
if (IS_INIT) {
ret = OB_INIT_TWICE;
STORAGE_LOG(WARN, "ObStorageDatumUtils init twice", K(ret), K(*this));
} else if (OB_UNLIKELY(schema_rowkey_cnt < 0 || schema_rowkey_cnt > OB_MAX_ROWKEY_COLUMN_NUMBER
|| schema_rowkey_cnt > col_descs.count())) {
ret = OB_INVALID_ARGUMENT;
STORAGE_LOG(WARN, "Invalid argument to init storage datum utils", K(ret), K(col_descs), K(schema_rowkey_cnt));
} else if (OB_FAIL(transform_multi_version_col_desc(col_descs, schema_rowkey_cnt, mv_col_descs))) {
STORAGE_LOG(WARN, "Failed to transform multi version col descs", K(ret));
} else if (FALSE_IT(mv_column_cnt = is_column_store ? 0 : storage::ObMultiVersionRowkeyHelpper::get_extra_rowkey_col_cnt())) {
} else if (FALSE_IT(mv_rowkey_cnt = schema_rowkey_cnt + mv_column_cnt)) {
} else if (OB_FAIL(cmp_funcs_.init(mv_rowkey_cnt, allocator))) {
STORAGE_LOG(WARN, "Failed to reserve cmp func array", K(ret));
} else if (OB_FAIL(hash_funcs_.init(mv_rowkey_cnt, allocator))) {
STORAGE_LOG(WARN, "Failed to reserve hash func array", K(ret));
} else if (OB_FAIL(inner_init(mv_col_descs, mv_rowkey_cnt, is_oracle_mode))) {
STORAGE_LOG(WARN, "Failed to inner init datum utils", K(ret), K(mv_col_descs), K(mv_rowkey_cnt));
}
return ret;
}
int ObStorageDatumUtils::init(const common::ObIArray<share::schema::ObColDesc> &col_descs,
const int64_t schema_rowkey_cnt,
const bool is_oracle_mode,
const int64_t arr_buf_len,
char *arr_buf)
{
int ret = OB_SUCCESS;
ObSEArray<share::schema::ObColDesc, 32> mv_col_descs;
int64_t pos = 0;
int64_t mv_rowkey_cnt = 0;
if (IS_INIT) {
ret = OB_INIT_TWICE;
STORAGE_LOG(WARN, "ObStorageDatumUtils init twice", K(ret), K(*this));
} else if (OB_UNLIKELY(schema_rowkey_cnt < 0 || schema_rowkey_cnt > OB_MAX_ROWKEY_COLUMN_NUMBER
|| schema_rowkey_cnt > col_descs.count())) {
ret = OB_INVALID_ARGUMENT;
STORAGE_LOG(WARN, "Invalid argument to init storage datum utils", K(ret), K(col_descs), K(schema_rowkey_cnt));
} else if (OB_FAIL(transform_multi_version_col_desc(col_descs, schema_rowkey_cnt, mv_col_descs))) {
STORAGE_LOG(WARN, "Failed to transform multi version col descs", K(ret));
} else if (FALSE_IT(mv_rowkey_cnt = schema_rowkey_cnt + storage::ObMultiVersionRowkeyHelpper::get_extra_rowkey_col_cnt())) {
} else if (OB_FAIL(cmp_funcs_.init(mv_rowkey_cnt, arr_buf_len, arr_buf, pos))) {
STORAGE_LOG(WARN, "Failed to init compare function array", K(ret));
} else if (OB_FAIL(hash_funcs_.init(mv_rowkey_cnt, arr_buf_len, arr_buf, pos))) {
STORAGE_LOG(WARN, "Failed to init hash function array", K(ret));
} else if (OB_FAIL(inner_init(mv_col_descs, mv_rowkey_cnt, is_oracle_mode))) {
STORAGE_LOG(WARN, "Failed to inner init datum utils", K(ret), K(mv_col_descs), K(mv_rowkey_cnt));
}
return ret;
}
int ObStorageDatumUtils::inner_init(
const common::ObIArray<share::schema::ObColDesc> &mv_col_descs,
const int64_t mv_rowkey_col_cnt,
const bool is_oracle_mode)
{
int ret = OB_SUCCESS;
is_oracle_mode_ = is_oracle_mode;
// support column order index until next task done
//
// we could use the cmp funcs in the basic funcs directlly
bool is_null_last = is_oracle_mode_;
ObCmpFunc cmp_func;
ObHashFunc hash_func;
for (int64_t i = 0; OB_SUCC(ret) && i < mv_rowkey_col_cnt; i++) {
const share::schema::ObColDesc &col_desc = mv_col_descs.at(i);
//TODO @hanhui support desc rowkey
bool is_ascending = true || col_desc.col_order_ == ObOrderType::ASC;
bool has_lob_header = is_lob_storage(col_desc.col_type_.get_type());
ObPrecision precision = PRECISION_UNKNOWN_YET;
if (col_desc.col_type_.is_decimal_int()) {
precision = col_desc.col_type_.get_stored_precision();
OB_ASSERT(precision != PRECISION_UNKNOWN_YET);
}
sql::ObExprBasicFuncs *basic_funcs = ObDatumFuncs::get_basic_func(col_desc.col_type_.get_type(),
col_desc.col_type_.get_collation_type(),
col_desc.col_type_.get_scale(),
is_oracle_mode,
has_lob_header,
precision);
if (OB_UNLIKELY(nullptr == basic_funcs
|| nullptr == basic_funcs->null_last_cmp_
|| nullptr == basic_funcs->murmur_hash_)) {
ret = OB_ERR_SYS;
STORAGE_LOG(ERROR, "Unexpected null basic funcs", K(ret), K(col_desc));
} else {
cmp_func.cmp_func_ = is_null_last ? basic_funcs->null_last_cmp_ : basic_funcs->null_first_cmp_;
hash_func.hash_func_ = basic_funcs->murmur_hash_;
if (OB_FAIL(hash_funcs_.push_back(hash_func))) {
STORAGE_LOG(WARN, "Failed to push back hash func", K(ret), K(i), K(col_desc));
} else if (is_ascending) {
if (OB_FAIL(cmp_funcs_.push_back(ObStorageDatumCmpFunc(cmp_func)))) {
STORAGE_LOG(WARN, "Failed to push back cmp func", K(ret), K(i), K(col_desc));
}
} else {
ret = OB_ERR_SYS;
STORAGE_LOG(WARN, "Unsupported desc column order", K(ret), K(col_desc), K(i));
}
}
}
if (OB_SUCC(ret)) {
sql::ObExprBasicFuncs *basic_funcs = ObDatumFuncs::get_basic_func(ObExtendType, CS_TYPE_BINARY);
if (OB_UNLIKELY(nullptr == basic_funcs || nullptr == basic_funcs->murmur_hash_)) {
ret = OB_ERR_SYS;
STORAGE_LOG(ERROR, "Unexpected null basic funcs for extend type", K(ret));
} else {
ext_hash_func_.hash_func_ = basic_funcs->murmur_hash_;
rowkey_cnt_ = mv_rowkey_col_cnt;
is_inited_ = true;
}
}
return ret;
}
int ObStorageDatumUtils::assign(const ObStorageDatumUtils &other_utils, ObIAllocator &allocator)
{
int ret = OB_SUCCESS;
if (OB_UNLIKELY(!other_utils.is_valid())) {
ret = OB_INVALID_ARGUMENT;
STORAGE_LOG(WARN, "Invalid argument to assign datum utils", K(ret), K(other_utils));
} else {
rowkey_cnt_ = other_utils.get_rowkey_count();
is_oracle_mode_ = other_utils.is_oracle_mode();
ext_hash_func_ = other_utils.get_ext_hash_funcs();
if (OB_FAIL(cmp_funcs_.init_and_assign(other_utils.get_cmp_funcs(), allocator))) {
STORAGE_LOG(WARN, "Failed to assign cmp func array", K(ret));
} else if (OB_FAIL(hash_funcs_.init_and_assign(other_utils.get_hash_funcs(), allocator))) {
STORAGE_LOG(WARN, "Failed to assign hash func array", K(ret));
} else {
is_inited_ = true;
}
}
return ret;
}
void ObStorageDatumUtils::reset()
{
rowkey_cnt_ = 0;
cmp_funcs_.reset();
hash_funcs_.reset();
ext_hash_func_.hash_func_ = nullptr;
is_inited_ = false;
}
int64_t ObStorageDatumUtils::get_deep_copy_size() const
{
return cmp_funcs_.get_deep_copy_size() + hash_funcs_.get_deep_copy_size();
}
int ObGhostRowUtil::is_ghost_row(
const blocksstable::ObMultiVersionRowFlag &flag,
bool &is_ghost_row)

View File

@ -21,6 +21,7 @@
#include "storage/tx/ob_trans_define.h"
#include "common/row/ob_row.h"
#include "storage/ob_storage_util.h"
#include "storage/blocksstable/ob_datum_rowkey.h"
namespace oceanbase
{
@ -38,6 +39,7 @@ namespace blocksstable
{
struct ObDmlRowFlag;
struct ObDatumRowkey;
enum ObDmlFlag
{
@ -307,65 +309,6 @@ public:
K_(flag));
};
//TODO optimize number buffer
struct ObStorageDatum : public common::ObDatum
{
ObStorageDatum() { set_nop(); }
ObStorageDatum(const ObStorageDatum &datum) { reuse(); *this = datum; }
~ObStorageDatum() = default;
// ext value section
OB_INLINE void reuse() { ptr_ = buf_; reserved_ = 0; pack_ = 0; }
OB_INLINE void set_ext_value(const int64_t ext_value)
{ reuse(); set_ext(); no_cv(extend_obj_)->set_ext(ext_value); }
OB_INLINE void set_nop() { set_ext_value(ObActionFlag::OP_NOP); }
OB_INLINE void set_min() { set_ext_value(common::ObObj::MIN_OBJECT_VALUE); }
OB_INLINE void set_max() { set_ext_value(common::ObObj::MAX_OBJECT_VALUE); }
OB_INLINE bool is_nop_value() const { return is_nop(); } // temp solution
// transfer section
OB_INLINE bool is_local_buf() const { return ptr_ == buf_; }
OB_INLINE int from_buf_enhance(const char *buf, const int64_t buf_len);
OB_INLINE int from_obj_enhance(const common::ObObj &obj);
OB_INLINE int to_obj_enhance(common::ObObj &obj, const common::ObObjMeta &meta) const;
OB_INLINE int deep_copy(const ObStorageDatum &src, common::ObIAllocator &allocator);
OB_INLINE int deep_copy(const ObStorageDatum &src, char * buf, const int64_t buf_len, int64_t &pos);
OB_INLINE void shallow_copy_from_datum(const ObDatum &src);
OB_INLINE int64_t get_deep_copy_size() const;
OB_INLINE ObStorageDatum& operator=(const ObStorageDatum &other);
OB_INLINE int64_t storage_to_string(char *buf, int64_t buf_len, const bool for_dump = false) const;
OB_INLINE bool need_copy_for_encoding_column_with_flat_format(const ObObjDatumMapType map_type) const;
OB_INLINE const char *to_cstring(const bool for_dump = false) const;
//only for unittest
OB_INLINE bool operator==(const ObStorageDatum &other) const;
OB_INLINE bool operator==(const ObObj &other) const;
//datum 12 byte
int32_t reserved_;
// buf 16 byte
char buf_[common::OBJ_DATUM_NUMBER_RES_SIZE];
};
struct ObStorageDatumBuffer
{
public:
ObStorageDatumBuffer(common::ObIAllocator *allocator = nullptr);
~ObStorageDatumBuffer();
void reset();
int init(common::ObIAllocator &allocator);
int reserve(const int64_t count, const bool keep_data = false);
OB_INLINE bool is_valid() const { return is_inited_; }
OB_INLINE ObStorageDatum *get_datums() { return datums_; }
OB_INLINE int64_t get_capacity() const { return capacity_; }
TO_STRING_KV(K_(capacity), KP_(datums), KP_(local_datums));
private:
static const int64_t LOCAL_BUFFER_ARRAY = common::OB_ROW_DEFAULT_COLUMNS_COUNT;
int64_t capacity_;
ObStorageDatum local_datums_[LOCAL_BUFFER_ARRAY];
ObStorageDatum *datums_;
common::ObIAllocator *allocator_;
bool is_inited_;
};
struct ObDatumRow
{
OB_UNIS_VERSION(1);
@ -379,6 +322,7 @@ public:
int reserve(const int64_t capacity, const bool keep_data = false);
int deep_copy(const ObDatumRow &src, common::ObIAllocator &allocator);
int from_store_row(const storage::ObStoreRow &store_row);
int shallow_copy(const ObDatumRow &other);
//only for unittest
bool operator==(const ObDatumRow &other) const;
bool operator==(const common::ObNewRow &other) const;
@ -487,333 +431,6 @@ public:
int64_t datum_row_offset_;
};
struct ObStorageDatumCmpFunc
{
public:
ObStorageDatumCmpFunc(common::ObCmpFunc &cmp_func) : cmp_func_(cmp_func) {}
ObStorageDatumCmpFunc() = default;
~ObStorageDatumCmpFunc() = default;
int compare(const ObStorageDatum &left, const ObStorageDatum &right, int &cmp_ret) const;
OB_INLINE const common::ObCmpFunc &get_cmp_func() const { return cmp_func_; }
TO_STRING_KV(K_(cmp_func));
private:
common::ObCmpFunc cmp_func_;
};
typedef storage::ObFixedMetaObjArray<ObStorageDatumCmpFunc> ObStoreCmpFuncs;
typedef storage::ObFixedMetaObjArray<common::ObHashFunc> ObStoreHashFuncs;
struct ObStorageDatumUtils
{
public:
ObStorageDatumUtils();
~ObStorageDatumUtils();
// init with array memory from allocator
int init(const common::ObIArray<share::schema::ObColDesc> &col_descs,
const int64_t schema_rowkey_cnt,
const bool is_oracle_mode,
common::ObIAllocator &allocator,
const bool is_column_store = false);
// init with array memory on fixed size memory buffer
int init(const common::ObIArray<share::schema::ObColDesc> &col_descs,
const int64_t schema_rowkey_cnt,
const bool is_oracle_mode,
const int64_t arr_buf_len,
char *arr_buf);
int assign(const ObStorageDatumUtils &other_utils, common::ObIAllocator &allocator);
void reset();
OB_INLINE bool is_valid() const
{
return is_inited_ && cmp_funcs_.count() >= rowkey_cnt_ && hash_funcs_.count() >= rowkey_cnt_;
}
OB_INLINE bool is_oracle_mode() const { return is_oracle_mode_; }
OB_INLINE int64_t get_rowkey_count() const { return rowkey_cnt_; }
OB_INLINE const ObStoreCmpFuncs &get_cmp_funcs() const { return cmp_funcs_; }
OB_INLINE const ObStoreHashFuncs &get_hash_funcs() const { return hash_funcs_; }
OB_INLINE const common::ObHashFunc &get_ext_hash_funcs() const { return ext_hash_func_; }
int64_t get_deep_copy_size() const;
TO_STRING_KV(K_(is_oracle_mode), K_(rowkey_cnt), K_(is_inited), K_(is_oracle_mode));
private:
//TODO to be removed by @hanhui
int transform_multi_version_col_desc(const common::ObIArray<share::schema::ObColDesc> &col_descs,
const int64_t schema_rowkey_cnt,
common::ObIArray<share::schema::ObColDesc> &mv_col_descs);
int inner_init(
const common::ObIArray<share::schema::ObColDesc> &mv_col_descs,
const int64_t mv_rowkey_col_cnt,
const bool is_oracle_mode);
private:
int32_t rowkey_cnt_; // multi version rowkey
ObStoreCmpFuncs cmp_funcs_; // multi version rowkey cmp funcs
ObStoreHashFuncs hash_funcs_; // multi version rowkey cmp funcs
common::ObHashFunc ext_hash_func_;
bool is_oracle_mode_;
bool is_inited_;
DISALLOW_COPY_AND_ASSIGN(ObStorageDatumUtils);
};
OB_INLINE int ObStorageDatum::deep_copy(const ObStorageDatum &src, common::ObIAllocator &allocator)
{
int ret = common::OB_SUCCESS;
reuse();
pack_ = src.pack_;
if (is_null()) {
} else if (src.len_ == 0) {
} else if (src.is_local_buf()) {
OB_ASSERT(src.len_ <= common::OBJ_DATUM_NUMBER_RES_SIZE);
MEMCPY(buf_, src.ptr_, src.len_);
ptr_ = buf_;
} else {
char * buf = static_cast<char *>(allocator.alloc(src.len_));
if (OB_ISNULL(buf)) {
ret = OB_ALLOCATE_MEMORY_FAILED;
COMMON_LOG(WARN, "allocate memory failed", K(ret), K(src));
pack_ = 0;
} else {
MEMCPY(buf, src.ptr_, src.len_);
// need set ptr_ after memory copy, if this == &src
ptr_ = buf;
}
}
return ret;
}
OB_INLINE int ObStorageDatum::deep_copy(const ObStorageDatum &src, char * buf, const int64_t buf_len, int64_t &pos)
{
int ret = common::OB_SUCCESS;
reuse();
pack_ = src.pack_;
if (is_null()) {
} else if (src.len_ == 0) {
} else if (src.is_local_buf()) {
OB_ASSERT(src.len_ <= common::OBJ_DATUM_NUMBER_RES_SIZE);
MEMCPY(buf_, src.ptr_, src.len_);
ptr_ = buf_;
} else if (OB_UNLIKELY(nullptr == buf || buf_len < pos + src.len_)) {
ret = OB_INVALID_ARGUMENT;
STORAGE_LOG(WARN, "Invalid argument to deep copy datum", K(ret), K(src), KP(buf), K(buf_len), K(pos));
pack_ = 0;
} else {
MEMCPY(buf + pos, src.ptr_, src.len_);
// need set ptr_ after memory copy, if this == &src
ptr_ = buf + pos;
pos += src.len_;
}
return ret;
}
OB_INLINE void ObStorageDatum::shallow_copy_from_datum(const ObDatum &src)
{
if (this != &src) {
reuse();
pack_ = src.pack_;
if (is_null()) {
} else if (src.len_ == 0) {
} else {
ptr_ = src.ptr_;
}
}
}
OB_INLINE int64_t ObStorageDatum::get_deep_copy_size() const
{
int64_t deep_copy_len = 0;
if (is_null()) {
} else if (is_local_buf()) {
OB_ASSERT(len_ <= common::OBJ_DATUM_NUMBER_RES_SIZE);
} else {
deep_copy_len = len_;
}
return deep_copy_len;
}
OB_INLINE int ObStorageDatum::from_buf_enhance(const char *buf, const int64_t buf_len)
{
int ret = common::OB_SUCCESS;
if (OB_UNLIKELY(nullptr == buf || buf_len < 0 || buf_len > UINT32_MAX)) {
ret = OB_INVALID_ARGUMENT;
STORAGE_LOG(WARN, "Invalid argument to transfer from buf", K(ret), KP(buf), K(buf_len));
} else {
reuse();
len_ = static_cast<uint32_t>(buf_len);
if (buf_len > 0) {
ptr_ = buf;
}
}
return ret;
}
OB_INLINE int ObStorageDatum::from_obj_enhance(const common::ObObj &obj)
{
int ret = common::OB_SUCCESS;
reuse();
if (obj.is_ext()) {
set_ext_value(obj.get_ext());
} else if (OB_FAIL(from_obj(obj))) {
STORAGE_LOG(WARN, "Failed to transfer obj to datum", K(ret), K(obj));
}
STORAGE_LOG(DEBUG, "chaser debug from obj", K(obj), K(*this));
return ret;
}
OB_INLINE int ObStorageDatum::to_obj_enhance(common::ObObj &obj, const common::ObObjMeta &meta) const
{
int ret = common::OB_SUCCESS;
if (is_outrow()) {
ret = OB_ERR_UNEXPECTED;
STORAGE_LOG(WARN, "lob should not set outrow in datum", K(ret), K(*this), K(obj), K(meta));
} else if (is_ext()) {
obj.set_ext(get_ext());
} else if (OB_FAIL(to_obj(obj, meta))) {
STORAGE_LOG(WARN, "Failed to transfer datum to obj", K(ret), K(*this), K(obj), K(meta));
}
return ret;
}
OB_INLINE ObStorageDatum& ObStorageDatum::operator=(const ObStorageDatum &other)
{
if (&other != this) {
reuse();
pack_ = other.pack_;
if (is_null()) {
} else if (len_ == 0) {
} else if (other.is_local_buf()) {
OB_ASSERT(other.len_ <= common::OBJ_DATUM_NUMBER_RES_SIZE);
MEMCPY(buf_, other.ptr_, other.len_);
ptr_ = buf_;
} else {
ptr_ = other.ptr_;
}
}
return *this;
}
OB_INLINE bool ObStorageDatum::operator==(const ObStorageDatum &other) const
{
bool bret = true;
if (is_null()) {
bret = other.is_null();
} else if (is_ext()) {
bret = other.is_ext() && extend_obj_->get_ext() == other.extend_obj_->get_ext();
} else {
bret = ObDatum::binary_equal(*this, other);
}
if (!bret) {
STORAGE_LOG(DEBUG, "obj and datum no equal", K(other), K(*this));
}
return bret;
}
OB_INLINE bool ObStorageDatum::operator==(const common::ObObj &other) const
{
int ret = OB_SUCCESS;
bool bret = true;
ObStorageDatum datum;
if (OB_FAIL(datum.from_obj_enhance(other))) {
STORAGE_LOG(WARN, "Failed to transfer obj to datum", K(ret), K(other), K(datum));
} else {
bret = *this == datum;
}
if (!bret) {
STORAGE_LOG(DEBUG, "obj and datum no equal", K(other), K(datum), KPC(this));
}
return bret;
}
OB_INLINE int64_t ObStorageDatum::storage_to_string(char *buf, int64_t buf_len, const bool for_dump) const
{
int64_t pos = 0;
if (is_ext()) {
if (is_nop()) {
J_NOP();
} else if (is_max()) {
BUF_PRINTF("MAX_OBJ");
} else if (is_min()) {
BUF_PRINTF("MIN_OBJ");
}
} else if(!for_dump) {
pos = to_string(buf, buf_len);
} else {
int ret = OB_SUCCESS;
const static int64_t STR_MAX_PRINT_LEN = 128L;
if (null_) {
J_NULL();
} else {
J_OBJ_START();
BUF_PRINTF("len: %d, flag: %d, null: %d", len_, flag_, null_);
if (len_ > 0) {
OB_ASSERT(NULL != ptr_);
const int64_t plen = std::min(static_cast<int64_t>(len_),
static_cast<int64_t>(STR_MAX_PRINT_LEN));
// print hex value
BUF_PRINTF(", hex: ");
if (OB_FAIL(hex_print(ptr_, plen, buf, buf_len, pos))) {
// no logging in to_string function.
} else {
// maybe ObIntTC
if (sizeof(int64_t) == len_) {
BUF_PRINTF(", int: %ld", *int_);
// maybe number with one digit
if (1 == num_->desc_.len_) {
BUF_PRINTF(", num_digit0: %u", num_->digits_[0]);
}
}
// maybe printable C string
int64_t idx = 0;
while (idx < plen && isprint(ptr_[idx])) {
idx++;
}
if (idx >= plen) {
BUF_PRINTF(", cstr: %.*s", static_cast<int>(plen), ptr_);
}
}
}
J_OBJ_END();
}
}
return pos;
}
OB_INLINE const char *ObStorageDatum::to_cstring(const bool for_dump) const
{
char *buffer = NULL;
int64_t str_len = 0;
CStringBufMgr &mgr = CStringBufMgr::get_thread_local_instance();
mgr.inc_level();
const int64_t buf_len = mgr.acquire(buffer);
if (OB_ISNULL(buffer)) {
LIB_LOG_RET(ERROR, OB_ALLOCATE_MEMORY_FAILED, "buffer is NULL");
} else {
str_len = storage_to_string(buffer, buf_len -1, for_dump);
if (str_len >= 0 && str_len < buf_len) {
buffer[str_len] = '\0';
} else {
buffer[0] = '\0';
}
mgr.update_position(str_len + 1);
}
mgr.try_clear_list();
mgr.dec_level();
return buffer;
}
OB_INLINE bool ObStorageDatum::need_copy_for_encoding_column_with_flat_format(const ObObjDatumMapType map_type) const
{
return OBJ_DATUM_STRING == map_type && sizeof(uint64_t) == len_ && is_local_buf();
}
struct ObGhostRowUtil {
public:
ObGhostRowUtil() = delete;

View File

@ -0,0 +1,98 @@
/**
* Copyright (c) 2024 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.
*/
#ifndef OCEANBASE_DATUM_ROW_ITERATOR_
#define OCEANBASE_DATUM_ROW_ITERATOR_
#include "src/storage/blocksstable/ob_datum_row.h"
namespace oceanbase
{
namespace blocksstable
{
class ObDatumRowIterator
{
public:
typedef common::ObReserveArenaAllocator<1024> ObStorageReserveAllocator;
public:
ObDatumRowIterator() {}
virtual ~ObDatumRowIterator() {}
/**
* get the next datum row and move the cursor
*
* @param row [out]
*
* @return OB_ITER_END if end of iteration
*/
virtual int get_next_row(ObDatumRow *&row) = 0;
virtual int get_next_rows(ObDatumRow *&rows, int64_t &row_count)
{
int ret = OB_SUCCESS;
if (OB_FAIL(get_next_row(rows))) {
} else {
row_count = 1;
}
return ret;
}
virtual void reset() {}
TO_STRING_EMPTY();
};
/// wrap one datum row as an iterator
class ObSingleDatumRowIteratorWrapper: public ObDatumRowIterator
{
public:
ObSingleDatumRowIteratorWrapper();
ObSingleDatumRowIteratorWrapper(ObDatumRow *row);
virtual ~ObSingleDatumRowIteratorWrapper() {}
void set_row(ObDatumRow *row) { row_ = row; }
virtual int get_next_row(ObDatumRow *&row);
virtual void reset() { iter_end_ = false; }
private:
// disallow copy
DISALLOW_COPY_AND_ASSIGN(ObSingleDatumRowIteratorWrapper);
private:
// data members
ObDatumRow *row_;
bool iter_end_;
};
inline ObSingleDatumRowIteratorWrapper::ObSingleDatumRowIteratorWrapper()
:row_(NULL),
iter_end_(false)
{}
inline ObSingleDatumRowIteratorWrapper::ObSingleDatumRowIteratorWrapper(ObDatumRow *row)
:row_(row),
iter_end_(false)
{}
inline int ObSingleDatumRowIteratorWrapper::get_next_row(ObDatumRow *&row)
{
int ret = OB_SUCCESS;
if (OB_ISNULL(row_)) {
ret = OB_NOT_INIT;
} else if (iter_end_) {
ret = OB_ITER_END;
} else {
row = row_;
iter_end_ = true;
}
return ret;
}
}
}
#endif //OCEANBASE_DATUM_ROW_ITERATOR_

View File

@ -0,0 +1,242 @@
/**
* Copyright (c) 2024 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 COMMON
#include "ob_datum_row_store.h"
#include "lib/utility/utility.h"
namespace oceanbase
{
namespace blocksstable
{
////////////////////////////////////////////////////////////////
struct ObDatumRowStore::BlockInfo
{
explicit BlockInfo(int64_t block_size)
:magic_(0xabcd4444abcd4444),
next_(NULL),
curr_data_pos_(0),
block_size_(block_size)
{
}
OB_INLINE int64_t get_remain_size() const { return block_size_ - curr_data_pos_; }
OB_INLINE int64_t get_remain_size_for_read(int64_t pos) const { return curr_data_pos_ - pos; }
OB_INLINE char *get_buffer() { return data_ + curr_data_pos_; }
OB_INLINE const char *get_buffer_head() const { return data_; }
OB_INLINE void advance(const int64_t length) { curr_data_pos_ += length; }
OB_INLINE BlockInfo *get_next_block() { return next_; }
OB_INLINE const BlockInfo *get_next_block() const { return next_; }
OB_INLINE int64_t get_block_size() const { return block_size_; };
int append_row(const ObDatumRow &row, const int64_t length);
friend class ObDatumRowStore::BlockList;
private:
#ifdef __clang__
int64_t magic_ [[gnu::unused]];
#else
int64_t magic_;
#endif
BlockInfo *next_;
/**
* cur_data_pos_ must be set when BlockInfo deserialized
*/
int64_t curr_data_pos_;
int64_t block_size_;
char data_[0];
};
int ObDatumRowStore::BlockInfo::append_row(const ObDatumRow &row, const int64_t length)
{
int ret = OB_SUCCESS;
int64_t pos = 0;
if (OB_UNLIKELY(0 > curr_data_pos_)) {
ret = OB_ERR_UNEXPECTED;
STORAGE_LOG(WARN, "out of memory range",
K(ret), K_(block_size), K_(curr_data_pos), K(length));
} else if (OB_FAIL(row.serialize(get_buffer(), get_remain_size(), pos))) {
STORAGE_LOG(WARN, "fail to serialize datum row", K(ret), K(row));
} else {
advance(pos);
}
return ret;
}
////////////////////////////////////////////////////////////////
ObDatumRowStore::BlockList::BlockList()
:first_(NULL),
last_(NULL),
count_(0),
used_mem_size_(0)
{
};
void ObDatumRowStore::BlockList::reset()
{
first_ = NULL;
last_ = NULL;
count_ = 0;
used_mem_size_ = 0;
}
int ObDatumRowStore::BlockList::add_last(BlockInfo *block)
{
int ret = OB_SUCCESS;
if (OB_ISNULL(block)) {
ret = OB_INVALID_ARGUMENT;
STORAGE_LOG(WARN, "invalid argument", K(ret), K(block));
} else {
block->next_ = NULL;
if (OB_ISNULL(last_)) {
if (OB_ISNULL(first_)) {
first_ = block;
last_ = block;
} else {
ret = OB_ERR_UNEXPECTED;
STORAGE_LOG(WARN, "invalid block list", K(ret), K_(last), K_(first));
}
} else {
last_->next_ = block;
last_ = block;
}
}
if (OB_SUCC(ret)) {
used_mem_size_ += block->get_block_size();
++count_;
}
return ret;
}
////////////////////////////////////////////////////////////////
ObDatumRowStore::Iterator::Iterator(const ObDatumRowStore &row_store)
: row_store_(row_store),
cur_iter_block_(row_store_.blocks_.get_first()),
cur_iter_pos_(0)
{
}
int ObDatumRowStore::Iterator::get_next_row(ObDatumRow &row)
{
int ret = OB_SUCCESS;
int64_t pos = 0;
if (OB_UNLIKELY(row.count_ < row_store_.get_col_count())) {
ret = OB_ERR_UNEXPECTED;
STORAGE_LOG(WARN, "column buffer count is not enough", K(ret), K_(row.count), K(row_store_.get_col_count()));
} else if (OB_ISNULL(cur_iter_block_)) {
// the last block
ret = OB_ITER_END;
} else if (OB_FAIL(row.deserialize(cur_iter_block_->get_buffer_head() + cur_iter_pos_, cur_iter_block_->get_remain_size_for_read(cur_iter_pos_), pos))) {
STORAGE_LOG(WARN, "failed to deserialize datum row", K(ret), K(cur_iter_block_->get_block_size()), K(cur_iter_pos_),
K(row.get_serialize_size()), K(pos), K(row));
} else {
// next
cur_iter_pos_ += pos;
// update current block when current block reach its end
if (cur_iter_block_->get_remain_size_for_read(cur_iter_pos_) <= 0) {
// next block
cur_iter_block_ = cur_iter_block_->get_next_block();
cur_iter_pos_ = 0;
}
} // end else
return ret;
}
////////////////////////////////////////////////////////////////
ObDatumRowStore::ObDatumRowStore()
: inner_alloc_("DatumRowStore", MTL_ID()),
blocks_(),
row_count_(0),
col_count_(0)
{
}
ObDatumRowStore::~ObDatumRowStore()
{
clear_rows();
}
// method for ObAggregateFunction::prepare()
// prepare need to reuse ObDatumRowStore for WRITE,
// it needs to reuse reserved_columns_ which should not be cleared
void ObDatumRowStore::clear_rows()
{
row_count_ = 0;
col_count_ = 0;
// free all blocks
BlockInfo *block = blocks_.get_first();
while (NULL != block) {
BlockInfo *next = block->get_next_block();
block->~BlockInfo();
inner_alloc_.free(block);
block = next;
}
blocks_.reset();
}
int ObDatumRowStore::new_block(int64_t block_size, ObDatumRowStore::BlockInfo *&block)
{
int ret = OB_SUCCESS;
// normalize block size
if (block_size > BIG_BLOCK_SIZE) {
block_size = OB_MAX_ROW_LENGTH_IN_MEMTABLE;
} else if (block_size > NORMAL_BLOCK_SIZE) {
block_size = BIG_BLOCK_SIZE;
} else {
block_size = NORMAL_BLOCK_SIZE;
}
// make sure all memory allocated under the right tenant
block = static_cast<BlockInfo *>(inner_alloc_.alloc(block_size));
if (OB_ISNULL(block)) {
ret = OB_ALLOCATE_MEMORY_FAILED;
STORAGE_LOG(WARN, "failed to alloc block memory", K(ret), K(block_size + sizeof(BlockInfo)));
} else {
block = new(block) BlockInfo(block_size - sizeof(BlockInfo));
if (OB_FAIL(blocks_.add_last(block))) {
STORAGE_LOG(WARN, "failed to add a new block to block list", K(ret));
}
}
return ret;
}
int ObDatumRowStore::add_row(const ObDatumRow &row)
{
int ret = OB_SUCCESS;
if (OB_UNLIKELY(0 < col_count_) && OB_UNLIKELY(row.count_ != col_count_)) {
ret = OB_INVALID_ARGUMENT;
STORAGE_LOG(WARN, "all rows should have the same columns", K(col_count_), K(row.count_));
} else {
int64_t length = row.get_serialize_size();
BlockInfo *block = blocks_.get_last();
if (OB_ISNULL(block) || block->get_remain_size() < length) {
if (OB_FAIL(new_block(length, block))) {
STORAGE_LOG(WARN, "failed to new block", K(ret), K(length));
}
}
if (OB_SUCC(ret)) {
if (OB_FAIL(block->append_row(row, length))) {
STORAGE_LOG(WARN, "failed to append row", K(ret), K(row));
} else {
++row_count_;
}
}
}
return ret;
}
ObDatumRowStore::Iterator ObDatumRowStore::begin() const
{
return Iterator(*this);
}
} //end common
} //end oceanbase

View File

@ -0,0 +1,92 @@
/**
* Copyright (c) 2024 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.
*/
#ifndef OCEANBASE_COMMON_OB_DATUM_ROW_STORE_H
#define OCEANBASE_COMMON_OB_DATUM_ROW_STORE_H
#include <stdint.h>
#include <utility>
#include "common/row/ob_row.h"
#include "common/row/ob_row_iterator.h"
#include "lib/container/ob_fixed_array.h"
#include "lib/string/ob_string.h"
#include "ob_datum_row.h"
#include "storage/ob_i_store.h"
namespace oceanbase
{
namespace blocksstable
{
class ObDatumRowStore
{
public:
struct BlockInfo;
class Iterator
{
public:
friend class ObDatumRowStore;
int get_next_row(ObDatumRow &row);
private:
explicit Iterator(const ObDatumRowStore &row_store);
protected:
const ObDatumRowStore &row_store_;
const BlockInfo *cur_iter_block_;
int64_t cur_iter_pos_;
};
public:
ObDatumRowStore();
~ObDatumRowStore();
void clear_rows();
int add_row(const ObDatumRow &row);
inline int64_t get_row_count() const { return row_count_; }
inline int64_t get_col_count() const { return col_count_; }
Iterator begin() const;
TO_STRING_KV(N_BLOCK_NUM, blocks_.get_block_count(),
N_ROW_COUNT, row_count_,
N_COLUMN_COUNT, col_count_);
private:
DISALLOW_COPY_AND_ASSIGN(ObDatumRowStore);
static const int64_t BIG_BLOCK_SIZE = OB_MALLOC_BIG_BLOCK_SIZE;
static const int64_t NORMAL_BLOCK_SIZE = OB_MALLOC_NORMAL_BLOCK_SIZE;
// non-circular doubly linked list
class BlockList
{
public:
BlockList();
void reset();
int add_last(BlockInfo *block);
BlockInfo *get_first() { return first_; }
BlockInfo *get_last() { return last_; }
const BlockInfo *get_first() const { return first_; }
const BlockInfo *get_last() const { return last_; }
int64_t get_block_count() const { return count_; }
int64_t get_used_mem_size() const { return used_mem_size_; }
private:
BlockInfo *first_;
BlockInfo *last_;
int64_t count_;
int64_t used_mem_size_; // bytes of all blocks
};
private:
int new_block(int64_t block_size, BlockInfo *&block);
private:
DefaultPageAllocator inner_alloc_;
BlockList blocks_;
int64_t row_count_;
int64_t col_count_;
};
} // end namespace common
} // end namespace oceanbase
#endif /* OCEANBASE_COMMON_OB_DATUM_ROW_STORE_H */

View File

@ -0,0 +1,97 @@
/**
* Copyright (c) 2024 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 STORAGE
#include "ob_datum_row_utils.h"
namespace oceanbase
{
namespace blocksstable
{
int ObDatumRowUtils::ob_create_row(ObIAllocator &allocator, int64_t col_count, ObDatumRow *&datum_row)
{
int ret = OB_SUCCESS;
if (OB_UNLIKELY(col_count <= 0)) {
ret = OB_INVALID_ARGUMENT;
LOG_WARN("row_count is invalid", K(ret), K(col_count));
} else {
void *row_buf = NULL;
if (OB_ISNULL(row_buf = allocator.alloc(sizeof(blocksstable::ObDatumRow)))) {
ret = OB_ALLOCATE_MEMORY_FAILED;
LOG_WARN("allocate row buffer failed", K(ret), K(sizeof(blocksstable::ObDatumRow)));
} else if (FALSE_IT(datum_row = new(row_buf) blocksstable::ObDatumRow())) {
} else if (OB_FAIL(datum_row->init(allocator, col_count))) {
LOG_WARN("fail to init datum row", K(ret), K(col_count));
}
if (OB_FAIL(ret) && nullptr != datum_row) {
datum_row->~ObDatumRow();
datum_row = nullptr;
allocator.free(row_buf);
}
}
return ret;
}
int ObDatumRowUtils::ob_create_rows(ObIAllocator &allocator, int64_t row_count, int64_t col_count, ObDatumRow *&datum_rows)
{
int ret = OB_SUCCESS;
if (OB_UNLIKELY(col_count <= 0 || row_count <= 0)) {
ret = OB_INVALID_ARGUMENT;
LOG_WARN("col count or row count is invalid", K(ret), K(col_count), K(row_count));
} else {
void *rows_buf = nullptr;
const size_t rows_buf_len = sizeof(blocksstable::ObDatumRow) * row_count;
if (OB_ISNULL(rows_buf = allocator.alloc(rows_buf_len))) {
ret = OB_ALLOCATE_MEMORY_FAILED;
LOG_WARN("Failed to allocate row buffer", K(ret), K(rows_buf_len));
} else {
char *row_buf = static_cast<char*>(rows_buf);
datum_rows = new(row_buf) blocksstable::ObDatumRow[row_count]();
int64_t i = 0;
for (; OB_SUCC(ret) && i < row_count; ++i) {
if (OB_FAIL(datum_rows[i].init(allocator, col_count))) {
LOG_WARN("fail to init datum row", K(ret), K(col_count), K(datum_rows[i]));
}
}
if (OB_FAIL(ret)) {
// release storage_datums
for (int64_t j = i; j >= 0; --j) {
datum_rows[j].~ObDatumRow();
}
allocator.free(rows_buf);
}
}
}
return ret;
}
int ObDatumRowUtils::prepare_rowkey(
const ObDatumRow &datum_row,
const int key_datum_cnt,
const ObColDescIArray &col_descs,
common::ObIAllocator &allocator,
ObDatumRowkey &rowkey)
{
int ret = OB_SUCCESS;
if (!datum_row.is_valid()) {
ret = OB_INVALID_ARGUMENT;
LOG_WARN("get invalid datum row", K(ret), K(datum_row));
} else if (OB_FAIL(rowkey.assign(datum_row.storage_datums_, key_datum_cnt))) {
LOG_WARN("failed to assign datum rowkey", K(ret), K(datum_row), K(key_datum_cnt));
} else if (OB_FAIL(rowkey.prepare_memtable_readable(col_descs, allocator))) {
LOG_WARN("failed to prepare store rowkey to read memtable", K(ret), K(datum_row), K(rowkey));
}
return ret;
}
} // namespace sql
} // namespace oceanbase

View File

@ -0,0 +1,38 @@
/**
* Copyright (c) 2024 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.
*/
#ifndef DEV_SRC_STORAGE_BLOCKSSTABLE_OB_DATUM_ROW_UTILS_H_
#define DEV_SRC_STORAGE_BLOCKSSTABLE_OB_DATUM_ROW_UTILS_H_
#include "share/ob_define.h"
#include "ob_datum_row.h"
namespace oceanbase
{
namespace blocksstable
{
class ObDatumRowUtils
{
typedef common::ObIArray<share::schema::ObColDesc> ObColDescIArray;
public:
static int ob_create_row(ObIAllocator &allocator, int64_t col_count, ObDatumRow *&datum_row);
static int ob_create_rows(ObIAllocator &allocator, int64_t row_count, int64_t col_count, ObDatumRow *&datum_rows);
// TODO@xuanxi: rewrite it when store rowkey is no longer needed
static int prepare_rowkey(
const ObDatumRow &datum_row,
const int key_datum_cnt,
const ObColDescIArray &col_descs,
common::ObIAllocator &allocator,
ObDatumRowkey &rowkey);
};
} // namespace sql
} // namespace oceanbase
#endif /* DEV_SRC_STORAGE_BLOCKSSTABLE_OB_DATUM_ROW_UTILS_H_ */

View File

@ -616,6 +616,25 @@ int ObDatumRowkeyHelper::convert_store_rowkey(const ObDatumRowkey &datum_rowkey,
return ret;
}
int ObDatumRowkeyHelper::prepare_datum_rowkey(const ObDatumRow &datum_row,
const int key_datum_cnt,
const ObIArray<share::schema::ObColDesc> &col_descs,
ObDatumRowkey &datum_rowkey)
{
int ret = OB_SUCCESS;
if (!datum_row.is_valid() || col_descs.count() < datum_row.get_column_count()) {
ret = OB_INVALID_ARGUMENT;
STORAGE_LOG(WARN, "Get invalid datum row", K(ret), K(datum_row), K(col_descs));
} else if (OB_FAIL(datum_rowkey.assign(datum_row.storage_datums_, key_datum_cnt))) {
STORAGE_LOG(WARN, "Failed to assign datum rowkey", K(ret), K(datum_row), K(key_datum_cnt));
} else if (OB_FAIL(convert_store_rowkey(datum_rowkey, col_descs, datum_rowkey.store_rowkey_))) {
STORAGE_LOG(WARN, "Failed to convert store rowkeyy", K(ret), K(datum_rowkey));
}
return ret;
}
int ObDatumRowkeyHelper::reserve(const int64_t rowkey_cnt)
{

View File

@ -13,7 +13,7 @@
#ifndef OB_STORAGE_BLOCKSSTABLE_DATUM_ROWKEY_H
#define OB_STORAGE_BLOCKSSTABLE_DATUM_ROWKEY_H
#include "ob_datum_row.h"
#include "ob_storage_datum.h"
#include "lib/utility/ob_print_kv.h"
//to be removed
#include "common/rowkey/ob_store_rowkey.h"
@ -27,6 +27,7 @@ struct ObDatumRange;
class ObRowkeyVector;
struct ObDiscreteDatumRowkey;
struct ObCommonDatumRowkey;
struct ObDatumRow;
struct ObDatumRowkey
{
@ -123,6 +124,10 @@ public:
int convert_store_rowkey(const ObDatumRowkey &datum_rowkey,
const common::ObIArray<share::schema::ObColDesc> &col_descs,
common::ObStoreRowkey &rowkey);
int prepare_datum_rowkey(const ObDatumRow &datum_row,
const int key_datum_cnt,
const ObIArray<share::schema::ObColDesc> &col_descs,
ObDatumRowkey &datum_rowkey);
int reserve(const int64_t rowkey_cnt);
OB_INLINE ObStorageDatum *get_datums() { return datum_buffer_.get_datums(); }
OB_INLINE int64_t get_capacity() const { return datum_buffer_.get_capacity(); }

View File

@ -76,17 +76,16 @@ int ObRowWriter::init_common(char *buf, const int64_t buf_size, const int64_t po
}
int ObRowWriter::check_row_valid(
const ObStoreRow &row,
const ObDatumRow &row,
const int64_t rowkey_column_count)
{
int ret = OB_SUCCESS;
if (OB_UNLIKELY(!row.is_valid())) {
ret = OB_INVALID_ARGUMENT;
LOG_WARN("invalid row writer input argument", K(row), K(ret));
} else if (OB_UNLIKELY(rowkey_column_count <= 0 || rowkey_column_count > row.row_val_.count_)) {
LOG_WARN("invalid row writer input argument", K(ret), K(row));
} else if (OB_UNLIKELY(rowkey_column_count <= 0 || rowkey_column_count > row.count_)) {
ret = OB_INVALID_ARGUMENT;
LOG_WARN("invalid row writer input argument",
K(rowkey_column_count), K(row.row_val_.count_), K(ret));
LOG_WARN("invalid row writer input argument", K(ret), K(rowkey_column_count), K(row.count_));
}
return ret;
}
@ -230,24 +229,24 @@ int ObRowWriter::write(const int64_t rowkey_column_cnt, const ObDatumRow &datum_
return ret;
}
// when update_idx == nullptr, write full row; else only write rowkey + update cells
// when update_idx == nullptr, write full row; else only write rowkey + update storage_datums
int ObRowWriter::write(
const int64_t rowkey_column_count,
const storage::ObStoreRow &row,
const ObDatumRow &datum_row,
const ObIArray<int64_t> *update_idx,
char *&buf,
int64_t &len)
{
int ret = OB_SUCCESS;
len = 0;
if (OB_UNLIKELY(nullptr != update_idx && update_idx->count() > row.row_val_.count_)) {
if (OB_UNLIKELY(nullptr != update_idx && update_idx->count() > datum_row.count_)) {
ret = OB_INVALID_ARGUMENT;
LOG_WARN("update idx is invalid", K(ret), KPC(update_idx), K_(row.row_val_.count), K(rowkey_column_count));
LOG_WARN("update idx is invalid", K(ret), KPC(update_idx), K_(datum_row.count), K(rowkey_column_count));
} else {
do {
if (OB_FAIL(alloc_buf_and_init(OB_BUF_NOT_ENOUGH == ret))) {
LOG_WARN("row writer fail to alloc and init", K(ret));
} else if (OB_FAIL(inner_write_row(rowkey_column_count, row, update_idx))) {
} else if (OB_FAIL(inner_write_row(rowkey_column_count, datum_row, update_idx))) {
if (OB_BUF_NOT_ENOUGH != ret) {
LOG_WARN("row writer fail to append row header", K(ret), K(row_buffer_), K(pos_));
}
@ -289,29 +288,29 @@ int ObRowWriter::check_update_idx_array_valid(
int ObRowWriter::inner_write_row(
const int64_t rowkey_column_count,
const ObStoreRow &row,
const ObDatumRow &datum_row,
const ObIArray<int64_t> *update_idx)
{
int ret = OB_SUCCESS;
if (OB_FAIL(check_row_valid(row, rowkey_column_count))) {
if (OB_FAIL(check_row_valid(datum_row, rowkey_column_count))) {
LOG_WARN("row writer fail to init store row", K(ret), K(rowkey_column_count));
} else if (nullptr != update_idx && OB_FAIL(check_update_idx_array_valid(rowkey_column_count, update_idx))) {
LOG_WARN("invalid update idx array", K(ret));
} else if (OB_FAIL(append_row_header(
row.flag_.get_serialize_flag(),
row.row_type_flag_.flag_,
row.trans_id_.get_id(),
row.row_val_.count_,
datum_row.row_flag_.get_serialize_flag(),
datum_row.mvcc_row_flag_.flag_,
datum_row.trans_id_.get_id(),
datum_row.count_,
rowkey_column_count))) {
if (OB_BUF_NOT_ENOUGH != ret) {
LOG_WARN("row writer fail to append row header", K(ret), K(row));
LOG_WARN("row writer fail to append row header", K(ret), K(datum_row));
}
} else {
update_idx_array_ = update_idx;
rowkey_column_cnt_ = rowkey_column_count;
if (OB_FAIL(inner_write_cells(row.row_val_.cells_, row.row_val_.count_))) {
if (OB_FAIL(inner_write_cells(datum_row.storage_datums_, datum_row.count_))) {
if (OB_BUF_NOT_ENOUGH != ret) {
LOG_WARN("failed to write cells", K(ret), K(row));
LOG_WARN("failed to write cells", K(ret), K(datum_row));
}
}
}

View File

@ -63,7 +63,7 @@ public:
int write_rowkey(const common::ObStoreRowkey &rowkey, char *&buf, int64_t &len);
int write(
const int64_t rowkey_cnt,
const storage::ObStoreRow &row,
const ObDatumRow &datum_row,
const ObIArray<int64_t> *update_idx,
char *&buf,
int64_t &len);
@ -102,7 +102,7 @@ private:
};
int inner_write_row(
const int64_t rowkey_column_count,
const storage::ObStoreRow &row,
const ObDatumRow &row,
const ObIArray<int64_t> *update_idx);
OB_INLINE int write_oracle_timestamp(const common::ObOTimestampData &ot_data, const common::ObOTimestampMetaAttrType otmat);
int append_column(const common::ObObj &obj);
@ -110,7 +110,7 @@ private:
int append_8_bytes_column(const ObStorageDatum &datum);
int init_common(char *buf, const int64_t buf_size, const int64_t pos);
int check_row_valid(
const storage::ObStoreRow &row,
const ObDatumRow &row,
const int64_t rowkey_column_count);
int append_row_header(
const uint8_t row_flag,

View File

@ -0,0 +1,386 @@
/**
* Copyright (c) 2024 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 STORAGE
#include "ob_storage_datum.h"
#include "share/schema/ob_table_param.h"
#include "share/ob_force_print_log.h"
#include "storage/ob_i_store.h"
#include "share/scheduler/ob_tenant_dag_scheduler.h"
namespace oceanbase
{
using namespace common;
namespace blocksstable
{
static int nonext_nonext_compare(const ObStorageDatum &left, const ObStorageDatum &right, const common::ObCmpFunc &cmp_func, int &cmp_ret)
{
int ret = cmp_func.cmp_func_(left, right, cmp_ret);
STORAGE_LOG(DEBUG, "chaser debug compare datum", K(ret), K(left), K(right), K(cmp_ret));
return ret;
}
static int nonext_ext_compare(const ObStorageDatum &left, const ObStorageDatum &right, const common::ObCmpFunc &cmp_func, int &cmp_ret)
{
int ret = OB_SUCCESS;
UNUSEDx(left, cmp_func);
if (right.is_max()) {
cmp_ret = -1;
} else if (right.is_min()) {
cmp_ret = 1;
} else {
ret = OB_ERR_SYS;
STORAGE_LOG(ERROR, "Unexpected datum in rowkey to compare", K(ret), K(right));
}
STORAGE_LOG(DEBUG, "chaser debug compare datum", K(ret), K(left), K(right), K(cmp_ret));
return ret;
}
static int ext_nonext_compare(const ObStorageDatum &left, const ObStorageDatum &right, const common::ObCmpFunc &cmp_func, int &cmp_ret)
{
int ret = OB_SUCCESS;
UNUSEDx(right, cmp_func);
if (left.is_max()) {
cmp_ret = 1;
} else if (left.is_min()) {
cmp_ret = -1;
} else {
ret = OB_ERR_SYS;
STORAGE_LOG(ERROR, "Unexpected datum in rowkey to compare", K(ret), K(left));
}
STORAGE_LOG(DEBUG, "chaser debug compare datum", K(ret), K(left), K(right), K(cmp_ret));
return ret;
}
static int ext_ext_compare(const ObStorageDatum &left, const ObStorageDatum &right, const common::ObCmpFunc &cmp_func, int &cmp_ret)
{
int ret = OB_SUCCESS;
UNUSEDx(cmp_func);
int64_t lv = left.is_max() - left.is_min();
int64_t rv = right.is_max() - right.is_min();
if (OB_UNLIKELY(0 == lv || 0 == rv)) {
ret = OB_ERR_SYS;
STORAGE_LOG(ERROR, "Unexpected datum in rowkey to compare", K(ret), K(left), K(right));
} else {
cmp_ret = lv - rv;
}
STORAGE_LOG(DEBUG, "chaser debug compare datum", K(ret), K(left), K(right), K(cmp_ret));
return ret;
}
typedef int (*ExtSafeCompareFunc)(const ObStorageDatum &left, const ObStorageDatum &right, const common::ObCmpFunc &cmp_func, int &cmp_ret);
static ExtSafeCompareFunc ext_safe_cmp_funcs[2][2] = {
{nonext_nonext_compare, nonext_ext_compare},
{ext_nonext_compare, ext_ext_compare}
};
int ObStorageDatumCmpFunc::compare(const ObStorageDatum &left, const ObStorageDatum &right, int &cmp_ret) const
{
return ext_safe_cmp_funcs[left.is_ext()][right.is_ext()](left, right, cmp_func_, cmp_ret);
}
/*
*ObStorageDatumUtils
*/
ObStorageDatumUtils::ObStorageDatumUtils()
: rowkey_cnt_(0),
cmp_funcs_(),
hash_funcs_(),
ext_hash_func_(),
is_oracle_mode_(false),
is_inited_(false)
{}
ObStorageDatumUtils::~ObStorageDatumUtils()
{}
int ObStorageDatumUtils::transform_multi_version_col_desc(const ObIArray<share::schema::ObColDesc> &col_descs,
const int64_t schema_rowkey_cnt,
ObIArray<share::schema::ObColDesc> &mv_col_descs)
{
int ret = OB_SUCCESS;
if (OB_UNLIKELY(schema_rowkey_cnt > col_descs.count())) {
ret = OB_INVALID_ARGUMENT;
STORAGE_LOG(WARN, "Invalid argument to transform mv col descs", K(ret), K(schema_rowkey_cnt), K(col_descs));
} else {
mv_col_descs.reuse();
for (int64_t i = 0; OB_SUCC(ret) && i < schema_rowkey_cnt; i++) {
if (OB_FAIL(mv_col_descs.push_back(col_descs.at(i)))) {
STORAGE_LOG(WARN, "Failed to push back col desc", K(ret), K(i));
}
}
if (OB_FAIL(ret)) {
} else if (OB_FAIL(storage::ObMultiVersionRowkeyHelpper::add_extra_rowkey_cols(mv_col_descs))) {
STORAGE_LOG(WARN, "Fail to add extra_rowkey_cols", K(ret), K(schema_rowkey_cnt));
} else {
for (int64_t i = schema_rowkey_cnt; OB_SUCC(ret) && i < col_descs.count(); i++) {
const share::schema::ObColDesc &col_desc = col_descs.at(i);
if (col_desc.col_id_ == common::OB_HIDDEN_TRANS_VERSION_COLUMN_ID
|| col_desc.col_id_ == common::OB_HIDDEN_SQL_SEQUENCE_COLUMN_ID) {
continue;
} else if (OB_FAIL(mv_col_descs.push_back(col_desc))) {
STORAGE_LOG(WARN, "Failed to push back col desc", K(ret), K(col_desc));
}
}
}
}
return ret;
}
int ObStorageDatumUtils::init(const ObIArray<share::schema::ObColDesc> &col_descs,
const int64_t schema_rowkey_cnt,
const bool is_oracle_mode,
ObIAllocator &allocator,
const bool is_column_store)
{
int ret = OB_SUCCESS;
ObSEArray<share::schema::ObColDesc, 32> mv_col_descs;
int64_t mv_rowkey_cnt = 0;
int64_t mv_extra_rowkey_cnt = 0;
if (IS_INIT) {
ret = OB_INIT_TWICE;
STORAGE_LOG(WARN, "ObStorageDatumUtils init twice", K(ret), K(*this));
} else if (OB_UNLIKELY(schema_rowkey_cnt < 0 || schema_rowkey_cnt > OB_MAX_ROWKEY_COLUMN_NUMBER
|| schema_rowkey_cnt > col_descs.count())) {
ret = OB_INVALID_ARGUMENT;
STORAGE_LOG(WARN, "Invalid argument to init storage datum utils", K(ret), K(schema_rowkey_cnt), K(col_descs));
} else if (OB_FAIL(transform_multi_version_col_desc(col_descs, schema_rowkey_cnt, mv_col_descs))) {
STORAGE_LOG(WARN, "Failed to transform multi version col descs", K(ret));
} else if (FALSE_IT(mv_extra_rowkey_cnt = is_column_store ? 0 : storage::ObMultiVersionRowkeyHelpper::get_extra_rowkey_col_cnt())) {
} else if (FALSE_IT(mv_rowkey_cnt = schema_rowkey_cnt + mv_extra_rowkey_cnt)) {
} else if (OB_FAIL(cmp_funcs_.init(mv_rowkey_cnt, allocator))) {
STORAGE_LOG(WARN, "Failed to reserve cmp func array", K(ret));
} else if (OB_FAIL(hash_funcs_.init(mv_rowkey_cnt, allocator))) {
STORAGE_LOG(WARN, "Failed to reserve hash func array", K(ret));
} else if (OB_FAIL(inner_init(mv_col_descs, mv_rowkey_cnt, is_oracle_mode))) {
STORAGE_LOG(WARN, "Failed to inner init datum utils", K(ret), K(mv_col_descs), K(mv_rowkey_cnt));
}
return ret;
}
int ObStorageDatumUtils::init(const common::ObIArray<share::schema::ObColDesc> &col_descs,
const int64_t schema_rowkey_cnt,
const bool is_oracle_mode,
const int64_t arr_buf_len,
char *arr_buf)
{
int ret = OB_SUCCESS;
ObSEArray<share::schema::ObColDesc, 32> mv_col_descs;
int64_t pos = 0;
int64_t mv_rowkey_cnt = 0;
if (IS_INIT) {
ret = OB_INIT_TWICE;
STORAGE_LOG(WARN, "ObStorageDatumUtils init twice", K(ret), K(*this));
} else if (OB_UNLIKELY(schema_rowkey_cnt < 0 || schema_rowkey_cnt > OB_MAX_ROWKEY_COLUMN_NUMBER
|| schema_rowkey_cnt > col_descs.count())) {
ret = OB_INVALID_ARGUMENT;
STORAGE_LOG(WARN, "Invalid argument to init storage datum utils", K(ret), K(col_descs), K(schema_rowkey_cnt));
} else if (OB_FAIL(transform_multi_version_col_desc(col_descs, schema_rowkey_cnt, mv_col_descs))) {
STORAGE_LOG(WARN, "Failed to transform multi version col descs", K(ret));
} else if (FALSE_IT(mv_rowkey_cnt = schema_rowkey_cnt + storage::ObMultiVersionRowkeyHelpper::get_extra_rowkey_col_cnt())) {
} else if (OB_FAIL(cmp_funcs_.init(mv_rowkey_cnt, arr_buf_len, arr_buf, pos))) {
STORAGE_LOG(WARN, "Failed to init compare function array", K(ret));
} else if (OB_FAIL(hash_funcs_.init(mv_rowkey_cnt, arr_buf_len, arr_buf, pos))) {
STORAGE_LOG(WARN, "Failed to init hash function array", K(ret));
} else if (OB_FAIL(inner_init(mv_col_descs, mv_rowkey_cnt, is_oracle_mode))) {
STORAGE_LOG(WARN, "Failed to inner init datum utils", K(ret), K(mv_col_descs), K(mv_rowkey_cnt));
}
return ret;
}
int ObStorageDatumUtils::inner_init(
const common::ObIArray<share::schema::ObColDesc> &mv_col_descs,
const int64_t mv_rowkey_col_cnt,
const bool is_oracle_mode)
{
int ret = OB_SUCCESS;
is_oracle_mode_ = is_oracle_mode;
// support column order index until next task done
//
// we could use the cmp funcs in the basic funcs directlly
bool is_null_last = is_oracle_mode_;
ObCmpFunc cmp_func;
ObHashFunc hash_func;
for (int64_t i = 0; OB_SUCC(ret) && i < mv_rowkey_col_cnt; i++) {
const share::schema::ObColDesc &col_desc = mv_col_descs.at(i);
//TODO @hanhui support desc rowkey
bool is_ascending = true || col_desc.col_order_ == ObOrderType::ASC;
bool has_lob_header = is_lob_storage(col_desc.col_type_.get_type());
ObPrecision precision = PRECISION_UNKNOWN_YET;
if (col_desc.col_type_.is_decimal_int()) {
precision = col_desc.col_type_.get_stored_precision();
OB_ASSERT(precision != PRECISION_UNKNOWN_YET);
}
sql::ObExprBasicFuncs *basic_funcs = ObDatumFuncs::get_basic_func(col_desc.col_type_.get_type(),
col_desc.col_type_.get_collation_type(),
col_desc.col_type_.get_scale(),
is_oracle_mode,
has_lob_header,
precision);
if (OB_UNLIKELY(nullptr == basic_funcs
|| nullptr == basic_funcs->null_last_cmp_
|| nullptr == basic_funcs->murmur_hash_)) {
ret = OB_ERR_SYS;
STORAGE_LOG(ERROR, "Unexpected null basic funcs", K(ret), K(col_desc));
} else {
cmp_func.cmp_func_ = is_null_last ? basic_funcs->null_last_cmp_ : basic_funcs->null_first_cmp_;
hash_func.hash_func_ = basic_funcs->murmur_hash_;
if (OB_FAIL(hash_funcs_.push_back(hash_func))) {
STORAGE_LOG(WARN, "Failed to push back hash func", K(ret), K(i), K(col_desc));
} else if (is_ascending) {
if (OB_FAIL(cmp_funcs_.push_back(ObStorageDatumCmpFunc(cmp_func)))) {
STORAGE_LOG(WARN, "Failed to push back cmp func", K(ret), K(i), K(col_desc));
}
} else {
ret = OB_ERR_SYS;
STORAGE_LOG(WARN, "Unsupported desc column order", K(ret), K(col_desc), K(i));
}
}
}
if (OB_SUCC(ret)) {
sql::ObExprBasicFuncs *basic_funcs = ObDatumFuncs::get_basic_func(ObExtendType, CS_TYPE_BINARY);
if (OB_UNLIKELY(nullptr == basic_funcs || nullptr == basic_funcs->murmur_hash_)) {
ret = OB_ERR_SYS;
STORAGE_LOG(ERROR, "Unexpected null basic funcs for extend type", K(ret));
} else {
ext_hash_func_.hash_func_ = basic_funcs->murmur_hash_;
rowkey_cnt_ = mv_rowkey_col_cnt;
is_inited_ = true;
}
}
return ret;
}
int ObStorageDatumUtils::assign(const ObStorageDatumUtils &other_utils, ObIAllocator &allocator)
{
int ret = OB_SUCCESS;
if (OB_UNLIKELY(!other_utils.is_valid())) {
ret = OB_INVALID_ARGUMENT;
STORAGE_LOG(WARN, "Invalid argument to assign datum utils", K(ret), K(other_utils));
} else {
rowkey_cnt_ = other_utils.get_rowkey_count();
is_oracle_mode_ = other_utils.is_oracle_mode();
ext_hash_func_ = other_utils.get_ext_hash_funcs();
if (OB_FAIL(cmp_funcs_.init_and_assign(other_utils.get_cmp_funcs(), allocator))) {
STORAGE_LOG(WARN, "Failed to assign cmp func array", K(ret));
} else if (OB_FAIL(hash_funcs_.init_and_assign(other_utils.get_hash_funcs(), allocator))) {
STORAGE_LOG(WARN, "Failed to assign hash func array", K(ret));
} else {
is_inited_ = true;
}
}
return ret;
}
void ObStorageDatumUtils::reset()
{
rowkey_cnt_ = 0;
cmp_funcs_.reset();
hash_funcs_.reset();
ext_hash_func_.hash_func_ = nullptr;
is_inited_ = false;
}
int64_t ObStorageDatumUtils::get_deep_copy_size() const
{
return cmp_funcs_.get_deep_copy_size() + hash_funcs_.get_deep_copy_size();
}
/*
*ObStorageDatumBuffer
*/
ObStorageDatumBuffer::ObStorageDatumBuffer(common::ObIAllocator *allocator)
: capacity_(LOCAL_BUFFER_ARRAY),
local_datums_(),
datums_(local_datums_),
allocator_(allocator),
is_inited_(nullptr != allocator)
{}
ObStorageDatumBuffer::~ObStorageDatumBuffer()
{
if (datums_ != local_datums_ && nullptr != allocator_) {
allocator_->free(datums_);
}
}
void ObStorageDatumBuffer::reset()
{
if (datums_ != local_datums_ && nullptr != allocator_) {
allocator_->free(datums_);
}
allocator_ = nullptr;
datums_ = local_datums_;
capacity_ = LOCAL_BUFFER_ARRAY;
for (int64_t i = 0; i < capacity_; i++) {
datums_[i].reuse();
}
is_inited_ = false;
}
int ObStorageDatumBuffer::init(common::ObIAllocator &allocator)
{
int ret = OB_SUCCESS;
if (IS_INIT) {
ret = OB_INIT_TWICE;
STORAGE_LOG(WARN, "ObStorageDatumBuffer init twice", K(ret), K(*this));
} else {
OB_ASSERT(datums_ == local_datums_);
allocator_ = &allocator;
is_inited_ = true;
}
return ret;
}
int ObStorageDatumBuffer::reserve(const int64_t count, const bool keep_data)
{
int ret = OB_SUCCESS;
void *buf = nullptr;
if (IS_NOT_INIT) {
ret = OB_NOT_INIT;
STORAGE_LOG(WARN, "ObStorageDatumBuffer is not inited", K(ret), K(*this));
} else if (OB_UNLIKELY(count <= 0)) {
ret = OB_INVALID_ARGUMENT;
STORAGE_LOG(WARN, "Invalid argument to reserve datum buffer", K(ret), K(count));
} else if (count <= capacity_){
} else if (OB_ISNULL(buf = allocator_->alloc(sizeof(ObStorageDatum) * count))) {
ret = OB_ALLOCATE_MEMORY_FAILED;
STORAGE_LOG(WARN, "Failed to alloc memory", K(ret), K(count));
} else {
ObStorageDatum *new_datums = new (buf) ObStorageDatum [count];
if (keep_data) {
for (int64_t i = 0; i < capacity_; i++) {
new_datums[i] = datums_[i];
}
}
if (nullptr != datums_ && datums_ != local_datums_) {
allocator_->free(datums_);
}
datums_ = new_datums;
capacity_ = count;
}
return ret;
}
} // namespace blocksstable
} // namespace oceanbase

View File

@ -0,0 +1,427 @@
/**
* Copyright (c) 2024 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.
*/
#ifndef OB_STORAGE_BLOCKSSTABLE_STORAGE_DATUM_H
#define OB_STORAGE_BLOCKSSTABLE_STORAGE_DATUM_H
#include "common/ob_common_types.h"
#include "common/ob_tablet_id.h"
#include "share/datum/ob_datum.h"
#include "share/datum/ob_datum_funcs.h"
#include "storage/meta_mem/ob_fixed_meta_obj_array.h"
#include "storage/tx/ob_trans_define.h"
#include "common/row/ob_row.h"
#include "storage/ob_storage_util.h"
namespace oceanbase
{
namespace share{
namespace schema
{
struct ObColDesc;
}
}
namespace storage
{
struct ObStoreRow;
}
namespace blocksstable
{
//TODO optimize number buffer
struct ObStorageDatum : public common::ObDatum
{
ObStorageDatum() { set_nop(); }
ObStorageDatum(const ObStorageDatum &datum) { reuse(); *this = datum; }
~ObStorageDatum() = default;
// ext value section
OB_INLINE void reuse() { ptr_ = buf_; reserved_ = 0; pack_ = 0; }
OB_INLINE void set_ext_value(const int64_t ext_value)
{ reuse(); set_ext(); no_cv(extend_obj_)->set_ext(ext_value); }
OB_INLINE void set_nop() { set_ext_value(ObActionFlag::OP_NOP); }
OB_INLINE void set_min() { set_ext_value(common::ObObj::MIN_OBJECT_VALUE); }
OB_INLINE void set_max() { set_ext_value(common::ObObj::MAX_OBJECT_VALUE); }
OB_INLINE bool is_nop_value() const { return is_nop(); } // temp solution
// transfer section
OB_INLINE bool is_local_buf() const { return ptr_ == buf_; }
OB_INLINE int from_buf_enhance(const char *buf, const int64_t buf_len);
OB_INLINE int from_obj_enhance(const common::ObObj &obj);
OB_INLINE int to_obj_enhance(common::ObObj &obj, const common::ObObjMeta &meta) const;
OB_INLINE int deep_copy(const ObStorageDatum &src, common::ObIAllocator &allocator);
OB_INLINE int deep_copy(const ObStorageDatum &src, char * buf, const int64_t buf_len, int64_t &pos);
OB_INLINE void shallow_copy_from_datum(const ObDatum &src);
OB_INLINE int64_t get_deep_copy_size() const;
OB_INLINE ObStorageDatum& operator=(const ObStorageDatum &other);
OB_INLINE int64_t storage_to_string(char *buf, int64_t buf_len, const bool for_dump = false) const;
OB_INLINE bool need_copy_for_encoding_column_with_flat_format(const ObObjDatumMapType map_type) const;
OB_INLINE const char *to_cstring(const bool for_dump = false) const;
//only for unittest
OB_INLINE bool operator==(const ObStorageDatum &other) const;
OB_INLINE bool operator==(const ObObj &other) const;
//datum 12 byte
int32_t reserved_;
// buf 16 byte
char buf_[common::OBJ_DATUM_NUMBER_RES_SIZE];
};
struct ObStorageDatumCmpFunc
{
public:
ObStorageDatumCmpFunc(common::ObCmpFunc &cmp_func) : cmp_func_(cmp_func) {}
ObStorageDatumCmpFunc() = default;
~ObStorageDatumCmpFunc() = default;
int compare(const ObStorageDatum &left, const ObStorageDatum &right, int &cmp_ret) const;
OB_INLINE const common::ObCmpFunc &get_cmp_func() const { return cmp_func_; }
TO_STRING_KV(K_(cmp_func));
private:
common::ObCmpFunc cmp_func_;
};
typedef storage::ObFixedMetaObjArray<ObStorageDatumCmpFunc> ObStoreCmpFuncs;
typedef storage::ObFixedMetaObjArray<common::ObHashFunc> ObStoreHashFuncs;
struct ObStorageDatumUtils
{
public:
ObStorageDatumUtils();
~ObStorageDatumUtils();
// init with array memory from allocator
int init(const common::ObIArray<share::schema::ObColDesc> &col_descs,
const int64_t schema_rowkey_cnt,
const bool is_oracle_mode,
common::ObIAllocator &allocator,
const bool is_column_store = false);
// init with array memory on fixed size memory buffer
int init(const common::ObIArray<share::schema::ObColDesc> &col_descs,
const int64_t schema_rowkey_cnt,
const bool is_oracle_mode,
const int64_t arr_buf_len,
char *arr_buf);
int assign(const ObStorageDatumUtils &other_utils, common::ObIAllocator &allocator);
void reset();
OB_INLINE bool is_valid() const
{
return is_inited_ && cmp_funcs_.count() >= rowkey_cnt_ && hash_funcs_.count() >= rowkey_cnt_;
}
OB_INLINE bool is_oracle_mode() const { return is_oracle_mode_; }
OB_INLINE int64_t get_rowkey_count() const { return rowkey_cnt_; }
OB_INLINE const ObStoreCmpFuncs &get_cmp_funcs() const { return cmp_funcs_; }
OB_INLINE const ObStoreHashFuncs &get_hash_funcs() const { return hash_funcs_; }
OB_INLINE const common::ObHashFunc &get_ext_hash_funcs() const { return ext_hash_func_; }
int64_t get_deep_copy_size() const;
TO_STRING_KV(K_(is_oracle_mode), K_(rowkey_cnt), K_(is_inited), K_(is_oracle_mode));
private:
//TODO to be removed by @hanhui
int transform_multi_version_col_desc(const common::ObIArray<share::schema::ObColDesc> &col_descs,
const int64_t schema_rowkey_cnt,
common::ObIArray<share::schema::ObColDesc> &mv_col_descs);
int inner_init(
const common::ObIArray<share::schema::ObColDesc> &mv_col_descs,
const int64_t mv_rowkey_col_cnt,
const bool is_oracle_mode);
private:
int32_t rowkey_cnt_; // multi version rowkey
ObStoreCmpFuncs cmp_funcs_; // multi version rowkey cmp funcs
ObStoreHashFuncs hash_funcs_; // multi version rowkey cmp funcs
common::ObHashFunc ext_hash_func_;
bool is_oracle_mode_;
bool is_inited_;
DISALLOW_COPY_AND_ASSIGN(ObStorageDatumUtils);
};
struct ObStorageDatumBuffer
{
public:
ObStorageDatumBuffer(common::ObIAllocator *allocator = nullptr);
~ObStorageDatumBuffer();
void reset();
int init(common::ObIAllocator &allocator);
int reserve(const int64_t count, const bool keep_data = false);
OB_INLINE bool is_valid() const { return is_inited_; }
OB_INLINE ObStorageDatum *get_datums() { return datums_; }
OB_INLINE int64_t get_capacity() const { return capacity_; }
TO_STRING_KV(K_(capacity), KP_(datums), KP_(local_datums));
private:
static const int64_t LOCAL_BUFFER_ARRAY = common::OB_ROW_DEFAULT_COLUMNS_COUNT >> 1;
int64_t capacity_;
ObStorageDatum local_datums_[LOCAL_BUFFER_ARRAY];
ObStorageDatum *datums_;
common::ObIAllocator *allocator_;
bool is_inited_;
};
OB_INLINE int ObStorageDatum::deep_copy(const ObStorageDatum &src, common::ObIAllocator &allocator)
{
int ret = common::OB_SUCCESS;
reuse();
pack_ = src.pack_;
if (is_null()) {
} else if (src.len_ == 0) {
} else if (src.is_local_buf()) {
OB_ASSERT(src.len_ <= common::OBJ_DATUM_NUMBER_RES_SIZE);
MEMCPY(buf_, src.ptr_, src.len_);
ptr_ = buf_;
} else {
char * buf = static_cast<char *>(allocator.alloc(src.len_));
if (OB_ISNULL(buf)) {
ret = OB_ALLOCATE_MEMORY_FAILED;
COMMON_LOG(WARN, "allocate memory failed", K(ret), K(src));
pack_ = 0;
} else {
MEMCPY(buf, src.ptr_, src.len_);
// need set ptr_ after memory copy, if this == &src
ptr_ = buf;
}
}
return ret;
}
OB_INLINE int ObStorageDatum::deep_copy(const ObStorageDatum &src, char * buf, const int64_t buf_len, int64_t &pos)
{
int ret = common::OB_SUCCESS;
reuse();
pack_ = src.pack_;
if (is_null()) {
} else if (src.len_ == 0) {
} else if (src.is_local_buf()) {
OB_ASSERT(src.len_ <= common::OBJ_DATUM_NUMBER_RES_SIZE);
MEMCPY(buf_, src.ptr_, src.len_);
ptr_ = buf_;
} else if (OB_UNLIKELY(nullptr == buf || buf_len < pos + src.len_)) {
ret = OB_INVALID_ARGUMENT;
STORAGE_LOG(WARN, "Invalid argument to deep copy datum", K(ret), K(src), KP(buf), K(buf_len), K(pos));
pack_ = 0;
} else {
MEMCPY(buf + pos, src.ptr_, src.len_);
// need set ptr_ after memory copy, if this == &src
ptr_ = buf + pos;
pos += src.len_;
}
return ret;
}
OB_INLINE void ObStorageDatum::shallow_copy_from_datum(const ObDatum &src)
{
if (this != &src) {
reuse();
pack_ = src.pack_;
if (is_null()) {
} else if (src.len_ == 0) {
} else {
ptr_ = src.ptr_;
}
}
}
OB_INLINE int64_t ObStorageDatum::get_deep_copy_size() const
{
int64_t deep_copy_len = 0;
if (is_null()) {
} else if (is_local_buf()) {
OB_ASSERT(len_ <= common::OBJ_DATUM_NUMBER_RES_SIZE);
} else {
deep_copy_len = len_;
}
return deep_copy_len;
}
OB_INLINE int ObStorageDatum::from_buf_enhance(const char *buf, const int64_t buf_len)
{
int ret = common::OB_SUCCESS;
if (OB_UNLIKELY(nullptr == buf || buf_len < 0 || buf_len > UINT32_MAX)) {
ret = OB_INVALID_ARGUMENT;
STORAGE_LOG(WARN, "Invalid argument to transfer from buf", K(ret), KP(buf), K(buf_len));
} else {
reuse();
len_ = static_cast<uint32_t>(buf_len);
if (buf_len > 0) {
ptr_ = buf;
}
}
return ret;
}
OB_INLINE int ObStorageDatum::from_obj_enhance(const common::ObObj &obj)
{
int ret = common::OB_SUCCESS;
reuse();
if (obj.is_ext()) {
set_ext_value(obj.get_ext());
} else if (OB_FAIL(from_obj(obj))) {
STORAGE_LOG(WARN, "Failed to transfer obj to datum", K(ret), K(obj));
}
STORAGE_LOG(DEBUG, "chaser debug from obj", K(obj), K(*this));
return ret;
}
OB_INLINE int ObStorageDatum::to_obj_enhance(common::ObObj &obj, const common::ObObjMeta &meta) const
{
int ret = common::OB_SUCCESS;
if (is_outrow()) {
ret = OB_ERR_UNEXPECTED;
STORAGE_LOG(WARN, "lob should not set outrow in datum", K(ret), K(*this), K(obj), K(meta));
} else if (is_ext()) {
obj.set_ext(get_ext());
} else if (OB_FAIL(to_obj(obj, meta))) {
STORAGE_LOG(WARN, "Failed to transfer datum to obj", K(ret), K(*this), K(obj), K(meta));
}
return ret;
}
OB_INLINE ObStorageDatum& ObStorageDatum::operator=(const ObStorageDatum &other)
{
if (&other != this) {
reuse();
pack_ = other.pack_;
if (is_null()) {
} else if (len_ == 0) {
} else if (other.is_local_buf()) {
OB_ASSERT(other.len_ <= common::OBJ_DATUM_NUMBER_RES_SIZE);
MEMCPY(buf_, other.ptr_, other.len_);
ptr_ = buf_;
} else {
ptr_ = other.ptr_;
}
}
return *this;
}
OB_INLINE bool ObStorageDatum::operator==(const ObStorageDatum &other) const
{
bool bret = true;
if (is_null()) {
bret = other.is_null();
} else if (is_ext()) {
bret = other.is_ext() && extend_obj_->get_ext() == other.extend_obj_->get_ext();
} else {
bret = ObDatum::binary_equal(*this, other);
}
if (!bret) {
STORAGE_LOG(DEBUG, "datum and datum no equal", K(other), K(*this));
}
return bret;
}
OB_INLINE bool ObStorageDatum::operator==(const common::ObObj &other) const
{
int ret = OB_SUCCESS;
bool bret = true;
ObStorageDatum datum;
if (OB_FAIL(datum.from_obj_enhance(other))) {
STORAGE_LOG(WARN, "Failed to transfer obj to datum", K(ret), K(other), K(datum));
} else {
bret = *this == datum;
}
if (!bret) {
STORAGE_LOG(DEBUG, "obj and datum no equal", K(other), K(datum), KPC(this));
}
return bret;
}
OB_INLINE int64_t ObStorageDatum::storage_to_string(char *buf, int64_t buf_len, const bool for_dump) const
{
int64_t pos = 0;
if (is_ext()) {
if (is_nop()) {
J_NOP();
} else if (is_max()) {
BUF_PRINTF("MAX_OBJ");
} else if (is_min()) {
BUF_PRINTF("MIN_OBJ");
}
} else if(!for_dump) {
pos = to_string(buf, buf_len);
} else {
int ret = OB_SUCCESS;
const static int64_t STR_MAX_PRINT_LEN = 128L;
if (null_) {
J_NULL();
} else {
J_OBJ_START();
BUF_PRINTF("len: %d, flag: %d, null: %d", len_, flag_, null_);
if (len_ > 0) {
OB_ASSERT(NULL != ptr_);
const int64_t plen = std::min(static_cast<int64_t>(len_),
static_cast<int64_t>(STR_MAX_PRINT_LEN));
// print hex value
BUF_PRINTF(", hex: ");
if (OB_FAIL(hex_print(ptr_, plen, buf, buf_len, pos))) {
// no logging in to_string function.
} else {
// maybe ObIntTC
if (sizeof(int64_t) == len_) {
BUF_PRINTF(", int: %ld", *int_);
// maybe number with one digit
if (1 == num_->desc_.len_) {
BUF_PRINTF(", num_digit0: %u", num_->digits_[0]);
}
}
// maybe printable C string
int64_t idx = 0;
while (idx < plen && isprint(ptr_[idx])) {
idx++;
}
if (idx >= plen) {
BUF_PRINTF(", cstr: %.*s", static_cast<int>(plen), ptr_);
}
}
}
J_OBJ_END();
}
}
return pos;
}
OB_INLINE const char *ObStorageDatum::to_cstring(const bool for_dump) const
{
char *buffer = NULL;
int64_t str_len = 0;
CStringBufMgr &mgr = CStringBufMgr::get_thread_local_instance();
mgr.inc_level();
const int64_t buf_len = mgr.acquire(buffer);
if (OB_ISNULL(buffer)) {
LIB_LOG_RET(ERROR, OB_ALLOCATE_MEMORY_FAILED, "buffer is NULL");
} else {
str_len = storage_to_string(buffer, buf_len -1, for_dump);
if (str_len >= 0 && str_len < buf_len) {
buffer[str_len] = '\0';
} else {
buffer[0] = '\0';
}
mgr.update_position(str_len + 1);
}
mgr.try_clear_list();
mgr.dec_level();
return buffer;
}
OB_INLINE bool ObStorageDatum::need_copy_for_encoding_column_with_flat_format(const ObObjDatumMapType map_type) const
{
return OBJ_DATUM_STRING == map_type && sizeof(uint64_t) == len_ && is_local_buf();
}
} // namespace blocksstable
} // namespace oceanbase
#endif

View File

@ -186,7 +186,7 @@ int ObExtInfoCallback::set(
{
int ret = OB_SUCCESS;
ObLobManager *lob_mngr = MTL(ObLobManager*);
ObDatumRow datum_row;
blocksstable::ObDatumRow datum_row;
char *buf = nullptr;
int64_t len = 0;
@ -250,7 +250,8 @@ int ObExtInfoCbRegister::register_cb(
const blocksstable::ObDmlFlag dml_flag,
transaction::ObTxDesc *tx_desc,
transaction::ObTxSEQ &parent_seq_no,
ObObj &index_data,
blocksstable::ObStorageDatum &index_data,
ObObjType &type,
ObObj &ext_info_data)
{
int ret = OB_SUCCESS;
@ -269,7 +270,7 @@ int ObExtInfoCbRegister::register_cb(
} else if (OB_ISNULL(mvcc_ctx_ = ctx)) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("data is empty", K(ret), K(ext_info_data));
} else if (OB_FAIL(init_header(index_data, ext_info_data))) {
} else if (OB_FAIL(init_header(type))) {
LOG_WARN("init_header_ fail", K(ret), K(ext_info_data));
} else if (OB_FAIL(build_data_iter(ext_info_data))) {
LOG_WARN("build data iter fail", K(ret));
@ -306,24 +307,24 @@ int ObExtInfoCbRegister::register_cb(
}
if (OB_FAIL(ret)) {
} else if (OB_FALSE_IT(seq_no_cnt_ = cb_cnt)) {
} else if (OB_FAIL(set_index_data(index_data))) {
} else if (OB_FAIL(set_index_data(index_data, type))) {
LOG_WARN("set_index_data fail", K(ret));
}
}
return ret;
}
int ObExtInfoCbRegister::init_header(ObObj& index_data, ObObj &ext_info_data)
int ObExtInfoCbRegister::init_header(ObObjType &type)
{
int ret = OB_SUCCESS;
header_.type_ = get_type(index_data.get_type());
header_.type_ = get_type(type);
return ret;
}
int ObExtInfoCbRegister::set_index_data(ObObj &index_data)
int ObExtInfoCbRegister::set_index_data(blocksstable::ObStorageDatum &index_data, ObObjType &type)
{
int ret = OB_SUCCESS;
if (is_lob_storage(index_data.get_type())) {
if (is_lob_storage(type)) {
if (OB_FAIL(set_outrow_ctx_seq_no(index_data))) {
LOG_WARN("set_outrow_ctx_seq_no fail", K(ret));
}
@ -334,7 +335,7 @@ int ObExtInfoCbRegister::set_index_data(ObObj &index_data)
return ret;
}
int ObExtInfoCbRegister::set_outrow_ctx_seq_no(ObObj& index_data)
int ObExtInfoCbRegister::set_outrow_ctx_seq_no(blocksstable::ObStorageDatum& index_data)
{
int ret = OB_SUCCESS;
ObLobLocatorV2 locator;

View File

@ -153,12 +153,13 @@ public:
const blocksstable::ObDmlFlag dml_flag,
transaction::ObTxDesc *tx_desc,
transaction::ObTxSEQ &parent_seq_no,
ObObj &index_data,
blocksstable::ObStorageDatum &index_data,
ObObjType &type,
ObObj &ext_info_data);
private:
static ObExtInfoLogType get_type(ObObjType obj_type)
static ObExtInfoLogType get_type(ObObjType &obj_type)
{
ObExtInfoLogType res = OB_INVALID_EXT_INFO_LOG;
switch (obj_type)
@ -174,12 +175,12 @@ private:
int build_data_iter(ObObj &ext_info_data);
int set_index_data(ObObj &index_data);
int set_outrow_ctx_seq_no(ObObj& index_data);
int set_index_data(blocksstable::ObStorageDatum &index_data, ObObjType &type);
int set_outrow_ctx_seq_no(blocksstable::ObStorageDatum& index_data);
int get_data(ObString &data);
int init_header(ObObj& index_data, ObObj &ext_info_data);
int init_header(ObObjType &type);
public:
TO_STRING_KV(K(timeout_), K(data_size_), K(seq_no_st_), K(seq_no_cnt_), K(header_writed_));

View File

@ -972,7 +972,7 @@ int ObLobMetaManager::write(ObLobAccessParam& param, ObLobMetaInfo& in_row)
return ret;
}
int ObLobMetaManager::batch_insert(ObLobAccessParam& param, ObNewRowIterator &iter)
int ObLobMetaManager::batch_insert(ObLobAccessParam& param, blocksstable::ObDatumRowIterator &iter)
{
int ret = OB_SUCCESS;
if (OB_FAIL(persistent_lob_adapter_.write_lob_meta(param, iter))) {
@ -981,7 +981,7 @@ int ObLobMetaManager::batch_insert(ObLobAccessParam& param, ObNewRowIterator &it
return ret;
}
int ObLobMetaManager::batch_delete(ObLobAccessParam& param, ObNewRowIterator &iter)
int ObLobMetaManager::batch_delete(ObLobAccessParam& param, blocksstable::ObDatumRowIterator &iter)
{
int ret = OB_SUCCESS;
if (OB_FAIL(persistent_lob_adapter_.erase_lob_meta(param, iter))) {

View File

@ -230,8 +230,8 @@ public:
~ObLobMetaManager() {}
// write one lob meta row
int write(ObLobAccessParam& param, ObLobMetaInfo& in_row);
int batch_insert(ObLobAccessParam& param, ObNewRowIterator &iter);
int batch_delete(ObLobAccessParam& param, ObNewRowIterator &iter);
int batch_insert(ObLobAccessParam& param, blocksstable::ObDatumRowIterator &iter);
int batch_delete(ObLobAccessParam& param, blocksstable::ObDatumRowIterator &iter);
// append
int append(ObLobAccessParam& param, ObLobMetaWriteIter& iter);
// return ObLobMetaWriteResult

View File

@ -418,15 +418,14 @@ int ObPersistentLobApator::erase_lob_piece_tablet(ObLobAccessParam& param, ObLob
// construct insert data
int64_t affected_rows = 0;
ObObj cell[ObLobPieceUtil::LOB_PIECE_COLUMN_CNT];
char serialize_buf[32] = {0};
// make insert iterator
ObNewRow new_row;
ObDatumRow new_row;
blocksstable::ObSingleDatumRowIteratorWrapper single_iter;
common::ObSingleRowIteratorWrapper single_iter;
single_iter.set_row(&new_row);
if (OB_FAIL(set_lob_piece_row(serialize_buf, 32, cell, new_row, &single_iter, in_row))) {
if (OB_FAIL(new_row.init(ObLobPieceUtil::LOB_PIECE_COLUMN_CNT))) {
LOG_WARN("failed to init new datum row", K(ret));
} else if (OB_FAIL(set_lob_piece_row(serialize_buf, 32, new_row, &single_iter, in_row))) {
LOG_WARN("failed to set insert piece row.", K(ret), K(in_row));
} else if (OB_FAIL(oas->delete_rows(param.ls_id_,
lob_piece_tablet.get_obj()->get_tablet_meta().tablet_id_,
@ -534,15 +533,14 @@ int ObPersistentLobApator::write_lob_piece_tablet(ObLobAccessParam& param, ObLob
// construct insert data
int64_t affected_rows = 0;
ObObj cell[ObLobPieceUtil::LOB_PIECE_COLUMN_CNT];
char serialize_buf[32] = {0};
// make insert iterator
ObNewRow new_row;
ObDatumRow new_row;
blocksstable::ObSingleDatumRowIteratorWrapper single_iter;
common::ObSingleRowIteratorWrapper single_iter;
single_iter.set_row(&new_row);
if (OB_FAIL(set_lob_piece_row(serialize_buf, 32, cell, new_row, &single_iter, in_row))) {
if (OB_FAIL(new_row.init(ObLobPieceUtil::LOB_PIECE_COLUMN_CNT))) {
LOG_WARN("failed to init new datum row", K(ret));
} else if (OB_FAIL(set_lob_piece_row(serialize_buf, 32, new_row, &single_iter, in_row))) {
LOG_WARN("failed to set insert piece row.", K(ret), K(in_row));
} else if (OB_FAIL(oas->insert_rows(param.ls_id_,
lob_piece_tablet.get_obj()->get_tablet_meta().tablet_id_,
@ -604,15 +602,14 @@ int ObPersistentLobApator::update_lob_piece_tablet(ObLobAccessParam& param, ObLo
// construct insert data
int64_t affected_rows = 0;
ObObj cell[ObLobPieceUtil::LOB_PIECE_COLUMN_CNT];
char serialize_buf[32] = {0};
// make insert iterator
ObNewRow new_row;
ObDatumRow new_row;
blocksstable::ObSingleDatumRowIteratorWrapper single_iter;
common::ObSingleRowIteratorWrapper single_iter;
single_iter.set_row(&new_row);
if (OB_FAIL(set_lob_piece_row(serialize_buf, 32, cell, new_row, &single_iter, in_row))) {
if (OB_FAIL(new_row.init(ObLobPieceUtil::LOB_PIECE_COLUMN_CNT))) {
LOG_WARN("failed to init new datum row", K(ret));
} else if (OB_FAIL(set_lob_piece_row(serialize_buf, 32, new_row, &single_iter, in_row))) {
LOG_WARN("failed to set insert piece row.", K(ret), K(in_row));
} else if (OB_FAIL(oas->update_rows(param.ls_id_,
lob_piece_tablet.get_obj()->get_tablet_meta().tablet_id_,
@ -824,43 +821,32 @@ int ObPersistentLobApator::inner_get_tablet(
}
void ObPersistentLobApator::set_lob_meta_row(
ObObj* cell,
ObNewRow& new_row,
blocksstable::ObDatumRow& datum_row,
ObLobMetaInfo& in_row)
{
for (int64_t i = 0; i < ObLobMetaUtil::LOB_META_COLUMN_CNT; ++i) {
cell[i].reset();
cell[i].set_nop_value();
}
cell[ObLobMetaUtil::LOB_ID_COL_ID].set_varchar(reinterpret_cast<char*>(&in_row.lob_id_), sizeof(ObLobId));
cell[ObLobMetaUtil::LOB_ID_COL_ID].set_collation_type(common::ObCollationType::CS_TYPE_BINARY);
cell[ObLobMetaUtil::SEQ_ID_COL_ID].set_varchar(in_row.seq_id_);
cell[ObLobMetaUtil::SEQ_ID_COL_ID].set_collation_type(common::ObCollationType::CS_TYPE_BINARY);
cell[ObLobMetaUtil::BYTE_LEN_COL_ID].set_uint32(in_row.byte_len_);
cell[ObLobMetaUtil::CHAR_LEN_COL_ID].set_uint32(in_row.char_len_);
cell[ObLobMetaUtil::PIECE_ID_COL_ID].set_uint64(in_row.piece_id_);
cell[ObLobMetaUtil::LOB_DATA_COL_ID].set_varchar(in_row.lob_data_);
cell[ObLobMetaUtil::LOB_DATA_COL_ID].set_collation_type(common::ObCollationType::CS_TYPE_BINARY);
new_row.assign(cell, ObLobMetaUtil::LOB_META_COLUMN_CNT);
datum_row.reuse();
datum_row.storage_datums_[ObLobMetaUtil::LOB_ID_COL_ID].set_string(reinterpret_cast<char*>(&in_row.lob_id_), sizeof(ObLobId));
// TODO: if we need set collation type to be common::ObCollationType::CS_TYPE_BINARY@xuanxi
datum_row.storage_datums_[ObLobMetaUtil::SEQ_ID_COL_ID].set_string(in_row.seq_id_);
// TODO: if we need set collation type to be common::ObCollationType::CS_TYPE_BINARY@xuanxi
datum_row.storage_datums_[ObLobMetaUtil::BYTE_LEN_COL_ID].set_uint32(in_row.byte_len_);
datum_row.storage_datums_[ObLobMetaUtil::CHAR_LEN_COL_ID].set_uint32(in_row.char_len_);
datum_row.storage_datums_[ObLobMetaUtil::PIECE_ID_COL_ID].set_uint(in_row.piece_id_);
datum_row.storage_datums_[ObLobMetaUtil::LOB_DATA_COL_ID].set_string(in_row.lob_data_);
// TODO: if we need set collation type to be common::ObCollationType::CS_TYPE_BINARY@xuanxi
}
int ObPersistentLobApator::set_lob_piece_row(
char* buf,
size_t buf_len,
ObObj* cell,
ObNewRow& new_row,
common::ObSingleRowIteratorWrapper* new_row_iter,
ObDatumRow& datum_row,
blocksstable::ObSingleDatumRowIteratorWrapper* new_row_iter,
ObLobPieceInfo& in_row)
{
int ret = OB_SUCCESS;
for (int64_t i = 0; i < ObLobPieceUtil::LOB_PIECE_COLUMN_CNT; ++i) {
cell[i].reset();
cell[i].set_nop_value();
}
cell[0].set_uint64(in_row.piece_id_);
cell[1].set_uint32(in_row.len_);
datum_row.reuse();
datum_row.storage_datums_[0].set_uint(in_row.piece_id_);
datum_row.storage_datums_[1].set_uint32(in_row.len_);
int64_t pos = 0;
if (!in_row.macro_id_.is_valid()) {
@ -868,11 +854,9 @@ int ObPersistentLobApator::set_lob_piece_row(
} else if (OB_FAIL(in_row.macro_id_.serialize(buf, buf_len, pos))) {
LOG_WARN("failed to serialize macro id", K(ret), K(buf_len), K(pos));
} else {
cell[2].set_varchar(buf, pos);
cell[2].set_collation_type(common::ObCollationType::CS_TYPE_BINARY);
new_row.assign(cell, ObLobPieceUtil::LOB_PIECE_COLUMN_CNT);
new_row_iter->set_row(&new_row);
datum_row.storage_datums_[2].set_string(buf, pos);
// TODO: if we need set collation type to be common::ObCollationType::CS_TYPE_BINARY@xuanxi
new_row_iter->set_row(&datum_row);
}
return ret;
@ -928,20 +912,20 @@ int ObPersistentLobApator::do_scan_lob_meta(
ObTabletHandle lob_meta_tablet;
ObTabletHandle lob_piece_tablet;
if (OB_FAIL(get_lob_tablets(param, data_tablet, lob_meta_tablet, lob_piece_tablet))) {
LOG_WARN("failed to get tablets.", K(ret), K(param));
LOG_WARN("failed to get tablets", K(ret), K(param));
} else {
ObAccessService *oas = MTL(ObAccessService*);
scan_param.tablet_id_ = param.lob_meta_tablet_id_;
scan_param.schema_version_ = lob_meta_tablet.get_obj()->get_tablet_meta().max_sync_storage_schema_version_;
if (OB_ISNULL(oas)) {
ret = OB_ERR_INTERVAL_INVALID;
LOG_WARN("get access service failed.", K(ret));
LOG_WARN("get access service failed", K(ret));
} else if (OB_FAIL(build_common_scan_param(param, param.has_single_chunk(), ObLobMetaUtil::LOB_META_COLUMN_CNT, scan_param))) {
LOG_WARN("build common scan param failed.", K(ret), K(param));
LOG_WARN("build common scan param failed", K(ret), K(param));
} else if (OB_FAIL(prepare_table_param(param, scan_param, true/*is_meta*/))) {
LOG_WARN("prepare lob meta table param failed.", K(ret), K(param));
LOG_WARN("prepare lob meta table param failed", K(ret), K(param));
} else if (OB_FAIL(oas->table_scan(scan_param, meta_iter))) {
LOG_WARN("do table scan falied.", K(ret), K(scan_param), K(param));
LOG_WARN("do table scan falied", K(ret), K(scan_param), K(param));
}
}
return ret;
@ -967,7 +951,7 @@ int ObPersistentLobApator::scan_lob_meta(
} else if (OB_FAIL(param.get_rowkey_range(rowkey_objs, range))) {
LOG_WARN("get_rowkey_range fail", K(ret));
} else if (OB_FAIL(scan_param.key_ranges_.push_back(range))) {
LOG_WARN("failed to push key range.", K(ret), K(scan_param), K(range));
LOG_WARN("failed to push key range", K(ret), K(scan_param), K(range));
} else if (OB_FAIL(do_scan_lob_meta(param, scan_param, meta_iter))) {
LOG_WARN("do_scan_lob_meta fail", K(ret));
}
@ -1004,28 +988,28 @@ int ObPersistentLobApator::set_dml_seq_no(ObLobAccessParam &param)
LOG_DEBUG("dml lob meta with seq no", K(param.dml_base_param_->spec_seq_no_));
} else {
ret = OB_INVALID_ARGUMENT;
LOG_WARN("failed to get seq no from param.", K(ret), K(param));
LOG_WARN("failed to get seq no from param", K(ret), K(param));
}
} else {
ret = OB_INVALID_ARGUMENT;
LOG_WARN("invalid seq no from param.", K(ret), K(param));
LOG_WARN("invalid seq no from param", K(ret), K(param));
}
return ret;
}
int ObPersistentLobApator::erase_lob_meta(ObLobAccessParam &param, ObNewRowIterator& row_iter)
int ObPersistentLobApator::erase_lob_meta(ObLobAccessParam &param, ObDatumRowIterator& row_iter)
{
int ret = OB_SUCCESS;
int64_t affected_rows = 0;
ObAccessService *oas = MTL(ObAccessService*);
if (OB_ISNULL(oas)) {
ret = OB_ERR_INTERVAL_INVALID;
LOG_WARN("get access service failed.", K(ret), KP(oas));
LOG_WARN("get access service failed", K(ret), KP(oas));
} else if (OB_ISNULL(param.tx_desc_)) {
ret = OB_ERR_NULL_VALUE;
LOG_WARN("get tx desc null.", K(ret), K(param));
LOG_WARN("get tx desc null", K(ret), K(param));
} else if (OB_FAIL(prepare_lob_tablet_id(param))) {
LOG_WARN("failed to get tablets.", K(ret), K(param));
LOG_WARN("failed to get tablets", K(ret), K(param));
} else if (OB_FAIL(prepare_lob_meta_dml(param))) {
LOG_WARN("failed to prepare lob meta dml", K(ret));
} else if (OB_FAIL(oas->delete_rows(
@ -1041,19 +1025,19 @@ int ObPersistentLobApator::erase_lob_meta(ObLobAccessParam &param, ObNewRowItera
return ret;
}
int ObPersistentLobApator::write_lob_meta(ObLobAccessParam& param, ObNewRowIterator& row_iter)
int ObPersistentLobApator::write_lob_meta(ObLobAccessParam& param, ObDatumRowIterator& row_iter)
{
int ret = OB_SUCCESS;
int64_t affected_rows = 0;
ObAccessService *oas = MTL(ObAccessService*);
if (OB_ISNULL(oas)) {
ret = OB_ERR_INTERVAL_INVALID;
LOG_WARN("get access service failed.", K(ret), KP(oas));
LOG_WARN("get access service failed", K(ret), KP(oas));
} else if (OB_ISNULL(param.tx_desc_)) {
ret = OB_ERR_NULL_VALUE;
LOG_WARN("get tx desc null.", K(ret), K(param));
LOG_WARN("get tx desc null", K(ret), K(param));
} else if (OB_FAIL(prepare_lob_tablet_id(param))) {
LOG_WARN("failed to get tablets.", K(ret), K(param));
LOG_WARN("failed to get tablets", K(ret), K(param));
} else if (OB_FAIL(prepare_lob_meta_dml(param))) {
LOG_WARN("failed to prepare lob meta dml", K(ret));
} else if (OB_FAIL(oas->insert_rows(
@ -1069,26 +1053,26 @@ int ObPersistentLobApator::write_lob_meta(ObLobAccessParam& param, ObNewRowItera
return ret;
}
int ObPersistentLobApator::update_lob_meta(ObLobAccessParam& param, ObNewRowIterator &row_iter)
int ObPersistentLobApator::update_lob_meta(ObLobAccessParam& param, ObDatumRowIterator &row_iter)
{
int ret = OB_SUCCESS;
int64_t affected_rows = 0;
ObAccessService *oas = MTL(ObAccessService*);
if (OB_ISNULL(oas)) {
ret = OB_ERR_INTERVAL_INVALID;
LOG_WARN("get access service failed.", K(ret), KP(oas));
LOG_WARN("get access service failed", K(ret), KP(oas));
} else if (OB_ISNULL(param.tx_desc_)) {
ret = OB_ERR_NULL_VALUE;
LOG_WARN("get tx desc null.", K(ret), K(param));
LOG_WARN("get tx desc null", K(ret), K(param));
} else if (OB_FAIL(prepare_lob_tablet_id(param))) {
LOG_WARN("failed to get tablets.", K(ret), K(param));
LOG_WARN("failed to get tablets", K(ret), K(param));
} else if (OB_FAIL(prepare_lob_meta_dml(param))) {
LOG_WARN("failed to prepare lob meta dml", K(ret));
} else {
ObSEArray<uint64_t, 6> update_column_ids;
for (int i = 2; OB_SUCC(ret) && i < ObLobMetaUtil::LOB_META_COLUMN_CNT; ++i) {
if (OB_FAIL(update_column_ids.push_back(OB_APP_MIN_COLUMN_ID + i))) {
LOG_WARN("push column ids failed.", K(ret), K(i));
LOG_WARN("push column ids failed", K(ret), K(i));
}
}
if (OB_FAIL(ret)) {
@ -1110,11 +1094,12 @@ int ObPersistentLobApator::update_lob_meta(ObLobAccessParam& param, ObNewRowIter
int ObPersistentLobApator::write_lob_meta(ObLobAccessParam &param, ObLobMetaInfo& row_info)
{
int ret = OB_SUCCESS;
ObObj cell[ObLobMetaUtil::LOB_META_COLUMN_CNT];
ObNewRow new_row;
ObDatumRow new_row;
ObLobPersistInsertSingleRowIter single_iter;
set_lob_meta_row(cell, new_row, row_info);
if (OB_FAIL(single_iter.init(&param, &new_row))) {
if (OB_FAIL(new_row.init(ObLobMetaUtil::LOB_META_COLUMN_CNT))) {
LOG_WARN("failed to init datum row", K(ret));
} else if (FALSE_IT(set_lob_meta_row(new_row, row_info))) {
} else if (OB_FAIL(single_iter.init(&param, &new_row))) {
LOG_WARN("single_iter init fail", K(ret));
} else if (OB_FAIL(write_lob_meta(param, single_iter))) {
LOG_WARN("write_lob_meta fail", K(ret));
@ -1125,11 +1110,12 @@ int ObPersistentLobApator::write_lob_meta(ObLobAccessParam &param, ObLobMetaInfo
int ObPersistentLobApator::erase_lob_meta(ObLobAccessParam &param, ObLobMetaInfo& row_info)
{
int ret = OB_SUCCESS;
ObObj cell[ObLobMetaUtil::LOB_META_COLUMN_CNT];
ObNewRow new_row;
ObDatumRow new_row;
ObLobPersistDeleteSingleRowIter single_iter;
set_lob_meta_row(cell, new_row, row_info);
if (OB_FAIL(single_iter.init(&param, &new_row))) {
if (OB_FAIL(new_row.init(ObLobMetaUtil::LOB_META_COLUMN_CNT))) {
LOG_WARN("failed to init datum row", K(ret));
} else if (FALSE_IT(set_lob_meta_row(new_row, row_info))) {
} else if (OB_FAIL(single_iter.init(&param, &new_row))) {
LOG_WARN("single_iter init fail", K(ret));
} else if (OB_FAIL(erase_lob_meta(param, single_iter))) {
LOG_WARN("erase_lob_meta fail", K(ret));
@ -1140,14 +1126,16 @@ int ObPersistentLobApator::erase_lob_meta(ObLobAccessParam &param, ObLobMetaInfo
int ObPersistentLobApator::update_lob_meta(ObLobAccessParam& param, ObLobMetaInfo& old_row, ObLobMetaInfo& new_row)
{
int ret = OB_SUCCESS;
ObObj new_row_cell[ObLobMetaUtil::LOB_META_COLUMN_CNT];
ObNewRow new_tbl_row;
set_lob_meta_row(new_row_cell, new_tbl_row, new_row);
ObObj old_row_cell[ObLobMetaUtil::LOB_META_COLUMN_CNT];
ObNewRow old_tbl_row;
set_lob_meta_row(old_row_cell, old_tbl_row, old_row);
ObDatumRow new_datum_row;
ObDatumRow old_datum_row;
ObLobPersistUpdateSingleRowIter upd_iter;
if (OB_FAIL(upd_iter.init(&param, &old_tbl_row, &new_tbl_row))) {
if (OB_FAIL(new_datum_row.init(ObLobMetaUtil::LOB_META_COLUMN_CNT))) {
LOG_WARN("failed to init new datum row", K(ret));
} else if (OB_FAIL(old_datum_row.init(ObLobMetaUtil::LOB_META_COLUMN_CNT))) {
LOG_WARN("failed to init old datum row", K(ret));
} else if (FALSE_IT(set_lob_meta_row(new_datum_row, new_row))) {
} else if (FALSE_IT(set_lob_meta_row(old_datum_row, old_row))) {
} else if (OB_FAIL(upd_iter.init(&param, &old_datum_row, &new_datum_row))) {
LOG_WARN("upd_iter init fail", K(ret));
} else if (OB_FAIL(update_lob_meta(param, upd_iter))) {
LOG_WARN("update_lob_meta fail", K(ret));

View File

@ -17,6 +17,7 @@
#include "storage/blocksstable/ob_macro_block_id.h"
#include "ob_i_lob_adaptor.h"
#include "common/row/ob_row_iterator.h"
#include "storage/blocksstable/ob_datum_row_iterator.h"
namespace oceanbase
{
@ -25,22 +26,20 @@ namespace storage
class ObStoreCtxGuard;
class ObLobUpdIterator : public ObNewRowIterator
class ObLobUpdIterator : public blocksstable::ObDatumRowIterator
{
public:
ObLobUpdIterator(ObNewRow *old_row,
ObNewRow *new_row)
ObLobUpdIterator(blocksstable::ObDatumRow *old_row,
blocksstable::ObDatumRow *new_row)
: old_row_(old_row),
new_row_(new_row),
got_old_row_(false),
is_iter_end_(false)
{}
virtual int get_next_row(ObNewRow *&row) override;
virtual int get_next_row() override { return OB_NOT_IMPLEMENT; }
virtual void reset() override {}
virtual int get_next_row(blocksstable::ObDatumRow *&row) override;
private:
ObNewRow *old_row_;
ObNewRow *new_row_;
blocksstable::ObDatumRow *old_row_;
blocksstable::ObDatumRow *new_row_;
bool got_old_row_;
bool is_iter_end_;
};
@ -94,13 +93,12 @@ public:
virtual int update_lob_meta(ObLobAccessParam& param, ObLobMetaInfo& old_row, ObLobMetaInfo& new_row) override;
static void set_lob_meta_row(
ObObj* cell,
ObNewRow& new_row,
blocksstable::ObDatumRow& datum_row,
ObLobMetaInfo& in_row);
int write_lob_meta(ObLobAccessParam &param, ObNewRowIterator& row_iter);
int erase_lob_meta(ObLobAccessParam &param, ObNewRowIterator& row_iter);
int update_lob_meta(ObLobAccessParam& param, ObNewRowIterator &row_iter);
int write_lob_meta(ObLobAccessParam &param, blocksstable::ObDatumRowIterator& row_iter);
int erase_lob_meta(ObLobAccessParam &param, blocksstable::ObDatumRowIterator& row_iter);
int update_lob_meta(ObLobAccessParam& param, blocksstable::ObDatumRowIterator &row_iter);
int build_common_scan_param(
const ObLobAccessParam &param,
@ -159,9 +157,8 @@ private:
int set_lob_piece_row(
char* buf,
size_t buf_len,
ObObj* cell,
ObNewRow& new_row,
common::ObSingleRowIteratorWrapper* new_row_iter,
blocksstable::ObDatumRow& datum_row,
blocksstable::ObSingleDatumRowIteratorWrapper* new_row_iter,
ObLobPieceInfo& in_row);
int init_table_param();

View File

@ -65,7 +65,7 @@ int ObLobPersistWriteIter::dec_lob_size(ObLobMetaInfo &info)
return ret;
}
int ObLobPersistUpdateSingleRowIter::init(ObLobAccessParam *param, ObNewRow *old_row, ObNewRow *new_row)
int ObLobPersistUpdateSingleRowIter::init(ObLobAccessParam *param, blocksstable::ObDatumRow *old_row, blocksstable::ObDatumRow *new_row)
{
int ret = OB_SUCCESS;
if (OB_ISNULL(param) || OB_ISNULL(old_row) || OB_ISNULL(new_row)) {
@ -79,7 +79,7 @@ int ObLobPersistUpdateSingleRowIter::init(ObLobAccessParam *param, ObNewRow *old
return ret;
}
int ObLobPersistUpdateSingleRowIter::get_next_row(ObNewRow *&row)
int ObLobPersistUpdateSingleRowIter::get_next_row(blocksstable::ObDatumRow *&row)
{
int ret = OB_SUCCESS;
if (OB_ISNULL(old_row_) || OB_ISNULL(new_row_)) {
@ -100,7 +100,7 @@ int ObLobPersistUpdateSingleRowIter::get_next_row(ObNewRow *&row)
return ret;
}
int ObLobPersistInsertSingleRowIter::init(ObLobAccessParam *param, ObNewRow *row)
int ObLobPersistInsertSingleRowIter::init(ObLobAccessParam *param, blocksstable::ObDatumRow *row)
{
int ret = OB_SUCCESS;
if (OB_ISNULL(param) || OB_ISNULL(row)) {
@ -113,7 +113,7 @@ int ObLobPersistInsertSingleRowIter::init(ObLobAccessParam *param, ObNewRow *row
return ret;
}
int ObLobPersistInsertSingleRowIter::get_next_row(ObNewRow *&row)
int ObLobPersistInsertSingleRowIter::get_next_row(blocksstable::ObDatumRow *&row)
{
int ret = OB_SUCCESS;
if (OB_ISNULL(param_) || OB_ISNULL(row_)) {
@ -130,7 +130,7 @@ int ObLobPersistInsertSingleRowIter::get_next_row(ObNewRow *&row)
return ret;
}
int ObLobPersistDeleteSingleRowIter::init(ObLobAccessParam *param, ObNewRow *row)
int ObLobPersistDeleteSingleRowIter::init(ObLobAccessParam *param, blocksstable::ObDatumRow *row)
{
int ret = OB_SUCCESS;
if (OB_ISNULL(param) || OB_ISNULL(row)) {
@ -143,7 +143,7 @@ int ObLobPersistDeleteSingleRowIter::init(ObLobAccessParam *param, ObNewRow *row
return ret;
}
int ObLobPersistDeleteSingleRowIter::get_next_row(ObNewRow *&row)
int ObLobPersistDeleteSingleRowIter::get_next_row(blocksstable::ObDatumRow *&row)
{
int ret = OB_SUCCESS;
if (OB_ISNULL(param_) || OB_ISNULL(row_)) {
@ -166,6 +166,8 @@ int ObLobPersistInsertIter::init(ObLobAccessParam *param, ObLobMetaWriteIter *me
if (OB_ISNULL(param) || OB_ISNULL(meta_iter)) {
ret = OB_INVALID_ARGUMENT;
LOG_WARN("param or meta_iter is null", K(ret), KP(param), KP(meta_iter));
} else if (OB_FAIL(new_row_.init(ObLobMetaUtil::LOB_META_COLUMN_CNT))) {
LOG_WARN("init new datum row failed", K(ret));
} else {
param_ = param;
meta_iter_ = meta_iter;
@ -173,7 +175,7 @@ int ObLobPersistInsertIter::init(ObLobAccessParam *param, ObLobMetaWriteIter *me
return ret;
}
int ObLobPersistInsertIter::get_next_row(ObNewRow *&row)
int ObLobPersistInsertIter::get_next_row(blocksstable::ObDatumRow *&row)
{
int ret = OB_SUCCESS;
if (OB_FAIL(meta_iter_->get_next_row(result_))) {
@ -188,7 +190,7 @@ int ObLobPersistInsertIter::get_next_row(ObNewRow *&row)
} else if (OB_FAIL(inc_lob_size(result_.info_))) {
LOG_WARN("inc_lob_size fail", K(ret));
} else {
ObPersistentLobApator::set_lob_meta_row(row_cell_, new_row_, result_.info_);
ObPersistentLobApator::set_lob_meta_row(new_row_, result_.info_);
row = &new_row_;
}
return ret;
@ -200,6 +202,8 @@ int ObLobPersistDeleteIter::init(ObLobAccessParam *param, ObLobMetaScanIter *met
if (OB_ISNULL(param) || OB_ISNULL(meta_iter)) {
ret = OB_INVALID_ARGUMENT;
LOG_WARN("param or meta_iter is null", K(ret), KP(param), KP(meta_iter));
} else if (OB_FAIL(new_row_.init(ObLobMetaUtil::LOB_META_COLUMN_CNT))) {
LOG_WARN("init new datum row failed", K(ret));
} else {
param_ = param;
meta_iter_ = meta_iter;
@ -207,7 +211,7 @@ int ObLobPersistDeleteIter::init(ObLobAccessParam *param, ObLobMetaScanIter *met
return ret;
}
int ObLobPersistDeleteIter::get_next_row(ObNewRow *&row)
int ObLobPersistDeleteIter::get_next_row(blocksstable::ObDatumRow *&row)
{
int ret = OB_SUCCESS;
if (OB_FAIL(meta_iter_->get_next_row(result_))) {
@ -221,7 +225,7 @@ int ObLobPersistDeleteIter::get_next_row(ObNewRow *&row)
} else if (OB_FAIL(dec_lob_size(result_.info_))) {
LOG_WARN("dec_lob_size fail", K(ret));
} else {
ObPersistentLobApator::set_lob_meta_row(row_cell_, new_row_, result_.info_);
ObPersistentLobApator::set_lob_meta_row(new_row_, result_.info_);
row = &new_row_;
}
return ret;

View File

@ -12,19 +12,22 @@
#ifndef OCEABASE_STORAGE_OB_LOB_PERSISTENT_ITERATOR_
#define OCEABASE_STORAGE_OB_LOB_PERSISTENT_ITERATOR_
#include "storage/blocksstable/ob_datum_row_iterator.h"
#include "storage/lob/ob_lob_util.h"
#include "storage/lob/ob_lob_meta.h"
namespace oceanbase
{
namespace storage
{
class ObLobPersistWriteIter : public ObNewRowIterator
class ObLobPersistWriteIter : public blocksstable::ObDatumRowIterator
{
public:
ObLobPersistWriteIter(): param_(nullptr) {}
virtual ~ObLobPersistWriteIter() {}
virtual int get_next_row() override { return OB_NOT_IMPLEMENT; }
virtual int get_next_row(blocksstable::ObDatumRow *&row) override { return OB_NOT_IMPLEMENT; }
protected:
int update_seq_no();
@ -44,10 +47,10 @@ public:
row_(nullptr),
iter_end_(false)
{}
int init(ObLobAccessParam *param, ObNewRow *row);
int init(ObLobAccessParam *param, blocksstable::ObDatumRow *row);
virtual ~ObLobPersistInsertSingleRowIter() {}
virtual int get_next_row(ObNewRow *&row);
virtual int get_next_row(blocksstable::ObDatumRow *&row);
virtual void reset() { iter_end_ = false; }
private:
@ -55,7 +58,7 @@ private:
DISALLOW_COPY_AND_ASSIGN(ObLobPersistInsertSingleRowIter);
private:
// data members
ObNewRow *row_;
blocksstable::ObDatumRow *row_;
bool iter_end_;
};
@ -67,10 +70,10 @@ public:
row_(nullptr),
iter_end_(false)
{}
int init(ObLobAccessParam *param, ObNewRow *row);
int init(ObLobAccessParam *param, blocksstable::ObDatumRow *row);
virtual ~ObLobPersistDeleteSingleRowIter() {}
virtual int get_next_row(ObNewRow *&row);
virtual int get_next_row(blocksstable::ObDatumRow *&row);
virtual void reset() { iter_end_ = false; }
private:
@ -78,7 +81,7 @@ private:
DISALLOW_COPY_AND_ASSIGN(ObLobPersistDeleteSingleRowIter);
private:
// data members
ObNewRow *row_;
blocksstable::ObDatumRow *row_;
bool iter_end_;
};
@ -94,9 +97,9 @@ public:
virtual ~ObLobPersistUpdateSingleRowIter() {}
int init(ObLobAccessParam *param, ObNewRow *old_row, ObNewRow *new_row);
int init(ObLobAccessParam *param, blocksstable::ObDatumRow *old_row, blocksstable::ObDatumRow *new_row);
virtual int get_next_row(ObNewRow *&row) override;
virtual int get_next_row(blocksstable::ObDatumRow *&row) override;
virtual void reset() override {}
private:
@ -104,8 +107,8 @@ private:
DISALLOW_COPY_AND_ASSIGN(ObLobPersistUpdateSingleRowIter);
private:
ObNewRow *old_row_;
ObNewRow *new_row_;
blocksstable::ObDatumRow *old_row_;
blocksstable::ObDatumRow *new_row_;
bool got_old_row_;
bool is_iter_end_;
};
@ -114,10 +117,10 @@ private:
class ObLobPersistInsertIter: public ObLobPersistWriteIter
{
public:
ObLobPersistInsertIter() : meta_iter_(nullptr), new_row_(), row_cell_(), result_() {}
ObLobPersistInsertIter() : meta_iter_(nullptr), new_row_(), result_() {}
int init(ObLobAccessParam *param, ObLobMetaWriteIter *meta_iter);
virtual ~ObLobPersistInsertIter() {}
virtual int get_next_row(ObNewRow *&row);
virtual int get_next_row(blocksstable::ObDatumRow *&row);
virtual void reset() { new_row_.reset(); }
private:
@ -126,8 +129,7 @@ private:
private:
// data members
ObLobMetaWriteIter *meta_iter_;
ObNewRow new_row_;
ObObj row_cell_[ObLobMetaUtil::LOB_META_COLUMN_CNT];
blocksstable::ObDatumRow new_row_;
ObLobMetaWriteResult result_;
};
@ -135,10 +137,10 @@ private:
class ObLobPersistDeleteIter: public ObLobPersistWriteIter
{
public:
ObLobPersistDeleteIter() : meta_iter_(nullptr), new_row_(), row_cell_(), result_() {}
ObLobPersistDeleteIter() : meta_iter_(nullptr), new_row_(), result_() {}
int init(ObLobAccessParam *param, ObLobMetaScanIter *meta_iter);
virtual ~ObLobPersistDeleteIter() {}
virtual int get_next_row(ObNewRow *&row);
virtual int get_next_row(blocksstable::ObDatumRow *&row);
virtual void reset() { new_row_.reset(); }
@ -148,8 +150,7 @@ private:
private:
// data members
ObLobMetaScanIter *meta_iter_;
ObNewRow new_row_;
ObObj row_cell_[ObLobMetaUtil::LOB_META_COLUMN_CNT];
blocksstable::ObDatumRow new_row_;
ObLobMetaScanResult result_;
};

File diff suppressed because it is too large Load Diff

View File

@ -33,6 +33,7 @@
#include "storage/tablet/ob_tablet_persister.h"
#include "storage/lob/ob_lob_manager.h"
#include "storage/multi_data_source/mds_table_mgr.h"
#include "storage/blocksstable/ob_datum_row_iterator.h"
namespace oceanbase
{
@ -57,12 +58,18 @@ namespace blocksstable
{
class ObMigrationSSTableParam;
struct ObDatumRowkey;
class ObDatumRowStore;
}
namespace compaction
{
class ObTabletMergeCtx;
}
namespace sql
{
class ObDASDMLIterator;
class ObDASUpdIterator;
}
namespace storage
{
@ -317,7 +324,7 @@ public:
ObStoreCtx &ctx,
const ObDMLBaseParam &dml_param,
const common::ObIArray<uint64_t> &column_ids,
common::ObNewRowIterator *row_iter,
blocksstable::ObDatumRowIterator *row_iter,
int64_t &affected_rows);
int insert_row(
ObTabletHandle &tablet_handle,
@ -325,31 +332,31 @@ public:
const ObDMLBaseParam &dml_param,
const common::ObIArray<uint64_t> &column_ids,
const common::ObIArray<uint64_t> &duplicated_column_ids,
const common::ObNewRow &row,
blocksstable::ObDatumRow &row,
const ObInsertFlag flag,
int64_t &affected_rows,
common::ObNewRowIterator *&duplicated_rows);
blocksstable::ObDatumRowIterator *&duplicated_rows);
int update_rows(
ObTabletHandle &tablet_handle,
ObStoreCtx &ctx,
const ObDMLBaseParam &dml_param,
const ObIArray<uint64_t> &column_ids,
const ObIArray< uint64_t> &updated_column_ids,
ObNewRowIterator *row_iter,
blocksstable::ObDatumRowIterator *row_iter,
int64_t &affected_rows);
int put_rows(
ObTabletHandle &tablet_handle,
ObStoreCtx &ctx,
const ObDMLBaseParam &dml_param,
const ObIArray<uint64_t> &column_ids,
ObNewRowIterator *row_iter,
ObDatumRowIterator *row_iter,
int64_t &affected_rows); // for htable, insert or update
int delete_rows(
ObTabletHandle &tablet_handle,
ObStoreCtx &ctx,
const ObDMLBaseParam &dml_param,
const ObIArray<uint64_t> &column_ids,
ObNewRowIterator *row_iter,
blocksstable::ObDatumRowIterator *row_iter,
int64_t &affected_rows);
int lock_rows(
ObTabletHandle &tablet_handle,
@ -357,13 +364,13 @@ public:
const ObDMLBaseParam &dml_param,
const ObLockFlag lock_flag,
const bool is_sfu,
ObNewRowIterator *row_iter,
blocksstable::ObDatumRowIterator *row_iter,
int64_t &affected_rows);
int lock_row(
ObTabletHandle &tablet_handle,
ObStoreCtx &ctx,
const ObDMLBaseParam &dml_param,
const ObNewRow &row,
blocksstable::ObDatumRow &row,
const ObLockFlag lock_flag,
const bool is_sfu);
int get_multi_ranges_cost(
@ -553,7 +560,7 @@ private:
int offline_build_tablet_without_memtable_();
int offline_gc_tablet_for_create_or_transfer_in_abort_();
int offline_destroy_memtable_and_mds_table_();
int mock_duplicated_rows_(common::ObNewRowIterator *&duplicated_rows);
int mock_duplicated_rows_(blocksstable::ObDatumRowIterator *&duplicated_rows);
private:
static int check_real_leader_for_4377_(const ObLSID ls_id);
static int check_need_rollback_in_transfer_for_4377_(const transaction::ObTxDesc *tx_desc,
@ -562,50 +569,42 @@ private:
static int build_create_sstable_param_for_migration(
const blocksstable::ObMigrationSSTableParam &migrate_sstable_param,
ObTabletCreateSSTableParam &create_sstable_param);
static int need_check_old_row_legitimacy(
ObDMLRunningCtx &run_ctx,
bool &need_check,
bool &is_udf);
static int construct_table_rows(
const ObNewRow *rows,
ObStoreRow *tbl_rows,
int64_t row_count);
static int check_old_row_legitimacy(
const blocksstable::ObStoreCmpFuncs &cmp_funcs,
ObTabletHandle &data_tablet_handle,
ObDMLRunningCtx &run_ctx,
const common::ObNewRow &old_row);
blocksstable::ObDatumRow &old_row);
static int check_new_row_legitimacy(
ObDMLRunningCtx &run_ctx,
const common::ObNewRow &new_row);
const blocksstable::ObDatumRow &datum_row);
static int insert_rows_to_tablet(
ObTabletHandle &tablet_handle,
ObDMLRunningCtx &run_ctx,
const common::ObNewRow *const rows,
blocksstable::ObDatumRow *rows,
const int64_t row_count,
ObRowsInfo &rows_info,
storage::ObStoreRow *tbl_rows,
int64_t &afct_num,
int64_t &dup_num);
static int insert_tablet_rows(
const int64_t row_count,
ObTabletHandle &tablet_handle,
ObDMLRunningCtx &run_ctx,
ObStoreRow *rows,
blocksstable::ObDatumRow *rows,
ObRowsInfo &rows_info);
static int insert_lob_col(
ObDMLRunningCtx &run_ctx,
const ObColDesc &column,
ObObj &obj,
blocksstable::ObStorageDatum &datum,
ObLobAccessParam *del_param,
ObLobCommon *lob_common);
static int insert_lob_tablet_row(
ObTabletHandle &data_tablet,
ObDMLRunningCtx &run_ctx,
ObStoreRow &row);
blocksstable::ObDatumRow &datum_row);
static int insert_lob_tablet_rows(
ObTabletHandle &data_tablet,
ObDMLRunningCtx &run_ctx,
ObStoreRow *rows,
blocksstable::ObDatumRow *rows,
int64_t row_count);
static int extract_rowkey(
const ObRelativeTable &table,
@ -620,8 +619,8 @@ private:
const int64_t buffer_len,
const common::ObTimeZoneInfo *tz_info = nullptr);
static int get_next_rows(
ObNewRowIterator *row_iter,
ObNewRow *&rows,
blocksstable::ObDatumRowIterator *row_iter,
blocksstable::ObDatumRow *&rows,
int64_t &row_count);
static int construct_update_idx(
const int64_t schema_rowkey_cnt,
@ -634,19 +633,21 @@ private:
bool &rowkey_change,
bool &delay_new);
static int check_rowkey_value_change(
const common::ObNewRow &old_row,
const common::ObNewRow &new_row,
const ObDatumRow &old_row,
const ObDatumRow &new_row,
const int64_t rowkey_len,
const blocksstable::ObStorageDatumUtils &rowkey_datum_utils,
bool &rowkey_change);
static int process_delta_lob(
ObDMLRunningCtx &run_ctx,
const ObColDesc &column,
ObObj &old_obj,
ObStorageDatum &old_datum,
ObLobLocatorV2 &delta_lob,
ObObj &obj);
ObStorageDatum &datum);
static int register_ext_info_commit_cb(
ObDMLRunningCtx &run_ctx,
ObObj &col_data,
ObStorageDatum &col_data,
ObObjType type,
ObObj &ext_info_data);
static int set_lob_storage_params(
ObDMLRunningCtx &run_ctx,
@ -658,9 +659,8 @@ private:
ObDMLRunningCtx &run_ctx,
const ObIArray<int64_t> &update_idx,
bool data_tbl_rowkey_change,
ObStoreRow &old_sql_row,
ObStoreRow &old_row,
ObStoreRow &new_row);
ObDatumRow &old_row,
ObDatumRow &new_row);
static int update_row_to_tablet(
ObTabletHandle &tablet_handle,
ObDMLRunningCtx &run_ctx,
@ -668,42 +668,39 @@ private:
const ObIArray<int64_t> &update_idx,
const bool delay_new,
const bool lob_update,
ObStoreRow &old_tbl_row,
ObStoreRow &new_tbl_row,
ObRowStore *row_store,
ObDatumRow &old_row,
ObDatumRow &new_row,
ObDatumRowStore *row_store,
bool &duplicate);
static int process_old_row(
ObTabletHandle &tablet_handle,
ObDMLRunningCtx &run_ctx,
const bool data_tbl_rowkey_change,
const bool lob_update,
ObStoreRow &tbl_row);
ObDatumRow &datum_row);
static int process_new_row(
ObTabletHandle &tablet_handle,
ObDMLRunningCtx &run_ctx,
const common::ObIArray<int64_t> &update_idx,
const ObStoreRow &old_tbl_row,
const ObStoreRow &new_tbl_row,
const ObDatumRow &old_datum_row,
ObDatumRow &new_datum_row,
const bool rowkey_change);
static int process_data_table_row(
ObTabletHandle &data_tablet,
ObDMLRunningCtx &run_ctx,
const ObIArray<int64_t> &update_idx,
const ObStoreRow &old_tbl_row,
const ObStoreRow &new_tbl_row,
const ObDatumRow &old_datum_row,
ObDatumRow &new_datum_row,
const bool rowkey_change);
static int check_new_row_nullable_value(
const ObIArray<uint64_t> &column_ids,
ObRelativeTable &data_table,
const ObNewRow &new_row);
static int check_new_row_nullable_value(
static int check_datum_row_nullable_value(
const common::ObIArray<share::schema::ObColDesc> &col_descs,
ObRelativeTable &relative_table,
const common::ObNewRow &new_row);
static int check_new_row_shadow_pk(
const blocksstable::ObDatumRow &datum_row);
static int check_datum_row_shadow_pk(
const ObIArray<uint64_t> &column_ids,
ObRelativeTable &data_table,
const ObNewRow &new_row);
const blocksstable::ObDatumRow &datum_row,
const blocksstable::ObStorageDatumUtils &rowkey_datum_utils);
static int check_row_locked_by_myself(
ObTabletHandle &tablet_handle,
ObRelativeTable &relative_table,
@ -715,61 +712,55 @@ private:
ObDMLRunningCtx &run_ctx,
const ObInsertFlag flag,
const common::ObIArray<uint64_t> &out_col_ids,
const common::ObNewRow &row,
common::ObNewRowIterator *&duplicated_rows);
blocksstable::ObDatumRow &row,
blocksstable::ObDatumRowIterator *&duplicated_rows);
static int init_single_row_getter(
ObSingleRowGetter &row_getter,
ObDMLRunningCtx &run_ctx,
const ObIArray<uint64_t> &out_col_ids,
ObRelativeTable &relative_table,
bool skip_read_lob = false);
static int single_get_row(
ObSingleRowGetter &row_getter,
const blocksstable::ObDatumRowkey &rowkey,
ObNewRowIterator *&duplicated_rows);
static int convert_row_to_rowkey(
ObSingleRowGetter &index_row_getter,
ObStoreRowkey &rowkey);
static int add_duplicate_row(
ObDatumRow *storage_row,
const blocksstable::ObStorageDatumUtils &rowkey_datum_utils,
blocksstable::ObDatumRowIterator *&duplicated_rows);
static int get_next_row_from_iter(
ObNewRowIterator *row_iter,
ObStoreRow &store_row,
blocksstable::ObDatumRowIterator *row_iter,
ObDatumRow &datum_row,
const bool need_copy_cells);
static int insert_row_to_tablet(
const bool check_exist,
ObTabletHandle &tablet_handle,
ObDMLRunningCtx &run_ctx,
ObStoreRow &tbl_row);
static int process_old_row_lob_col(
blocksstable::ObDatumRow &datum_row);
static int process_old_row_lob_col(
ObTabletHandle &data_tablet_handle,
ObDMLRunningCtx &run_ctx,
ObStoreRow &tbl_row);
blocksstable::ObDatumRow &datum_row);
static int table_refresh_row(
ObTabletHandle &data_tablet_handle,
ObDMLRunningCtx &run_ctx,
ObNewRow &row);
blocksstable::ObDatumRow &datum_row);
static int delete_row_in_tablet(
ObTabletHandle &tablet_handle,
ObDMLRunningCtx &run_ctx,
const ObNewRow &row);
blocksstable::ObDatumRow &datum_row);
static int delete_lob_col(
ObDMLRunningCtx &run_ctx,
const ObColDesc &column,
ObObj &obj,
const ObObj &sql_obj,
blocksstable::ObStorageDatum &datum,
ObLobCommon *&lob_common,
ObLobAccessParam &lob_param);
static int delete_lob_tablet_rows(
ObDMLRunningCtx &run_ctx,
ObTabletHandle &data_tablet,
ObStoreRow &tbl_row,
const ObNewRow &row);
blocksstable::ObDatumRow &datum_row);
static int prepare_scan_table_param(
ObTableScanParam &param,
share::schema::ObMultiVersionSchemaService &schema_service);
static void dump_diag_info_for_old_row_loss(
ObRelativeTable &data_table,
ObStoreCtx &store_ctx,
const ObStoreRow &tbl_row);
ObDMLRunningCtx &run_ctx,
blocksstable::ObDatumRow &datum_row);
int set_allow_to_read_(ObLS *ls);
// TODO(chenqingxiang.cqx): remove this
int create_empty_shell_tablet(
@ -786,8 +777,14 @@ private:
const int64_t ddl_task_id,
const common::ObTabletID &tablet_id,
const common::ObIArray<uint64_t> &column_ids,
common::ObNewRowIterator *row_iter,
blocksstable::ObDatumRowIterator *row_iter,
int64_t &affected_rows);
static int get_storage_row(const ObDatumRow &sql_row,
const ObIArray<uint64_t> &column_ids,
ObSingleRowGetter &row_getter,
ObDMLRunningCtx &run_ctx,
ObDatumRow *&out_row,
bool use_fuse_row_cache = false);
static int check_is_gencol_check_failed(const ObRelativeTable &data_table,
uint64_t error_col_id,
bool &is_virtual_gencol);

View File

@ -269,12 +269,13 @@ int ObIMvccCtx::register_ext_info_commit_cb(
const blocksstable::ObDmlFlag dml_flag,
transaction::ObTxDesc *tx_desc,
transaction::ObTxSEQ &parent_seq_no,
ObObj &index_data,
blocksstable::ObStorageDatum &index_data,
ObObjType &type,
ObObj &ext_info_data)
{
int ret = OB_SUCCESS;
storage::ObExtInfoCbRegister cb_register;
if (OB_FAIL(cb_register.register_cb(this, timeout, dml_flag, tx_desc, parent_seq_no, index_data, ext_info_data))) {
if (OB_FAIL(cb_register.register_cb(this, timeout, dml_flag, tx_desc, parent_seq_no, index_data, type, ext_info_data))) {
TRANS_LOG(ERROR, "register ext info callback failed", K(ret), K(cb_register), K(*this));
}
return ret;

View File

@ -178,7 +178,8 @@ public:
const blocksstable::ObDmlFlag dml_flag,
transaction::ObTxDesc *tx_desc,
transaction::ObTxSEQ &parent_seq_no,
ObObj &index_data,
blocksstable::ObStorageDatum &index_data,
ObObjType &type,
ObObj &ext_info_data);
public:
virtual void reset()

View File

@ -68,7 +68,7 @@ int check_sequence_set_violation(const concurrent_control::ObWriteFlag write_fla
ret = OB_ERR_PRIMARY_KEY_DUPLICATE;
TRANS_LOG(WARN, "pdml duplicate primary key found", K(ret),
K(writer_tx_id), K(writer_dml_flag), K(writer_seq_no),
K(locker_tx_id), K(locker_dml_flag), K(locker_seq_no));
K(locker_tx_id), K(locker_dml_flag), K(locker_seq_no), K(reader_seq_no));
// Case 2.1: For the case of the update in the storage layer, it may be
// split into lock and update in a single statement and fail the check, so
// we need bypass this case(Currently only the update of the lob will cause

View File

@ -373,7 +373,7 @@ int ObMemtable::multi_set(
const storage::ObTableIterParam &param,
storage::ObTableAccessContext &context,
const common::ObIArray<share::schema::ObColDesc> &columns,
const storage::ObStoreRow *rows,
blocksstable::ObDatumRow *rows,
const int64_t row_count,
const bool check_exist,
const share::ObEncryptMeta *encrypt_meta,
@ -381,7 +381,6 @@ int ObMemtable::multi_set(
{
int ret = OB_SUCCESS;
ObMvccWriteGuard guard(ret);
ObMemtableKeyGenerator mtk_generator;
if (IS_NOT_INIT) {
TRANS_LOG(WARN, "Not inited", K(*this));
ret = OB_NOT_INIT;
@ -389,7 +388,7 @@ int ObMemtable::multi_set(
ret = OB_INVALID_ARGUMENT;
TRANS_LOG(WARN, "Invalid argument", K(ret), K(param), K(context));
} else if (OB_UNLIKELY(nullptr == context.store_ctx_->mvcc_acc_ctx_.get_mem_ctx()
|| param.get_schema_rowkey_count() > columns.count())) {
|| param.get_schema_rowkey_count() > columns.count())) {
ret = OB_INVALID_ARGUMENT;
TRANS_LOG(WARN, "Invalid param", K(ret), K(param), K(columns.count()));
#ifdef OB_BUILD_TDE_SECURITY
@ -400,8 +399,6 @@ int ObMemtable::multi_set(
} else if (need_for_save(encrypt_meta) && OB_FAIL(save_encrypt_meta(param.table_id_, encrypt_meta))) {
TRANS_LOG(WARN, "store encrypt meta to memtable failed", KPC(encrypt_meta), KR(ret));
#endif
} else if (OB_FAIL(mtk_generator.init(rows, row_count, param.get_schema_rowkey_count(), columns))) {
TRANS_LOG(WARN, "fail to generate memtable keys", KPC(encrypt_meta), K(*context.store_ctx_), KR(ret));
}
if (OB_FAIL(ret)) {
@ -410,17 +407,22 @@ int ObMemtable::multi_set(
} else {
lib::CompatModeGuard compat_guard(mode_);
if (row_count > 1) {
ret = multi_set_(param, columns, rows, row_count, check_exist, mtk_generator, context, rows_info);
ret = multi_set_(param, columns, rows, row_count, check_exist, context, rows_info);
} else {
ret = set_(param,
columns,
rows[0],
nullptr, /*old_row*/
nullptr, /*update_idx*/
mtk_generator[0],
check_exist,
context,
nullptr /*mvcc_row*/);
ObMemtableKeyGenerator memtable_key_generator(param.get_schema_rowkey_count(), columns);
if (OB_FAIL(memtable_key_generator.init())) {
TRANS_LOG(WARN, "fail to init memtable key generator", K(ret));
} else {
ret = set_(param,
columns,
rows[0],
nullptr, /*old_row*/
nullptr, /*update_idx*/
check_exist,
context,
memtable_key_generator,
nullptr /*mvcc_row*/);
}
}
guard.set_memtable(this);
}
@ -529,24 +531,23 @@ int ObMemtable::set(
const storage::ObTableIterParam &param,
storage::ObTableAccessContext &context,
const common::ObIArray<share::schema::ObColDesc> &columns,
const storage::ObStoreRow &row,
blocksstable::ObDatumRow &row,
const share::ObEncryptMeta *encrypt_meta,
const bool check_exist)
{
int ret = OB_SUCCESS;
ObMvccWriteGuard guard(ret);
ObMemtableKeyGenerator mtk_generator;
if (IS_NOT_INIT) {
TRANS_LOG(WARN, "not init", K(*this));
ret = OB_NOT_INIT;
} else if (!param.is_valid() || !context.is_valid()) {
ret = OB_INVALID_ARGUMENT;
TRANS_LOG(WARN, "invalid argument, ", K(ret), K(param), K(context));
ret = OB_INVALID_ARGUMENT;
TRANS_LOG(WARN, "invalid argument, ", K(ret), K(param), K(context));
} else if (NULL == context.store_ctx_->mvcc_acc_ctx_.get_mem_ctx()
|| param.get_schema_rowkey_count() > columns.count()
|| row.row_val_.count_ < columns.count()) {
|| param.get_schema_rowkey_count() > columns.count()
|| row.count_ < columns.count()) {
TRANS_LOG(WARN, "invalid param", K(param),
K(columns.count()), K(row.row_val_.count_));
K(columns.count()), K(row.count_));
ret = OB_INVALID_ARGUMENT;
#ifdef OB_BUILD_TDE_SECURITY
//TODO: table_id is just used as encrypt_index, we may rename it in the future.
@ -556,32 +557,28 @@ int ObMemtable::set(
} else if (need_for_save(encrypt_meta) && OB_FAIL(save_encrypt_meta(param.table_id_, encrypt_meta))) {
TRANS_LOG(WARN, "store encrypt meta to memtable failed", KPC(encrypt_meta), KR(ret));
#endif
} else if (OB_FAIL(mtk_generator.init(&row, 1, param.get_schema_rowkey_count(), columns))) {
TRANS_LOG(WARN, "fail to generate memtable keys", KPC(encrypt_meta), K(*context.store_ctx_), KR(ret));
}
if (OB_FAIL(ret)) {
} else if (OB_FAIL(guard.write_auth(*context.store_ctx_))) {
TRANS_LOG(WARN, "not allow to write", K(*context.store_ctx_));
} else {
lib::CompatModeGuard compat_guard(mode_);
ret = set_(param,
columns,
row,
NULL, /*old_row*/
NULL, /*update_idx*/
mtk_generator[0],
check_exist,
context,
nullptr /*mvcc_row*/);
guard.set_memtable(this);
}
if (OB_SUCC(ret)) {
int tmp_ret = OB_SUCCESS;
if (OB_TMP_FAIL(try_report_dml_stat_(param.table_id_))) {
TRANS_LOG_RET(WARN, tmp_ret, "fail to report dml stat", K_(reported_dml_stat));
ObMemtableKeyGenerator memtable_key_generator(param.get_schema_rowkey_count(), columns);
if (OB_FAIL(memtable_key_generator.init())) {
TRANS_LOG(WARN, "fail to init memtable key generator", K(ret));
} else {
lib::CompatModeGuard compat_guard(mode_);
ret = set_(param,
columns,
row,
NULL, /*old_row*/
NULL, /*update_idx*/
check_exist,
context,
memtable_key_generator,
nullptr /*mvcc_row*/);
TRANS_LOG(WARN, "[xuanxi] set row", K(ret), K(row), K(check_exist), K(memtable_key_generator.get_memtable_key()));
guard.set_memtable(this);
}
}
return ret;
@ -592,13 +589,12 @@ int ObMemtable::set(
storage::ObTableAccessContext &context,
const ObIArray<ObColDesc> &columns,
const ObIArray<int64_t> &update_idx,
const storage::ObStoreRow &old_row,
const storage::ObStoreRow &new_row,
const blocksstable::ObDatumRow &old_row,
blocksstable::ObDatumRow &new_row,
const share::ObEncryptMeta *encrypt_meta)
{
int ret = OB_SUCCESS;
ObMvccWriteGuard guard(ret);
ObMemtableKeyGenerator mtk_generator;
if (IS_NOT_INIT) {
TRANS_LOG(WARN, "not init", K(*this));
ret = OB_NOT_INIT;
@ -606,7 +602,7 @@ int ObMemtable::set(
ret = OB_INVALID_ARGUMENT;
TRANS_LOG(WARN, "invalid argument, ", K(ret), K(param), K(context));
} else if (NULL == context.store_ctx_->mvcc_acc_ctx_.get_mem_ctx()
|| param.get_schema_rowkey_count() > columns.count()) {
|| param.get_schema_rowkey_count() > columns.count()) {
ret = OB_INVALID_ARGUMENT;
TRANS_LOG(ERROR, "invalid param", K(ret), K(param));
#ifdef OB_BUILD_TDE_SECURITY
@ -617,32 +613,28 @@ int ObMemtable::set(
} else if (need_for_save(encrypt_meta) && OB_FAIL(save_encrypt_meta(param.table_id_, encrypt_meta))) {
TRANS_LOG(WARN, "store encrypt meta to memtable failed", KPC(encrypt_meta), KR(ret));
#endif
} else if (OB_FAIL(mtk_generator.init(&new_row, 1, param.get_schema_rowkey_count(), columns))) {
TRANS_LOG(WARN, "fail to generate memtable keys", KPC(encrypt_meta), K(*context.store_ctx_), KR(ret));
}
if (OB_FAIL(ret)){
} else if (OB_FAIL(guard.write_auth(*context.store_ctx_))) {
TRANS_LOG(WARN, "not allow to write", K(*context.store_ctx_));
} else {
lib::CompatModeGuard compat_guard(mode_);
ObMemtableKeyGenerator memtable_key_generator(param.get_schema_rowkey_count(), columns);
if (OB_FAIL(memtable_key_generator.init())) {
TRANS_LOG(WARN, "fail to init memtable key generator", K(ret));
} else {
lib::CompatModeGuard compat_guard(mode_);
ret = set_(param,
columns,
new_row,
&old_row,
&update_idx,
mtk_generator[0],
false/*check_exist*/,
context,
nullptr /*mvcc_row*/);
guard.set_memtable(this);
}
if (OB_SUCC(ret)) {
int tmp_ret = OB_SUCCESS;
if (OB_TMP_FAIL(try_report_dml_stat_(param.table_id_))) {
TRANS_LOG_RET(WARN, tmp_ret, "fail to report dml stat", K_(reported_dml_stat));
ret = set_(param,
columns,
new_row,
&old_row,
&update_idx,
false/*check_exist*/,
context,
memtable_key_generator,
nullptr /*mvcc_row*/);
guard.set_memtable(this);
}
}
return ret;
@ -651,10 +643,13 @@ int ObMemtable::set(
int ObMemtable::lock(
const storage::ObTableIterParam &param,
storage::ObTableAccessContext &context,
const common::ObNewRow &row)
ObColDescArray &col_desc,
blocksstable::ObDatumRow &row)
{
int ret = OB_SUCCESS;
ObMvccWriteGuard guard(ret);
ObDatumRowkeyHelper rowkey_helper;
ObDatumRowkey datum_rowkey(row.storage_datums_, param.get_schema_rowkey_count());
ObStoreRowkey tmp_key;
ObMemtableKey mtk;
ObMvccAccessCtx &acc_ctx = context.store_ctx_->mvcc_acc_ctx_;
@ -670,9 +665,9 @@ int ObMemtable::lock(
// actually, there is no circumstance in where locking the index table is need.
ret = OB_NOT_SUPPORTED;
TRANS_LOG(WARN, "locking the non-unique local index is not supported", K(ret), K(row), K(param));
} else if (OB_FAIL(tmp_key.assign(row.cells_, param.get_schema_rowkey_count()))) {
TRANS_LOG(WARN, "Failed to assign rowkey", K(row), K(param));
} else if (OB_FAIL(mtk.encode(param.get_read_info()->get_columns_desc(), &tmp_key))) {
} else if (OB_FAIL(rowkey_helper.convert_store_rowkey(datum_rowkey, col_desc, tmp_key))) {
LOG_WARN("Failed to convert store rowkey from datum rowkey", K(ret), K(row), K(datum_rowkey));
} else if (OB_FAIL(mtk.encode(col_desc, &tmp_key))) {
TRANS_LOG(WARN, "encode mtk failed", K(ret), K(param));
} else if (acc_ctx.write_flag_.is_check_row_locked()) {
if (OB_FAIL(ObRowConflictHandler::check_foreign_key_constraint(param, context, tmp_key))) {
@ -1589,7 +1584,6 @@ void ObMemtable::lock_row_on_frozen_stores_on_failure(
int ObMemtable::lock_rows_on_frozen_stores_(
const bool check_exist,
const storage::ObTableIterParam &param,
const ObMemtableKeyGenerator &memtable_keys,
storage::ObTableAccessContext &context,
ObMvccRowAndWriteResults &mvcc_rows,
ObRowsInfo &rows_info)
@ -2499,10 +2493,9 @@ bool ObMemtable::need_for_save(const share::ObEncryptMeta *encrypt_meta)
int ObMemtable::multi_set_(
const storage::ObTableIterParam &param,
const common::ObIArray<share::schema::ObColDesc> &columns,
const storage::ObStoreRow *rows,
const blocksstable::ObDatumRow *rows,
const int64_t row_count,
const bool check_exist,
const ObMemtableKeyGenerator &memtable_keys,
storage::ObTableAccessContext &context,
storage::ObRowsInfo &rows_info)
{
@ -2511,8 +2504,13 @@ int ObMemtable::multi_set_(
int64_t conflict_idx = -1;
int64_t row_size_stat = 0;
ObMvccRowAndWriteResults mvcc_rows;
// TODO(xuanxi): remove it later
ObMemtableKeyGenerator::ObMemtableKeyBuffer memtable_key_buffer;
ObMemtableKeyGenerator memtable_key_generator(param.get_schema_rowkey_count(), columns, &memtable_key_buffer);
if (OB_FAIL(mvcc_rows.prepare_allocate(row_count))) {
TRANS_LOG(WARN, "Failed to prepare allocate mvcc rows", K(ret), K(row_count));
} else if (OB_FAIL(memtable_key_generator.init())) {
TRANS_LOG(WARN, "fail to init memtable key generator", K(ret));
}
// 1. Check write conflict in memtables.
@ -2524,9 +2522,9 @@ int ObMemtable::multi_set_(
rows[i],
nullptr, /*old_row*/
nullptr, /*update_idx*/
memtable_keys[i],
check_exist,
context,
memtable_key_generator,
&(mvcc_rows[permutation_idx])))) {
if (OB_UNLIKELY(OB_TRY_LOCK_ROW_CONFLICT != ret && OB_TRANSACTION_SET_VIOLATION != ret)) {
TRANS_LOG(WARN, "Failed to insert new row", K(ret), K(i), K(permutation_idx), K(rows[i]));
@ -2553,7 +2551,7 @@ int ObMemtable::multi_set_(
// 2. Check uniqueness constraint and write conflict in sstables.
if (OB_FAIL(ret)) {
} else if (rows_info.all_rows_found()) {
} else if (OB_FAIL(lock_rows_on_frozen_stores_(check_exist, param, memtable_keys, context, mvcc_rows, rows_info))) {
} else if (OB_FAIL(lock_rows_on_frozen_stores_(check_exist, param, context, mvcc_rows, rows_info))) {
TRANS_LOG(WARN, "Failed to lock rows on frozen stores", K(ret));
} else if (rows_info.have_conflict()) {
conflict_idx = rows_info.get_conflict_idx();
@ -2579,9 +2577,9 @@ int ObMemtable::multi_set_(
if (param.is_non_unique_local_index_) {
// no need to detect deadlock for non-unique local index table
} else {
for (int64_t idx = 0; idx < memtable_keys.count(); ++idx) {
for (int64_t idx = 0; idx < memtable_key_buffer.count(); ++idx) {
MTL(ObLockWaitMgr*)->set_hash_holder(key_.get_tablet_id(),
memtable_keys[idx],
memtable_key_buffer.at(idx),
context.store_ctx_->mvcc_acc_ctx_.get_mem_ctx()->get_tx_id());
}
}
@ -2601,12 +2599,12 @@ int ObMemtable::multi_set_(
int ObMemtable::set_(
const storage::ObTableIterParam &param,
const common::ObIArray<share::schema::ObColDesc> &columns,
const storage::ObStoreRow &new_row,
const storage::ObStoreRow *old_row,
const blocksstable::ObDatumRow &new_row,
const blocksstable::ObDatumRow *old_row,
const common::ObIArray<int64_t> *update_idx,
const ObMemtableKey &mtk,
const bool check_exist,
storage::ObTableAccessContext &context,
ObMemtableKeyGenerator &memtable_key_generator,
ObMvccRowAndWriteResult *mvcc_row)
{
int ret = OB_SUCCESS;
@ -2645,11 +2643,11 @@ int ObMemtable::set_(
TRANS_LOG(WARN, "get write seq failed", K(ret));
} else if (OB_FAIL(row_writer.write(param.get_schema_rowkey_count(), new_row, update_idx, buf, len))) {
TRANS_LOG(WARN, "Failed to write new row", K(ret), K(new_row));
} else if (OB_UNLIKELY(new_row.flag_.is_not_exist())) {
} else if (OB_UNLIKELY(new_row.row_flag_.is_not_exist())) {
ret = OB_ERR_UNEXPECTED;
TRANS_LOG(ERROR, "Unexpected not exist trans node", K(ret), K(new_row));
} else {
ObMemtableData mtd(new_row.flag_.get_dml_flag(), len, buf);
ObMemtableData mtd(new_row.row_flag_.get_dml_flag(), len, buf);
ObTxNodeArg arg(
ctx.mvcc_acc_ctx_.tx_id_, /*trans id*/
&mtd, /*memtable_data*/
@ -2657,24 +2655,27 @@ int ObMemtable::set_(
init_timestamp_, /*memstore_version*/
write_seq, /*seq_no*/
write_epoch, /*write_epoch*/
new_row.row_val_.count_ /*column_cnt*/);
if (OB_FAIL(mvcc_write_(param,
new_row.count_ /*column_cnt*/);
if (OB_FAIL(memtable_key_generator.generate_memtable_key(new_row))) {
TRANS_LOG(WARN, "generate memtable key fail", K(ret), K(new_row));
} else if (OB_FAIL(mvcc_write_(param,
context,
&mtk,
memtable_key_generator.get_memtable_key(),
arg,
check_exist,
is_new_locked,
memtable_key_generator.get_key_buffer(),
mvcc_row))) {
if (OB_TRY_LOCK_ROW_CONFLICT != ret &&
OB_TRANSACTION_SET_VIOLATION != ret &&
OB_ERR_PRIMARY_KEY_DUPLICATE != ret) {
TRANS_LOG(WARN, "mvcc write fail", K(mtk), K(ret));
TRANS_LOG(WARN, "mvcc write fail", K(memtable_key_generator.get_memtable_key()), K(ret));
}
} else {
TRANS_LOG(DEBUG, "set end, success",
"ret", ret,
"tablet_id_", key_.tablet_id_,
"dml_flag", new_row.flag_.get_dml_flag(),
"dml_flag", new_row.row_flag_.get_dml_flag(),
"columns", strarray<ObColDesc>(columns),
"old_row", to_cstring(old_row),
"new_row", to_cstring(new_row),
@ -2711,9 +2712,8 @@ int ObMemtable::set_(
//set_end(ctx.mvcc_acc_ctx_, ret);
if (OB_SUCC(ret)) {
set_max_data_schema_version(ctx.table_version_);
set_max_column_cnt(new_row.row_val_.count_);
set_max_column_cnt(new_row.count_);
}
return ret;
}
@ -2754,10 +2754,11 @@ int ObMemtable::lock_(
rowkey.get_obj_cnt()); /*column_cnt*/
if (OB_FAIL(mvcc_write_(param,
context,
&mtk,
mtk,
arg,
false, /*check_exist*/
is_new_locked,
nullptr, /*memtable_key_buffer*/
nullptr /*mvcc_row*/))) {
} else if (OB_UNLIKELY(!is_new_locked)) {
TRANS_LOG(DEBUG, "lock twice, no need to store lock trans node");
@ -2810,10 +2811,11 @@ int ObMemtable::mvcc_replay_(storage::ObStoreCtx &ctx,
int ObMemtable::mvcc_write_(
const storage::ObTableIterParam &param,
storage::ObTableAccessContext &context,
const ObMemtableKey *key,
const ObMemtableKey &key,
const ObTxNodeArg &arg,
const bool check_exist,
bool &is_new_locked,
ObMemtableKeyGenerator::ObMemtableKeyBuffer *memtable_key_buffer,
ObMvccRowAndWriteResult *mvcc_row)
{
int ret = OB_SUCCESS;
@ -2826,13 +2828,13 @@ int ObMemtable::mvcc_write_(
SCN snapshot_version = ctx.mvcc_acc_ctx_.get_snapshot_version();
transaction::ObTxSnapshot &snapshot = ctx.mvcc_acc_ctx_.snapshot_;
if (OB_FAIL(mvcc_engine_.create_kv(key,
if (OB_FAIL(mvcc_engine_.create_kv(&key,
// is_insert
blocksstable::ObDmlFlag::DF_INSERT == arg.data_->dml_flag_,
&stored_key,
value,
is_new_add))) {
TRANS_LOG(WARN, "create kv failed", K(ret), K(arg), K(*key));
TRANS_LOG(WARN, "create kv failed", K(ret), K(arg), K(key));
} else if (OB_FAIL(mvcc_engine_.mvcc_write(ctx,
snapshot,
*value,
@ -2840,29 +2842,29 @@ int ObMemtable::mvcc_write_(
res))) {
if (OB_TRY_LOCK_ROW_CONFLICT == ret) {
ret = post_row_write_conflict_(ctx.mvcc_acc_ctx_,
*key,
key,
res.lock_state_,
value->get_last_compact_cnt(),
value->get_total_trans_node_cnt());
} else if (OB_TRANSACTION_SET_VIOLATION == ret) {
mem_ctx->on_tsc_retry(*key,
mem_ctx->on_tsc_retry(key,
snapshot_version,
value->get_max_trans_version(),
value->get_max_trans_id());
} else if (OB_ERR_PRIMARY_KEY_DUPLICATE == ret) {
mem_ctx->on_key_duplication_retry(*key);
mem_ctx->on_key_duplication_retry(key);
} else {
TRANS_LOG(WARN, "mvcc write fail", K(ret));
}
} else if (nullptr == mvcc_row && OB_FAIL(lock_row_on_frozen_stores_(param,
arg,
key,
&key,
check_exist,
context,
value,
res))) {
lock_row_on_frozen_stores_on_failure(arg.data_->dml_flag_,
*key,
key,
ret,
value,
context,
@ -2890,6 +2892,8 @@ int ObMemtable::mvcc_write_(
(void)mvcc_engine_.mvcc_undo(value);
res.is_mvcc_undo_ = true;
TRANS_LOG(WARN, "register row commit failed", K(ret));
} else if (nullptr != memtable_key_buffer && OB_FAIL(memtable_key_buffer->push_back(stored_key))) {
TRANS_LOG(WARN, "push back stored memtable key into buffer failed", K(ret));
} else if (nullptr == mvcc_row && res.has_insert()) {
(void)mvcc_engine_.finish_kv(res);
/*****[for deadlock]*****/
@ -2898,7 +2902,7 @@ int ObMemtable::mvcc_write_(
// no need to detect deadlock for non-unique local index table
} else {
MTL(ObLockWaitMgr*)->set_hash_holder(key_.get_tablet_id(),
*key,
key,
context.store_ctx_->mvcc_acc_ctx_.get_mem_ctx()->get_tx_id());
}
/***********************/

View File

@ -245,22 +245,22 @@ public: // derived from ObITable
const storage::ObTableIterParam &param,
storage::ObTableAccessContext &context,
const common::ObIArray<share::schema::ObColDesc> &columns, // TODO: remove columns
const storage::ObStoreRow &row,
blocksstable::ObDatumRow &row,
const share::ObEncryptMeta *encrypt_meta,
const bool check_exist);
virtual int set(
const storage::ObTableIterParam &param,
storage::ObTableAccessContext &context,
const common::ObIArray<share::schema::ObColDesc> &columns, // TODO: remove columns
const common::ObIArray<share::schema::ObColDesc> &columns,
const ObIArray<int64_t> &update_idx,
const storage::ObStoreRow &old_row,
const storage::ObStoreRow &new_row,
const blocksstable::ObDatumRow &old_row,
blocksstable::ObDatumRow &new_row,
const share::ObEncryptMeta *encrypt_meta);
int multi_set(
const storage::ObTableIterParam &param,
storage::ObTableAccessContext &context,
const common::ObIArray<share::schema::ObColDesc> &columns,
const storage::ObStoreRow *rows,
blocksstable::ObDatumRow *rows,
const int64_t row_count,
const bool check_exist,
const share::ObEncryptMeta *encrypt_meta,
@ -287,7 +287,8 @@ public: // derived from ObITable
virtual int lock(
const storage::ObTableIterParam &param,
storage::ObTableAccessContext &context,
const common::ObNewRow &row);
ObColDescArray &col_desc,
blocksstable::ObDatumRow &row);
virtual int lock(
const storage::ObTableIterParam &param,
storage::ObTableAccessContext &context,
@ -476,10 +477,11 @@ private:
int mvcc_write_(
const storage::ObTableIterParam &param,
storage::ObTableAccessContext &context,
const ObMemtableKey *key,
const ObMemtableKey &key,
const ObTxNodeArg &arg,
const bool check_exist,
bool &is_new_locked,
ObMemtableKeyGenerator::ObMemtableKeyBuffer *memtable_key_buffer,
ObMvccRowAndWriteResult *mvcc_row = nullptr);
int mvcc_replay_(storage::ObStoreCtx &ctx,
@ -513,7 +515,6 @@ private:
int lock_rows_on_frozen_stores_(
const bool check_exist,
const storage::ObTableIterParam &param,
const ObMemtableKeyGenerator &memtable_keys,
storage::ObTableAccessContext &context,
ObMvccRowAndWriteResults &mvcc_rows,
ObRowsInfo &rows_info);
@ -544,20 +545,19 @@ private:
int set_(
const storage::ObTableIterParam &param,
const common::ObIArray<share::schema::ObColDesc> &columns,
const storage::ObStoreRow &new_row,
const storage::ObStoreRow *old_row,
const blocksstable::ObDatumRow &new_row,
const blocksstable::ObDatumRow *old_row,
const common::ObIArray<int64_t> *update_idx,
const ObMemtableKey &mtk,
const bool check_exist,
storage::ObTableAccessContext &context,
ObMemtableKeyGenerator &memtable_key_generator,
ObMvccRowAndWriteResult *mvcc_row = nullptr);
int multi_set_(
const storage::ObTableIterParam &param,
const common::ObIArray<share::schema::ObColDesc> &columns,
const storage::ObStoreRow *rows,
const blocksstable::ObDatumRow *rows,
const int64_t row_count,
const bool check_exist,
const ObMemtableKeyGenerator &memtable_keys,
storage::ObTableAccessContext &context,
storage::ObRowsInfo &rows_info);
int lock_(

View File

@ -1,5 +1,5 @@
/**
* Copyright (c) 2021 OceanBase
* Copyright (c) 2024 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:
@ -11,110 +11,56 @@
*/
#include "ob_memtable_key.h"
#include "lib/ob_errno.h"
#include "rowkey/ob_rowkey.h"
#include "share/rc/ob_tenant_base.h"
#include "storage/ob_i_store.h"
namespace oceanbase
{
namespace memtable
{
constexpr int64_t ObMemtableKeyGenerator::STACK_BUFFER_SIZE;
int ObMemtableKeyGenerator::init(const storage::ObStoreRow *rows,
const int64_t row_count,
const int64_t schema_rowkey_count,
const common::ObIArray<share::schema::ObColDesc> &columns)
int ObMemtableKeyGenerator::init()
{
int ret = OB_SUCCESS;
if (size_ != 0) {
if (OB_UNLIKELY(is_inited_)) {
ret = OB_INIT_TWICE;
TRANS_LOG(WARN, "init ObMemtableKeyGenerator twice", K(ret));
} else if (columns_.count() < rowkey_cnt_) {
ret = OB_INVALID_ARGUMENT;
TRANS_LOG(WARN, "rowkey number mismatched", K(columns_.count()), K(rowkey_cnt_));
} else if (OB_FAIL(obj_buf_.init(&allocator_))) {
TRANS_LOG(WARN, "init obj buffer fail", K(ret));
} else if (OB_FAIL(obj_buf_.reserve(rowkey_cnt_))) {
TRANS_LOG(WARN, "reserve obj buffer fail", K(ret), K(rowkey_cnt_));
} else {
int64_t extra_size = row_count - STACK_BUFFER_SIZE;
if (extra_size > 0) {
if (FALSE_IT(p_extra_store_row_keys_ =
(ObStoreRowkey *)share::mtl_malloc(extra_size * (sizeof(ObStoreRowkey)), "MemTableKey"))) {
} else if (OB_ISNULL(p_extra_store_row_keys_)) {
ret = OB_ALLOCATE_MEMORY_FAILED;
TRANS_LOG(WARN, "Failed to alloc ObStoreRowkey memory", K(ret), K(row_count), K(schema_rowkey_count), K(columns), KP(MTL_CTX()),
KP(lib::ObMallocAllocator::get_instance()), KP(p_extra_store_row_keys_));
} else if (FALSE_IT(p_extra_memtable_keys_ =
(ObMemtableKey *)share::mtl_malloc(extra_size * (sizeof(ObMemtableKey)), "MemTableKey"))) {
} else if (OB_ISNULL(p_extra_memtable_keys_)) {
share::mtl_free(p_extra_store_row_keys_);
p_extra_store_row_keys_ = nullptr;
ret = OB_ALLOCATE_MEMORY_FAILED;
TRANS_LOG(WARN, "Failed to alloc ObMemtableKey memory", K(ret), K(row_count), K(schema_rowkey_count), K(columns), KP(MTL_CTX()),
KP(lib::ObMallocAllocator::get_instance()), KP(p_extra_store_row_keys_));
is_inited_ = true;
}
return ret;
}
int ObMemtableKeyGenerator::generate_memtable_key(const blocksstable::ObDatumRow &row)
{
int ret = OB_SUCCESS;
if (OB_UNLIKELY(!is_inited_)) {
ret = OB_NOT_INIT;
TRANS_LOG(WARN, "ObMemtableKeyGenerator not inited", K(ret));
} else if (OB_UNLIKELY(!row.is_valid())) {
ret = OB_INVALID_ARGUMENT;
TRANS_LOG(WARN, "invalid argument", K(ret), K(row));
} else {
ObObj *objs = obj_buf_.get_data();
for (int64_t i = 0; OB_SUCC(ret) && i < rowkey_cnt_; i++) {
if (OB_FAIL(row.storage_datums_[i].to_obj_enhance(objs[i], columns_.at(i).col_type_))) {
TRANS_LOG(WARN, "failed to transfer datum to obj", K(ret), K(i), K(row));
}
}
for (int i = 0; i < row_count && OB_SUCC(ret); ++i) {
ObStoreRowkey *p_store_row_key = i < STACK_BUFFER_SIZE ? &store_row_key_buffer_[i] : &p_extra_store_row_keys_[i - STACK_BUFFER_SIZE];
ObMemtableKey *p_memtable_key = i < STACK_BUFFER_SIZE ? &memtable_key_buffer_[i] : &p_extra_memtable_keys_[i - STACK_BUFFER_SIZE];
new (p_store_row_key) ObStoreRowkey();
new (p_memtable_key) ObMemtableKey();
if (OB_FAIL(p_store_row_key->assign(rows[i].row_val_.cells_, schema_rowkey_count))) {
p_store_row_key->~ObStoreRowkey();
TRANS_LOG(WARN, "Failed to assign tmp rowkey", K(ret), K(rows[i]), K(row_count), K(schema_rowkey_count));
} else if (OB_FAIL(p_memtable_key->encode(columns, p_store_row_key))) {
p_memtable_key->~ObMemtableKey();
p_store_row_key->~ObStoreRowkey();
TRANS_LOG(WARN, "mtk encode fail", K(ret), K(rows[i]), K(row_count), K(schema_rowkey_count));
} else {
size_++;
if (OB_SUCC(ret)) {
if (OB_FAIL(store_rowkey_.assign(objs, rowkey_cnt_))) {
TRANS_LOG(WARN, "failed to assign rowkey", K(ret), K(row), K(objs), K(rowkey_cnt_));
} else if (OB_FAIL(memtable_key_.encode(columns_, &store_rowkey_))) {
TRANS_LOG(WARN, "memtable key encode failed", K(ret), K(row), K(columns_), K(store_rowkey_));
}
}
if (OB_FAIL(ret)) {
reset();
}
}
return ret;
}
ObMemtableKey &ObMemtableKeyGenerator::operator[](int64_t idx) {
ObMemtableKey *element = nullptr;
if (OB_UNLIKELY(idx < 0 || idx >= size_)) {
ob_abort();
}
if (idx < STACK_BUFFER_SIZE) {
element = &memtable_key_buffer_[idx];
} else {
element = &p_extra_memtable_keys_[idx - STACK_BUFFER_SIZE];
}
return *element;
}
const ObMemtableKey &ObMemtableKeyGenerator::operator[](int64_t idx) const
{
return const_cast<ObMemtableKeyGenerator *>(this)->operator[](idx);
}
void ObMemtableKeyGenerator::reset()
{
int64_t idx = size_ - 1;
for(; idx >= STACK_BUFFER_SIZE; --idx) {
p_extra_memtable_keys_[idx - STACK_BUFFER_SIZE].~ObMemtableKey();
p_extra_store_row_keys_[idx - STACK_BUFFER_SIZE].~ObStoreRowkey();
}
for(; idx >= 0; --idx) {
memtable_key_buffer_[idx].~ObMemtableKey();
store_row_key_buffer_[idx].~ObStoreRowkey();
}
if (OB_UNLIKELY(nullptr != p_extra_memtable_keys_)) {
share::mtl_free(p_extra_memtable_keys_);
}
if (OB_UNLIKELY(nullptr != p_extra_store_row_keys_)) {
share::mtl_free(p_extra_store_row_keys_);
}
new (this) ObMemtableKeyGenerator();
}
ObMemtableKeyGenerator::~ObMemtableKeyGenerator()
{
reset();
}
}
}
} // namespace memtable
} // namespace oceanbase

View File

@ -283,7 +283,7 @@ public:
private:
common::ObStoreRowkey *rowkey_;
mutable uint64_t hash_val_; // Perf optimization.
DISALLOW_COPY_AND_ASSIGN(ObMemtableKey);
//DISALLOW_COPY_AND_ASSIGN(ObMemtableKey);
};
class ObStoreRowkeyWrapper
@ -308,31 +308,38 @@ public:
const common::ObStoreRowkey *rowkey_;
};
// this is for multi_set pre alloc memory to generate memtable key
class ObMemtableKeyGenerator {// RAII
static constexpr int64_t STACK_BUFFER_SIZE = 32;
// TODO(xuanxi): remove it later
class ObMemtableKeyGenerator {
public:
ObMemtableKeyGenerator() : p_extra_store_row_keys_(nullptr), p_extra_memtable_keys_(nullptr), size_(0) {}
~ObMemtableKeyGenerator();
int init(const storage::ObStoreRow *rows,
const int64_t row_count,
const int64_t schema_rowkey_count,
const common::ObIArray<share::schema::ObColDesc> &columns);
void reset();
int64_t count() const { return size_; }
ObMemtableKey &operator[](int64_t idx);
const ObMemtableKey &operator[](int64_t idx) const;
using ObMemtableKeyBuffer = common::ObSEArray<ObMemtableKey, 16>;
public:
ObMemtableKeyGenerator(
const int64_t rowkey_cnt,
const common::ObIArray<share::schema::ObColDesc> &columns,
ObMemtableKeyBuffer *memtable_key_buffer = nullptr)
: allocator_(common::ObMemAttr(MTL_ID(), "ObMemtableKey")),
rowkey_cnt_(rowkey_cnt),
columns_(columns),
memtable_key_buffer_(memtable_key_buffer),
is_inited_(false)
{}
~ObMemtableKeyGenerator() = default;
int init();
int generate_memtable_key(const blocksstable::ObDatumRow &datum_row);
ObMemtableKey &get_memtable_key() { return memtable_key_; }
ObMemtableKeyBuffer *get_key_buffer() { return memtable_key_buffer_; }
private:
// this is for avoid memory allocation when rows not so much
ObStoreRowkey store_row_key_buffer_[STACK_BUFFER_SIZE];
ObMemtableKey memtable_key_buffer_[STACK_BUFFER_SIZE];
ObStoreRowkey *p_extra_store_row_keys_;
ObMemtableKey *p_extra_memtable_keys_;
int64_t size_;
ObArenaAllocator allocator_;
int64_t rowkey_cnt_;
const common::ObIArray<share::schema::ObColDesc> &columns_;
storage::ObObjBufArray obj_buf_;
ObStoreRowkey store_rowkey_;
ObMemtableKey memtable_key_;
ObMemtableKeyBuffer *memtable_key_buffer_;
bool is_inited_;
};
}
}
} // namespace memtable
} // namespace oceanbase
#endif // OCEANBASE_MEMTABLE_OB_MEMTABLE_KEY2_

View File

@ -35,7 +35,8 @@ ObDMLRunningCtx::ObDMLRunningCtx(
ObStoreCtx &store_ctx,
const ObDMLBaseParam &dml_param,
common::ObIAllocator &allocator,
const blocksstable::ObDmlFlag dml_flag)
const blocksstable::ObDmlFlag dml_flag,
bool is_need_row_datum_utils)
: store_ctx_(store_ctx),
dml_param_(dml_param),
allocator_(allocator),
@ -44,13 +45,21 @@ ObDMLRunningCtx::ObDMLRunningCtx(
col_map_(nullptr),
col_descs_(nullptr),
column_ids_(nullptr),
tbl_row_(),
datum_row_(),
cmp_funcs_(),
is_old_row_valid_for_lob_(false),
is_need_check_old_row_(is_need_row_datum_utils),
is_udf_(false),
schema_guard_(share::schema::ObSchemaMgrItem::MOD_RELATIVE_TABLE),
is_need_row_datum_utils_(is_need_row_datum_utils),
is_inited_(false)
{
}
ObDMLRunningCtx::~ObDMLRunningCtx()
{
}
int ObDMLRunningCtx::init(
const common::ObIArray<uint64_t> *column_ids,
const common::ObIArray<uint64_t> *upd_col_ids,
@ -89,6 +98,10 @@ int ObDMLRunningCtx::init(
LOG_WARN("failed to get relative table", K(ret), K(dml_param_));
} else if (NULL != column_ids && OB_FAIL(prepare_column_info(*column_ids))) {
LOG_WARN("fail to get column descriptions and column map", K(ret), K(*column_ids));
} else if (is_need_check_old_row_ && OB_FAIL(check_need_old_row_legitimacy())) {
LOG_WARN("fail to get flag of checking old row legitimacy", K(ret));
} else if (is_need_check_old_row_ && OB_FAIL(init_cmp_funcs())) {
LOG_WARN("fail to init compare functions", K(ret));
} else {
store_ctx_.mvcc_acc_ctx_.mem_ctx_->set_table_version(dml_param_.schema_version_);
store_ctx_.table_version_ = dml_param_.schema_version_;
@ -161,6 +174,101 @@ int ObDMLRunningCtx::prepare_column_info(const common::ObIArray<uint64_t> &colum
return ret;
}
int ObDMLRunningCtx::check_need_old_row_legitimacy()
{
int ret = OB_SUCCESS;
// TODO(jingxing): setting this to true
if (OB_FAIL(relative_table_.has_udf_column(is_need_check_old_row_))) {
LOG_WARN("check has udf column failed", K(ret));
} else if (is_need_check_old_row_) {
is_udf_ = true;
ObTableStoreIterator &table_iter = *relative_table_.tablet_iter_.table_iter();
while (OB_SUCC(ret) && !is_need_check_old_row_) {
ObITable *table_ptr = nullptr;
if (OB_FAIL(table_iter.get_next(table_ptr))) {
if (OB_ITER_END != ret) {
LOG_WARN("get next table failed", K(ret));
}
} else if (OB_ISNULL(table_ptr)) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("error unexpected, table ptr must not be nullptr", K(ret));
} else {
is_need_check_old_row_ = table_ptr->is_major_sstable();
}
}
} else if (dml_param_.is_batch_stmt_ && !relative_table_.is_index_table()) {
//batch stmt execution dependency defensive check to check
//if the same row was modified multiple times
is_need_check_old_row_ = true;
ret = OB_E(EventTable::EN_INS_MULTI_VALUES_BATCH_OPT) OB_SUCCESS;
// no need to check old row, just for bmsql performance optimization
// TODO yuchen.ywc
if (OB_SUCCESS != ret) {
LOG_INFO("error sim when current statement is batch update", K(ret), K_(is_udf));
is_need_check_old_row_ = false;
ret = OB_SUCCESS;
}
} else if (GCONF.enable_defensive_check()) {
is_need_check_old_row_ = true;
if (relative_table_.is_index_table() && !relative_table_.can_read_index()) {
//index can not be read during building index, so does not check old index row
is_need_check_old_row_ = false;
}
if (ObDmlFlag::DF_LOCK == dml_flag_) {
is_need_check_old_row_ = false;
}
}
return ret;
}
int ObDMLRunningCtx::init_cmp_funcs()
{
int ret = OB_SUCCESS;
const common::ObIArray<share::schema::ObColDesc> &col_descs = dml_param_.table_param_->get_col_descs();
int64_t column_cnt = col_descs.count();
if (OB_UNLIKELY(column_cnt < 0 || column_cnt > OB_ROW_MAX_COLUMNS_COUNT)) {
ret = OB_INVALID_ARGUMENT;
STORAGE_LOG(WARN, "Invalid argument to init compare functions", K(ret), K(column_cnt), K(col_descs));
} else if (OB_FAIL(cmp_funcs_.init(column_cnt, allocator_))) {
STORAGE_LOG(WARN, "Failed to reserve cmp func array", K(ret));
} else {
bool is_oracle_mode = lib::is_oracle_mode();
ObCmpFunc cmp_func;
for (int64_t i = 0; OB_SUCC(ret) && i < col_descs.count(); i++) {
const share::schema::ObColDesc &col_desc = col_descs.at(i);
//TODO @hanhui support desc rowkey
bool is_ascending = true || col_desc.col_order_ == ObOrderType::ASC;
bool has_lob_header = is_lob_storage(col_desc.col_type_.get_type());
ObPrecision precision = PRECISION_UNKNOWN_YET;
if (col_desc.col_type_.is_decimal_int()) {
precision = col_desc.col_type_.get_stored_precision();
OB_ASSERT(precision != PRECISION_UNKNOWN_YET);
}
sql::ObExprBasicFuncs *basic_funcs = ObDatumFuncs::get_basic_func(col_desc.col_type_.get_type(),
col_desc.col_type_.get_collation_type(),
col_desc.col_type_.get_scale(),
is_oracle_mode,
has_lob_header,
precision);
if (OB_UNLIKELY(nullptr == basic_funcs || nullptr == basic_funcs->null_last_cmp_)) {
ret = OB_ERR_SYS;
STORAGE_LOG(ERROR, "Unexpected null basic funcs", K(ret), K(col_desc));
} else {
if (is_ascending) {
cmp_func.cmp_func_ = is_oracle_mode ? basic_funcs->null_last_cmp_ : basic_funcs->null_first_cmp_;
if (OB_FAIL(cmp_funcs_.push_back(ObStorageDatumCmpFunc(cmp_func)))) {
STORAGE_LOG(WARN, "Failed to push back cmp func", K(ret), K(i), K(col_desc));
}
} else {
ret = OB_ERR_SYS;
STORAGE_LOG(WARN, "Unsupported desc column order", K(ret), K(col_desc), K(i));
}
}
}
}
return ret;
}
int ObDMLRunningCtx::check_schema_version(
share::schema::ObMultiVersionSchemaService &schema_service,
const uint64_t tenant_id,

View File

@ -47,8 +47,9 @@ public:
ObStoreCtx &store_ctx,
const ObDMLBaseParam &dml_param,
common::ObIAllocator &allocator,
const blocksstable::ObDmlFlag dml_flag);
~ObDMLRunningCtx() {}
const blocksstable::ObDmlFlag dml_flag,
bool is_need_row_datum_utils = false);
~ObDMLRunningCtx();
int init(
const common::ObIArray<uint64_t> *column_ids,
@ -65,6 +66,8 @@ private:
const share::schema::ObTableSchemaParam &schema,
ObTabletHandle &tablet_handle,
const share::SCN &read_snapshot);
int check_need_old_row_legitimacy();
int init_cmp_funcs();
int check_schema_version(share::schema::ObMultiVersionSchemaService &schema_service,
const uint64_t tenant_id,
const uint64_t table_id,
@ -86,11 +89,15 @@ public:
const share::schema::ColumnMap *col_map_;
const ObColDescIArray *col_descs_;
const common::ObIArray<uint64_t> *column_ids_;
ObStoreRow tbl_row_;
blocksstable::ObDatumRow datum_row_;
blocksstable::ObStoreCmpFuncs cmp_funcs_;
bool is_old_row_valid_for_lob_;
bool is_need_check_old_row_;
bool is_udf_;
private:
share::schema::ObSchemaGetterGuard schema_guard_;
bool is_need_row_datum_utils_;
bool is_inited_;
};
} // namespace storage

View File

@ -113,7 +113,7 @@ void ObQueryIteratorFactory::free_table_scan_iter(common::ObNewRowIterator *iter
}
}
void ObQueryIteratorFactory::free_insert_dup_iter(common::ObNewRowIterator *iter)
void ObQueryIteratorFactory::free_insert_dup_iter(blocksstable::ObDatumRowIterator *iter)
{
if (OB_LIKELY(NULL != iter)) {
(void)ATOMIC_FAA(&insert_dup_release_count_, 1);

View File

@ -18,6 +18,10 @@
namespace oceanbase
{
namespace blocksstable
{
class ObDatumRowIterator;
}
namespace storage
{
class ObMultipleScanMerge;
@ -37,7 +41,7 @@ public:
static ObColMap *get_col_map();
static void free_table_scan_iter(common::ObNewRowIterator *iter);
static void free_insert_dup_iter(common::ObNewRowIterator *iter);
static void free_insert_dup_iter(blocksstable::ObDatumRowIterator *iter);
static void free_merge_iter(ObQueryRowIterator *iter);
static void free_col_map(ObColMap *col_map);
static void free_work_row(ObStoreRow *row);

View File

@ -25,7 +25,7 @@ using namespace blocksstable;
namespace storage
{
ObValueRowIterator::ObValueRowIterator()
: ObNewRowIterator(),
: ObDatumRowIterator(),
is_inited_(false),
unique_(false),
allocator_("ObValueRowAlloc"),
@ -53,10 +53,9 @@ int ObValueRowIterator::init(bool unique)
return ret;
}
int ObValueRowIterator::add_row(common::ObNewRow &row)
int ObValueRowIterator::add_row(ObDatumRow &row, const ObStorageDatumUtils &rowkey_datum_utils)
{
int ret = OB_SUCCESS;
ObNewRow *cur_row = NULL;
if (!row.is_valid()) {
ret = OB_INVALID_ARGUMENT;
STORAGE_LOG(WARN, "invalid row", K(ret), K(row));
@ -71,29 +70,34 @@ int ObValueRowIterator::add_row(common::ObNewRow &row)
//on multiple unique index is small, so there is usually only one row in the value row iterator
//so using list traversal to deduplicate unique index is more efficiently
//and also saves the CPU overhead that constructs the hash map
ObStoreRowkey rowkey;
ObStoreRowkey tmp_rowkey;
if (OB_FAIL(rowkey.assign(row.cells_, row.count_))) {
ObDatumRowkey rowkey;
ObDatumRowkey tmp_rowkey;
if (OB_FAIL(rowkey.assign(row.storage_datums_, row.count_))) {
STORAGE_LOG(WARN, "Failed to assign rowkey", K(ret), K(row));
}
for (int64_t i = 0; OB_SUCC(ret) && !exist && i < rows_.count(); ++i) {
if (OB_FAIL(tmp_rowkey.assign(rows_.at(i).cells_, rows_.at(i).count_))) {
STORAGE_LOG(WARN, "Failed to assign rowkey", K(ret), K(i), K(rows_.at(i)));
} else if (OB_UNLIKELY(tmp_rowkey == rowkey)) {
exist = true;
if (OB_FAIL(tmp_rowkey.assign(rows_.at(i)->storage_datums_, rows_.at(i)->count_))) {
STORAGE_LOG(WARN, "Failed to assign rowkey", K(ret), K(i), KPC(rows_.at(i)));
} else if (OB_FAIL(tmp_rowkey.equal(rowkey, rowkey_datum_utils, exist))) {
STORAGE_LOG(WARN, "Failed to compare rowkey", K(ret), K(i), K(tmp_rowkey), K(rowkey));
}
}
}
// store non-exist row
if (OB_SUCC(ret)) {
if (!exist) {
if (NULL == (cur_row = rows_.alloc_place_holder())) {
ObDatumRow *cur_row = nullptr;
void *buff = nullptr;
if (OB_ISNULL(buff = allocator_.alloc(sizeof(ObDatumRow)))) {
ret = OB_ALLOCATE_MEMORY_FAILED;
STORAGE_LOG(ERROR, "add row error", K(ret));
} else if (OB_SUCCESS != (ret = ob_write_row(allocator_,
row,
*cur_row))) {
STORAGE_LOG(WARN, "alloc memory for datum row error", K(ret));
} else if (FALSE_IT(cur_row = new (buff) ObDatumRow())) {
} else if (OB_FAIL(cur_row->init(allocator_, row.count_))) {
STORAGE_LOG(WARN, "init datum row error", K(ret), K(row), KPC(cur_row));
} else if (OB_FAIL(cur_row->deep_copy(row, allocator_))) {
STORAGE_LOG(WARN, "copy row error", K(ret), K(row));
} else if (OB_FAIL(rows_.push_back(cur_row))) {
STORAGE_LOG(WARN, "fail to push datum row to iterator array", K(ret), K(cur_row));
}
}
}
@ -101,27 +105,14 @@ int ObValueRowIterator::add_row(common::ObNewRow &row)
return ret;
}
int ObValueRowIterator::get_next_row(common::ObNewRow *&row)
int ObValueRowIterator::get_next_row(ObDatumRow *&row)
{
int ret = OB_SUCCESS;
if (OB_UNLIKELY(!is_inited_)) {
ret = OB_NOT_INIT;
STORAGE_LOG(WARN, "ObValueRowIterator is not initialized", K(ret));
} else if (cur_idx_ < rows_.count()) {
row = &rows_.at(cur_idx_++);
} else {
ret = OB_ITER_END;
}
return ret;
}
int ObValueRowIterator::get_next_rows(ObNewRow *&rows, int64_t &row_count)
{
int ret = OB_SUCCESS;
if (cur_idx_ < rows_.count()) {
rows = &(rows_.at(cur_idx_));
row_count = rows_.count() - cur_idx_;
cur_idx_ = rows_.count();
row = rows_.at(cur_idx_++);
} else {
ret = OB_ITER_END;
}
@ -143,23 +134,23 @@ ObSingleRowGetter::ObSingleRowGetter(ObIAllocator &allocator, ObTablet &tablet)
store_ctx_(nullptr),
output_projector_(allocator),
relative_table_(nullptr),
table_param_(nullptr),
allocator_(allocator),
new_row_builder_()
cached_iter_node_(nullptr)
{
}
ObSingleRowGetter::~ObSingleRowGetter()
{
if (single_merge_ != nullptr) {
single_merge_->~ObSingleMerge();
allocator_.free(single_merge_);
if (nullptr != single_merge_) {
if (nullptr == cached_iter_node_) {
single_merge_->~ObSingleMerge();
allocator_.free(single_merge_);
}
single_merge_ = nullptr;
}
if (table_param_ != nullptr) {
table_param_->~ObTableParam();
allocator_.free(table_param_);
table_param_ = nullptr;
if (nullptr != cached_iter_node_) {
ObGlobalIteratorPool *iter_pool = MTL(ObGlobalIteratorPool*);
iter_pool->release(cached_iter_node_);
}
}
@ -171,6 +162,7 @@ int ObSingleRowGetter::init_dml_access_ctx(
int ret = OB_SUCCESS;
common::ObQueryFlag query_flag;
common::ObVersionRange trans_version_range;
query_flag.set_not_use_bloomfilter_cache();
query_flag.read_latest_ = ObQueryFlag::OBSF_MASK_READ_LATEST;
if (skip_read_lob) {
query_flag.skip_read_lob_ = ObQueryFlag::OBSF_MASK_SKIP_READ_LOB;
@ -180,7 +172,7 @@ int ObSingleRowGetter::init_dml_access_ctx(
trans_version_range.multi_version_start_ = 0;
store_ctx_ = &store_ctx;
if (OB_FAIL(access_ctx_.init(query_flag, store_ctx, allocator_, trans_version_range))) {
if (OB_FAIL(access_ctx_.init(query_flag, store_ctx, allocator_, trans_version_range, cached_iter_node_))) {
LOG_WARN("failed to init table access ctx", K(ret));
}
return ret;
@ -233,18 +225,21 @@ int ObSingleRowGetter::init_dml_access_param(ObRelativeTable &relative_table,
return ret;
}
int ObSingleRowGetter::create_table_param()
int ObSingleRowGetter::prepare_cached_iter_node()
{
int ret = OB_SUCCESS;
void *buf = nullptr;
if (table_param_ != nullptr) {
ret = OB_INIT_TWICE;
LOG_WARN("init table param twice", K(ret));
} else if (OB_ISNULL(buf = allocator_.alloc(sizeof(share::schema::ObTableParam)))) {
ret = OB_ALLOCATE_MEMORY_FAILED;
LOG_WARN("allocate table param failed", K(ret), K(sizeof(share::schema::ObTableParam)));
} else {
table_param_ = new(buf) share::schema::ObTableParam(allocator_);
if (OB_UNLIKELY(nullptr != cached_iter_node_)) {
ret = OB_ERR_UNEXPECTED;
STORAGE_LOG(WARN, "Unexpected not null cached iter node", K(ret), KP(cached_iter_node_));
} else if (can_use_global_iter_pool()) {
ObGlobalIteratorPool *iter_pool = MTL(ObGlobalIteratorPool*);
if (OB_FAIL(iter_pool->get(ITER_TYPE, cached_iter_node_))) {
STORAGE_LOG(WARN, "Failed to get from iter pool", K(ret));
} else if (nullptr != cached_iter_node_) {
access_param_.set_use_global_iter_pool();
access_param_.iter_param_.set_use_stmt_iter_pool();
STORAGE_LOG(TRACE, "use global iter pool", K(access_param_));
}
}
return ret;
}
@ -252,28 +247,18 @@ int ObSingleRowGetter::create_table_param()
int ObSingleRowGetter::open(const ObDatumRowkey &rowkey, bool use_fuse_row_cache)
{
int ret = OB_SUCCESS;
void *buf = nullptr;
const common::ObIArray<share::schema::ObColDesc> * col_descs = nullptr;
if (OB_ISNULL(buf = allocator_.alloc(sizeof(ObSingleMerge)))) {
ret = OB_ALLOCATE_MEMORY_FAILED;
LOG_WARN("Fail to allocate memory for multi get merge ", K(ret));
} else {
{
ObStorageTableGuard guard(tablet_, *store_ctx_, false);
if (OB_FAIL(guard.refresh_and_protect_memtable_for_write(*relative_table_))) {
STORAGE_LOG(WARN, "fail to protect table", K(ret));
}
{
ObStorageTableGuard guard(tablet_, *store_ctx_, false);
if (OB_FAIL(guard.refresh_and_protect_memtable_for_write(*relative_table_))) {
STORAGE_LOG(WARN, "fail to protect table", K(ret));
}
single_merge_ = new(buf) ObSingleMerge();
}
if (OB_SUCC(ret)) {
if (OB_FAIL(single_merge_->init(access_param_, access_ctx_, get_table_param_))) {
STORAGE_LOG(WARN, "Fail to init ObSingleMerge, ", K(ret));
ACTIVE_GLOBAL_ITERATOR_GUARD(ret, cached_iter_node_);
if (OB_FAIL(init_single_merge())) {
STORAGE_LOG(WARN, "Fail to init ObSingleMerge", K(ret));
} else if (OB_FAIL(single_merge_->open(rowkey))) {
STORAGE_LOG(WARN, "Fail to open iter, ", K(ret));
} else if (OB_FAIL(new_row_builder_.init(single_merge_->get_out_project_cells(), allocator_))) {
LOG_WARN("Failed to init ObNewRowBuilder", K(ret));
STORAGE_LOG(WARN, "Fail to open iter", K(ret));
}
if (use_fuse_row_cache) {
access_ctx_.use_fuse_row_cache_ = true;
@ -282,9 +267,10 @@ int ObSingleRowGetter::open(const ObDatumRowkey &rowkey, bool use_fuse_row_cache
return ret;
}
int ObSingleRowGetter::get_next_row(ObNewRow *&row)
int ObSingleRowGetter::get_next_row(blocksstable::ObDatumRow *&row)
{
int ret = OB_SUCCESS;
ACTIVE_GLOBAL_ITERATOR_GUARD(ret, cached_iter_node_);
row = nullptr;
while (OB_SUCC(ret)) {
blocksstable::ObDatumRow *store_row = NULL;
@ -293,9 +279,7 @@ int ObSingleRowGetter::get_next_row(ObNewRow *&row)
STORAGE_LOG(WARN, "failed to get next row", K(ret));
}
} else if (store_row->row_flag_.is_exist_without_delete()) {
if (OB_FAIL(new_row_builder_.build(*store_row, row))) {
STORAGE_LOG(WARN, "Failed to build new row", K(ret), KPC(store_row));
}
row = store_row;
break;
}
}
@ -319,5 +303,58 @@ int ObSingleRowGetter::get_next_row(ObNewRow *&row)
}
return ret;
}
bool ObSingleRowGetter::can_use_global_iter_pool() const
{
bool use_pool = false;
if (access_param_.iter_param_.tablet_id_.is_inner_tablet()) {
} else if (access_param_.iter_param_.has_lob_column_out_) {
} else {
const int64_t table_cnt = get_table_param_.tablet_iter_.table_iter()->count();
const int64_t col_cnt = get_table_param_.tablet_iter_.get_tablet()->get_rowkey_read_info().get_schema_column_count();
ObGlobalIteratorPool *iter_pool = MTL(ObGlobalIteratorPool*);
if (OB_NOT_NULL(iter_pool)) {
use_pool = iter_pool->can_use_iter_pool(table_cnt, col_cnt, ITER_TYPE);
}
}
return use_pool;
}
int ObSingleRowGetter::init_single_merge()
{
int ret = OB_SUCCESS;
ObQueryRowIterator *cached_iter = nullptr == cached_iter_node_ ? nullptr : cached_iter_node_->get_iter();
if (OB_NOT_NULL(cached_iter)) {
if (OB_UNLIKELY(cached_iter->get_type() != ITER_TYPE)) {
ret = OB_ERR_UNEXPECTED;
STORAGE_LOG(WARN, "Unexpected cached iter type", K(ret), K(cached_iter->get_type()));
} else {
single_merge_ = static_cast<ObSingleMerge*>(cached_iter);
}
}
if (OB_FAIL(ret)) {
} else if (nullptr == single_merge_) {
void *buf = nullptr;
if (OB_ISNULL(buf = access_ctx_.get_long_life_allocator()->alloc(sizeof(ObSingleMerge)))) {
ret = OB_ALLOCATE_MEMORY_FAILED;
STORAGE_LOG(WARN, "Fail to allocate memory", K(ret));
} else {
single_merge_ = new (buf) ObSingleMerge();
if (OB_FAIL(single_merge_->init(access_param_, access_ctx_, get_table_param_))) {
STORAGE_LOG(WARN, "Failed to init multiple merge", K(ret));
}
if (OB_FAIL(ret)) {
single_merge_->~ObSingleMerge();
access_ctx_.get_long_life_allocator()->free(single_merge_);
single_merge_ = nullptr;
} else if (nullptr != cached_iter_node_) {
cached_iter_node_->set_iter(single_merge_);
}
}
} else if (OB_FAIL(single_merge_->switch_table(access_param_, access_ctx_, get_table_param_))) {
STORAGE_LOG(WARN, "Failed to switch table", K(ret), K(access_param_));
}
return ret;
}
} // end namespace storage
} // end namespace oceanbase

View File

@ -22,6 +22,7 @@
#include "storage/ob_i_store.h"
#include "storage/access/ob_dml_param.h"
#include "blocksstable/ob_datum_rowkey.h"
#include "blocksstable/ob_datum_row_iterator.h"
namespace oceanbase
{
@ -29,17 +30,16 @@ namespace storage
{
class ObTablet;
class ObValueRowIterator : public common::ObNewRowIterator
class ObValueRowIterator : public blocksstable::ObDatumRowIterator
{
static const int64_t DEFAULT_ROW_NUM = 2;
typedef common::ObSEArray<common::ObNewRow, DEFAULT_ROW_NUM> RowArray;
typedef common::ObSEArray<blocksstable::ObDatumRow*, DEFAULT_ROW_NUM> RowArray;
public:
ObValueRowIterator();
virtual ~ObValueRowIterator();
virtual int init(bool unique);
virtual int get_next_row(common::ObNewRow *&row);
virtual int get_next_rows(common::ObNewRow *&rows, int64_t &row_count);
virtual int add_row(common::ObNewRow &row);
virtual int get_next_row(blocksstable::ObDatumRow *&row);
virtual int add_row(blocksstable::ObDatumRow &row, const blocksstable::ObStorageDatumUtils &rowkey_datum_utils);
virtual void reset();
private:
bool is_inited_;
@ -55,6 +55,7 @@ class ObSingleMerge;
class ObSingleRowGetter
{
typedef common::ObFixedArray<int32_t, common::ObIAllocator> Projector;
const ObQRIterType ITER_TYPE = T_SINGLE_GET;
public:
ObSingleRowGetter(common::ObIAllocator &allocator, ObTablet &tablet);
~ObSingleRowGetter();
@ -68,13 +69,15 @@ public:
const ObDMLBaseParam &dml_param,
const common::ObIArray<uint64_t> &out_col_ids,
const bool skip_read_lob = false);
int prepare_cached_iter_node();
ObTableAccessParam &get_access_param() { return access_param_; }
ObTableAccessContext &get_access_ctx() { return access_ctx_; }
void set_relative_table(ObRelativeTable *relative_table) { relative_table_ = relative_table; }
int open(const blocksstable::ObDatumRowkey &rowkey, bool use_fuse_row_cache = false);
int get_next_row(common::ObNewRow *&row);
int get_next_row(blocksstable::ObDatumRow *&row);
private:
int create_table_param();
bool can_use_global_iter_pool() const;
int init_single_merge();
private:
ObTablet *tablet_;
ObSingleMerge *single_merge_;
@ -84,9 +87,8 @@ private:
ObTableAccessContext access_ctx_;
ObGetTableParam get_table_param_;
ObRelativeTable *relative_table_;
share::schema::ObTableParam *table_param_;
common::ObIAllocator &allocator_;
blocksstable::ObNewRowBuilder new_row_builder_;
CachedIteratorNode *cached_iter_node_;
};
} // end namespace storage
} // end namespace oceanbase

View File

@ -91,6 +91,7 @@
#include "storage/tablet/ob_tablet_mds_table_mini_merger.h"
#include "storage/blocksstable/ob_shared_macro_block_manager.h"
#include "storage/ob_direct_load_table_guard.h"
#include "storage/blocksstable/ob_datum_row_utils.h"
namespace oceanbase
{
@ -3639,7 +3640,8 @@ int ObTablet::check_schema_version_for_bounded_staleness_read(
int ObTablet::lock_row(
ObRelativeTable &relative_table,
ObStoreCtx &store_ctx,
const common::ObNewRow &row)
ObColDescArray &col_desc,
blocksstable::ObDatumRow &row)
{
int ret = OB_SUCCESS;
ObStorageTableGuard guard(this, store_ctx, true);
@ -3669,7 +3671,7 @@ int ObTablet::lock_row(
LOG_WARN("prepare write memtable fail", K(ret), K(relative_table));
} else if (OB_FAIL(prepare_param_ctx(allocator, relative_table, store_ctx, param, context))) {
LOG_WARN("prepare param ctx fail, ", K(ret));
} else if (OB_FAIL(write_memtable->lock(param, context, row))) {
} else if (OB_FAIL(write_memtable->lock(param, context, col_desc, row))) {
LOG_WARN("failed to lock write_memtable", K(ret), K(row));
}
}
@ -4101,8 +4103,8 @@ int ObTablet::update_row(
storage::ObStoreCtx &store_ctx,
const common::ObIArray<share::schema::ObColDesc> &col_descs,
const ObIArray<int64_t> &update_idx,
const storage::ObStoreRow &old_row,
const storage::ObStoreRow &new_row,
const blocksstable::ObDatumRow &old_row,
blocksstable::ObDatumRow &new_row,
const common::ObIArray<transaction::ObEncryptMetaCache> *encrypt_meta_arr)
{
int ret = OB_SUCCESS;
@ -4159,7 +4161,7 @@ int ObTablet::update_row(
int ObTablet::insert_rows(
ObRelativeTable &relative_table,
ObStoreCtx &store_ctx,
ObStoreRow *rows,
ObDatumRow *rows,
ObRowsInfo &rows_info,
const bool check_exist,
const ObColDescIArray &col_descs,
@ -4209,7 +4211,7 @@ int ObTablet::insert_row_without_rowkey_check(
ObStoreCtx &store_ctx,
const bool check_exist,
const common::ObIArray<share::schema::ObColDesc> &col_descs,
const storage::ObStoreRow &row,
blocksstable::ObDatumRow &row,
const common::ObIArray<transaction::ObEncryptMetaCache> *encrypt_meta_arr)
{
int ret = OB_SUCCESS;
@ -4373,7 +4375,8 @@ int ObTablet::do_rowkeys_exist(
int ObTablet::rowkey_exists(
ObRelativeTable &relative_table,
ObStoreCtx &store_ctx,
const common::ObNewRow &row,
const ObColDescIArray &col_descs,
ObDatumRow &row,
bool &exists)
{
int ret = OB_SUCCESS;
@ -4399,24 +4402,22 @@ int ObTablet::rowkey_exists(
}
if (OB_SUCC(ret)) {
ObStoreRowkey rowkey;
ObDatumRowkey datum_rowkey;
ObDatumRowkeyHelper rowkey_helper;
ObArenaAllocator allocator(common::ObMemAttr(MTL_ID(), "rowkey_acc_ctx"));
ObTableIterParam param;
ObTableAccessContext context;
if (OB_FAIL(rowkey.assign(row.cells_, relative_table.get_rowkey_column_num()))) {
LOG_WARN("Failed to assign rowkey", K(ret), K(row));
} else if (OB_FAIL(rowkey_helper.convert_datum_rowkey(rowkey.get_rowkey(), datum_rowkey))) {
LOG_WARN("Failed to transfer datum rowkey", K(ret), K(rowkey));
if (OB_FAIL(rowkey_helper.prepare_datum_rowkey(row, relative_table.get_rowkey_column_num(),
col_descs, datum_rowkey))) {
LOG_WARN("Failed to prepare rowkey", K(ret), K(row));
} else if (OB_FAIL(prepare_param_ctx(allocator, relative_table, store_ctx, param, context))) {
LOG_WARN("Failed to prepare param ctx, ", K(ret), K(rowkey));
LOG_WARN("Failed to prepare param ctx, ", K(ret), K(row));
} else if (OB_FAIL(relative_table.tablet_iter_.get_tablet()->do_rowkey_exists(
param, context, datum_rowkey, exists))) {
LOG_WARN("do rowkey exist fail", K(ret), K(rowkey));
LOG_WARN("do rowkey exist fail", K(ret), K(row), K(datum_rowkey));
}
LOG_DEBUG("chaser debug row", K(ret), K(row), K(rowkey));
LOG_DEBUG("chaser debug row", K(ret), K(row));
}
}
return ret;

View File

@ -314,7 +314,7 @@ public:
int insert_rows(
ObRelativeTable &relative_table,
ObStoreCtx &store_ctx,
ObStoreRow *rows,
blocksstable::ObDatumRow *rows,
ObRowsInfo &rows_info,
const bool check_exist,
const ObColDescIArray &col_descs,
@ -325,20 +325,21 @@ public:
ObStoreCtx &store_ctx,
const bool check_exist,
const ObColDescIArray &col_descs,
const storage::ObStoreRow &row,
blocksstable::ObDatumRow &row,
const common::ObIArray<transaction::ObEncryptMetaCache> *encrypt_meta_arr);
int update_row(
ObRelativeTable &relative_table,
ObStoreCtx &store_ctx,
const ObColDescIArray &col_descs,
const ObIArray<int64_t> &update_idx,
const storage::ObStoreRow &old_row,
const storage::ObStoreRow &new_row,
const blocksstable::ObDatumRow &old_row,
blocksstable::ObDatumRow &new_row,
const common::ObIArray<transaction::ObEncryptMetaCache> *encrypt_meta_arr);
int lock_row(
ObRelativeTable &relative_table,
ObStoreCtx &store_ctx,
const common::ObNewRow &row);
ObColDescArray &col_desc,
blocksstable::ObDatumRow &row);
int lock_row(
ObRelativeTable &relative_table,
ObStoreCtx &store_ctx,
@ -399,7 +400,8 @@ public:
int rowkey_exists(
ObRelativeTable &relative_table,
ObStoreCtx &store_ctx,
const common::ObNewRow &row,
const ObColDescIArray &col_descs,
blocksstable::ObDatumRow &row,
bool &exists);
int rowkeys_exists(
ObStoreCtx &store_ctx,

View File

@ -96,6 +96,7 @@ void ObTableStoreIterator::reset()
table_ptr_array_.reset();
sstable_handle_array_.reset();
table_store_handle_.reset();
if (nullptr != transfer_src_table_store_handle_) {
transfer_src_table_store_handle_->~ObStorageMetaHandle();
ob_free(transfer_src_table_store_handle_);

View File

@ -754,7 +754,7 @@ int ObAccessService::delete_rows(
transaction::ObTxDesc &tx_desc,
const ObDMLBaseParam &dml_param,
const common::ObIArray<uint64_t> &column_ids,
common::ObNewRowIterator *row_iter,
blocksstable::ObDatumRowIterator *row_iter,
int64_t &affected_rows)
{
ACTIVE_SESSION_FLAG_SETTER_GUARD(in_storage_write);
@ -808,7 +808,7 @@ int ObAccessService::put_rows(
transaction::ObTxDesc &tx_desc,
const ObDMLBaseParam &dml_param,
const common::ObIArray<uint64_t> &column_ids,
common::ObNewRowIterator *row_iter,
blocksstable::ObDatumRowIterator *row_iter,
int64_t &affected_rows)
{
ACTIVE_SESSION_FLAG_SETTER_GUARD(in_storage_write);
@ -861,7 +861,7 @@ int ObAccessService::insert_rows(
transaction::ObTxDesc &tx_desc,
const ObDMLBaseParam &dml_param,
const common::ObIArray<uint64_t> &column_ids,
common::ObNewRowIterator *row_iter,
blocksstable::ObDatumRowIterator *row_iter,
int64_t &affected_rows)
{
ACTIVE_SESSION_FLAG_SETTER_GUARD(in_storage_write);
@ -916,10 +916,10 @@ int ObAccessService::insert_row(
const ObDMLBaseParam &dml_param,
const common::ObIArray<uint64_t> &column_ids,
const common::ObIArray<uint64_t> &duplicated_column_ids,
const common::ObNewRow &row,
blocksstable::ObDatumRow &row,
const ObInsertFlag flag,
int64_t &affected_rows,
common::ObNewRowIterator *&duplicated_rows)
blocksstable::ObDatumRowIterator *&duplicated_rows)
{
ACTIVE_SESSION_FLAG_SETTER_GUARD(in_storage_write);
int ret = OB_SUCCESS;
@ -970,7 +970,7 @@ int ObAccessService::insert_row(
return ret;
}
int ObAccessService::revert_insert_iter(common::ObNewRowIterator *iter)
int ObAccessService::revert_insert_iter(blocksstable::ObDatumRowIterator *iter)
{
ACTIVE_SESSION_FLAG_SETTER_GUARD(in_storage_write);
int ret = OB_SUCCESS;
@ -987,7 +987,7 @@ int ObAccessService::update_rows(
const ObDMLBaseParam &dml_param,
const common::ObIArray<uint64_t> &column_ids,
const common::ObIArray< uint64_t> &updated_column_ids,
common::ObNewRowIterator *row_iter,
blocksstable::ObDatumRowIterator *row_iter,
int64_t &affected_rows)
{
ACTIVE_SESSION_FLAG_SETTER_GUARD(in_storage_write);
@ -1043,7 +1043,7 @@ int ObAccessService::lock_rows(
const ObDMLBaseParam &dml_param,
const int64_t abs_lock_timeout,
const ObLockFlag lock_flag,
common::ObNewRowIterator *row_iter,
blocksstable::ObDatumRowIterator *row_iter,
int64_t &affected_rows)
{
ACTIVE_SESSION_FLAG_SETTER_GUARD(in_storage_write);
@ -1098,7 +1098,7 @@ int ObAccessService::lock_row(
transaction::ObTxDesc &tx_desc,
const ObDMLBaseParam &dml_param,
const int64_t abs_lock_timeout,
const common::ObNewRow &row,
blocksstable::ObDatumRow &row,
const ObLockFlag lock_flag)
{
ACTIVE_SESSION_FLAG_SETTER_GUARD(in_storage_write);

View File

@ -137,7 +137,7 @@ public:
transaction::ObTxDesc &tx_desc,
const ObDMLBaseParam &dml_param,
const common::ObIArray<uint64_t> &column_ids,
common::ObNewRowIterator *row_iter,
blocksstable::ObDatumRowIterator *row_iter,
int64_t &affected_rows);
int put_rows(
const share::ObLSID &ls_id,
@ -145,7 +145,7 @@ public:
transaction::ObTxDesc &tx_desc,
const ObDMLBaseParam &dml_param,
const common::ObIArray<uint64_t> &column_ids,
common::ObNewRowIterator *row_iter,
blocksstable::ObDatumRowIterator *row_iter,
int64_t &affected_rows);
int insert_rows(
const share::ObLSID &ls_id,
@ -153,7 +153,7 @@ public:
transaction::ObTxDesc &tx_desc,
const ObDMLBaseParam &dml_param,
const common::ObIArray<uint64_t> &column_ids,
common::ObNewRowIterator *row_iter,
blocksstable::ObDatumRowIterator *row_iter,
int64_t &affected_rows);
int insert_row(
const share::ObLSID &ls_id,
@ -162,11 +162,11 @@ public:
const ObDMLBaseParam &dml_param,
const common::ObIArray<uint64_t> &column_ids,
const common::ObIArray<uint64_t> &duplicated_column_ids,
const common::ObNewRow &row,
blocksstable::ObDatumRow &row,
const ObInsertFlag flag,
int64_t &affected_rows,
common::ObNewRowIterator *&duplicated_rows);
int revert_insert_iter(common::ObNewRowIterator *iter);
blocksstable::ObDatumRowIterator *&duplicated_rows);
int revert_insert_iter(blocksstable::ObDatumRowIterator *iter);
int update_rows(
const share::ObLSID &ls_id,
const common::ObTabletID &tablet_id,
@ -174,7 +174,7 @@ public:
const ObDMLBaseParam &dml_param,
const common::ObIArray<uint64_t> &column_ids,
const common::ObIArray< uint64_t> &updated_column_ids,
common::ObNewRowIterator *row_iter,
blocksstable::ObDatumRowIterator *row_iter,
int64_t &affected_rows);
int lock_rows(
const share::ObLSID &ls_id,
@ -183,7 +183,7 @@ public:
const ObDMLBaseParam &dml_param,
const int64_t abs_lock_timeout, /* -1: undefined, 0: nowait */
const ObLockFlag lock_flag,
common::ObNewRowIterator *row_iter,
blocksstable::ObDatumRowIterator *row_iter,
int64_t &affected_rows);
int lock_row(
const share::ObLSID &ls_id,
@ -191,7 +191,7 @@ public:
transaction::ObTxDesc &tx_desc,
const ObDMLBaseParam &dml_param,
const int64_t abs_lock_timeout,
const common::ObNewRow &row,
blocksstable::ObDatumRow &row,
const ObLockFlag lock_flag);
int estimate_row_count(
const ObTableScanParam &param,

View File

@ -1326,30 +1326,30 @@ TEST_F(TestNewRowReader, test_write_update_row)
const int64_t num = 200;
const int64_t write_col_cnt = 80;
const int64_t rowkey_cnt = 5;
oceanbase::common::ObObj objs[num];
ObStoreRow writer_row;
writer_row.row_val_.cells_ = objs;
writer_row.row_val_.count_ = column_num;
blocksstable::ObStorageDatum objs[num];
ObDatumRow writer_row;
writer_row.storage_datums_ = objs;
writer_row.count_ = column_num;
ASSERT_EQ(OB_SUCCESS, row_generate_.get_next_row(writer_row));
for (int i = writer_row.row_val_.count_; i < write_col_cnt; ++i) {
writer_row.row_val_.cells_[i] = writer_row.row_val_.cells_[i - writer_row.row_val_.count_];
for (int i = writer_row.count_; i < write_col_cnt; ++i) {
writer_row.storage_datums_[i] = writer_row.storage_datums_[i - writer_row.count_];
}
writer_row.row_val_.count_ = write_col_cnt;
writer_row.count_ = write_col_cnt;
memtable::ObNopBitMap nop_bitmap;
bool read_finished = false;
ret = nop_bitmap.init(writer_row.row_val_.count_, rowkey_cnt);
ret = nop_bitmap.init(writer_row.count_, rowkey_cnt);
ObDatumRow reader_row;
ASSERT_EQ(OB_SUCCESS, reader_row.init(allocator_, writer_row.row_val_.count_));
for (int i = 0; i < writer_row.row_val_.count_; ++i) {
ASSERT_EQ(OB_SUCCESS, reader_row.init(allocator_, writer_row.count_));
for (int i = 0; i < writer_row.count_; ++i) {
reader_row.storage_datums_[i].set_nop();
}
int64_t array[] = {5, 18, 29, 45, 75, 78};
writer_row.row_val_.cells_[array[2]].set_int(0);
writer_row.row_val_.cells_[array[4]].set_int(0);
writer_row.storage_datums_[array[2]].set_int(0);
writer_row.storage_datums_[array[4]].set_int(0);
build_column_read_info(rowkey_cnt, writer_row);
STORAGE_LOG(INFO, "write_row", K(writer_row));
@ -1363,11 +1363,11 @@ TEST_F(TestNewRowReader, test_write_update_row)
int64_t len = 0;
char *buf = nullptr;
writer_row.flag_.set_flag(ObDmlFlag::DF_UPDATE);
writer_row.row_val_.cells_[array[2]].set_int(100 * i);
writer_row.row_val_.cells_[array[4]].set_int(100 * i);
writer_row.row_flag_.set_flag(ObDmlFlag::DF_UPDATE);
writer_row.storage_datums_[array[2]].set_int(100 * i);
writer_row.storage_datums_[array[4]].set_int(100 * i);
if (i == 4) {
writer_row.flag_.set_flag(ObDmlFlag::DF_INSERT);
writer_row.row_flag_.set_flag(ObDmlFlag::DF_INSERT);
ret = row_writer[i].write(rowkey_cnt, writer_row, nullptr, buf, len);
} else {
ret = row_writer[i].write(rowkey_cnt, writer_row, &update_idx, buf, len);
@ -1387,7 +1387,7 @@ TEST_F(TestNewRowReader, test_write_update_row)
STORAGE_LOG(INFO, "chaser check writer row", K(read_info_));
int update_pos = 0;
for (int i = 0; i < writer_row.row_val_.count_; ++i) {
for (int i = 0; i < writer_row.count_; ++i) {
bool check_cell_flag = false;
if (i < rowkey_cnt) {
check_cell_flag = true;
@ -1397,12 +1397,10 @@ TEST_F(TestNewRowReader, test_write_update_row)
}
if (check_cell_flag) {
STORAGE_LOG(INFO, "check", K(i), K(update_pos), K(reader_row.storage_datums_[i]));
if (ObNumberFloatType != writer_row.row_val_.cells_[i].get_type()) {
if (i == array[2] || i == array[4]) {
ASSERT_TRUE(reader_row.storage_datums_[i].get_int() == 0);
} else {
ASSERT_TRUE(reader_row.storage_datums_[i] == writer_row.row_val_.cells_[i]);
}
if (i == array[2] || i == array[4]) {
ASSERT_TRUE(reader_row.storage_datums_[i].get_int() == 0);
} else {
ASSERT_TRUE(reader_row.storage_datums_[i] == writer_row.storage_datums_[i]);
}
} else {
ASSERT_TRUE(!reader_row.storage_datums_[i].is_nop());
@ -1416,28 +1414,28 @@ TEST_F(TestNewRowReader, test_write_write_nop_val)
const int64_t num = 400;
const int64_t write_col_cnt = 302;
const int64_t rowkey_cnt = 3;
oceanbase::common::ObObj objs[num];
ObStoreRow writer_row;
writer_row.row_val_.cells_ = objs;
writer_row.row_val_.count_ = column_num;
blocksstable::ObStorageDatum objs[num];
ObDatumRow writer_row;
writer_row.storage_datums_ = objs;
writer_row.count_ = column_num;
ASSERT_EQ(OB_SUCCESS, row_generate_.get_next_row(writer_row));
int64_t idx = 0;
writer_row.row_val_.cells_[idx++].set_int(14);
writer_row.row_val_.cells_[idx++].set_int(-1658240586131896801);
writer_row.row_val_.cells_[idx++].set_int(-INT64_MAX);
writer_row.storage_datums_[idx++].set_int(14);
writer_row.storage_datums_[idx++].set_int(-1658240586131896801);
writer_row.storage_datums_[idx++].set_int(-INT64_MAX);
for (int i = idx; i < write_col_cnt; ++i) {
writer_row.row_val_.cells_[i].set_nop_value();
writer_row.storage_datums_[i].set_nop();
}
writer_row.row_val_.count_ = write_col_cnt;
writer_row.count_ = write_col_cnt;
memtable::ObNopBitMap nop_bitmap;
bool read_finished = false;
ret = nop_bitmap.init(writer_row.row_val_.count_, rowkey_cnt);
ret = nop_bitmap.init(writer_row.count_, rowkey_cnt);
ObDatumRow reader_row;
ASSERT_EQ(OB_SUCCESS, reader_row.init(allocator_, num));
reader_row.count_ = writer_row.row_val_.count_;
reader_row.count_ = writer_row.count_;
build_column_read_info(rowkey_cnt, writer_row);
int64_t len = 0;
@ -1449,11 +1447,9 @@ TEST_F(TestNewRowReader, test_write_write_nop_val)
ret = row_reader.read_row(buf, len, &read_info_, reader_row);
STORAGE_LOG(INFO, "chaser check writer row", K(read_info_), K(reader_row));
for (int i = 0; i < writer_row.row_val_.count_; ++i) {
for (int i = 0; i < writer_row.count_; ++i) {
STORAGE_LOG(INFO, "check", K(i), K(reader_row.storage_datums_[i]));
if (ObNumberFloatType != writer_row.row_val_.cells_[i].get_type()) {
ASSERT_TRUE(reader_row.storage_datums_[i] == writer_row.row_val_.cells_[i]);
}
ASSERT_TRUE(reader_row.storage_datums_[i] == writer_row.storage_datums_[i]);
}
}
@ -1504,10 +1500,10 @@ TEST_F(TestNewRowReader, test_update_idx_with_rowkey)
const int64_t write_col_cnt = 80;
const int64_t rowkey_cnt = 3;
oceanbase::common::ObObj objs[num];
ObStoreRow writer_row;
writer_row.row_val_.cells_ = objs;
writer_row.row_val_.count_ = column_num;
blocksstable::ObStorageDatum objs[num];
ObDatumRow writer_row;
writer_row.storage_datums_ = objs;
writer_row.count_ = column_num;
ASSERT_EQ(OB_SUCCESS, row_generate_.get_next_row(writer_row));
int64_t update_array[] = {0, 1, 2, 5, 18};
@ -1515,9 +1511,9 @@ TEST_F(TestNewRowReader, test_update_idx_with_rowkey)
build_column_read_info(rowkey_cnt, writer_row);
int64_t array_idx = 0;
for (int i = 0; i < writer_row.row_val_.count_; ++i) {
for (int i = 0; i < writer_row.count_; ++i) {
if (i != update_array[array_idx]) {
writer_row.row_val_.cells_[i].set_nop_value();
writer_row.storage_datums_[i].set_nop();
} else {
update_idx.push_back(update_array[array_idx]);
++array_idx;

View File

@ -32,7 +32,7 @@ int MockObAccessService::insert_rows(
transaction::ObTxDesc &tx_desc,
const ObDMLBaseParam &dml_param,
const common::ObIArray<uint64_t> &column_ids,
common::ObNewRowIterator *row_iter,
blocksstable::ObDatumRowIterator *row_iter,
int64_t &affected_rows)
{
int ret = OB_SUCCESS;

View File

@ -33,7 +33,7 @@ public:
transaction::ObTxDesc &tx_desc,
const ObDMLBaseParam &dml_param,
const common::ObIArray<uint64_t> &column_ids,
common::ObNewRowIterator *row_iter,
blocksstable::ObDatumRowIterator *row_iter,
int64_t &affected_rows);
public:
ObLSTabletService *tablet_service_; // different kinds of mock ls tablet service

File diff suppressed because it is too large Load Diff

View File

@ -23,6 +23,7 @@
#include "storage/access/ob_store_row_iterator.h"
#include "storage/access/ob_table_read_info.h"
#include "storage/access/ob_sstable_row_whole_scanner.h"
#include "storage/blocksstable/ob_datum_row_iterator.h"
namespace oceanbase
{
@ -39,10 +40,16 @@ public:
int64_t count() const { return rows_.count(); }
// get row at idx, do not move iter
int get_row(const int64_t idx, const blocksstable::ObDatumRow *&row) const;
int get_row(const int64_t idx, blocksstable::ObDatumRow *&row) const;
// get row at idx, do not move iter
int get_row(const int64_t idx, const storage::ObStoreRow *&row) const;
int get_row(const int64_t idx, storage::ObStoreRow *&row) const;
int get_row(const int64_t idx, common::ObNewRow *&row) const;
// get row and move iter to the next
int get_next_row(const blocksstable::ObDatumRow *&row);
int get_next_row(blocksstable::ObDatumRow *&row);
// get row and move iter to the next
int get_next_row(const storage::ObStoreRow *&row);
int get_next_row(storage::ObStoreRow *&row);
int get_next_row(common::ObNewRow *&row);
@ -52,6 +59,7 @@ public:
// rewind iter
void reset_iter();
int add_row(blocksstable::ObDatumRow *row);
int add_row(storage::ObStoreRow *row);
int from(
const char *cstr,
@ -63,6 +71,24 @@ public:
char escape = '\\',
uint16_t* col_id_array = nullptr,
int64_t *result_col_id_array = nullptr);
int from_for_datum(
const char *cstr,
char escape = '\\',
uint16_t* col_id_array = nullptr,
int64_t *result_col_id_array = nullptr);
int from_for_datum(
const common::ObString &str,
char escape = '\\',
uint16_t* col_id_array = nullptr,
int64_t *result_col_id_array = nullptr);
static bool inner_equals(const blocksstable::ObDatumRow &r1, const blocksstable::ObDatumRow &r2);
static bool equals(const blocksstable::ObDatumRow &r1, const blocksstable::ObDatumRow &r2,
const bool cmp_multi_version_row_flag = false, const bool cmp_is_get_and_scan_index = false);
bool equals(int64_t idx, blocksstable::ObDatumRow &row) const;
bool equals(int64_t idx, const blocksstable::ObDatumRow &row) const;
bool equals(blocksstable::ObDatumRow &other_row) const { return equals(0, other_row); }
bool equals(const blocksstable::ObDatumRow &other_row) const { return equals(0, other_row); }
static bool equals(const common::ObNewRow &r1, const common::ObNewRow &r2);
static bool equals(const storage::ObStoreRow &r1, const storage::ObStoreRow &r2,
@ -97,15 +123,15 @@ public:
return ret;
}
template<typename T>
template<typename T, typename T_ROW>
bool equals(T &other_iter, const bool cmp_multi_version_row_flag = false,
const bool cmp_is_get_and_scan_index = false)
{
bool bool_ret = true;
int ret1 = common::OB_SUCCESS;
int ret2 = common::OB_SUCCESS;
const storage::ObStoreRow *other_row = NULL;
storage::ObStoreRow *this_row = NULL;
const T_ROW *other_row = NULL;
T_ROW *this_row = NULL;
int64_t idx = 0;
while (bool_ret) {
@ -155,7 +181,7 @@ private:
void setup_start_cursor();
void advance();
bool end_of_row() const;
common::ObSEArray<blocksstable::ObDatumRow *, DEF_ROW_NUM> datum_rows_;
common::ObSEArray<storage::ObStoreRow *, DEF_ROW_NUM> rows_;
int64_t column_cnt_;
common::ObObjMeta metas_[common::OB_ROW_MAX_COLUMNS_COUNT];
@ -177,6 +203,8 @@ public:
void reset_iter() { return iter_.reset_iter(); }
int from(const char *cstr, char escape = '\\') { return iter_.from(cstr, escape); }
int from(const common::ObString &str, char escape = '\\') { return iter_.from(str, escape); }
int from_for_datum(const char *cstr, char escape = '\\') { return iter_.from_for_datum(cstr, escape); }
int from_for_datum(const common::ObString &str, char escape = '\\') { return iter_.from_for_datum(str, escape); }
bool equals(ROW_TYPE &row) const { return iter_.equals(row); }
bool equals(int64_t idx, ROW_TYPE &row) const { return iter_.equals(idx, row); }
// compare to an iterator, rewind the iter before call this function
@ -219,10 +247,10 @@ public:
private:
ObMockIterator iter_;
};
typedef ObMockRowIterator<storage::ObStoreRowIterator, const storage::ObStoreRow>
ObMockStoreRowIterator;
typedef ObMockRowIterator<storage::ObStoreRowIterator, const storage::ObStoreRow> ObMockStoreRowIterator;
typedef ObMockRowIterator<storage::ObQueryRowIterator, storage::ObStoreRow> ObMockQueryRowIterator;
typedef ObMockRowIterator<common::ObNewRowIterator, common::ObNewRow> ObMockNewRowIterator;
typedef ObMockRowIterator<blocksstable::ObDatumRowIterator, blocksstable::ObDatumRow> ObMockDatumRowIterator;
// init
// parse -> parse->header
@ -270,6 +298,10 @@ public:
static common::ObObjMeta TS_TYPE;
static common::ObObjMeta NU_TYPE;
typedef int (*ObParseDatumFunc)(common::ObIAllocator *,
const common::ObString &,
blocksstable::ObDatumRow &,
int64_t &);
typedef int (*ObParseFunc)(common::ObIAllocator *,
const common::ObString &,
storage::ObStoreRow &,
@ -281,10 +313,19 @@ public:
~ObMockIteratorBuilder() {}
int init(common::ObIAllocator *allocator = NULL, char escape = '\\');
int parse_for_datum(
const common::ObString &str,
ObMockIterator &iter,
uint16_t *col_id_array_list = nullptr);
int parse(
const common::ObString &str,
ObMockIterator &iter,
uint16_t *col_id_array_list = nullptr);
int parse_datum_with_specified_col_ids(
const ObString &str,
ObMockIterator &iter,
uint16_t *col_id_array_list = nullptr,
int64_t *result_col_id_array = nullptr);
int parse_with_specified_col_ids(
const ObString &str,
ObMockIterator &iter,
@ -292,72 +333,164 @@ public:
int64_t *result_col_id_array = nullptr);
private:
static int static_init();
static int parse_varchar(common::ObIAllocator *allocator,
static int prepare_parse_varchar(common::ObIAllocator *allocator,
const common::ObString &word,
const uint16_t count,
int64_t &idx);
static int parse_datum_varchar(common::ObIAllocator *allocator,
const common::ObString &word,
blocksstable::ObDatumRow &row,
int64_t &idx);
static int parse_obj_varchar(common::ObIAllocator *allocator,
const common::ObString &word,
storage::ObStoreRow &row,
int64_t &idx);
static int prepare_parse_lob(common::ObIAllocator *allocator,
const common::ObString &word,
const uint16_t count,
int64_t &idx,
ObLobCommon *&lob_data,
int64_t &val);
static int parse_datum_lob(common::ObIAllocator *allocator,
const common::ObString &word,
blocksstable::ObDatumRow &row,
int64_t &idx);
static int parse_obj_lob(common::ObIAllocator *allocator,
const common::ObString &word,
storage::ObStoreRow &row,
int64_t &idx);
static int parse_lob(common::ObIAllocator *allocator,
const common::ObString &word,
storage::ObStoreRow &row,
int64_t &idx);
/*
static int parse_bool(common::ObIAllocator *allocator,
const common::ObString &word, storage::ObStoreRow &row, int64_t &idx);
const common::ObString &word, blocksstable::ObDatumRow &row, int64_t &idx);
*/
static int parse_timestamp(common::ObIAllocator *allocator,
static int prepare_parse_timestamp(common::ObIAllocator *allocator,
const common::ObString &word,
const uint16_t count,
int64_t &idx,
int64_t &usec);
static int parse_datum_timestamp(common::ObIAllocator *allocator,
const common::ObString &word,
blocksstable::ObDatumRow &row,
int64_t &idx);
static int parse_obj_timestamp(common::ObIAllocator *allocator,
const common::ObString &word,
storage::ObStoreRow &row,
int64_t &idx);
static int prepare_parse_int(common::ObIAllocator *allocator,
const common::ObString &word,
const uint16_t count,
int64_t &idx,
int64_t &val);
static int parse_datum_int(common::ObIAllocator *allocator,
const common::ObString &word,
storage::ObStoreRow &row,
blocksstable::ObDatumRow &row,
int64_t &idx);
static int parse_int(common::ObIAllocator *allocator,
const common::ObString &word,
storage::ObStoreRow &row,
int64_t &idx);
static int parse_bigint(common::ObIAllocator *allocator,
const common::ObString &word,
storage::ObStoreRow &row,
int64_t &idx);
static int parse_number(common::ObIAllocator *allocator,
const common::ObString &word,
storage::ObStoreRow &row,
int64_t &idx);
static int parse_obj_int(common::ObIAllocator *allocator,
const common::ObString &word,
storage::ObStoreRow &row,
int64_t &idx);
static int prepare_parse_bigint(common::ObIAllocator *allocator,
const common::ObString &word,
const uint16_t count,
int64_t &idx,
int64_t &val);
static int parse_datum_bigint(common::ObIAllocator *allocator,
const common::ObString &word,
blocksstable::ObDatumRow &row,
int64_t &idx);
static int parse_obj_bigint(common::ObIAllocator *allocator,
const common::ObString &word,
storage::ObStoreRow &row,
int64_t &idx);
static int prepare_parse_number(common::ObIAllocator *allocator,
const common::ObString &word,
const uint16_t count,
int64_t &idx,
number::ObNumber &nmb);
static int parse_datum_number(common::ObIAllocator *allocator,
const common::ObString &word,
blocksstable::ObDatumRow &row,
int64_t &idx);
static int parse_obj_number(common::ObIAllocator *allocator,
const common::ObString &word,
storage::ObStoreRow &row,
int64_t &idx);
static int parse_dml(common::ObIAllocator *allocator,
const common::ObString &word,
storage::ObStoreRow &row,
int64_t &idx);
static int parse_datum_dml(common::ObIAllocator *allocator,
const common::ObString &word,
blocksstable::ObDatumRow &row,
int64_t &idx);
static int parse_first_dml(common::ObIAllocator *allocator,
const common::ObString &word,
storage::ObStoreRow &row,
int64_t &idx);
static int parse_flag(common::ObIAllocator *allocator,
const common::ObString &word,
storage::ObStoreRow &row,
int64_t &idx);
static int prepare_parse_flag(common::ObIAllocator *allocator,
const common::ObString &word,
int64_t &idx,
int64_t &flag);
static int parse_datum_flag(common::ObIAllocator *allocator,
const common::ObString &word,
blocksstable::ObDatumRow &row,
int64_t &idx);
static int parse_obj_flag(common::ObIAllocator *allocator,
const common::ObString &word,
storage::ObStoreRow &row,
int64_t &idx);
static int parse_base(common::ObIAllocator *allocator,
const common::ObString &word,
storage::ObStoreRow &row,
int64_t &idx);
static int parse_multi_version_row_flag(common::ObIAllocator *allocator,
const common::ObString &word,
storage::ObStoreRow &row,
int64_t &idx);
static int parse_datum_multi_version_row_flag(common::ObIAllocator *allocator,
const common::ObString &word,
blocksstable::ObDatumRow &row,
int64_t &idx);
static int parse_obj_multi_version_row_flag(common::ObIAllocator *allocator,
const common::ObString &word,
storage::ObStoreRow &row,
int64_t &idx);
static int parse_is_get(common::ObIAllocator *allocator,
const common::ObString &word,
storage::ObStoreRow &row,
int64_t &idx);
static int parse_scan_index(common::ObIAllocator *allocator,
static int prepare_parse_scan_index(common::ObIAllocator *allocator,
const common::ObString &word,
int64_t &idx,
int64_t &val);
static int parse_datum_scan_index(common::ObIAllocator *allocator,
const common::ObString &word,
blocksstable::ObDatumRow &row,
int64_t &idx);
static int parse_obj_scan_index(common::ObIAllocator *allocator,
const common::ObString &word,
storage::ObStoreRow &row,
int64_t &idx);
static int parse_datum_trans_id(common::ObIAllocator *allocator,
const common::ObString &word,
storage::ObStoreRow &row,
int64_t &idx);
static int parse_trans_id(common::ObIAllocator *allocator,
const common::ObString &word,
storage::ObStoreRow &row,
blocksstable::ObDatumRow &row,
int64_t &idx);
static int parse_obj_trans_id(common::ObIAllocator *allocator,
const common::ObString &word,
storage::ObStoreRow &row,
int64_t &idx);
int parse_datum_header(const ObString &str,
int64_t &pos,
ObIArray<ObParseDatumFunc> &header,
int64_t &obj_num,
ObMockIterator &iter);
int parse_header(const common::ObString &str,
int64_t &pos,
common::ObIArray<ObParseFunc> &header,
int64_t &obj_num,
ObMockIterator &iter);
int parse_datum_row(const common::ObString &str,
int64_t &pos,
const common::ObIArray<ObParseDatumFunc> &header,
const uint16_t *col_id_array_list,
blocksstable::ObDatumRow &row);
int parse_row(const common::ObString &str,
int64_t &pos,
const common::ObIArray<ObParseFunc> &header,
@ -388,6 +521,10 @@ private:
static common::hash::ObHashMap<common::ObString, ObParseFunc> str_to_obj_parse_func_;
// hash ObString to row info parse func , such as parse_dml ...
static common::hash::ObHashMap<common::ObString, ObParseFunc> str_to_info_parse_func_;
// hash ObString to obj parse func , such as parse_int ...
static common::hash::ObHashMap<common::ObString, ObParseDatumFunc> str_to_datum_parse_func_;
// hash ObString to row info parse func , such as parse_dml ...
static common::hash::ObHashMap<common::ObString, ObParseDatumFunc> str_to_datum_info_parse_func_;
static common::hash::ObHashMap<common::ObString, common::ObObjMeta*> str_to_obj_type_;
static common::hash::ObHashMap<common::ObString, int64_t> str_to_flag_;
static common::hash::ObHashMap<common::ObString, blocksstable::ObDmlFlag> str_to_dml_;
@ -402,25 +539,25 @@ private:
char escape_;
};
class MockObNewRowIterator: public ObNewRowIterator
{
OB_UNIS_VERSION(1);
public:
MockObNewRowIterator();
~MockObNewRowIterator();
static bool equals(const common::ObNewRow &r1, const common::ObNewRow &r2);
void reset();
int from(const char *cstr, char escape = '\\') { return iter_.from(cstr, escape); }
int from(const common::ObString &str, char escape = '\\') { return iter_.from(str, escape); }
int get_next_row(ObNewRow *&row) { return iter_.get_next_row(row); }
int get_row(const int64_t idex, storage::ObStoreRow *&row) const { return iter_.get_row(idex, row); }
int64_t count() const { return iter_.count(); }
int add_row(storage::ObStoreRow *row) { return iter_.add_row(row); }
// class MockObNewRowIterator: public ObNewRowIterator
// {
// OB_UNIS_VERSION(1);
// public:
// MockObNewRowIterator();
// ~MockObNewRowIterator();
// static bool equals(const common::ObNewRow &r1, const common::ObNewRow &r2);
// void reset();
// int from(const char *cstr, char escape = '\\') { return iter_.from(cstr, escape); }
// int from(const common::ObString &str, char escape = '\\') { return iter_.from(str, escape); }
// int get_next_row(ObNewRow *&row) { return iter_.get_next_row(row); }
// int get_row(const int64_t idex, storage::ObStoreRow *&row) const { return iter_.get_row(idex, row); }
// int64_t count() const { return iter_.count(); }
// int add_row(storage::ObStoreRow *row) { return iter_.add_row(row); }
private:
ObMockIterator iter_;
common::PageArena<char> allocator_;
};
// private:
// ObMockIterator iter_;
// common::PageArena<char> allocator_;
// };
class ObMockDirectReadIterator : public storage::ObStoreRowIterator
{

View File

@ -429,17 +429,17 @@ TEST_F(TestObMockIteratorBuilder, equals)
TEST_F(TestObMockIteratorBuilder, test_new_row)
{
ObMockNewRowIterator iter1;
ObMockDatumRowIterator iter1;
const char *input1 =
"int var num\n"
"1 2 3\n";
ASSERT_EQ(OB_SUCCESS, iter1.from(input1));
ASSERT_EQ(OB_SUCCESS, iter1.from_for_datum(input1));
ObMockNewRowIterator iter2;
ObMockDatumRowIterator iter2;
const char *input2 =
"int var num\n"
"1 2 4\n";
EXPECT_EQ(OB_SUCCESS, iter2.from(input2));
EXPECT_EQ(OB_SUCCESS, iter2.from_for_datum(input2));
EXPECT_FALSE(iter2.equals(iter1));
}

View File

@ -658,12 +658,13 @@ int ObTxNode::write(ObTxDesc &tx,
write_store_ctx));
write_store_ctx.mvcc_acc_ctx_.tx_table_guards_.tx_table_guard_.init(&fake_tx_table_);
ObArenaAllocator allocator;
ObStoreRow row;
ObObj cols[2] = {ObObj(key), ObObj(value)};
row.capacity_ = 2;
row.row_val_.cells_ = cols;
row.row_val_.count_ = 2;
row.flag_ = blocksstable::ObDmlFlag::DF_UPDATE;
ObDatumRow row;
ObStorageDatum cols[2] = {ObStorageDatum(), ObStorageDatum()};
cols[0].set_int(key);
cols[1].set_int(value);
row.count_ = 2;
row.storage_datums_ = cols;
row.row_flag_ = blocksstable::ObDmlFlag::DF_UPDATE;
row.trans_id_.reset();
ObTableIterParam param;
@ -723,11 +724,13 @@ int ObTxNode::write_one_row(ObStoreCtx& write_store_ctx, const int64_t key, cons
const transaction::ObSerializeEncryptMeta *encrypt_meta = NULL;
const int64_t schema_version = 100;
read_info.init(allocator, 2, 1, false, columns_, nullptr/*storage_cols_index*/);
ObStoreRow row;
ObObj cols[2] = {ObObj(key), ObObj(value)};
row.flag_ = blocksstable::ObDmlFlag::DF_UPDATE;
row.row_val_.cells_ = cols;
row.row_val_.count_ = 2;
ObDatumRow row;
ObStorageDatum cols[2] = {ObStorageDatum(), ObStorageDatum()};
cols[0].set_int(key);
cols[1].set_int(value);
row.row_flag_ = blocksstable::ObDmlFlag::DF_UPDATE;
row.storage_datums_ = cols;
row.count_ = 2;
ObTableIterParam param;
ObTableAccessContext context;