This is an automated email from the ASF dual-hosted git repository.
SteNicholas pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/paimon-cpp.git
The following commit(s) were added to refs/heads/main by this push:
new 653cf18 feat: update commit message to version 12 (#179)
653cf18 is described below
commit 653cf187548074d10d8c9e339a50f08e9bbadd14
Author: lszskye <[email protected]>
AuthorDate: Tue Aug 4 23:29:49 2026 -0700
feat: update commit message to version 12 (#179)
* feat: update commit message to version 12
* add compatibility test
* fix pre-commit
---
src/paimon/core/index/global_index_meta.cpp | 39 ++++++-
src/paimon/core/index/global_index_meta.h | 8 +-
.../core/index/index_file_meta_serializer_test.cpp | 31 +++++
.../core/index/index_file_meta_v4_deserializer.h | 125 +++++++++++++++++++++
.../core/table/sink/commit_message_serializer.cpp | 8 +-
src/paimon/core/table/sink/commit_message_test.cpp | 35 +++++-
.../pk_btree_source_meta/README | 32 ++++++
...data-022e32ce-1d75-4b9a-8496-a3311c44bad0-0.orc | Bin 0 -> 694 bytes
...data-293d6705-bd19-4986-9aa0-3a24443e7e8e-0.orc | Bin 0 -> 722 bytes
...data-b4949ff6-78f4-4e58-86ad-33eb3e5e6749-0.orc | Bin 0 -> 694 bytes
...data-b5896b79-1c4d-4359-920a-ce719ea303af-0.orc | Bin 0 -> 713 bytes
...data-c2e3ff2f-a3e1-48a1-8bb1-f868477c796a-0.orc | Bin 0 -> 722 bytes
.../commit_messages/commit_messages-01 | Bin 0 -> 1633 bytes
.../index-05388eac-7c9d-48cf-9053-f68b800ebe9e-0 | Bin 0 -> 112 bytes
.../index-5d1ef2e5-c136-4059-8380-fe5d60344f83-0 | Bin 0 -> 112 bytes
.../index-759d0483-a0e7-417b-8c3d-288f36679770-0 | Bin 0 -> 96 bytes
...manifest-0216d085-645d-486b-9ebb-e48df26b8aa7-0 | Bin 0 -> 1970 bytes
...manifest-5ba1f8c6-fcde-45f8-b59b-a948ef3013be-0 | Bin 0 -> 1970 bytes
...manifest-d347fbd7-d7cc-4e5e-9f4a-efa8d0ce8651-0 | Bin 0 -> 1961 bytes
...manifest-180aa8f5-0932-462f-8f02-a1000b585552-0 | Bin 0 -> 3083 bytes
...manifest-e108640e-b3a6-499d-9821-fe36afde58d6-0 | Bin 0 -> 2815 bytes
...manifest-e108640e-b3a6-499d-9821-fe36afde58d6-1 | Bin 0 -> 3078 bytes
...manifest-fbd7c824-c952-4f2b-ad6c-0227a823a745-0 | Bin 0 -> 2833 bytes
...manifest-fbd7c824-c952-4f2b-ad6c-0227a823a745-1 | Bin 0 -> 3184 bytes
...est-list-3fe1dd64-b6ac-46dc-b968-1740e05383a2-0 | Bin 0 -> 392 bytes
...est-list-3fe1dd64-b6ac-46dc-b968-1740e05383a2-1 | Bin 0 -> 1533 bytes
...est-list-3fe1dd64-b6ac-46dc-b968-1740e05383a2-2 | Bin 0 -> 1533 bytes
...est-list-3fe1dd64-b6ac-46dc-b968-1740e05383a2-3 | Bin 0 -> 1543 bytes
...est-list-6678a969-de46-4cb3-b744-36a17ac35371-0 | Bin 0 -> 1603 bytes
...est-list-6678a969-de46-4cb3-b744-36a17ac35371-1 | Bin 0 -> 1529 bytes
...est-list-6678a969-de46-4cb3-b744-36a17ac35371-2 | Bin 0 -> 1713 bytes
...est-list-6678a969-de46-4cb3-b744-36a17ac35371-3 | Bin 0 -> 1548 bytes
...est-list-8e8a1e2e-9fbe-4fb9-920b-82edaed23f41-0 | Bin 0 -> 1723 bytes
...est-list-8e8a1e2e-9fbe-4fb9-920b-82edaed23f41-1 | Bin 0 -> 1554 bytes
.../pk_btree_source_meta/schema/schema-0 | 30 +++++
.../pk_btree_source_meta/snapshot/EARLIEST | 1 +
.../pk_btree_source_meta/snapshot/LATEST | 1 +
.../pk_btree_source_meta/snapshot/snapshot-1 | 17 +++
.../pk_btree_source_meta/snapshot/snapshot-2 | 18 +++
.../pk_btree_source_meta/snapshot/snapshot-3 | 18 +++
.../pk_btree_source_meta/snapshot/snapshot-4 | 18 +++
.../pk_btree_source_meta/snapshot/snapshot-5 | 18 +++
42 files changed, 390 insertions(+), 9 deletions(-)
diff --git a/src/paimon/core/index/global_index_meta.cpp
b/src/paimon/core/index/global_index_meta.cpp
index ffe05e3..ab18280 100644
--- a/src/paimon/core/index/global_index_meta.cpp
+++ b/src/paimon/core/index/global_index_meta.cpp
@@ -33,11 +33,20 @@ GlobalIndexMeta::GlobalIndexMeta(int64_t _row_range_start,
int64_t _row_range_en
int32_t _index_field_id,
const std::optional<std::vector<int32_t>>&
_extra_field_ids,
const std::shared_ptr<Bytes>& _index_meta)
+ : GlobalIndexMeta(_row_range_start, _row_range_end, _index_field_id,
_extra_field_ids,
+ _index_meta, nullptr) {}
+
+GlobalIndexMeta::GlobalIndexMeta(int64_t _row_range_start, int64_t
_row_range_end,
+ int32_t _index_field_id,
+ const std::optional<std::vector<int32_t>>&
_extra_field_ids,
+ const std::shared_ptr<Bytes>& _index_meta,
+ const std::shared_ptr<Bytes>& _source_meta)
: row_range_start(_row_range_start),
row_range_end(_row_range_end),
index_field_id(_index_field_id),
extra_field_ids(_extra_field_ids),
- index_meta(_index_meta) {}
+ index_meta(_index_meta),
+ source_meta(_source_meta) {}
bool GlobalIndexMeta::operator==(const GlobalIndexMeta& other) const {
if (this == &other) {
@@ -49,6 +58,12 @@ bool GlobalIndexMeta::operator==(const GlobalIndexMeta&
other) const {
if (index_meta && other.index_meta && !(*index_meta == *other.index_meta))
{
return false;
}
+ if ((source_meta && !other.source_meta) || (!source_meta &&
other.source_meta)) {
+ return false;
+ }
+ if (source_meta && other.source_meta && !(*source_meta ==
*other.source_meta)) {
+ return false;
+ }
return row_range_start == other.row_range_start && row_range_end ==
other.row_range_end &&
index_field_id == other.index_field_id && extra_field_ids ==
other.extra_field_ids;
}
@@ -61,14 +76,17 @@ std::string GlobalIndexMeta::ToString() const {
std::string index_meta_str =
index_meta == nullptr ? "null" : std::string(index_meta->data(),
index_meta->size());
+ std::string source_meta_str =
+ source_meta == nullptr ? "null" : std::string(source_meta->data(),
source_meta->size());
return fmt::format(
"{{row_range_start={}, row_range_end={}, index_field_id={},
extra_field_ids={}, "
- "index_meta={}}}",
- row_range_start, row_range_end, index_field_id, extra_field_ids_str,
index_meta_str);
+ "index_meta={}, source_meta={}}}",
+ row_range_start, row_range_end, index_field_id, extra_field_ids_str,
index_meta_str,
+ source_meta_str);
}
BinaryRow GlobalIndexMeta::ToRow(MemoryPool* pool) const {
- BinaryRow row(5);
+ BinaryRow row(6);
BinaryRowWriter writer(&row, 32 * 1024, pool);
writer.WriteLong(0, row_range_start);
writer.WriteLong(1, row_range_end);
@@ -83,6 +101,11 @@ BinaryRow GlobalIndexMeta::ToRow(MemoryPool* pool) const {
} else {
writer.WriteBinary(4, *index_meta);
}
+ if (source_meta == nullptr) {
+ writer.SetNullAt(5);
+ } else {
+ writer.WriteBinary(5, *source_meta);
+ }
writer.Complete();
return row;
}
@@ -104,8 +127,13 @@ Result<GlobalIndexMeta> GlobalIndexMeta::FromRow(const
InternalRow& row) {
index_meta = row.GetBinary(4);
assert(index_meta);
}
+ std::shared_ptr<Bytes> source_meta;
+ if (!row.IsNullAt(5)) {
+ source_meta = row.GetBinary(5);
+ assert(source_meta);
+ }
return GlobalIndexMeta(row_range_start, row_range_end, index_field_id,
extra_field_ids,
- index_meta);
+ index_meta, source_meta);
}
const std::shared_ptr<arrow::DataType>& GlobalIndexMeta::DataType() {
@@ -117,6 +145,7 @@ const std::shared_ptr<arrow::DataType>&
GlobalIndexMeta::DataType() {
arrow::list(arrow::field("item", arrow::int32(),
/*nullable=*/false)),
/*nullable=*/true),
arrow::field("_INDEX_META", arrow::binary(), /*nullable=*/true),
+ arrow::field("_SOURCE_META", arrow::binary(), /*nullable=*/true),
});
return schema;
}
diff --git a/src/paimon/core/index/global_index_meta.h
b/src/paimon/core/index/global_index_meta.h
index a11cb82..2159936 100644
--- a/src/paimon/core/index/global_index_meta.h
+++ b/src/paimon/core/index/global_index_meta.h
@@ -31,12 +31,17 @@
namespace paimon {
/// Schema for global index.
struct GlobalIndexMeta {
- static constexpr int32_t NUM_FIELDS = 5;
+ static constexpr int32_t NUM_FIELDS = 6;
GlobalIndexMeta(int64_t _row_range_start, int64_t _row_range_end, int32_t
_index_field_id,
const std::optional<std::vector<int32_t>>&
_extra_field_ids,
const std::shared_ptr<Bytes>& _index_meta);
+ GlobalIndexMeta(int64_t _row_range_start, int64_t _row_range_end, int32_t
_index_field_id,
+ const std::optional<std::vector<int32_t>>&
_extra_field_ids,
+ const std::shared_ptr<Bytes>& _index_meta,
+ const std::shared_ptr<Bytes>& _source_meta);
+
bool operator==(const GlobalIndexMeta& other) const;
std::string ToString() const;
@@ -52,6 +57,7 @@ struct GlobalIndexMeta {
int32_t index_field_id;
std::optional<std::vector<int32_t>> extra_field_ids;
std::shared_ptr<Bytes> index_meta;
+ std::shared_ptr<Bytes> source_meta;
};
} // namespace paimon
diff --git a/src/paimon/core/index/index_file_meta_serializer_test.cpp
b/src/paimon/core/index/index_file_meta_serializer_test.cpp
index 4db2ce3..ab1c77b 100644
--- a/src/paimon/core/index/index_file_meta_serializer_test.cpp
+++ b/src/paimon/core/index/index_file_meta_serializer_test.cpp
@@ -127,6 +127,37 @@ TEST_F(IndexFileMetaSerializerTest,
TestToFromRowWithGlobalIndex) {
}
}
+TEST_F(IndexFileMetaSerializerTest,
TestToFromRowWithGlobalIndexWithSourceMeta) {
+ auto index_meta_bytes = std::make_shared<Bytes>("apple",
memory_pool_.get());
+ auto source_meta_bytes = std::make_shared<Bytes>("banana",
memory_pool_.get());
+ IndexFileMetaSerializer serializer(memory_pool_);
+ GlobalIndexMeta global_index_meta(
+ /*row_range_start=*/10, /*row_range_end=*/50,
+ /*index_field_id=*/5,
/*extra_field_ids=*/std::optional<std::vector<int32_t>>({0, 1}),
+ index_meta_bytes, source_meta_bytes);
+ {
+ auto expected =
+ std::make_shared<IndexFileMeta>("bitmap", "bitmap_index_file_0",
/*file_size=*/10,
+ /*row_count=*/41,
/*dv_ranges=*/std::nullopt,
+ /*external_path=*/std::nullopt,
global_index_meta);
+ ASSERT_OK_AND_ASSIGN(BinaryRow row, serializer.ToRow(expected));
+ ASSERT_OK_AND_ASSIGN(std::shared_ptr<IndexFileMeta> actual,
serializer.FromRow(row));
+ ASSERT_EQ(expected->ToString(), actual->ToString());
+ ASSERT_EQ(*expected, *actual);
+ }
+ {
+ // test external path
+ auto expected = std::make_shared<IndexFileMeta>(
+ "bitmap", "bitmap_index_file_0", /*file_size=*/10,
+ /*row_count=*/41, /*dv_ranges=*/std::nullopt,
+ /*external_path=*/"FILE:/tmp/external/bitmap_index_file_0",
global_index_meta);
+ ASSERT_OK_AND_ASSIGN(BinaryRow row, serializer.ToRow(expected));
+ ASSERT_OK_AND_ASSIGN(std::shared_ptr<IndexFileMeta> actual,
serializer.FromRow(row));
+ ASSERT_EQ(expected->ToString(), actual->ToString());
+ ASSERT_EQ(*expected, *actual);
+ }
+}
+
TEST_F(IndexFileMetaSerializerTest, TestSerialize) {
IndexFileMetaSerializer serializer(memory_pool_);
auto expected = GetRandomDeletionVectorIndexFile();
diff --git a/src/paimon/core/index/index_file_meta_v4_deserializer.h
b/src/paimon/core/index/index_file_meta_v4_deserializer.h
new file mode 100644
index 0000000..c7207f6
--- /dev/null
+++ b/src/paimon/core/index/index_file_meta_v4_deserializer.h
@@ -0,0 +1,125 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#pragma once
+
+#include <cassert>
+#include <cstdint>
+#include <list>
+#include <memory>
+#include <optional>
+#include <string>
+#include <utility>
+#include <vector>
+
+#include "paimon/common/data/internal_array.h"
+#include "paimon/common/data/internal_row.h"
+#include "paimon/common/utils/linked_hash_map.h"
+#include "paimon/core/index/deletion_vector_meta.h"
+#include "paimon/core/index/index_file_meta.h"
+#include "paimon/core/index/index_file_meta_v2_deserializer.h"
+#include "paimon/core/utils/object_serializer.h"
+#include "paimon/result.h"
+
+namespace paimon {
+class MemoryPool;
+
+class IndexFileMetaV4Deserializer : public
ObjectSerializer<std::shared_ptr<IndexFileMeta>> {
+ public:
+ static const std::shared_ptr<arrow::DataType>& GlobalIndexMetaDataType() {
+ static std::shared_ptr<arrow::DataType> schema = arrow::struct_({
+ arrow::field("_ROW_RANGE_START", arrow::int64(),
/*nullable=*/false),
+ arrow::field("_ROW_RANGE_END", arrow::int64(), /*nullable=*/false),
+ arrow::field("_INDEX_FIELD_ID", arrow::int32(),
/*nullable=*/false),
+ arrow::field("_EXTRA_FIELD_IDS",
+ arrow::list(arrow::field("item", arrow::int32(),
/*nullable=*/false)),
+ /*nullable=*/true),
+ arrow::field("_INDEX_META", arrow::binary(), /*nullable=*/true),
+ });
+ return schema;
+ }
+
+ static const std::shared_ptr<arrow::DataType>& DataType() {
+ static std::shared_ptr<arrow::DataType> schema = arrow::struct_({
+ arrow::field("_INDEX_TYPE", arrow::utf8(), false),
+ arrow::field("_FILE_NAME", arrow::utf8(), false),
+ arrow::field("_FILE_SIZE", arrow::int64(), false),
+ arrow::field("_ROW_COUNT", arrow::int64(), false),
+ arrow::field("_DELETIONS_VECTORS_RANGES",
+ arrow::list(arrow::field("item",
DeletionVectorMeta::DataType(), true)),
+ true),
+ arrow::field("_EXTERNAL_PATH", arrow::utf8(), true),
+ arrow::field("_GLOBAL_INDEX", GlobalIndexMetaDataType(), true),
+ });
+ return schema;
+ }
+
+ explicit IndexFileMetaV4Deserializer(const std::shared_ptr<MemoryPool>&
pool)
+ : ObjectSerializer<std::shared_ptr<IndexFileMeta>>(DataType(), pool) {}
+
+ Result<BinaryRow> ToRow(const std::shared_ptr<IndexFileMeta>& meta) const
override {
+ assert(false);
+ return Status::Invalid("IndexFileMetaV4Deserializer to row is not
valid");
+ }
+
+ Result<std::shared_ptr<IndexFileMeta>> FromRow(const InternalRow& row)
const override {
+ auto file_type = row.GetString(0);
+ auto file_name = row.GetString(1);
+ auto file_size = row.GetLong(2);
+ auto row_count = row.GetLong(3);
+ std::optional<LinkedHashMap<std::string, DeletionVectorMeta>>
dv_ranges;
+ if (!row.IsNullAt(4)) {
+ dv_ranges =
IndexFileMetaV2Deserializer::RowArrayDataToDvRanges(row.GetArray(4).get());
+ }
+ std::optional<std::string> external_path;
+ if (!row.IsNullAt(5)) {
+ external_path = row.GetString(5).ToString();
+ }
+ std::optional<GlobalIndexMeta> global_index_meta;
+ if (!row.IsNullAt(6)) {
+ std::shared_ptr<InternalRow> global_index_meta_row =
+ row.GetRow(6, GlobalIndexMetaDataType()->num_fields());
+ assert(global_index_meta_row);
+ int64_t row_range_start = global_index_meta_row->GetLong(0);
+ int64_t row_range_end = global_index_meta_row->GetLong(1);
+ int32_t index_field_id = global_index_meta_row->GetInt(2);
+ std::optional<std::vector<int32_t>> extra_field_ids;
+ if (!global_index_meta_row->IsNullAt(3)) {
+ std::shared_ptr<InternalArray> array =
global_index_meta_row->GetArray(3);
+ if (!array) {
+ return Status::Invalid(
+ "GlobalIndexMeta FromRow failed with nullptr extra
field ids");
+ }
+ PAIMON_ASSIGN_OR_RAISE(extra_field_ids, array->ToIntArray());
+ }
+ std::shared_ptr<Bytes> index_meta;
+ if (!global_index_meta_row->IsNullAt(4)) {
+ index_meta = global_index_meta_row->GetBinary(4);
+ assert(index_meta);
+ }
+ global_index_meta = GlobalIndexMeta(row_range_start,
row_range_end, index_field_id,
+ extra_field_ids, index_meta);
+ }
+ return std::make_shared<IndexFileMeta>(file_type.ToString(),
file_name.ToString(),
+ file_size, row_count,
dv_ranges, external_path,
+ global_index_meta);
+ }
+};
+
+} // namespace paimon
diff --git a/src/paimon/core/table/sink/commit_message_serializer.cpp
b/src/paimon/core/table/sink/commit_message_serializer.cpp
index b2533a7..1b0645f 100644
--- a/src/paimon/core/table/sink/commit_message_serializer.cpp
+++ b/src/paimon/core/table/sink/commit_message_serializer.cpp
@@ -31,6 +31,7 @@
#include "paimon/core/index/index_file_meta_v1_deserializer.h"
#include "paimon/core/index/index_file_meta_v2_deserializer.h"
#include "paimon/core/index/index_file_meta_v3_deserializer.h"
+#include "paimon/core/index/index_file_meta_v4_deserializer.h"
#include "paimon/core/io/compact_increment.h"
#include "paimon/core/io/data_file_meta_09_serializer.h"
#include "paimon/core/io/data_file_meta_10_serializer.h"
@@ -45,7 +46,7 @@
namespace paimon {
class MemoryPool;
-const int32_t CommitMessageSerializer::CURRENT_VERSION = 11;
+const int32_t CommitMessageSerializer::CURRENT_VERSION = 12;
CommitMessageSerializer::CommitMessageSerializer(const
std::shared_ptr<MemoryPool>& pool)
: memory_pool_(pool),
@@ -203,6 +204,11 @@ Result<std::shared_ptr<CommitMessage>>
CommitMessageSerializer::Deserialize(int3
DataInputStream* in) {
if (version == CURRENT_VERSION) {
return Deserialize(version, data_file_serializer_.get(),
index_entry_serializer_.get(), in);
+ } else if (version == 11) {
+ auto index_entry_v4_deserializer =
+ std::make_unique<IndexFileMetaV4Deserializer>(memory_pool_);
+ return Deserialize(version, data_file_serializer_.get(),
index_entry_v4_deserializer.get(),
+ in);
} else if (version == 9 || version == 10) {
auto index_entry_v3_deserializer =
std::make_unique<IndexFileMetaV3Deserializer>(memory_pool_);
diff --git a/src/paimon/core/table/sink/commit_message_test.cpp
b/src/paimon/core/table/sink/commit_message_test.cpp
index 6c00bb9..935e45d 100644
--- a/src/paimon/core/table/sink/commit_message_test.cpp
+++ b/src/paimon/core/table/sink/commit_message_test.cpp
@@ -65,6 +65,39 @@ TEST(CommitMessageTest, TestCurrentVersion) {
ASSERT_EQ(CommitMessageSerializer::CURRENT_VERSION,
CommitMessage::CurrentVersion());
}
+TEST(CommitMessageTest, TestCompatibleWithVersion12) {
+ // index file meta: add global index meta source meta
+ int32_t version = 12;
+ std::string data_path = paimon::test::GetDataDir() +
+ "orc/pk_btree_source_meta.db/pk_btree_source_meta/"
+ "commit_messages/commit_messages-01";
+ auto file_system = std::make_shared<LocalFileSystem>();
+ auto buffer_length =
file_system->GetFileStatus(data_path).value()->GetLen();
+
+ std::vector<char> buffer(buffer_length, 0);
+ ASSERT_OK_AND_ASSIGN(auto in_stream, file_system->Open(data_path));
+ ASSERT_OK(in_stream->Read(reinterpret_cast<char*>(buffer.data()),
buffer.size()));
+ ASSERT_OK(in_stream->Close());
+
+ auto pool = GetDefaultPool();
+ ASSERT_OK_AND_ASSIGN(std::shared_ptr<CommitMessage> ret,
+ CommitMessage::Deserialize(version,
reinterpret_cast<char*>(buffer.data()),
+ buffer.size(), pool));
+ auto res_msg = std::dynamic_pointer_cast<CommitMessageImpl>(ret);
+ ASSERT_NE(res_msg, nullptr);
+
+ // check source_meta exists
+ const auto& new_indexes = res_msg->GetCompactIncrement().NewIndexFiles();
+ ASSERT_EQ(new_indexes.size(), 1);
+ const auto& global_index_meta = new_indexes[0]->GetGlobalIndexMeta();
+ ASSERT_TRUE(global_index_meta.has_value());
+ ASSERT_NE(global_index_meta->source_meta, nullptr);
+
+ // check result
+ ASSERT_OK_AND_ASSIGN(std::string serialized_bytes,
CommitMessage::Serialize(ret, pool));
+ ASSERT_EQ(serialized_bytes,
std::string(reinterpret_cast<char*>(buffer.data()), buffer.size()));
+}
+
TEST(CommitMessageTest, TestCompatibleWithVersion11) {
// index file meta: add global index meta
int32_t version = 11;
@@ -106,8 +139,6 @@ TEST(CommitMessageTest, TestCompatibleWithVersion11) {
// check result
ASSERT_EQ(res_msgs, expected_msgs);
- ASSERT_OK_AND_ASSIGN(std::string serialized_bytes,
CommitMessage::SerializeList(ret, pool));
- ASSERT_EQ(serialized_bytes,
std::string(reinterpret_cast<char*>(buffer.data()), buffer.size()));
}
TEST(CommitMessageTest, TestCompatibleWithVersion10) {
diff --git
a/test/test_data/orc/pk_btree_source_meta.db/pk_btree_source_meta/README
b/test/test_data/orc/pk_btree_source_meta.db/pk_btree_source_meta/README
new file mode 100644
index 0000000..692b105
--- /dev/null
+++ b/test/test_data/orc/pk_btree_source_meta.db/pk_btree_source_meta/README
@@ -0,0 +1,32 @@
+id:int score:int tag:string
+primary key: id
+no partition key
+no bucket key
+bucket count: 1
+
+file format: orc
+manifest format: orc
+deletion-vectors.enabled: true
+primary-key btree index: score
+compaction.force-rewrite-all-files: true
+
+Msgs:
+snapshot-1: APPEND
+Add: 1, 10, first
+Add: 2, 20, second
+
+snapshot-2: COMPACT
+Build the primary-key btree index for score.
+
+snapshot-3: APPEND
+Add: 3, 30, third
+Add: 4, 40, fourth
+
+snapshot-4: COMPACT
+Rebuild the primary-key btree index for score.
+
+snapshot-5: COMPACT
+Force a full compaction and rebuild the primary-key btree index for score.
+
+commit_messages-01:
+Single CommitMessage serialized by Java CommitMessageSerializer version 12 for
snapshot-5.
\ No newline at end of file
diff --git
a/test/test_data/orc/pk_btree_source_meta.db/pk_btree_source_meta/bucket-0/data-022e32ce-1d75-4b9a-8496-a3311c44bad0-0.orc
b/test/test_data/orc/pk_btree_source_meta.db/pk_btree_source_meta/bucket-0/data-022e32ce-1d75-4b9a-8496-a3311c44bad0-0.orc
new file mode 100644
index 0000000..767c7ee
Binary files /dev/null and
b/test/test_data/orc/pk_btree_source_meta.db/pk_btree_source_meta/bucket-0/data-022e32ce-1d75-4b9a-8496-a3311c44bad0-0.orc
differ
diff --git
a/test/test_data/orc/pk_btree_source_meta.db/pk_btree_source_meta/bucket-0/data-293d6705-bd19-4986-9aa0-3a24443e7e8e-0.orc
b/test/test_data/orc/pk_btree_source_meta.db/pk_btree_source_meta/bucket-0/data-293d6705-bd19-4986-9aa0-3a24443e7e8e-0.orc
new file mode 100644
index 0000000..02673d7
Binary files /dev/null and
b/test/test_data/orc/pk_btree_source_meta.db/pk_btree_source_meta/bucket-0/data-293d6705-bd19-4986-9aa0-3a24443e7e8e-0.orc
differ
diff --git
a/test/test_data/orc/pk_btree_source_meta.db/pk_btree_source_meta/bucket-0/data-b4949ff6-78f4-4e58-86ad-33eb3e5e6749-0.orc
b/test/test_data/orc/pk_btree_source_meta.db/pk_btree_source_meta/bucket-0/data-b4949ff6-78f4-4e58-86ad-33eb3e5e6749-0.orc
new file mode 100644
index 0000000..767c7ee
Binary files /dev/null and
b/test/test_data/orc/pk_btree_source_meta.db/pk_btree_source_meta/bucket-0/data-b4949ff6-78f4-4e58-86ad-33eb3e5e6749-0.orc
differ
diff --git
a/test/test_data/orc/pk_btree_source_meta.db/pk_btree_source_meta/bucket-0/data-b5896b79-1c4d-4359-920a-ce719ea303af-0.orc
b/test/test_data/orc/pk_btree_source_meta.db/pk_btree_source_meta/bucket-0/data-b5896b79-1c4d-4359-920a-ce719ea303af-0.orc
new file mode 100644
index 0000000..d741dbd
Binary files /dev/null and
b/test/test_data/orc/pk_btree_source_meta.db/pk_btree_source_meta/bucket-0/data-b5896b79-1c4d-4359-920a-ce719ea303af-0.orc
differ
diff --git
a/test/test_data/orc/pk_btree_source_meta.db/pk_btree_source_meta/bucket-0/data-c2e3ff2f-a3e1-48a1-8bb1-f868477c796a-0.orc
b/test/test_data/orc/pk_btree_source_meta.db/pk_btree_source_meta/bucket-0/data-c2e3ff2f-a3e1-48a1-8bb1-f868477c796a-0.orc
new file mode 100644
index 0000000..02673d7
Binary files /dev/null and
b/test/test_data/orc/pk_btree_source_meta.db/pk_btree_source_meta/bucket-0/data-c2e3ff2f-a3e1-48a1-8bb1-f868477c796a-0.orc
differ
diff --git
a/test/test_data/orc/pk_btree_source_meta.db/pk_btree_source_meta/commit_messages/commit_messages-01
b/test/test_data/orc/pk_btree_source_meta.db/pk_btree_source_meta/commit_messages/commit_messages-01
new file mode 100644
index 0000000..374b9b8
Binary files /dev/null and
b/test/test_data/orc/pk_btree_source_meta.db/pk_btree_source_meta/commit_messages/commit_messages-01
differ
diff --git
a/test/test_data/orc/pk_btree_source_meta.db/pk_btree_source_meta/index/index-05388eac-7c9d-48cf-9053-f68b800ebe9e-0
b/test/test_data/orc/pk_btree_source_meta.db/pk_btree_source_meta/index/index-05388eac-7c9d-48cf-9053-f68b800ebe9e-0
new file mode 100644
index 0000000..dcf43f6
Binary files /dev/null and
b/test/test_data/orc/pk_btree_source_meta.db/pk_btree_source_meta/index/index-05388eac-7c9d-48cf-9053-f68b800ebe9e-0
differ
diff --git
a/test/test_data/orc/pk_btree_source_meta.db/pk_btree_source_meta/index/index-5d1ef2e5-c136-4059-8380-fe5d60344f83-0
b/test/test_data/orc/pk_btree_source_meta.db/pk_btree_source_meta/index/index-5d1ef2e5-c136-4059-8380-fe5d60344f83-0
new file mode 100644
index 0000000..dcf43f6
Binary files /dev/null and
b/test/test_data/orc/pk_btree_source_meta.db/pk_btree_source_meta/index/index-5d1ef2e5-c136-4059-8380-fe5d60344f83-0
differ
diff --git
a/test/test_data/orc/pk_btree_source_meta.db/pk_btree_source_meta/index/index-759d0483-a0e7-417b-8c3d-288f36679770-0
b/test/test_data/orc/pk_btree_source_meta.db/pk_btree_source_meta/index/index-759d0483-a0e7-417b-8c3d-288f36679770-0
new file mode 100644
index 0000000..83e0054
Binary files /dev/null and
b/test/test_data/orc/pk_btree_source_meta.db/pk_btree_source_meta/index/index-759d0483-a0e7-417b-8c3d-288f36679770-0
differ
diff --git
a/test/test_data/orc/pk_btree_source_meta.db/pk_btree_source_meta/manifest/index-manifest-0216d085-645d-486b-9ebb-e48df26b8aa7-0
b/test/test_data/orc/pk_btree_source_meta.db/pk_btree_source_meta/manifest/index-manifest-0216d085-645d-486b-9ebb-e48df26b8aa7-0
new file mode 100644
index 0000000..ee5c88f
Binary files /dev/null and
b/test/test_data/orc/pk_btree_source_meta.db/pk_btree_source_meta/manifest/index-manifest-0216d085-645d-486b-9ebb-e48df26b8aa7-0
differ
diff --git
a/test/test_data/orc/pk_btree_source_meta.db/pk_btree_source_meta/manifest/index-manifest-5ba1f8c6-fcde-45f8-b59b-a948ef3013be-0
b/test/test_data/orc/pk_btree_source_meta.db/pk_btree_source_meta/manifest/index-manifest-5ba1f8c6-fcde-45f8-b59b-a948ef3013be-0
new file mode 100644
index 0000000..fb7a5f1
Binary files /dev/null and
b/test/test_data/orc/pk_btree_source_meta.db/pk_btree_source_meta/manifest/index-manifest-5ba1f8c6-fcde-45f8-b59b-a948ef3013be-0
differ
diff --git
a/test/test_data/orc/pk_btree_source_meta.db/pk_btree_source_meta/manifest/index-manifest-d347fbd7-d7cc-4e5e-9f4a-efa8d0ce8651-0
b/test/test_data/orc/pk_btree_source_meta.db/pk_btree_source_meta/manifest/index-manifest-d347fbd7-d7cc-4e5e-9f4a-efa8d0ce8651-0
new file mode 100644
index 0000000..e0bea20
Binary files /dev/null and
b/test/test_data/orc/pk_btree_source_meta.db/pk_btree_source_meta/manifest/index-manifest-d347fbd7-d7cc-4e5e-9f4a-efa8d0ce8651-0
differ
diff --git
a/test/test_data/orc/pk_btree_source_meta.db/pk_btree_source_meta/manifest/manifest-180aa8f5-0932-462f-8f02-a1000b585552-0
b/test/test_data/orc/pk_btree_source_meta.db/pk_btree_source_meta/manifest/manifest-180aa8f5-0932-462f-8f02-a1000b585552-0
new file mode 100644
index 0000000..6015b47
Binary files /dev/null and
b/test/test_data/orc/pk_btree_source_meta.db/pk_btree_source_meta/manifest/manifest-180aa8f5-0932-462f-8f02-a1000b585552-0
differ
diff --git
a/test/test_data/orc/pk_btree_source_meta.db/pk_btree_source_meta/manifest/manifest-e108640e-b3a6-499d-9821-fe36afde58d6-0
b/test/test_data/orc/pk_btree_source_meta.db/pk_btree_source_meta/manifest/manifest-e108640e-b3a6-499d-9821-fe36afde58d6-0
new file mode 100644
index 0000000..816e82b
Binary files /dev/null and
b/test/test_data/orc/pk_btree_source_meta.db/pk_btree_source_meta/manifest/manifest-e108640e-b3a6-499d-9821-fe36afde58d6-0
differ
diff --git
a/test/test_data/orc/pk_btree_source_meta.db/pk_btree_source_meta/manifest/manifest-e108640e-b3a6-499d-9821-fe36afde58d6-1
b/test/test_data/orc/pk_btree_source_meta.db/pk_btree_source_meta/manifest/manifest-e108640e-b3a6-499d-9821-fe36afde58d6-1
new file mode 100644
index 0000000..a1a46f2
Binary files /dev/null and
b/test/test_data/orc/pk_btree_source_meta.db/pk_btree_source_meta/manifest/manifest-e108640e-b3a6-499d-9821-fe36afde58d6-1
differ
diff --git
a/test/test_data/orc/pk_btree_source_meta.db/pk_btree_source_meta/manifest/manifest-fbd7c824-c952-4f2b-ad6c-0227a823a745-0
b/test/test_data/orc/pk_btree_source_meta.db/pk_btree_source_meta/manifest/manifest-fbd7c824-c952-4f2b-ad6c-0227a823a745-0
new file mode 100644
index 0000000..cd45ccc
Binary files /dev/null and
b/test/test_data/orc/pk_btree_source_meta.db/pk_btree_source_meta/manifest/manifest-fbd7c824-c952-4f2b-ad6c-0227a823a745-0
differ
diff --git
a/test/test_data/orc/pk_btree_source_meta.db/pk_btree_source_meta/manifest/manifest-fbd7c824-c952-4f2b-ad6c-0227a823a745-1
b/test/test_data/orc/pk_btree_source_meta.db/pk_btree_source_meta/manifest/manifest-fbd7c824-c952-4f2b-ad6c-0227a823a745-1
new file mode 100644
index 0000000..7cfbf59
Binary files /dev/null and
b/test/test_data/orc/pk_btree_source_meta.db/pk_btree_source_meta/manifest/manifest-fbd7c824-c952-4f2b-ad6c-0227a823a745-1
differ
diff --git
a/test/test_data/orc/pk_btree_source_meta.db/pk_btree_source_meta/manifest/manifest-list-3fe1dd64-b6ac-46dc-b968-1740e05383a2-0
b/test/test_data/orc/pk_btree_source_meta.db/pk_btree_source_meta/manifest/manifest-list-3fe1dd64-b6ac-46dc-b968-1740e05383a2-0
new file mode 100644
index 0000000..bc2b65e
Binary files /dev/null and
b/test/test_data/orc/pk_btree_source_meta.db/pk_btree_source_meta/manifest/manifest-list-3fe1dd64-b6ac-46dc-b968-1740e05383a2-0
differ
diff --git
a/test/test_data/orc/pk_btree_source_meta.db/pk_btree_source_meta/manifest/manifest-list-3fe1dd64-b6ac-46dc-b968-1740e05383a2-1
b/test/test_data/orc/pk_btree_source_meta.db/pk_btree_source_meta/manifest/manifest-list-3fe1dd64-b6ac-46dc-b968-1740e05383a2-1
new file mode 100644
index 0000000..e3378b1
Binary files /dev/null and
b/test/test_data/orc/pk_btree_source_meta.db/pk_btree_source_meta/manifest/manifest-list-3fe1dd64-b6ac-46dc-b968-1740e05383a2-1
differ
diff --git
a/test/test_data/orc/pk_btree_source_meta.db/pk_btree_source_meta/manifest/manifest-list-3fe1dd64-b6ac-46dc-b968-1740e05383a2-2
b/test/test_data/orc/pk_btree_source_meta.db/pk_btree_source_meta/manifest/manifest-list-3fe1dd64-b6ac-46dc-b968-1740e05383a2-2
new file mode 100644
index 0000000..e3378b1
Binary files /dev/null and
b/test/test_data/orc/pk_btree_source_meta.db/pk_btree_source_meta/manifest/manifest-list-3fe1dd64-b6ac-46dc-b968-1740e05383a2-2
differ
diff --git
a/test/test_data/orc/pk_btree_source_meta.db/pk_btree_source_meta/manifest/manifest-list-3fe1dd64-b6ac-46dc-b968-1740e05383a2-3
b/test/test_data/orc/pk_btree_source_meta.db/pk_btree_source_meta/manifest/manifest-list-3fe1dd64-b6ac-46dc-b968-1740e05383a2-3
new file mode 100644
index 0000000..158525f
Binary files /dev/null and
b/test/test_data/orc/pk_btree_source_meta.db/pk_btree_source_meta/manifest/manifest-list-3fe1dd64-b6ac-46dc-b968-1740e05383a2-3
differ
diff --git
a/test/test_data/orc/pk_btree_source_meta.db/pk_btree_source_meta/manifest/manifest-list-6678a969-de46-4cb3-b744-36a17ac35371-0
b/test/test_data/orc/pk_btree_source_meta.db/pk_btree_source_meta/manifest/manifest-list-6678a969-de46-4cb3-b744-36a17ac35371-0
new file mode 100644
index 0000000..c810bea
Binary files /dev/null and
b/test/test_data/orc/pk_btree_source_meta.db/pk_btree_source_meta/manifest/manifest-list-6678a969-de46-4cb3-b744-36a17ac35371-0
differ
diff --git
a/test/test_data/orc/pk_btree_source_meta.db/pk_btree_source_meta/manifest/manifest-list-6678a969-de46-4cb3-b744-36a17ac35371-1
b/test/test_data/orc/pk_btree_source_meta.db/pk_btree_source_meta/manifest/manifest-list-6678a969-de46-4cb3-b744-36a17ac35371-1
new file mode 100644
index 0000000..78cece9
Binary files /dev/null and
b/test/test_data/orc/pk_btree_source_meta.db/pk_btree_source_meta/manifest/manifest-list-6678a969-de46-4cb3-b744-36a17ac35371-1
differ
diff --git
a/test/test_data/orc/pk_btree_source_meta.db/pk_btree_source_meta/manifest/manifest-list-6678a969-de46-4cb3-b744-36a17ac35371-2
b/test/test_data/orc/pk_btree_source_meta.db/pk_btree_source_meta/manifest/manifest-list-6678a969-de46-4cb3-b744-36a17ac35371-2
new file mode 100644
index 0000000..f4f2396
Binary files /dev/null and
b/test/test_data/orc/pk_btree_source_meta.db/pk_btree_source_meta/manifest/manifest-list-6678a969-de46-4cb3-b744-36a17ac35371-2
differ
diff --git
a/test/test_data/orc/pk_btree_source_meta.db/pk_btree_source_meta/manifest/manifest-list-6678a969-de46-4cb3-b744-36a17ac35371-3
b/test/test_data/orc/pk_btree_source_meta.db/pk_btree_source_meta/manifest/manifest-list-6678a969-de46-4cb3-b744-36a17ac35371-3
new file mode 100644
index 0000000..a4954a1
Binary files /dev/null and
b/test/test_data/orc/pk_btree_source_meta.db/pk_btree_source_meta/manifest/manifest-list-6678a969-de46-4cb3-b744-36a17ac35371-3
differ
diff --git
a/test/test_data/orc/pk_btree_source_meta.db/pk_btree_source_meta/manifest/manifest-list-8e8a1e2e-9fbe-4fb9-920b-82edaed23f41-0
b/test/test_data/orc/pk_btree_source_meta.db/pk_btree_source_meta/manifest/manifest-list-8e8a1e2e-9fbe-4fb9-920b-82edaed23f41-0
new file mode 100644
index 0000000..7a53461
Binary files /dev/null and
b/test/test_data/orc/pk_btree_source_meta.db/pk_btree_source_meta/manifest/manifest-list-8e8a1e2e-9fbe-4fb9-920b-82edaed23f41-0
differ
diff --git
a/test/test_data/orc/pk_btree_source_meta.db/pk_btree_source_meta/manifest/manifest-list-8e8a1e2e-9fbe-4fb9-920b-82edaed23f41-1
b/test/test_data/orc/pk_btree_source_meta.db/pk_btree_source_meta/manifest/manifest-list-8e8a1e2e-9fbe-4fb9-920b-82edaed23f41-1
new file mode 100644
index 0000000..fa3e6d6
Binary files /dev/null and
b/test/test_data/orc/pk_btree_source_meta.db/pk_btree_source_meta/manifest/manifest-list-8e8a1e2e-9fbe-4fb9-920b-82edaed23f41-1
differ
diff --git
a/test/test_data/orc/pk_btree_source_meta.db/pk_btree_source_meta/schema/schema-0
b/test/test_data/orc/pk_btree_source_meta.db/pk_btree_source_meta/schema/schema-0
new file mode 100644
index 0000000..2a12245
--- /dev/null
+++
b/test/test_data/orc/pk_btree_source_meta.db/pk_btree_source_meta/schema/schema-0
@@ -0,0 +1,30 @@
+{
+ "version" : 3,
+ "id" : 0,
+ "fields" : [ {
+ "id" : 0,
+ "name" : "id",
+ "type" : "INT NOT NULL"
+ }, {
+ "id" : 1,
+ "name" : "score",
+ "type" : "INT"
+ }, {
+ "id" : 2,
+ "name" : "tag",
+ "type" : "STRING"
+ } ],
+ "highestFieldId" : 2,
+ "partitionKeys" : [ ],
+ "primaryKeys" : [ "id" ],
+ "options" : {
+ "bucket" : "1",
+ "compaction.force-rewrite-all-files" : "true",
+ "num-sorted-run.compaction-trigger" : "100",
+ "manifest.format" : "orc",
+ "pk-btree.index.columns" : "score",
+ "file.format" : "orc",
+ "deletion-vectors.enabled" : "true"
+ },
+ "timeMillis" : 1785840706107
+}
\ No newline at end of file
diff --git
a/test/test_data/orc/pk_btree_source_meta.db/pk_btree_source_meta/snapshot/EARLIEST
b/test/test_data/orc/pk_btree_source_meta.db/pk_btree_source_meta/snapshot/EARLIEST
new file mode 100644
index 0000000..56a6051
--- /dev/null
+++
b/test/test_data/orc/pk_btree_source_meta.db/pk_btree_source_meta/snapshot/EARLIEST
@@ -0,0 +1 @@
+1
\ No newline at end of file
diff --git
a/test/test_data/orc/pk_btree_source_meta.db/pk_btree_source_meta/snapshot/LATEST
b/test/test_data/orc/pk_btree_source_meta.db/pk_btree_source_meta/snapshot/LATEST
new file mode 100644
index 0000000..7813681
--- /dev/null
+++
b/test/test_data/orc/pk_btree_source_meta.db/pk_btree_source_meta/snapshot/LATEST
@@ -0,0 +1 @@
+5
\ No newline at end of file
diff --git
a/test/test_data/orc/pk_btree_source_meta.db/pk_btree_source_meta/snapshot/snapshot-1
b/test/test_data/orc/pk_btree_source_meta.db/pk_btree_source_meta/snapshot/snapshot-1
new file mode 100644
index 0000000..340133f
--- /dev/null
+++
b/test/test_data/orc/pk_btree_source_meta.db/pk_btree_source_meta/snapshot/snapshot-1
@@ -0,0 +1,17 @@
+{
+ "version" : 3,
+ "uuid" : "fac92a8a-8b53-4e8b-b48a-3bd1bd0d3830",
+ "id" : 1,
+ "schemaId" : 0,
+ "baseManifestList" : "manifest-list-3fe1dd64-b6ac-46dc-b968-1740e05383a2-0",
+ "baseManifestListSize" : 392,
+ "deltaManifestList" : "manifest-list-3fe1dd64-b6ac-46dc-b968-1740e05383a2-1",
+ "deltaManifestListSize" : 1533,
+ "commitUser" : "f391a034-adf4-4c09-8936-7c9646929aa1",
+ "commitIdentifier" : 9223372036854775807,
+ "commitKind" : "APPEND",
+ "timeMillis" : 1785840707537,
+ "totalRecordCount" : 2,
+ "deltaRecordCount" : 2,
+ "nextRowId" : 0
+}
\ No newline at end of file
diff --git
a/test/test_data/orc/pk_btree_source_meta.db/pk_btree_source_meta/snapshot/snapshot-2
b/test/test_data/orc/pk_btree_source_meta.db/pk_btree_source_meta/snapshot/snapshot-2
new file mode 100644
index 0000000..3549501
--- /dev/null
+++
b/test/test_data/orc/pk_btree_source_meta.db/pk_btree_source_meta/snapshot/snapshot-2
@@ -0,0 +1,18 @@
+{
+ "version" : 3,
+ "uuid" : "9b609570-5b41-42c0-a69f-ba6bff5deb5f",
+ "id" : 2,
+ "schemaId" : 0,
+ "baseManifestList" : "manifest-list-3fe1dd64-b6ac-46dc-b968-1740e05383a2-2",
+ "baseManifestListSize" : 1533,
+ "deltaManifestList" : "manifest-list-3fe1dd64-b6ac-46dc-b968-1740e05383a2-3",
+ "deltaManifestListSize" : 1543,
+ "indexManifest" : "index-manifest-d347fbd7-d7cc-4e5e-9f4a-efa8d0ce8651-0",
+ "commitUser" : "f391a034-adf4-4c09-8936-7c9646929aa1",
+ "commitIdentifier" : 9223372036854775807,
+ "commitKind" : "COMPACT",
+ "timeMillis" : 1785840707755,
+ "totalRecordCount" : 2,
+ "deltaRecordCount" : 0,
+ "nextRowId" : 0
+}
\ No newline at end of file
diff --git
a/test/test_data/orc/pk_btree_source_meta.db/pk_btree_source_meta/snapshot/snapshot-3
b/test/test_data/orc/pk_btree_source_meta.db/pk_btree_source_meta/snapshot/snapshot-3
new file mode 100644
index 0000000..bd3fbf0
--- /dev/null
+++
b/test/test_data/orc/pk_btree_source_meta.db/pk_btree_source_meta/snapshot/snapshot-3
@@ -0,0 +1,18 @@
+{
+ "version" : 3,
+ "uuid" : "9e585ab7-2f32-4166-aee7-b5fb5efc7432",
+ "id" : 3,
+ "schemaId" : 0,
+ "baseManifestList" : "manifest-list-6678a969-de46-4cb3-b744-36a17ac35371-0",
+ "baseManifestListSize" : 1603,
+ "deltaManifestList" : "manifest-list-6678a969-de46-4cb3-b744-36a17ac35371-1",
+ "deltaManifestListSize" : 1529,
+ "indexManifest" : "index-manifest-d347fbd7-d7cc-4e5e-9f4a-efa8d0ce8651-0",
+ "commitUser" : "f3a789d1-3e17-42f7-858c-3d0bc96a8128",
+ "commitIdentifier" : 9223372036854775807,
+ "commitKind" : "APPEND",
+ "timeMillis" : 1785840707913,
+ "totalRecordCount" : 4,
+ "deltaRecordCount" : 2,
+ "nextRowId" : 0
+}
\ No newline at end of file
diff --git
a/test/test_data/orc/pk_btree_source_meta.db/pk_btree_source_meta/snapshot/snapshot-4
b/test/test_data/orc/pk_btree_source_meta.db/pk_btree_source_meta/snapshot/snapshot-4
new file mode 100644
index 0000000..e45fedc
--- /dev/null
+++
b/test/test_data/orc/pk_btree_source_meta.db/pk_btree_source_meta/snapshot/snapshot-4
@@ -0,0 +1,18 @@
+{
+ "version" : 3,
+ "uuid" : "a9477987-a7ea-4f90-9722-fd95450883f4",
+ "id" : 4,
+ "schemaId" : 0,
+ "baseManifestList" : "manifest-list-6678a969-de46-4cb3-b744-36a17ac35371-2",
+ "baseManifestListSize" : 1713,
+ "deltaManifestList" : "manifest-list-6678a969-de46-4cb3-b744-36a17ac35371-3",
+ "deltaManifestListSize" : 1548,
+ "indexManifest" : "index-manifest-5ba1f8c6-fcde-45f8-b59b-a948ef3013be-0",
+ "commitUser" : "f3a789d1-3e17-42f7-858c-3d0bc96a8128",
+ "commitIdentifier" : 9223372036854775807,
+ "commitKind" : "COMPACT",
+ "timeMillis" : 1785840707981,
+ "totalRecordCount" : 4,
+ "deltaRecordCount" : 0,
+ "nextRowId" : 0
+}
\ No newline at end of file
diff --git
a/test/test_data/orc/pk_btree_source_meta.db/pk_btree_source_meta/snapshot/snapshot-5
b/test/test_data/orc/pk_btree_source_meta.db/pk_btree_source_meta/snapshot/snapshot-5
new file mode 100644
index 0000000..490a0dc
--- /dev/null
+++
b/test/test_data/orc/pk_btree_source_meta.db/pk_btree_source_meta/snapshot/snapshot-5
@@ -0,0 +1,18 @@
+{
+ "version" : 3,
+ "uuid" : "7c3a0002-b775-4d25-88e2-62b5d87b7059",
+ "id" : 5,
+ "schemaId" : 0,
+ "baseManifestList" : "manifest-list-8e8a1e2e-9fbe-4fb9-920b-82edaed23f41-0",
+ "baseManifestListSize" : 1723,
+ "deltaManifestList" : "manifest-list-8e8a1e2e-9fbe-4fb9-920b-82edaed23f41-1",
+ "deltaManifestListSize" : 1554,
+ "indexManifest" : "index-manifest-0216d085-645d-486b-9ebb-e48df26b8aa7-0",
+ "commitUser" : "7474e587-57d5-4214-913d-e16e4ca8dfd7",
+ "commitIdentifier" : 9223372036854775807,
+ "commitKind" : "COMPACT",
+ "timeMillis" : 1785840708181,
+ "totalRecordCount" : 4,
+ "deltaRecordCount" : 0,
+ "nextRowId" : 0
+}
\ No newline at end of file