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 ee3c9592 fix(orc): support CHAR/VARCHAR compatibility and extend
format compatibility tests (#362)
ee3c9592 is described below
commit ee3c9592c311b43f4afffaafb5636ecf609f1bf3
Author: lxy <[email protected]>
AuthorDate: Fri Sep 18 18:27:39 2026 +0800
fix(orc): support CHAR/VARCHAR compatibility and extend format
compatibility tests (#362)
---
src/paimon/format/orc/orc_file_batch_reader.cpp | 34 ++-
.../format/orc/orc_file_batch_reader_test.cpp | 14 +
test/inte/paimon_read_compat_inte_test.cpp | 305 +++++++++++++--------
.../java_array_blob_types/README.md | 17 ++
...ata-e450b386-992c-4934-a77c-428b16f00082-0.avro | Bin 0 -> 217 bytes
...ata-e450b386-992c-4934-a77c-428b16f00082-1.blob | Bin 0 -> 85 bytes
...manifest-1d608455-d871-46a3-ad5c-c6359f77c02c-0 | Bin 0 -> 2221 bytes
...est-list-d1d4bb47-ac3a-43a1-b20a-16384869a4b6-0 | Bin 0 -> 1158 bytes
...est-list-d1d4bb47-ac3a-43a1-b20a-16384869a4b6-1 | Bin 0 -> 1261 bytes
.../java_array_blob_types/schema/schema-0 | 7 +-
.../java_array_blob_types/snapshot/EARLIEST | 1 +
.../java_array_blob_types/snapshot/LATEST | 1 +
.../java_array_blob_types/snapshot/snapshot-1 | 18 ++
.../java_map_blob_types/README.md | 17 ++
...ata-67ea4504-2d8c-449a-b66d-e51f7866489a-0.avro | Bin 0 -> 217 bytes
...ata-67ea4504-2d8c-449a-b66d-e51f7866489a-1.blob | Bin 0 -> 100 bytes
...manifest-d901117d-19e9-45d7-9627-7b385635001e-0 | Bin 0 -> 2216 bytes
...est-list-d38e0d87-461f-4cd4-aabf-d47141e679b7-0 | Bin 0 -> 1158 bytes
...est-list-d38e0d87-461f-4cd4-aabf-d47141e679b7-1 | Bin 0 -> 1261 bytes
.../java_map_blob_types/schema/schema-0 | 7 +-
.../java_map_blob_types/snapshot/EARLIEST | 1 +
.../java_map_blob_types/snapshot/LATEST | 1 +
.../java_map_blob_types/snapshot/snapshot-1 | 18 ++
.../java_time_types/README.md | 12 +
...ata-552bc110-1000-47fd-91f8-d8c988911595-0.avro | Bin 0 -> 407 bytes
...manifest-3d3ad23a-e678-485a-aeae-fb733e7d970a-0 | Bin 0 -> 2189 bytes
...est-list-7e7bdeb2-7827-4a05-aed8-e1aea50f9144-0 | Bin 0 -> 1158 bytes
...est-list-7e7bdeb2-7827-4a05-aed8-e1aea50f9144-1 | Bin 0 -> 1261 bytes
.../java_time_types/schema/schema-0 | 17 +-
.../java_time_types/snapshot/EARLIEST | 1 +
.../java_time_types/snapshot/LATEST | 1 +
.../java_time_types/snapshot/snapshot-1 | 18 ++
.../java_types/README.md | 92 +++++++
...ata-6fb2ed11-0ae4-4fe3-9bf8-8e1a54ecf8b7-0.avro | Bin 0 -> 4485 bytes
...ata-6fb2ed11-0ae4-4fe3-9bf8-8e1a54ecf8b7-1.blob | Bin 0 -> 81 bytes
...manifest-ad942b8a-bdb3-4a5d-a6ab-637f8d2a9ba5-0 | Bin 0 -> 2747 bytes
...est-list-ecb389f6-229e-4460-ab9e-d739db56e794-0 | Bin 0 -> 1158 bytes
...est-list-ecb389f6-229e-4460-ab9e-d739db56e794-1 | Bin 0 -> 1261 bytes
.../java_types/schema/schema-0 | 112 ++------
.../java_types/snapshot/EARLIEST | 1 +
.../java_types/snapshot/LATEST | 1 +
.../java_types/snapshot/snapshot-1 | 18 ++
.../java_vector_types/README.md | 16 ++
...ata-3e8ef942-de78-4a10-acb8-911560a123bd-0.avro | Bin 0 -> 1052 bytes
...manifest-ef4060ce-0bd8-4eab-ba5f-4f4a90603b8f-0 | Bin 0 -> 2189 bytes
...est-list-4d5f3302-46cf-4658-b90a-e05d3cd39b76-0 | Bin 0 -> 1158 bytes
...est-list-4d5f3302-46cf-4658-b90a-e05d3cd39b76-1 | Bin 0 -> 1258 bytes
.../java_vector_types/schema/schema-0 | 7 +-
.../java_vector_types/snapshot/EARLIEST | 1 +
.../java_vector_types/snapshot/LATEST | 1 +
.../java_vector_types/snapshot/snapshot-1 | 18 ++
.../java_array_blob_types/README.md | 18 ++
...data-51e35438-5081-45b2-a42b-01a7146ef8dd-0.orc | Bin 0 -> 219 bytes
...ata-51e35438-5081-45b2-a42b-01a7146ef8dd-1.blob | Bin 0 -> 100 bytes
...manifest-fc560a6b-5521-465f-9523-72234acb5ee8-0 | Bin 0 -> 2241 bytes
...est-list-8ebc8260-da53-49fd-a42b-0ddb8a3e0269-0 | Bin 0 -> 1158 bytes
...est-list-8ebc8260-da53-49fd-a42b-0ddb8a3e0269-1 | Bin 0 -> 1258 bytes
.../java_array_blob_types/schema/schema-0 | 8 +-
.../java_array_blob_types/snapshot/EARLIEST | 1 +
.../java_array_blob_types/snapshot/LATEST | 1 +
.../java_array_blob_types/snapshot/snapshot-1 | 18 ++
.../java_map_blob_types/README.md | 18 ++
...data-56bef3f1-cd23-4fe9-9411-d52f5bf1db9d-0.orc | Bin 0 -> 219 bytes
...ata-56bef3f1-cd23-4fe9-9411-d52f5bf1db9d-1.blob | Bin 0 -> 100 bytes
...manifest-be1d7959-ae2c-4e46-84d0-3f42732e6560-0 | Bin 0 -> 2237 bytes
...est-list-9fe2cdf2-7bce-48cc-8111-decf7e1e0232-0 | Bin 0 -> 1158 bytes
...est-list-9fe2cdf2-7bce-48cc-8111-decf7e1e0232-1 | Bin 0 -> 1261 bytes
.../java_map_blob_types/schema/schema-0 | 8 +-
.../java_map_blob_types/snapshot/EARLIEST | 1 +
.../java_map_blob_types/snapshot/LATEST | 1 +
.../java_map_blob_types/snapshot/snapshot-1 | 18 ++
.../java_time_types/README.md | 14 +
...data-c3c43658-047f-42b1-bfae-26f67cd77c5f-0.orc | Bin 0 -> 626 bytes
...manifest-306250ad-71a2-42a3-9d47-a7146425bc2b-0 | Bin 0 -> 2198 bytes
...est-list-e0a1ab29-c5e3-438c-b82f-753a4006e310-0 | Bin 0 -> 1158 bytes
...est-list-e0a1ab29-c5e3-438c-b82f-753a4006e310-1 | Bin 0 -> 1264 bytes
.../java_time_types/schema/schema-0 | 8 +-
.../java_time_types/snapshot/EARLIEST | 1 +
.../java_time_types/snapshot/LATEST | 1 +
.../java_time_types/snapshot/snapshot-1 | 18 ++
.../java_types/README.md | 100 +++++++
...data-4135518c-e709-4232-ad15-508e494bdcf8-0.orc | Bin 0 -> 6058 bytes
...ata-4135518c-e709-4232-ad15-508e494bdcf8-1.blob | Bin 0 -> 81 bytes
...manifest-6b6f74b3-783e-4138-84a2-343b997c2f53-0 | Bin 0 -> 2727 bytes
...est-list-76873624-e06e-4313-b7ae-ec0e45180cc6-0 | Bin 0 -> 1158 bytes
...est-list-76873624-e06e-4313-b7ae-ec0e45180cc6-1 | Bin 0 -> 1261 bytes
.../java_types/schema/schema-0 | 63 +----
.../java_types/snapshot/EARLIEST | 1 +
.../java_types/snapshot/LATEST | 1 +
.../java_types/snapshot/snapshot-1 | 18 ++
.../append_types_compatibility.db/README.md | 55 ----
.../java_array_blob_types/README.md | 17 ++
.../java_array_blob_types/schema/schema-0 | 3 +-
.../java_map_blob_types/README.md | 17 ++
.../java_map_blob_types/schema/schema-0 | 3 +-
.../java_time_types/README.md | 13 +
.../java_time_types/schema/schema-0 | 3 +-
.../java_types/README.md | 103 +++++++
.../java_types/schema/schema-0 | 3 +-
.../java_vector_types/README.md | 16 ++
.../java_vector_types/schema/schema-0 | 3 +-
.../python_array_blob_types/README.md | 17 ++
.../python_array_blob_types/schema/schema-0 | 3 +-
.../python_map_blob_types/README.md | 17 ++
.../python_map_blob_types/schema/schema-0 | 3 +-
.../python_time_types/README.md | 13 +
.../python_time_types/schema/schema-0 | 5 +-
.../python_types/README.md | 103 +++++++
.../python_types/schema/schema-0 | 3 +-
.../python_vector_types/README.md | 16 ++
.../python_vector_types/schema/schema-0 | 5 +-
.../rust_array_blob_types/README.md | 17 ++
.../rust_array_blob_types/schema/schema-0 | 2 +-
.../rust_map_blob_types/README.md | 17 ++
.../rust_map_blob_types/schema/schema-0 | 2 +-
.../rust_time_types/README.md | 13 +
.../rust_time_types/schema/schema-0 | 2 +-
.../rust_types/README.md | 103 +++++++
.../rust_types/schema/schema-0 | 2 +-
.../rust_vector_types/README.md | 16 ++
.../rust_vector_types/schema/schema-0 | 2 +-
121 files changed, 1280 insertions(+), 391 deletions(-)
diff --git a/src/paimon/format/orc/orc_file_batch_reader.cpp
b/src/paimon/format/orc/orc_file_batch_reader.cpp
index d45cf4d9..526ff7cd 100644
--- a/src/paimon/format/orc/orc_file_batch_reader.cpp
+++ b/src/paimon/format/orc/orc_file_batch_reader.cpp
@@ -47,6 +47,36 @@
namespace paimon::orc {
namespace {
+bool IsStringTypeCompatible(const ::orc::Type* src_type, const ::orc::Type*
target_type) {
+ ::orc::TypeKind src_kind = src_type->getKind();
+ return (src_kind == ::orc::TypeKind::CHAR || src_kind ==
::orc::TypeKind::VARCHAR) &&
+ target_type->getKind() == ::orc::TypeKind::STRING;
+}
+
+bool IsCompleteTypeCompatible(const ::orc::Type* src_type, const ::orc::Type*
target_type) {
+ ::orc::TypeKind src_kind = src_type->getKind();
+ ::orc::TypeKind target_kind = target_type->getKind();
+ if (IsStringTypeCompatible(src_type, target_type)) {
+ return true;
+ }
+ if (src_kind != target_kind || src_type->getSubtypeCount() !=
target_type->getSubtypeCount()) {
+ return false;
+ }
+ if (src_type->getSubtypeCount() == 0) {
+ return src_type->toString() == target_type->toString();
+ }
+ for (uint64_t i = 0; i < src_type->getSubtypeCount(); i++) {
+ if (src_kind == ::orc::TypeKind::STRUCT &&
+ src_type->getFieldName(i) != target_type->getFieldName(i)) {
+ return false;
+ }
+ if (!IsCompleteTypeCompatible(src_type->getSubtype(i),
target_type->getSubtype(i))) {
+ return false;
+ }
+ }
+ return true;
+}
+
void CollectAllColumnIds(const ::orc::Type* type, std::vector<uint64_t>*
column_ids) {
column_ids->push_back(type->getColumnId());
for (uint64_t i = 0; i < type->getSubtypeCount(); ++i) {
@@ -208,7 +238,7 @@ Status OrcFileBatchReader::CollectTargetColumnIds(const
::orc::Type* src_type,
std::vector<uint64_t>*
target_column_ids) {
auto src_kind = src_type->getKind();
auto target_kind = target_type->getKind();
- if (src_kind != target_kind) {
+ if (src_kind != target_kind && !IsStringTypeCompatible(src_type,
target_type)) {
return Status::Invalid(fmt::format("type kind mismatch: src {} vs
target {}",
src_type->toString(),
target_type->toString()));
}
@@ -235,7 +265,7 @@ Status OrcFileBatchReader::CollectTargetColumnIds(const
::orc::Type* src_type,
// Partial field recall inside list/map types is unsupported, so
the target must match
// the complete source subtree. Include the container and every
descendant because all
// of their streams are recalled by the ORC reader.
- if (src_type->toString() != target_type->toString()) {
+ if (!IsCompleteTypeCompatible(src_type, target_type)) {
return Status::Invalid(fmt::format("type mismatch: src {} vs
target {}",
src_type->toString(),
target_type->toString()));
}
diff --git a/src/paimon/format/orc/orc_file_batch_reader_test.cpp
b/src/paimon/format/orc/orc_file_batch_reader_test.cpp
index 3f57f1fb..e73e1c7e 100644
--- a/src/paimon/format/orc/orc_file_batch_reader_test.cpp
+++ b/src/paimon/format/orc/orc_file_batch_reader_test.cpp
@@ -533,6 +533,20 @@ TEST_F(OrcFileBatchReaderTest,
TestCollectTargetColumnIdsPrimitiveMap) {
ASSERT_EQ(target_column_ids, (std::vector<uint64_t>{1, 2, 3}));
}
+TEST_F(OrcFileBatchReaderTest,
TestCollectTargetColumnIdsCompatibleStringKinds) {
+ std::unique_ptr<::orc::Type> src_type = ::orc::Type::buildTypeFromString(
+ "struct<char_value:char(3),varchar_value:varchar(64),"
+ "nested:array<map<char(4),varchar(16)>>>");
+ std::unique_ptr<::orc::Type> target_type =
::orc::Type::buildTypeFromString(
+
"struct<char_value:string,varchar_value:string,nested:array<map<string,string>>>");
+ std::vector<uint64_t> target_column_ids;
+
+ ASSERT_OK(OrcFileBatchReader::CollectTargetColumnIds(src_type.get(),
target_type.get(),
+ &target_column_ids));
+ // char_value(1), varchar_value(2), nested-list(3), map(4), key(5),
value(6)
+ ASSERT_EQ(target_column_ids, (std::vector<uint64_t>{1, 2, 3, 4, 5, 6}));
+}
+
TEST_F(OrcFileBatchReaderTest, TestCollectTargetColumnIdsDeeplyNestedMap) {
std::string schema =
"struct<attributes:map<string,array<struct<score:double,tags:array<string>>>>>";
diff --git a/test/inte/paimon_read_compat_inte_test.cpp
b/test/inte/paimon_read_compat_inte_test.cpp
index a5595150..5948f0ef 100644
--- a/test/inte/paimon_read_compat_inte_test.cpp
+++ b/test/inte/paimon_read_compat_inte_test.cpp
@@ -17,6 +17,7 @@
* under the License.
*/
+#include <algorithm>
#include <cstdint>
#include <map>
#include <memory>
@@ -47,14 +48,28 @@ namespace {
const char kDatabaseName[] = "append_types_compatibility";
-std::vector<std::string> WriterPrefixes() {
- return {"python", "rust", "java"};
+struct CompatibilityParam {
+ std::string file_format;
+ std::string writer_prefix;
+ bool supports_variant;
+ bool supports_vector;
+ bool supports_nanosecond_timestamps;
+};
+
+std::vector<CompatibilityParam> CompatibilityParams() {
+ return {
+ {"parquet", "python", true, true, true}, {"parquet", "rust", true,
true, true},
+ {"parquet", "java", true, true, true}, {"orc", "java", false, false,
true},
+ {"avro", "java", false, true, false},
+ };
}
Result<std::shared_ptr<arrow::ChunkedArray>> ReadTable(
- const std::string& table_name, const std::vector<std::string>& field_names,
+ const std::string& file_format, const std::string& table_name,
+ const std::vector<std::string>& field_names,
const std::map<std::string, std::string>& options = {}) {
- std::string table_path = GetDataDir() + "/parquet/" + kDatabaseName +
".db/" + table_name;
+ std::string table_path =
+ GetDataDir() + "/" + file_format + "/" + kDatabaseName + ".db/" +
table_name;
ScanContextBuilder scan_context_builder(table_path);
scan_context_builder.SetOptions(options);
@@ -75,6 +90,13 @@ Result<std::shared_ptr<arrow::ChunkedArray>> ReadTable(
return ReadResultCollector::CollectResult(std::move(batch_reader));
}
+Result<std::shared_ptr<arrow::ChunkedArray>> ReadTable(
+ const CompatibilityParam& param, const std::string& table_name,
+ const std::vector<std::string>& field_names,
+ const std::map<std::string, std::string>& options = {}) {
+ return ReadTable(param.file_format, table_name, field_names, options);
+}
+
std::shared_ptr<arrow::StructArray> GetOnlyStructChunk(
const std::shared_ptr<arrow::ChunkedArray>& result) {
if (!result || result->num_chunks() != 1) {
@@ -134,10 +156,10 @@ void AssertVariantJsonAt(const
std::shared_ptr<arrow::StructArray>& variants, in
} // namespace
-class PaimonReadCompatInteTest : public ::testing::TestWithParam<std::string>
{};
+class PaimonReadCompatInteTest : public
::testing::TestWithParam<CompatibilityParam> {};
TEST_P(PaimonReadCompatInteTest, ReadsCompatibleTypeValues) {
- const std::string& writer_prefix = GetParam();
+ const CompatibilityParam& param = GetParam();
TimezoneGuard timezone_guard("Asia/Shanghai");
// Project every non-BLOB field from the main compatibility table in
schema order.
@@ -175,8 +197,7 @@ TEST_P(PaimonReadCompatInteTest, ReadsCompatibleTypeValues)
{
"f_timestamp_ltz_3",
"f_timestamp_ltz_6",
"f_timestamp_ltz_9",
- // VARIANT and nested container types.
- "f_variant",
+ // Nested container types supported by every fixture.
"f_array_int",
"f_map_string_bigint",
"f_row",
@@ -185,12 +206,18 @@ TEST_P(PaimonReadCompatInteTest,
ReadsCompatibleTypeValues) {
"f_map_array",
"f_array_row",
"f_map_row",
- "f_deep_row",
- "f_array_variant",
- "f_map_variant",
};
+ if (!param.supports_nanosecond_timestamps) {
+ fields.erase(std::remove(fields.begin(), fields.end(),
"f_timestamp_9"), fields.end());
+ fields.erase(std::remove(fields.begin(), fields.end(),
"f_timestamp_ltz_9"), fields.end());
+ }
+ if (param.supports_variant) {
+ auto nested_types = std::find(fields.begin(), fields.end(),
"f_array_int");
+ fields.insert(nested_types, "f_variant");
+ fields.insert(fields.end(), {"f_deep_row", "f_array_variant",
"f_map_variant"});
+ }
ASSERT_OK_AND_ASSIGN(std::shared_ptr<arrow::ChunkedArray> result,
- ReadTable(writer_prefix + "_types", fields));
+ ReadTable(param, param.writer_prefix + "_types",
fields));
std::shared_ptr<arrow::StructArray> rows = GetOnlyStructChunk(result);
ASSERT_TRUE(rows);
ASSERT_EQ(rows->length(), 3);
@@ -208,7 +235,9 @@ TEST_P(PaimonReadCompatInteTest, ReadsCompatibleTypeValues)
{
AssertFieldEqualsJson(rows, "f_double", arrow::float64(), "[-12345.6789,
null, null]");
// Character and binary strings, including empty and embedded-null values.
- AssertFieldEqualsJson(rows, "f_char", arrow::utf8(), R"(["char", null,
""])");
+ AssertFieldEqualsJson(
+ rows, "f_char", arrow::utf8(),
+ param.file_format == "orc" ? R"(["char ", null, " "])" :
R"(["char", null, ""])");
AssertFieldEqualsJson(rows, "f_varchar", arrow::utf8(), R"(["varchar-中文",
null, ""])");
AssertFieldEqualsJson(rows, "f_string", arrow::utf8(), R"(["pypaimon
2.0.0", null, ""])");
AssertFieldEqualsJson(rows, "f_binary", arrow::binary(), R"(["12345678",
null, "ABCDEFGH"])");
@@ -237,8 +266,10 @@ TEST_P(PaimonReadCompatInteTest,
ReadsCompatibleTypeValues) {
R"(["2024-02-29 12:34:56.123", null, null])");
AssertFieldEqualsJson(rows, "f_timestamp_6",
arrow::timestamp(arrow::TimeUnit::MICRO),
R"(["2024-02-29 12:34:56.123456", null, null])");
- AssertFieldEqualsJson(rows, "f_timestamp_9",
arrow::timestamp(arrow::TimeUnit::NANO),
- R"(["2024-02-29 12:34:56.123456000", null, null])");
+ if (param.supports_nanosecond_timestamps) {
+ AssertFieldEqualsJson(rows, "f_timestamp_9",
arrow::timestamp(arrow::TimeUnit::NANO),
+ R"(["2024-02-29 12:34:56.123456000", null,
null])");
+ }
AssertFieldEqualsJson(rows, "f_timestamp_ltz_0",
arrow::timestamp(arrow::TimeUnit::SECOND,
"Asia/Shanghai"),
R"(["2024-02-29 12:34:56", null, null])");
@@ -248,26 +279,39 @@ TEST_P(PaimonReadCompatInteTest,
ReadsCompatibleTypeValues) {
AssertFieldEqualsJson(rows, "f_timestamp_ltz_6",
arrow::timestamp(arrow::TimeUnit::MICRO,
"Asia/Shanghai"),
R"(["2024-02-29 12:34:56.123456", null, null])");
- AssertFieldEqualsJson(rows, "f_timestamp_ltz_9",
- arrow::timestamp(arrow::TimeUnit::NANO,
"Asia/Shanghai"),
- R"(["2024-02-29 12:34:56.123456000", null, null])");
+ if (param.supports_nanosecond_timestamps) {
+ AssertFieldEqualsJson(rows, "f_timestamp_ltz_9",
+ arrow::timestamp(arrow::TimeUnit::NANO,
"Asia/Shanghai"),
+ R"(["2024-02-29 12:34:56.123456000", null,
null])");
+ }
// First-level ARRAY, MAP, and ROW values with null and empty containers.
AssertFieldEqualsJson(rows, "f_array_int", arrow::list(arrow::int32()),
"[[1, null, 3], null, []]");
AssertFieldEqualsJson(rows, "f_map_string_bigint",
arrow::map(arrow::utf8(), arrow::int64()),
R"([[ ["one", 1], ["null", null] ], null, []])");
- std::shared_ptr<arrow::DataType> row_type = arrow::struct_({
- arrow::field("nested_int", arrow::int32()),
- arrow::field("nested_string", arrow::utf8()),
- arrow::field("nested_decimal", arrow::decimal128(19, 4)),
- arrow::field("nested_timestamp",
arrow::timestamp(arrow::TimeUnit::NANO)),
- arrow::field("nested_timestamp_ltz",
- arrow::timestamp(arrow::TimeUnit::NANO, "Asia/Shanghai")),
- });
- AssertFieldEqualsJson(
- rows, "f_row", row_type,
- R"([[7, "nested", "123456789012345.6789", "2024-02-29
12:34:56.123456000", "2024-02-29 12:34:56.123456000"], null, null])");
+ std::shared_ptr<arrow::DataType> row_type;
+ std::string row_json;
+ if (param.supports_nanosecond_timestamps) {
+ row_type = arrow::struct_({
+ arrow::field("nested_int", arrow::int32()),
+ arrow::field("nested_string", arrow::utf8()),
+ arrow::field("nested_decimal", arrow::decimal128(19, 4)),
+ arrow::field("nested_timestamp",
arrow::timestamp(arrow::TimeUnit::NANO)),
+ arrow::field("nested_timestamp_ltz",
+ arrow::timestamp(arrow::TimeUnit::NANO,
"Asia/Shanghai")),
+ });
+ row_json =
+ R"([[7, "nested", "123456789012345.6789", "2024-02-29
12:34:56.123456000", "2024-02-29 12:34:56.123456000"], null, null])";
+ } else {
+ row_type = arrow::struct_({
+ arrow::field("nested_int", arrow::int32()),
+ arrow::field("nested_string", arrow::utf8()),
+ arrow::field("nested_decimal", arrow::decimal128(19, 4)),
+ });
+ row_json = R"([[7, "nested", "123456789012345.6789"], null, null])";
+ }
+ AssertFieldEqualsJson(rows, "f_row", row_type, row_json);
// Nested ARRAY/MAP combinations and containers whose values are ROWs.
AssertFieldEqualsJson(rows, "f_array_array_int",
arrow::list(arrow::list(arrow::int32())),
@@ -292,81 +336,88 @@ TEST_P(PaimonReadCompatInteTest,
ReadsCompatibleTypeValues) {
rows, "f_map_row", map_row_type,
R"([[ ["first", [true, "2024-02-29 12:34:56.123456"]], ["second",
null] ], null, []])");
- // Top-level VARIANT values are compared as normalized JSON.
- const std::string object_variant_json =
-
R"({"name":"variant-object","count":42,"active":true,"items":[null,1,"x"],"nested":{"decimal":12.34}})";
- const std::string array_variant_json = R"([1,"two",false,{"k":"v"}])";
- std::shared_ptr<arrow::StructArray> variants =
-
std::dynamic_pointer_cast<arrow::StructArray>(rows->GetFieldByName("f_variant"));
- ASSERT_TRUE(variants);
- AssertVariantJsonAt(variants, 0, object_variant_json);
- ASSERT_TRUE(variants->IsNull(1));
- ASSERT_TRUE(variants->IsNull(2));
-
- // Deeply nested ROW -> ARRAY<ROW<VARIANT>> and ROW -> MAP values.
- std::shared_ptr<arrow::StructArray> deep_rows =
-
std::dynamic_pointer_cast<arrow::StructArray>(rows->GetFieldByName("f_deep_row"));
- ASSERT_TRUE(deep_rows);
- ASSERT_FALSE(deep_rows->IsNull(0));
- ASSERT_TRUE(deep_rows->IsNull(1));
- ASSERT_TRUE(deep_rows->IsNull(2));
- std::shared_ptr<arrow::ListArray> children =
-
std::dynamic_pointer_cast<arrow::ListArray>(deep_rows->GetFieldByName("children"));
- ASSERT_TRUE(children);
- ASSERT_EQ(children->value_length(0), 2);
- std::shared_ptr<arrow::StructArray> child_rows =
- std::dynamic_pointer_cast<arrow::StructArray>(children->values());
- ASSERT_TRUE(child_rows);
- AssertArrayEqualsJson(child_rows->GetFieldByName("leaf_id"),
"f_deep_row.children.leaf_id",
- "[10, 11]");
- std::shared_ptr<arrow::StructArray> leaf_variants =
-
std::dynamic_pointer_cast<arrow::StructArray>(child_rows->GetFieldByName("leaf_variant"));
- ASSERT_TRUE(leaf_variants);
- AssertVariantJsonAt(leaf_variants, 0, array_variant_json);
- ASSERT_TRUE(leaf_variants->IsNull(1));
- std::shared_ptr<arrow::MapArray> labels =
-
std::dynamic_pointer_cast<arrow::MapArray>(deep_rows->GetFieldByName("labels"));
- ASSERT_TRUE(labels);
- AssertArrayEqualsJson(labels->Slice(0, 1), "f_deep_row.labels",
- R"([[ ["language", "python"], ["format", "parquet"]
]])");
-
- // ARRAY<VARIANT> values, including null elements and empty arrays.
- std::shared_ptr<arrow::ListArray> array_variants =
-
std::dynamic_pointer_cast<arrow::ListArray>(rows->GetFieldByName("f_array_variant"));
- ASSERT_TRUE(array_variants);
- ASSERT_EQ(array_variants->value_length(0), 3);
- ASSERT_TRUE(array_variants->IsNull(1));
- ASSERT_EQ(array_variants->value_length(2), 0);
- std::shared_ptr<arrow::StructArray> array_variant_values =
-
std::dynamic_pointer_cast<arrow::StructArray>(array_variants->values());
- ASSERT_TRUE(array_variant_values);
- AssertVariantJsonAt(array_variant_values, 0, object_variant_json);
- ASSERT_TRUE(array_variant_values->IsNull(1));
- AssertVariantJsonAt(array_variant_values, 2, array_variant_json);
-
- // MAP<STRING, VARIANT> values and their key/value alignment.
- std::shared_ptr<arrow::MapArray> map_variants =
-
std::dynamic_pointer_cast<arrow::MapArray>(rows->GetFieldByName("f_map_variant"));
- ASSERT_TRUE(map_variants);
- ASSERT_EQ(map_variants->value_length(0), 2);
- ASSERT_TRUE(map_variants->IsNull(1));
- ASSERT_EQ(map_variants->value_length(2), 0);
- AssertArrayEqualsJson(map_variants->keys(), "f_map_variant.keys",
R"(["object", "array"])");
- std::shared_ptr<arrow::StructArray> map_variant_values =
- std::dynamic_pointer_cast<arrow::StructArray>(map_variants->items());
- ASSERT_TRUE(map_variant_values);
- AssertVariantJsonAt(map_variant_values, 0, object_variant_json);
- AssertVariantJsonAt(map_variant_values, 1, array_variant_json);
+ if (param.supports_variant) {
+ // Top-level VARIANT values are compared as normalized JSON.
+ const std::string object_variant_json =
+
R"({"name":"variant-object","count":42,"active":true,"items":[null,1,"x"],"nested":{"decimal":12.34}})";
+ const std::string array_variant_json = R"([1,"two",false,{"k":"v"}])";
+ std::shared_ptr<arrow::StructArray> variants =
+
std::dynamic_pointer_cast<arrow::StructArray>(rows->GetFieldByName("f_variant"));
+ ASSERT_TRUE(variants);
+ AssertVariantJsonAt(variants, 0, object_variant_json);
+ ASSERT_TRUE(variants->IsNull(1));
+ ASSERT_TRUE(variants->IsNull(2));
+
+ // Deeply nested ROW -> ARRAY<ROW<VARIANT>> and ROW -> MAP values.
+ std::shared_ptr<arrow::StructArray> deep_rows =
+
std::dynamic_pointer_cast<arrow::StructArray>(rows->GetFieldByName("f_deep_row"));
+ ASSERT_TRUE(deep_rows);
+ ASSERT_FALSE(deep_rows->IsNull(0));
+ ASSERT_TRUE(deep_rows->IsNull(1));
+ ASSERT_TRUE(deep_rows->IsNull(2));
+ std::shared_ptr<arrow::ListArray> children =
+
std::dynamic_pointer_cast<arrow::ListArray>(deep_rows->GetFieldByName("children"));
+ ASSERT_TRUE(children);
+ ASSERT_EQ(children->value_length(0), 2);
+ std::shared_ptr<arrow::StructArray> child_rows =
+ std::dynamic_pointer_cast<arrow::StructArray>(children->values());
+ ASSERT_TRUE(child_rows);
+ AssertArrayEqualsJson(child_rows->GetFieldByName("leaf_id"),
"f_deep_row.children.leaf_id",
+ "[10, 11]");
+ std::shared_ptr<arrow::StructArray> leaf_variants =
+ std::dynamic_pointer_cast<arrow::StructArray>(
+ child_rows->GetFieldByName("leaf_variant"));
+ ASSERT_TRUE(leaf_variants);
+ AssertVariantJsonAt(leaf_variants, 0, array_variant_json);
+ ASSERT_TRUE(leaf_variants->IsNull(1));
+ std::shared_ptr<arrow::MapArray> labels =
+
std::dynamic_pointer_cast<arrow::MapArray>(deep_rows->GetFieldByName("labels"));
+ ASSERT_TRUE(labels);
+ AssertArrayEqualsJson(labels->Slice(0, 1), "f_deep_row.labels",
+ R"([[ ["language", "python"], ["format",
"parquet"] ]])");
+
+ // ARRAY<VARIANT> values, including null elements and empty arrays.
+ std::shared_ptr<arrow::ListArray> array_variants =
+
std::dynamic_pointer_cast<arrow::ListArray>(rows->GetFieldByName("f_array_variant"));
+ ASSERT_TRUE(array_variants);
+ ASSERT_EQ(array_variants->value_length(0), 3);
+ ASSERT_TRUE(array_variants->IsNull(1));
+ ASSERT_EQ(array_variants->value_length(2), 0);
+ std::shared_ptr<arrow::StructArray> array_variant_values =
+
std::dynamic_pointer_cast<arrow::StructArray>(array_variants->values());
+ ASSERT_TRUE(array_variant_values);
+ AssertVariantJsonAt(array_variant_values, 0, object_variant_json);
+ ASSERT_TRUE(array_variant_values->IsNull(1));
+ AssertVariantJsonAt(array_variant_values, 2, array_variant_json);
+
+ // MAP<STRING, VARIANT> values and their key/value alignment.
+ std::shared_ptr<arrow::MapArray> map_variants =
+
std::dynamic_pointer_cast<arrow::MapArray>(rows->GetFieldByName("f_map_variant"));
+ ASSERT_TRUE(map_variants);
+ ASSERT_EQ(map_variants->value_length(0), 2);
+ ASSERT_TRUE(map_variants->IsNull(1));
+ ASSERT_EQ(map_variants->value_length(2), 0);
+ AssertArrayEqualsJson(map_variants->keys(), "f_map_variant.keys",
R"(["object", "array"])");
+ std::shared_ptr<arrow::StructArray> map_variant_values =
+
std::dynamic_pointer_cast<arrow::StructArray>(map_variants->items());
+ ASSERT_TRUE(map_variant_values);
+ AssertVariantJsonAt(map_variant_values, 0, object_variant_json);
+ AssertVariantJsonAt(map_variant_values, 1, array_variant_json);
+ }
}
TEST_P(PaimonReadCompatInteTest, ReadsBlobValues) {
- const std::string& writer_prefix = GetParam();
+ const CompatibilityParam& param = GetParam();
- ASSERT_OK_AND_ASSIGN(std::shared_ptr<arrow::ChunkedArray> result,
- ReadTable(writer_prefix + "_types", {"f_blob",
"f_blob_descriptor"},
- {{Options::FILE_SYSTEM, "local"},
- {Options::BLOB_AS_DESCRIPTOR, "true"},
- {Options::BLOB_VIEW_RESOLVE_ENABLED,
"false"}}));
+ std::vector<std::string> blob_fields = {"f_blob", "f_blob_descriptor"};
+ std::map<std::string, std::string> blob_descriptor_options;
+ blob_descriptor_options[Options::FILE_SYSTEM] = "local";
+ blob_descriptor_options[Options::BLOB_AS_DESCRIPTOR] = "true";
+ blob_descriptor_options[Options::BLOB_VIEW_RESOLVE_ENABLED] = "false";
+
+ ASSERT_OK_AND_ASSIGN(
+ std::shared_ptr<arrow::ChunkedArray> result,
+ ReadTable(param, param.writer_prefix + "_types", blob_fields,
blob_descriptor_options));
std::shared_ptr<arrow::StructArray> rows = GetOnlyStructChunk(result);
ASSERT_TRUE(rows);
ASSERT_EQ(rows->length(), 3);
@@ -392,18 +443,18 @@ TEST_P(PaimonReadCompatInteTest, ReadsBlobValues) {
ASSERT_EQ(empty_descriptor->Length(), 0);
// Resolve the external BLOB and validate its payload instead of its
descriptor.
- std::map<std::string, std::string> blob_value_options = {
- {Options::FILE_SYSTEM, "local"},
- {Options::BLOB_AS_DESCRIPTOR, "false"},
- };
- ASSERT_OK_AND_ASSIGN(std::shared_ptr<arrow::ChunkedArray>
blob_value_result,
- ReadTable(writer_prefix + "_types", {"f_blob"},
blob_value_options));
+ std::map<std::string, std::string> blob_value_options;
+ blob_value_options[Options::FILE_SYSTEM] = "local";
+ blob_value_options[Options::BLOB_AS_DESCRIPTOR] = "false";
+ ASSERT_OK_AND_ASSIGN(
+ std::shared_ptr<arrow::ChunkedArray> blob_value_result,
+ ReadTable(param, param.writer_prefix + "_types", {"f_blob"},
blob_value_options));
std::shared_ptr<arrow::StructArray> blob_value_rows =
GetOnlyStructChunk(blob_value_result);
ASSERT_TRUE(blob_value_rows);
AssertFieldEqualsJson(blob_value_rows, "f_blob", arrow::large_binary(),
R"(["ordinary blob payload from pypaimon 2.0.0",
null, ""])");
- // Inline BLOB descriptors exercise compatible binary types restored from
ARROW:schema.
+ // Inline BLOB descriptors exercise each file format's compatible binary
representation.
std::shared_ptr<arrow::LargeBinaryArray> inline_blobs =
std::dynamic_pointer_cast<arrow::LargeBinaryArray>(
rows->GetFieldByName("f_blob_descriptor"));
@@ -423,12 +474,12 @@ TEST_P(PaimonReadCompatInteTest, ReadsBlobValues) {
// Python and Java store MAP<STRING, BLOB> values in standard separate
BLOB files. Validate
// resolved payloads, null values, and an empty map. Rust stores raw
values inline in Parquet,
// which is not a compatible Paimon BLOB representation and is asserted
separately below.
- if (writer_prefix == "rust") {
+ if (param.writer_prefix == "rust") {
return;
}
- ASSERT_OK_AND_ASSIGN(
- std::shared_ptr<arrow::ChunkedArray> map_blob_result,
- ReadTable(writer_prefix + "_map_blob_types", {"id", "f_map_blob"},
blob_value_options));
+ ASSERT_OK_AND_ASSIGN(std::shared_ptr<arrow::ChunkedArray> map_blob_result,
+ ReadTable(param, param.writer_prefix +
"_map_blob_types",
+ {"id", "f_map_blob"}, blob_value_options));
std::shared_ptr<arrow::StructArray> map_blob_rows =
GetOnlyStructChunk(map_blob_result);
ASSERT_TRUE(map_blob_rows);
ASSERT_EQ(map_blob_rows->length(), 3);
@@ -440,12 +491,15 @@ TEST_P(PaimonReadCompatInteTest, ReadsBlobValues) {
TEST(PaimonReadCompatInteStandaloneTest, RejectsNonStandardRustMapBlob) {
ASSERT_NOK_WITH_MSG(
- ReadTable("rust_map_blob_types", {"f_map_blob"}),
+ ReadTable("parquet", "rust_map_blob_types", {"f_map_blob"}),
"Parquet does not support partial projection inside list/map: src
map<string, binary");
}
TEST_P(PaimonReadCompatInteTest, ReadsVectorValues) {
- const std::string& writer_prefix = GetParam();
+ const CompatibilityParam& param = GetParam();
+ if (!param.supports_vector) {
+ return;
+ }
// Validate every supported VECTOR element type.
std::vector<std::string> vector_fields = {
@@ -453,7 +507,7 @@ TEST_P(PaimonReadCompatInteTest, ReadsVectorValues) {
"f_vector_int", "f_vector_bigint", "f_vector_float",
"f_vector_double",
};
ASSERT_OK_AND_ASSIGN(std::shared_ptr<arrow::ChunkedArray> vector_result,
- ReadTable(writer_prefix + "_vector_types",
vector_fields));
+ ReadTable(param, param.writer_prefix +
"_vector_types", vector_fields));
std::shared_ptr<arrow::StructArray> vector_rows =
GetOnlyStructChunk(vector_result);
ASSERT_TRUE(vector_rows);
ASSERT_EQ(vector_rows->length(), 2);
@@ -479,9 +533,10 @@ TEST_P(PaimonReadCompatInteTest, ReadsVectorValues) {
"[[1.125, -2.25, 3.5], [4.125, 5.25, 6.5]]");
}
-INSTANTIATE_TEST_SUITE_P(Writers, PaimonReadCompatInteTest,
::testing::ValuesIn(WriterPrefixes()),
- [](const ::testing::TestParamInfo<std::string>& info)
{
- return info.param;
+INSTANTIATE_TEST_SUITE_P(FormatsAndWriters, PaimonReadCompatInteTest,
+ ::testing::ValuesIn(CompatibilityParams()),
+ [](const
::testing::TestParamInfo<CompatibilityParam>& info) {
+ return info.param.file_format + "_" +
info.param.writer_prefix;
});
struct UnsupportedReadCase {
@@ -492,6 +547,7 @@ struct UnsupportedReadCase {
};
struct UnsupportedReadParam {
+ std::string file_format;
std::string writer_prefix;
UnsupportedReadCase read_case;
};
@@ -500,7 +556,8 @@ class PaimonUnsupportedTypeInteTest : public
::testing::TestWithParam<Unsupporte
TEST_P(PaimonUnsupportedTypeInteTest, ReportsExpectedError) {
const UnsupportedReadParam& test_case = GetParam();
- ASSERT_NOK_WITH_MSG(ReadTable(test_case.writer_prefix + "_" +
test_case.read_case.table_suffix,
+ ASSERT_NOK_WITH_MSG(ReadTable(test_case.file_format,
+ test_case.writer_prefix + "_" +
test_case.read_case.table_suffix,
{test_case.read_case.field_name}),
test_case.read_case.expected_error);
}
@@ -515,9 +572,14 @@ std::vector<UnsupportedReadParam> UnsupportedReadParams() {
{"TimePrecision9", "time_types", "f_time_9", "Unsupported type: TIME"},
};
std::vector<UnsupportedReadParam> result;
- for (const std::string& writer_prefix : WriterPrefixes()) {
+ for (const CompatibilityParam& param : CompatibilityParams()) {
for (const UnsupportedReadCase& read_case : read_cases) {
- result.push_back({writer_prefix, read_case});
+ // Java Avro cannot create TIME(6/9), so its negative table
contains TIME(0/3) only.
+ if (param.file_format == "avro" &&
+ (read_case.name == "TimePrecision6" || read_case.name ==
"TimePrecision9")) {
+ continue;
+ }
+ result.push_back({param.file_format, param.writer_prefix,
read_case});
}
}
return result;
@@ -526,7 +588,8 @@ std::vector<UnsupportedReadParam> UnsupportedReadParams() {
INSTANTIATE_TEST_SUITE_P(UnsupportedTypes, PaimonUnsupportedTypeInteTest,
::testing::ValuesIn(UnsupportedReadParams()),
[](const
::testing::TestParamInfo<UnsupportedReadParam>& info) {
- return info.param.writer_prefix +
info.param.read_case.name;
+ return info.param.file_format + "_" +
info.param.writer_prefix + "_" +
+ info.param.read_case.name;
});
} // namespace paimon::test
diff --git
a/test/test_data/avro/append_types_compatibility.db/java_array_blob_types/README.md
b/test/test_data/avro/append_types_compatibility.db/java_array_blob_types/README.md
new file mode 100644
index 00000000..d9cd7bf0
--- /dev/null
+++
b/test/test_data/avro/append_types_compatibility.db/java_array_blob_types/README.md
@@ -0,0 +1,17 @@
+Schema: id INT NOT NULL, f_array_blob ARRAY<BLOB>.
+
+Options:
+
+bucket = -1
+file.format = avro
+blob-field = f_array_blob
+data-evolution.enabled = true
+row-tracking.enabled = true
+
+The table is unpartitioned and has no primary key.
+
+Add: (1, ["array-blob-value", null, ""])
+Add: (2, null)
+Add: (3, [])
+
+Paimon C++ is expected to reject this table while ARRAY<BLOB> is unsupported.
diff --git
a/test/test_data/avro/append_types_compatibility.db/java_array_blob_types/bucket-0/data-e450b386-992c-4934-a77c-428b16f00082-0.avro
b/test/test_data/avro/append_types_compatibility.db/java_array_blob_types/bucket-0/data-e450b386-992c-4934-a77c-428b16f00082-0.avro
new file mode 100644
index 00000000..0186940f
Binary files /dev/null and
b/test/test_data/avro/append_types_compatibility.db/java_array_blob_types/bucket-0/data-e450b386-992c-4934-a77c-428b16f00082-0.avro
differ
diff --git
a/test/test_data/avro/append_types_compatibility.db/java_array_blob_types/bucket-0/data-e450b386-992c-4934-a77c-428b16f00082-1.blob
b/test/test_data/avro/append_types_compatibility.db/java_array_blob_types/bucket-0/data-e450b386-992c-4934-a77c-428b16f00082-1.blob
new file mode 100644
index 00000000..a5b24e12
Binary files /dev/null and
b/test/test_data/avro/append_types_compatibility.db/java_array_blob_types/bucket-0/data-e450b386-992c-4934-a77c-428b16f00082-1.blob
differ
diff --git
a/test/test_data/avro/append_types_compatibility.db/java_array_blob_types/manifest/manifest-1d608455-d871-46a3-ad5c-c6359f77c02c-0
b/test/test_data/avro/append_types_compatibility.db/java_array_blob_types/manifest/manifest-1d608455-d871-46a3-ad5c-c6359f77c02c-0
new file mode 100644
index 00000000..76718ec7
Binary files /dev/null and
b/test/test_data/avro/append_types_compatibility.db/java_array_blob_types/manifest/manifest-1d608455-d871-46a3-ad5c-c6359f77c02c-0
differ
diff --git
a/test/test_data/avro/append_types_compatibility.db/java_array_blob_types/manifest/manifest-list-d1d4bb47-ac3a-43a1-b20a-16384869a4b6-0
b/test/test_data/avro/append_types_compatibility.db/java_array_blob_types/manifest/manifest-list-d1d4bb47-ac3a-43a1-b20a-16384869a4b6-0
new file mode 100644
index 00000000..24a7b07a
Binary files /dev/null and
b/test/test_data/avro/append_types_compatibility.db/java_array_blob_types/manifest/manifest-list-d1d4bb47-ac3a-43a1-b20a-16384869a4b6-0
differ
diff --git
a/test/test_data/avro/append_types_compatibility.db/java_array_blob_types/manifest/manifest-list-d1d4bb47-ac3a-43a1-b20a-16384869a4b6-1
b/test/test_data/avro/append_types_compatibility.db/java_array_blob_types/manifest/manifest-list-d1d4bb47-ac3a-43a1-b20a-16384869a4b6-1
new file mode 100644
index 00000000..012cb960
Binary files /dev/null and
b/test/test_data/avro/append_types_compatibility.db/java_array_blob_types/manifest/manifest-list-d1d4bb47-ac3a-43a1-b20a-16384869a4b6-1
differ
diff --git
a/test/test_data/parquet/append_types_compatibility.db/java_array_blob_types/schema/schema-0
b/test/test_data/avro/append_types_compatibility.db/java_array_blob_types/schema/schema-0
similarity index 83%
copy from
test/test_data/parquet/append_types_compatibility.db/java_array_blob_types/schema/schema-0
copy to
test/test_data/avro/append_types_compatibility.db/java_array_blob_types/schema/schema-0
index 0bce94c9..0ec58c84 100644
---
a/test/test_data/parquet/append_types_compatibility.db/java_array_blob_types/schema/schema-0
+++
b/test/test_data/avro/append_types_compatibility.db/java_array_blob_types/schema/schema-0
@@ -21,8 +21,7 @@
"blob-field" : "f_array_blob",
"row-tracking.enabled" : "true",
"data-evolution.enabled" : "true",
- "manifest.format" : "avro",
- "file.format" : "parquet"
+ "file.format" : "avro"
},
- "timeMillis" : 1788859707631
-}
\ No newline at end of file
+ "timeMillis" : 1789549988349
+}
diff --git
a/test/test_data/avro/append_types_compatibility.db/java_array_blob_types/snapshot/EARLIEST
b/test/test_data/avro/append_types_compatibility.db/java_array_blob_types/snapshot/EARLIEST
new file mode 100644
index 00000000..56a6051c
--- /dev/null
+++
b/test/test_data/avro/append_types_compatibility.db/java_array_blob_types/snapshot/EARLIEST
@@ -0,0 +1 @@
+1
\ No newline at end of file
diff --git
a/test/test_data/avro/append_types_compatibility.db/java_array_blob_types/snapshot/LATEST
b/test/test_data/avro/append_types_compatibility.db/java_array_blob_types/snapshot/LATEST
new file mode 100644
index 00000000..56a6051c
--- /dev/null
+++
b/test/test_data/avro/append_types_compatibility.db/java_array_blob_types/snapshot/LATEST
@@ -0,0 +1 @@
+1
\ No newline at end of file
diff --git
a/test/test_data/avro/append_types_compatibility.db/java_array_blob_types/snapshot/snapshot-1
b/test/test_data/avro/append_types_compatibility.db/java_array_blob_types/snapshot/snapshot-1
new file mode 100644
index 00000000..0abfb546
--- /dev/null
+++
b/test/test_data/avro/append_types_compatibility.db/java_array_blob_types/snapshot/snapshot-1
@@ -0,0 +1,18 @@
+{
+ "version" : 3,
+ "uuid" : "5a95869a-09be-4cd5-b769-faa937e03b11",
+ "id" : 1,
+ "schemaId" : 0,
+ "baseManifestList" : "manifest-list-d1d4bb47-ac3a-43a1-b20a-16384869a4b6-0",
+ "baseManifestListSize" : 1158,
+ "deltaManifestList" : "manifest-list-d1d4bb47-ac3a-43a1-b20a-16384869a4b6-1",
+ "deltaManifestListSize" : 1261,
+ "commitUser" : "88af33b1-2dd5-4c11-9edd-7d13cc81d1cb",
+ "writerVersion" :
"java-2.2-SNAPSHOT-bbae07d37545cf2cf65b397007fa68c387bb521f",
+ "commitIdentifier" : 9223372036854775807,
+ "commitKind" : "APPEND",
+ "timeMillis" : 1789549988372,
+ "totalRecordCount" : 6,
+ "deltaRecordCount" : 6,
+ "nextRowId" : 3
+}
\ No newline at end of file
diff --git
a/test/test_data/avro/append_types_compatibility.db/java_map_blob_types/README.md
b/test/test_data/avro/append_types_compatibility.db/java_map_blob_types/README.md
new file mode 100644
index 00000000..43810f80
--- /dev/null
+++
b/test/test_data/avro/append_types_compatibility.db/java_map_blob_types/README.md
@@ -0,0 +1,17 @@
+Schema: id INT NOT NULL, f_map_blob MAP<STRING NOT NULL, BLOB>.
+
+Options:
+
+bucket = -1
+file.format = avro
+blob-field = f_map_blob
+data-evolution.enabled = true
+row-tracking.enabled = true
+
+The table is unpartitioned and has no primary key.
+
+Add: (1, {"left":"blob-map-left","right":null})
+Add: (2, null)
+Add: (3, {})
+
+This writer stores map BLOB values in Paimon's external BLOB representation.
diff --git
a/test/test_data/avro/append_types_compatibility.db/java_map_blob_types/bucket-0/data-67ea4504-2d8c-449a-b66d-e51f7866489a-0.avro
b/test/test_data/avro/append_types_compatibility.db/java_map_blob_types/bucket-0/data-67ea4504-2d8c-449a-b66d-e51f7866489a-0.avro
new file mode 100644
index 00000000..4f67788c
Binary files /dev/null and
b/test/test_data/avro/append_types_compatibility.db/java_map_blob_types/bucket-0/data-67ea4504-2d8c-449a-b66d-e51f7866489a-0.avro
differ
diff --git
a/test/test_data/avro/append_types_compatibility.db/java_map_blob_types/bucket-0/data-67ea4504-2d8c-449a-b66d-e51f7866489a-1.blob
b/test/test_data/avro/append_types_compatibility.db/java_map_blob_types/bucket-0/data-67ea4504-2d8c-449a-b66d-e51f7866489a-1.blob
new file mode 100644
index 00000000..bf82127d
Binary files /dev/null and
b/test/test_data/avro/append_types_compatibility.db/java_map_blob_types/bucket-0/data-67ea4504-2d8c-449a-b66d-e51f7866489a-1.blob
differ
diff --git
a/test/test_data/avro/append_types_compatibility.db/java_map_blob_types/manifest/manifest-d901117d-19e9-45d7-9627-7b385635001e-0
b/test/test_data/avro/append_types_compatibility.db/java_map_blob_types/manifest/manifest-d901117d-19e9-45d7-9627-7b385635001e-0
new file mode 100644
index 00000000..0838f067
Binary files /dev/null and
b/test/test_data/avro/append_types_compatibility.db/java_map_blob_types/manifest/manifest-d901117d-19e9-45d7-9627-7b385635001e-0
differ
diff --git
a/test/test_data/avro/append_types_compatibility.db/java_map_blob_types/manifest/manifest-list-d38e0d87-461f-4cd4-aabf-d47141e679b7-0
b/test/test_data/avro/append_types_compatibility.db/java_map_blob_types/manifest/manifest-list-d38e0d87-461f-4cd4-aabf-d47141e679b7-0
new file mode 100644
index 00000000..3482cd16
Binary files /dev/null and
b/test/test_data/avro/append_types_compatibility.db/java_map_blob_types/manifest/manifest-list-d38e0d87-461f-4cd4-aabf-d47141e679b7-0
differ
diff --git
a/test/test_data/avro/append_types_compatibility.db/java_map_blob_types/manifest/manifest-list-d38e0d87-461f-4cd4-aabf-d47141e679b7-1
b/test/test_data/avro/append_types_compatibility.db/java_map_blob_types/manifest/manifest-list-d38e0d87-461f-4cd4-aabf-d47141e679b7-1
new file mode 100644
index 00000000..7832b4f0
Binary files /dev/null and
b/test/test_data/avro/append_types_compatibility.db/java_map_blob_types/manifest/manifest-list-d38e0d87-461f-4cd4-aabf-d47141e679b7-1
differ
diff --git
a/test/test_data/parquet/append_types_compatibility.db/java_map_blob_types/schema/schema-0
b/test/test_data/avro/append_types_compatibility.db/java_map_blob_types/schema/schema-0
similarity index 83%
copy from
test/test_data/parquet/append_types_compatibility.db/java_map_blob_types/schema/schema-0
copy to
test/test_data/avro/append_types_compatibility.db/java_map_blob_types/schema/schema-0
index 340c0ade..084bbcdd 100644
---
a/test/test_data/parquet/append_types_compatibility.db/java_map_blob_types/schema/schema-0
+++
b/test/test_data/avro/append_types_compatibility.db/java_map_blob_types/schema/schema-0
@@ -22,8 +22,7 @@
"blob-field" : "f_map_blob",
"row-tracking.enabled" : "true",
"data-evolution.enabled" : "true",
- "manifest.format" : "avro",
- "file.format" : "parquet"
+ "file.format" : "avro"
},
- "timeMillis" : 1788859708882
-}
\ No newline at end of file
+ "timeMillis" : 1789549988375
+}
diff --git
a/test/test_data/avro/append_types_compatibility.db/java_map_blob_types/snapshot/EARLIEST
b/test/test_data/avro/append_types_compatibility.db/java_map_blob_types/snapshot/EARLIEST
new file mode 100644
index 00000000..56a6051c
--- /dev/null
+++
b/test/test_data/avro/append_types_compatibility.db/java_map_blob_types/snapshot/EARLIEST
@@ -0,0 +1 @@
+1
\ No newline at end of file
diff --git
a/test/test_data/avro/append_types_compatibility.db/java_map_blob_types/snapshot/LATEST
b/test/test_data/avro/append_types_compatibility.db/java_map_blob_types/snapshot/LATEST
new file mode 100644
index 00000000..56a6051c
--- /dev/null
+++
b/test/test_data/avro/append_types_compatibility.db/java_map_blob_types/snapshot/LATEST
@@ -0,0 +1 @@
+1
\ No newline at end of file
diff --git
a/test/test_data/avro/append_types_compatibility.db/java_map_blob_types/snapshot/snapshot-1
b/test/test_data/avro/append_types_compatibility.db/java_map_blob_types/snapshot/snapshot-1
new file mode 100644
index 00000000..f7dc836f
--- /dev/null
+++
b/test/test_data/avro/append_types_compatibility.db/java_map_blob_types/snapshot/snapshot-1
@@ -0,0 +1,18 @@
+{
+ "version" : 3,
+ "uuid" : "c3c36bdf-5a2e-4be2-b4b5-12a047bd98bb",
+ "id" : 1,
+ "schemaId" : 0,
+ "baseManifestList" : "manifest-list-d38e0d87-461f-4cd4-aabf-d47141e679b7-0",
+ "baseManifestListSize" : 1158,
+ "deltaManifestList" : "manifest-list-d38e0d87-461f-4cd4-aabf-d47141e679b7-1",
+ "deltaManifestListSize" : 1261,
+ "commitUser" : "c24edb81-3117-4136-8f93-65311bbf6b79",
+ "writerVersion" :
"java-2.2-SNAPSHOT-bbae07d37545cf2cf65b397007fa68c387bb521f",
+ "commitIdentifier" : 9223372036854775807,
+ "commitKind" : "APPEND",
+ "timeMillis" : 1789549988393,
+ "totalRecordCount" : 6,
+ "deltaRecordCount" : 6,
+ "nextRowId" : 3
+}
\ No newline at end of file
diff --git
a/test/test_data/avro/append_types_compatibility.db/java_time_types/README.md
b/test/test_data/avro/append_types_compatibility.db/java_time_types/README.md
new file mode 100644
index 00000000..c62c1438
--- /dev/null
+++
b/test/test_data/avro/append_types_compatibility.db/java_time_types/README.md
@@ -0,0 +1,12 @@
+Schema:
+
+id INT NOT NULL
+f_time_0 TIME(0)
+f_time_3 TIME(3)
+
+Options: bucket = -1, file.format = avro. The table is unpartitioned and has
no primary
+key.
+
+Add: (1, 12:34:56, 12:34:56.123)
+Add: (2, null, null)
+Add: (3, null, null)
diff --git
a/test/test_data/avro/append_types_compatibility.db/java_time_types/bucket-0/data-552bc110-1000-47fd-91f8-d8c988911595-0.avro
b/test/test_data/avro/append_types_compatibility.db/java_time_types/bucket-0/data-552bc110-1000-47fd-91f8-d8c988911595-0.avro
new file mode 100644
index 00000000..0d926d19
Binary files /dev/null and
b/test/test_data/avro/append_types_compatibility.db/java_time_types/bucket-0/data-552bc110-1000-47fd-91f8-d8c988911595-0.avro
differ
diff --git
a/test/test_data/avro/append_types_compatibility.db/java_time_types/manifest/manifest-3d3ad23a-e678-485a-aeae-fb733e7d970a-0
b/test/test_data/avro/append_types_compatibility.db/java_time_types/manifest/manifest-3d3ad23a-e678-485a-aeae-fb733e7d970a-0
new file mode 100644
index 00000000..9e4316ba
Binary files /dev/null and
b/test/test_data/avro/append_types_compatibility.db/java_time_types/manifest/manifest-3d3ad23a-e678-485a-aeae-fb733e7d970a-0
differ
diff --git
a/test/test_data/avro/append_types_compatibility.db/java_time_types/manifest/manifest-list-7e7bdeb2-7827-4a05-aed8-e1aea50f9144-0
b/test/test_data/avro/append_types_compatibility.db/java_time_types/manifest/manifest-list-7e7bdeb2-7827-4a05-aed8-e1aea50f9144-0
new file mode 100644
index 00000000..8a42d2fc
Binary files /dev/null and
b/test/test_data/avro/append_types_compatibility.db/java_time_types/manifest/manifest-list-7e7bdeb2-7827-4a05-aed8-e1aea50f9144-0
differ
diff --git
a/test/test_data/avro/append_types_compatibility.db/java_time_types/manifest/manifest-list-7e7bdeb2-7827-4a05-aed8-e1aea50f9144-1
b/test/test_data/avro/append_types_compatibility.db/java_time_types/manifest/manifest-list-7e7bdeb2-7827-4a05-aed8-e1aea50f9144-1
new file mode 100644
index 00000000..ae30edbe
Binary files /dev/null and
b/test/test_data/avro/append_types_compatibility.db/java_time_types/manifest/manifest-list-7e7bdeb2-7827-4a05-aed8-e1aea50f9144-1
differ
diff --git
a/test/test_data/parquet/append_types_compatibility.db/java_time_types/schema/schema-0
b/test/test_data/avro/append_types_compatibility.db/java_time_types/schema/schema-0
similarity index 57%
copy from
test/test_data/parquet/append_types_compatibility.db/java_time_types/schema/schema-0
copy to
test/test_data/avro/append_types_compatibility.db/java_time_types/schema/schema-0
index 02f0fbff..2f50e251 100644
---
a/test/test_data/parquet/append_types_compatibility.db/java_time_types/schema/schema-0
+++
b/test/test_data/avro/append_types_compatibility.db/java_time_types/schema/schema-0
@@ -13,22 +13,13 @@
"id" : 2,
"name" : "f_time_3",
"type" : "TIME(3)"
- }, {
- "id" : 3,
- "name" : "f_time_6",
- "type" : "TIME(6)"
- }, {
- "id" : 4,
- "name" : "f_time_9",
- "type" : "TIME(9)"
} ],
- "highestFieldId" : 4,
+ "highestFieldId" : 2,
"partitionKeys" : [ ],
"primaryKeys" : [ ],
"options" : {
"bucket" : "-1",
- "manifest.format" : "avro",
- "file.format" : "parquet"
+ "file.format" : "avro"
},
- "timeMillis" : 1788853436258
-}
\ No newline at end of file
+ "timeMillis" : 1789549988395
+}
diff --git
a/test/test_data/avro/append_types_compatibility.db/java_time_types/snapshot/EARLIEST
b/test/test_data/avro/append_types_compatibility.db/java_time_types/snapshot/EARLIEST
new file mode 100644
index 00000000..56a6051c
--- /dev/null
+++
b/test/test_data/avro/append_types_compatibility.db/java_time_types/snapshot/EARLIEST
@@ -0,0 +1 @@
+1
\ No newline at end of file
diff --git
a/test/test_data/avro/append_types_compatibility.db/java_time_types/snapshot/LATEST
b/test/test_data/avro/append_types_compatibility.db/java_time_types/snapshot/LATEST
new file mode 100644
index 00000000..56a6051c
--- /dev/null
+++
b/test/test_data/avro/append_types_compatibility.db/java_time_types/snapshot/LATEST
@@ -0,0 +1 @@
+1
\ No newline at end of file
diff --git
a/test/test_data/avro/append_types_compatibility.db/java_time_types/snapshot/snapshot-1
b/test/test_data/avro/append_types_compatibility.db/java_time_types/snapshot/snapshot-1
new file mode 100644
index 00000000..deac9189
--- /dev/null
+++
b/test/test_data/avro/append_types_compatibility.db/java_time_types/snapshot/snapshot-1
@@ -0,0 +1,18 @@
+{
+ "version" : 3,
+ "uuid" : "7a749721-b43a-479c-8267-5cf7202ae260",
+ "id" : 1,
+ "schemaId" : 0,
+ "baseManifestList" : "manifest-list-7e7bdeb2-7827-4a05-aed8-e1aea50f9144-0",
+ "baseManifestListSize" : 1158,
+ "deltaManifestList" : "manifest-list-7e7bdeb2-7827-4a05-aed8-e1aea50f9144-1",
+ "deltaManifestListSize" : 1261,
+ "commitUser" : "53b53c25-6a25-4df2-a0cc-10f050fb32c6",
+ "writerVersion" :
"java-2.2-SNAPSHOT-bbae07d37545cf2cf65b397007fa68c387bb521f",
+ "commitIdentifier" : 9223372036854775807,
+ "commitKind" : "APPEND",
+ "timeMillis" : 1789549988409,
+ "totalRecordCount" : 3,
+ "deltaRecordCount" : 3,
+ "nextRowId" : 0
+}
\ No newline at end of file
diff --git
a/test/test_data/avro/append_types_compatibility.db/java_types/README.md
b/test/test_data/avro/append_types_compatibility.db/java_types/README.md
new file mode 100644
index 00000000..8e437015
--- /dev/null
+++ b/test/test_data/avro/append_types_compatibility.db/java_types/README.md
@@ -0,0 +1,92 @@
+Schema:
+
+id INT NOT NULL
+f_boolean BOOLEAN
+f_tinyint TINYINT
+f_smallint SMALLINT
+f_int INT
+f_bigint BIGINT
+f_float FLOAT
+f_double DOUBLE
+f_char CHAR(8)
+f_varchar VARCHAR(64)
+f_string STRING
+f_binary BINARY(8)
+f_varbinary VARBINARY(64)
+f_bytes BYTES
+f_blob BLOB
+f_blob_descriptor BLOB
+f_decimal_1_0 DECIMAL(1, 0)
+f_decimal_9_2 DECIMAL(9, 2)
+f_decimal_18_2 DECIMAL(18, 2)
+f_decimal_19_2 DECIMAL(19, 2)
+f_decimal_38_18 DECIMAL(38, 18)
+f_decimal_38_38 DECIMAL(38, 38)
+f_date DATE
+f_timestamp_0 TIMESTAMP(0)
+f_timestamp_3 TIMESTAMP(3)
+f_timestamp_6 TIMESTAMP(6)
+f_timestamp_ltz_0 TIMESTAMP_LTZ(0)
+f_timestamp_ltz_3 TIMESTAMP_LTZ(3)
+f_timestamp_ltz_6 TIMESTAMP_LTZ(6)
+f_array_int ARRAY<INT>
+f_map_string_bigint MAP<STRING NOT NULL, BIGINT>
+f_row ROW<nested_int INT, nested_string STRING, nested_decimal DECIMAL(19, 4)>
+f_array_array_int ARRAY<ARRAY<INT>>
+f_array_map ARRAY<MAP<STRING NOT NULL, INT>>
+f_map_array MAP<STRING NOT NULL, ARRAY<INT>>
+f_array_row ARRAY<ROW<name STRING, score DECIMAL(9, 2)>>
+f_map_row MAP<STRING NOT NULL, ROW<enabled BOOLEAN, event_time TIMESTAMP(6)>>
+
+Options:
+
+bucket = -1
+file.format = avro
+blob-field = f_blob,f_blob_descriptor
+blob-descriptor-field = f_blob_descriptor
+data-evolution.enabled = true
+row-tracking.enabled = true
+
+The table has no partition key or primary key. Values below are listed as
[id=1, id=2, id=3].
+Timestamps and local-zoned timestamps are shown in Asia/Shanghai; binary
values are hexadecimal.
+
+id: [1, 2, 3]
+f_boolean: [true, null, null]
+f_tinyint: [-8, null, null]
+f_smallint: [1234, null, null]
+f_int: [-123456, null, null]
+f_bigint: [9223372036854770000, null, null]
+f_float: [1.25, null, null]
+f_double: [-12345.6789, null, null]
+f_char: ["char", null, ""]
+f_varchar: ["varchar-中文", null, ""]
+f_string: ["pypaimon 2.0.0", null, ""]
+f_binary: [0x3132333435363738, null, 0x4142434445464748]
+f_varbinary: [0x76617262696e6172790076616c7565, null, 0x]
+f_bytes: [0x62797465730076616c7565, null, 0x]
+f_blob: ["ordinary blob payload from pypaimon 2.0.0", null, ""]
+f_blob_descriptor:
[Blob("file:///nonexistent/pypaimon-all-types-external-blob.bin", 7, 11), null,
null]
+f_decimal_1_0: [9, null, null]
+f_decimal_9_2: [1234567.89, null, null]
+f_decimal_18_2: [1234567890123456.78, null, null]
+f_decimal_19_2: [12345678901234567.89, null, null]
+f_decimal_38_18: [12345678901234567890.123456789012345678, null, null]
+f_decimal_38_38: [0.12345678901234567890123456789012345678, null, null]
+f_date: [2024-02-29, null, null]
+f_timestamp_0: [2024-02-29 12:34:56, null, null]
+f_timestamp_3: [2024-02-29 12:34:56.123, null, null]
+f_timestamp_6: [2024-02-29 12:34:56.123456, null, null]
+f_timestamp_ltz_0: [2024-02-29 12:34:56, null, null]
+f_timestamp_ltz_3: [2024-02-29 12:34:56.123, null, null]
+f_timestamp_ltz_6: [2024-02-29 12:34:56.123456, null, null]
+f_array_int: [[1, null, 3], null, []]
+f_map_string_bigint: [{"one":1,"null":null}, null, {}]
+f_row: [(7,"nested",123456789012345.6789), null, null]
+f_array_array_int: [[[1,2],null,[]], null, []]
+f_array_map: [[{"a":1,"b":null},null,{}], null, []]
+f_map_array: [{"numbers":[1,null,3],"empty":[]}, null, {}]
+f_array_row: [[("alice",99.50),null,("bob",null)], null, []]
+f_map_row: [{"first":(true,2024-02-29 12:34:56.123456),"second":null}, null,
{}]
+
+Java Avro supports timestamp precision only through 6. VARIANT and its nested
forms are omitted
+because Java cannot derive an Avro schema for them.
diff --git
a/test/test_data/avro/append_types_compatibility.db/java_types/bucket-0/data-6fb2ed11-0ae4-4fe3-9bf8-8e1a54ecf8b7-0.avro
b/test/test_data/avro/append_types_compatibility.db/java_types/bucket-0/data-6fb2ed11-0ae4-4fe3-9bf8-8e1a54ecf8b7-0.avro
new file mode 100644
index 00000000..d6c02f2c
Binary files /dev/null and
b/test/test_data/avro/append_types_compatibility.db/java_types/bucket-0/data-6fb2ed11-0ae4-4fe3-9bf8-8e1a54ecf8b7-0.avro
differ
diff --git
a/test/test_data/avro/append_types_compatibility.db/java_types/bucket-0/data-6fb2ed11-0ae4-4fe3-9bf8-8e1a54ecf8b7-1.blob
b/test/test_data/avro/append_types_compatibility.db/java_types/bucket-0/data-6fb2ed11-0ae4-4fe3-9bf8-8e1a54ecf8b7-1.blob
new file mode 100644
index 00000000..6561d11d
Binary files /dev/null and
b/test/test_data/avro/append_types_compatibility.db/java_types/bucket-0/data-6fb2ed11-0ae4-4fe3-9bf8-8e1a54ecf8b7-1.blob
differ
diff --git
a/test/test_data/avro/append_types_compatibility.db/java_types/manifest/manifest-ad942b8a-bdb3-4a5d-a6ab-637f8d2a9ba5-0
b/test/test_data/avro/append_types_compatibility.db/java_types/manifest/manifest-ad942b8a-bdb3-4a5d-a6ab-637f8d2a9ba5-0
new file mode 100644
index 00000000..710e3aea
Binary files /dev/null and
b/test/test_data/avro/append_types_compatibility.db/java_types/manifest/manifest-ad942b8a-bdb3-4a5d-a6ab-637f8d2a9ba5-0
differ
diff --git
a/test/test_data/avro/append_types_compatibility.db/java_types/manifest/manifest-list-ecb389f6-229e-4460-ab9e-d739db56e794-0
b/test/test_data/avro/append_types_compatibility.db/java_types/manifest/manifest-list-ecb389f6-229e-4460-ab9e-d739db56e794-0
new file mode 100644
index 00000000..49628b0a
Binary files /dev/null and
b/test/test_data/avro/append_types_compatibility.db/java_types/manifest/manifest-list-ecb389f6-229e-4460-ab9e-d739db56e794-0
differ
diff --git
a/test/test_data/avro/append_types_compatibility.db/java_types/manifest/manifest-list-ecb389f6-229e-4460-ab9e-d739db56e794-1
b/test/test_data/avro/append_types_compatibility.db/java_types/manifest/manifest-list-ecb389f6-229e-4460-ab9e-d739db56e794-1
new file mode 100644
index 00000000..ca3b4108
Binary files /dev/null and
b/test/test_data/avro/append_types_compatibility.db/java_types/manifest/manifest-list-ecb389f6-229e-4460-ab9e-d739db56e794-1
differ
diff --git
a/test/test_data/parquet/append_types_compatibility.db/java_types/schema/schema-0
b/test/test_data/avro/append_types_compatibility.db/java_types/schema/schema-0
similarity index 69%
copy from
test/test_data/parquet/append_types_compatibility.db/java_types/schema/schema-0
copy to
test/test_data/avro/append_types_compatibility.db/java_types/schema/schema-0
index 554c947a..5d099b9b 100644
---
a/test/test_data/parquet/append_types_compatibility.db/java_types/schema/schema-0
+++
b/test/test_data/avro/append_types_compatibility.db/java_types/schema/schema-0
@@ -107,37 +107,25 @@
"type" : "TIMESTAMP(6)"
}, {
"id" : 26,
- "name" : "f_timestamp_9",
- "type" : "TIMESTAMP(9)"
- }, {
- "id" : 27,
"name" : "f_timestamp_ltz_0",
"type" : "TIMESTAMP(0) WITH LOCAL TIME ZONE"
}, {
- "id" : 28,
+ "id" : 27,
"name" : "f_timestamp_ltz_3",
"type" : "TIMESTAMP(3) WITH LOCAL TIME ZONE"
}, {
- "id" : 29,
+ "id" : 28,
"name" : "f_timestamp_ltz_6",
"type" : "TIMESTAMP(6) WITH LOCAL TIME ZONE"
}, {
- "id" : 30,
- "name" : "f_timestamp_ltz_9",
- "type" : "TIMESTAMP(9) WITH LOCAL TIME ZONE"
- }, {
- "id" : 31,
- "name" : "f_variant",
- "type" : "VARIANT"
- }, {
- "id" : 32,
+ "id" : 29,
"name" : "f_array_int",
"type" : {
"type" : "ARRAY",
"element" : "INT"
}
}, {
- "id" : 33,
+ "id" : 30,
"name" : "f_map_string_bigint",
"type" : {
"type" : "MAP",
@@ -145,34 +133,26 @@
"value" : "BIGINT"
}
}, {
- "id" : 34,
+ "id" : 31,
"name" : "f_row",
"type" : {
"type" : "ROW",
"fields" : [ {
- "id" : 35,
+ "id" : 32,
"name" : "nested_int",
"type" : "INT"
}, {
- "id" : 36,
+ "id" : 33,
"name" : "nested_string",
"type" : "STRING"
}, {
- "id" : 37,
+ "id" : 34,
"name" : "nested_decimal",
"type" : "DECIMAL(19, 4)"
- }, {
- "id" : 38,
- "name" : "nested_timestamp",
- "type" : "TIMESTAMP(9)"
- }, {
- "id" : 39,
- "name" : "nested_timestamp_ltz",
- "type" : "TIMESTAMP(9) WITH LOCAL TIME ZONE"
} ]
}
}, {
- "id" : 40,
+ "id" : 35,
"name" : "f_array_array_int",
"type" : {
"type" : "ARRAY",
@@ -182,7 +162,7 @@
}
}
}, {
- "id" : 41,
+ "id" : 36,
"name" : "f_array_map",
"type" : {
"type" : "ARRAY",
@@ -193,7 +173,7 @@
}
}
}, {
- "id" : 42,
+ "id" : 37,
"name" : "f_map_array",
"type" : {
"type" : "MAP",
@@ -204,25 +184,25 @@
}
}
}, {
- "id" : 43,
+ "id" : 38,
"name" : "f_array_row",
"type" : {
"type" : "ARRAY",
"element" : {
"type" : "ROW",
"fields" : [ {
- "id" : 44,
+ "id" : 39,
"name" : "name",
"type" : "STRING"
}, {
- "id" : 45,
+ "id" : 40,
"name" : "score",
"type" : "DECIMAL(9, 2)"
} ]
}
}
}, {
- "id" : 46,
+ "id" : 41,
"name" : "f_map_row",
"type" : {
"type" : "MAP",
@@ -230,66 +210,18 @@
"value" : {
"type" : "ROW",
"fields" : [ {
- "id" : 47,
+ "id" : 42,
"name" : "enabled",
"type" : "BOOLEAN"
}, {
- "id" : 48,
+ "id" : 43,
"name" : "event_time",
"type" : "TIMESTAMP(6)"
} ]
}
}
- }, {
- "id" : 49,
- "name" : "f_deep_row",
- "type" : {
- "type" : "ROW",
- "fields" : [ {
- "id" : 52,
- "name" : "children",
- "type" : {
- "type" : "ARRAY",
- "element" : {
- "type" : "ROW",
- "fields" : [ {
- "id" : 50,
- "name" : "leaf_id",
- "type" : "BIGINT"
- }, {
- "id" : 51,
- "name" : "leaf_variant",
- "type" : "VARIANT"
- } ]
- }
- }
- }, {
- "id" : 53,
- "name" : "labels",
- "type" : {
- "type" : "MAP",
- "key" : "STRING NOT NULL",
- "value" : "STRING"
- }
- } ]
- }
- }, {
- "id" : 54,
- "name" : "f_array_variant",
- "type" : {
- "type" : "ARRAY",
- "element" : "VARIANT"
- }
- }, {
- "id" : 55,
- "name" : "f_map_variant",
- "type" : {
- "type" : "MAP",
- "key" : "STRING NOT NULL",
- "value" : "VARIANT"
- }
} ],
- "highestFieldId" : 55,
+ "highestFieldId" : 43,
"partitionKeys" : [ ],
"primaryKeys" : [ ],
"options" : {
@@ -297,10 +229,8 @@
"blob-field" : "f_blob,f_blob_descriptor",
"row-tracking.enabled" : "true",
"data-evolution.enabled" : "true",
- "manifest.format" : "avro",
- "file.format" : "parquet",
+ "file.format" : "avro",
"blob-descriptor-field" : "f_blob_descriptor"
},
- "comment" : "All Paimon data types written by Java Paimon",
- "timeMillis" : 1788853434699
-}
\ No newline at end of file
+ "timeMillis" : 1789549987393
+}
diff --git
a/test/test_data/avro/append_types_compatibility.db/java_types/snapshot/EARLIEST
b/test/test_data/avro/append_types_compatibility.db/java_types/snapshot/EARLIEST
new file mode 100644
index 00000000..56a6051c
--- /dev/null
+++
b/test/test_data/avro/append_types_compatibility.db/java_types/snapshot/EARLIEST
@@ -0,0 +1 @@
+1
\ No newline at end of file
diff --git
a/test/test_data/avro/append_types_compatibility.db/java_types/snapshot/LATEST
b/test/test_data/avro/append_types_compatibility.db/java_types/snapshot/LATEST
new file mode 100644
index 00000000..56a6051c
--- /dev/null
+++
b/test/test_data/avro/append_types_compatibility.db/java_types/snapshot/LATEST
@@ -0,0 +1 @@
+1
\ No newline at end of file
diff --git
a/test/test_data/avro/append_types_compatibility.db/java_types/snapshot/snapshot-1
b/test/test_data/avro/append_types_compatibility.db/java_types/snapshot/snapshot-1
new file mode 100644
index 00000000..6158a056
--- /dev/null
+++
b/test/test_data/avro/append_types_compatibility.db/java_types/snapshot/snapshot-1
@@ -0,0 +1,18 @@
+{
+ "version" : 3,
+ "uuid" : "09d9c09d-a5da-4263-a9f6-19f5abb8dd4e",
+ "id" : 1,
+ "schemaId" : 0,
+ "baseManifestList" : "manifest-list-ecb389f6-229e-4460-ab9e-d739db56e794-0",
+ "baseManifestListSize" : 1158,
+ "deltaManifestList" : "manifest-list-ecb389f6-229e-4460-ab9e-d739db56e794-1",
+ "deltaManifestListSize" : 1261,
+ "commitUser" : "660bd68f-e39e-4fec-80b9-d965a3bc3245",
+ "writerVersion" :
"java-2.2-SNAPSHOT-bbae07d37545cf2cf65b397007fa68c387bb521f",
+ "commitIdentifier" : 9223372036854775807,
+ "commitKind" : "APPEND",
+ "timeMillis" : 1789549988252,
+ "totalRecordCount" : 6,
+ "deltaRecordCount" : 6,
+ "nextRowId" : 3
+}
\ No newline at end of file
diff --git
a/test/test_data/avro/append_types_compatibility.db/java_vector_types/README.md
b/test/test_data/avro/append_types_compatibility.db/java_vector_types/README.md
new file mode 100644
index 00000000..0420a933
--- /dev/null
+++
b/test/test_data/avro/append_types_compatibility.db/java_vector_types/README.md
@@ -0,0 +1,16 @@
+Schema:
+
+id INT NOT NULL
+f_vector_boolean VECTOR<BOOLEAN, 3>
+f_vector_tinyint VECTOR<TINYINT, 3>
+f_vector_smallint VECTOR<SMALLINT, 3>
+f_vector_int VECTOR<INT, 3>
+f_vector_bigint VECTOR<BIGINT, 3>
+f_vector_float VECTOR<FLOAT, 3>
+f_vector_double VECTOR<DOUBLE, 3>
+
+Options: bucket = -1, file.format = avro. The table is unpartitioned and has
no primary
+key.
+
+Add: (1, [true,false,true], [-1,0,1], [-1000,0,1000], [-100000,0,100000],
[-10000000000,0,10000000000], [1.25,-2.5,3.75], [1.125,-2.25,3.5])
+Add: (2, [false,true,false], [2,3,4], [2000,3000,4000],
[200000,300000,400000], [20000000000,30000000000,40000000000], [4.25,5.5,6.75],
[4.125,5.25,6.5])
diff --git
a/test/test_data/avro/append_types_compatibility.db/java_vector_types/bucket-0/data-3e8ef942-de78-4a10-acb8-911560a123bd-0.avro
b/test/test_data/avro/append_types_compatibility.db/java_vector_types/bucket-0/data-3e8ef942-de78-4a10-acb8-911560a123bd-0.avro
new file mode 100644
index 00000000..a5fc44e8
Binary files /dev/null and
b/test/test_data/avro/append_types_compatibility.db/java_vector_types/bucket-0/data-3e8ef942-de78-4a10-acb8-911560a123bd-0.avro
differ
diff --git
a/test/test_data/avro/append_types_compatibility.db/java_vector_types/manifest/manifest-ef4060ce-0bd8-4eab-ba5f-4f4a90603b8f-0
b/test/test_data/avro/append_types_compatibility.db/java_vector_types/manifest/manifest-ef4060ce-0bd8-4eab-ba5f-4f4a90603b8f-0
new file mode 100644
index 00000000..d51087ba
Binary files /dev/null and
b/test/test_data/avro/append_types_compatibility.db/java_vector_types/manifest/manifest-ef4060ce-0bd8-4eab-ba5f-4f4a90603b8f-0
differ
diff --git
a/test/test_data/avro/append_types_compatibility.db/java_vector_types/manifest/manifest-list-4d5f3302-46cf-4658-b90a-e05d3cd39b76-0
b/test/test_data/avro/append_types_compatibility.db/java_vector_types/manifest/manifest-list-4d5f3302-46cf-4658-b90a-e05d3cd39b76-0
new file mode 100644
index 00000000..b46217d5
Binary files /dev/null and
b/test/test_data/avro/append_types_compatibility.db/java_vector_types/manifest/manifest-list-4d5f3302-46cf-4658-b90a-e05d3cd39b76-0
differ
diff --git
a/test/test_data/avro/append_types_compatibility.db/java_vector_types/manifest/manifest-list-4d5f3302-46cf-4658-b90a-e05d3cd39b76-1
b/test/test_data/avro/append_types_compatibility.db/java_vector_types/manifest/manifest-list-4d5f3302-46cf-4658-b90a-e05d3cd39b76-1
new file mode 100644
index 00000000..00ff734f
Binary files /dev/null and
b/test/test_data/avro/append_types_compatibility.db/java_vector_types/manifest/manifest-list-4d5f3302-46cf-4658-b90a-e05d3cd39b76-1
differ
diff --git
a/test/test_data/parquet/append_types_compatibility.db/java_vector_types/schema/schema-0
b/test/test_data/avro/append_types_compatibility.db/java_vector_types/schema/schema-0
similarity index 93%
copy from
test/test_data/parquet/append_types_compatibility.db/java_vector_types/schema/schema-0
copy to
test/test_data/avro/append_types_compatibility.db/java_vector_types/schema/schema-0
index 6e93d2b4..7254ef19 100644
---
a/test/test_data/parquet/append_types_compatibility.db/java_vector_types/schema/schema-0
+++
b/test/test_data/avro/append_types_compatibility.db/java_vector_types/schema/schema-0
@@ -67,8 +67,7 @@
"primaryKeys" : [ ],
"options" : {
"bucket" : "-1",
- "manifest.format" : "avro",
- "file.format" : "parquet"
+ "file.format" : "avro"
},
- "timeMillis" : 1788853436194
-}
\ No newline at end of file
+ "timeMillis" : 1789549988314
+}
diff --git
a/test/test_data/avro/append_types_compatibility.db/java_vector_types/snapshot/EARLIEST
b/test/test_data/avro/append_types_compatibility.db/java_vector_types/snapshot/EARLIEST
new file mode 100644
index 00000000..56a6051c
--- /dev/null
+++
b/test/test_data/avro/append_types_compatibility.db/java_vector_types/snapshot/EARLIEST
@@ -0,0 +1 @@
+1
\ No newline at end of file
diff --git
a/test/test_data/avro/append_types_compatibility.db/java_vector_types/snapshot/LATEST
b/test/test_data/avro/append_types_compatibility.db/java_vector_types/snapshot/LATEST
new file mode 100644
index 00000000..56a6051c
--- /dev/null
+++
b/test/test_data/avro/append_types_compatibility.db/java_vector_types/snapshot/LATEST
@@ -0,0 +1 @@
+1
\ No newline at end of file
diff --git
a/test/test_data/avro/append_types_compatibility.db/java_vector_types/snapshot/snapshot-1
b/test/test_data/avro/append_types_compatibility.db/java_vector_types/snapshot/snapshot-1
new file mode 100644
index 00000000..f11bed9c
--- /dev/null
+++
b/test/test_data/avro/append_types_compatibility.db/java_vector_types/snapshot/snapshot-1
@@ -0,0 +1,18 @@
+{
+ "version" : 3,
+ "uuid" : "681acc56-27b0-4a55-bbc6-476aa5111a20",
+ "id" : 1,
+ "schemaId" : 0,
+ "baseManifestList" : "manifest-list-4d5f3302-46cf-4658-b90a-e05d3cd39b76-0",
+ "baseManifestListSize" : 1158,
+ "deltaManifestList" : "manifest-list-4d5f3302-46cf-4658-b90a-e05d3cd39b76-1",
+ "deltaManifestListSize" : 1258,
+ "commitUser" : "4705de16-97c8-4367-9713-2322f84c24c2",
+ "writerVersion" :
"java-2.2-SNAPSHOT-bbae07d37545cf2cf65b397007fa68c387bb521f",
+ "commitIdentifier" : 9223372036854775807,
+ "commitKind" : "APPEND",
+ "timeMillis" : 1789549988346,
+ "totalRecordCount" : 2,
+ "deltaRecordCount" : 2,
+ "nextRowId" : 0
+}
\ No newline at end of file
diff --git
a/test/test_data/orc/append_types_compatibility.db/java_array_blob_types/README.md
b/test/test_data/orc/append_types_compatibility.db/java_array_blob_types/README.md
new file mode 100644
index 00000000..039de56b
--- /dev/null
+++
b/test/test_data/orc/append_types_compatibility.db/java_array_blob_types/README.md
@@ -0,0 +1,18 @@
+Schema: id INT NOT NULL, f_array_blob ARRAY<BLOB>.
+
+Options:
+
+bucket = -1
+file.format = orc
+orc.timestamp-ltz.legacy.type = false
+blob-field = f_array_blob
+data-evolution.enabled = true
+row-tracking.enabled = true
+
+The table is unpartitioned and has no primary key.
+
+Add: (1, ["blob-array-left", null, "blob-array-right"])
+Add: (2, null)
+Add: (3, [])
+
+Paimon C++ is expected to reject this table while ARRAY<BLOB> is unsupported.
diff --git
a/test/test_data/orc/append_types_compatibility.db/java_array_blob_types/bucket-0/data-51e35438-5081-45b2-a42b-01a7146ef8dd-0.orc
b/test/test_data/orc/append_types_compatibility.db/java_array_blob_types/bucket-0/data-51e35438-5081-45b2-a42b-01a7146ef8dd-0.orc
new file mode 100644
index 00000000..63a72400
Binary files /dev/null and
b/test/test_data/orc/append_types_compatibility.db/java_array_blob_types/bucket-0/data-51e35438-5081-45b2-a42b-01a7146ef8dd-0.orc
differ
diff --git
a/test/test_data/orc/append_types_compatibility.db/java_array_blob_types/bucket-0/data-51e35438-5081-45b2-a42b-01a7146ef8dd-1.blob
b/test/test_data/orc/append_types_compatibility.db/java_array_blob_types/bucket-0/data-51e35438-5081-45b2-a42b-01a7146ef8dd-1.blob
new file mode 100644
index 00000000..91fc2fc4
Binary files /dev/null and
b/test/test_data/orc/append_types_compatibility.db/java_array_blob_types/bucket-0/data-51e35438-5081-45b2-a42b-01a7146ef8dd-1.blob
differ
diff --git
a/test/test_data/orc/append_types_compatibility.db/java_array_blob_types/manifest/manifest-fc560a6b-5521-465f-9523-72234acb5ee8-0
b/test/test_data/orc/append_types_compatibility.db/java_array_blob_types/manifest/manifest-fc560a6b-5521-465f-9523-72234acb5ee8-0
new file mode 100644
index 00000000..d65b66c0
Binary files /dev/null and
b/test/test_data/orc/append_types_compatibility.db/java_array_blob_types/manifest/manifest-fc560a6b-5521-465f-9523-72234acb5ee8-0
differ
diff --git
a/test/test_data/orc/append_types_compatibility.db/java_array_blob_types/manifest/manifest-list-8ebc8260-da53-49fd-a42b-0ddb8a3e0269-0
b/test/test_data/orc/append_types_compatibility.db/java_array_blob_types/manifest/manifest-list-8ebc8260-da53-49fd-a42b-0ddb8a3e0269-0
new file mode 100644
index 00000000..2a64dcdc
Binary files /dev/null and
b/test/test_data/orc/append_types_compatibility.db/java_array_blob_types/manifest/manifest-list-8ebc8260-da53-49fd-a42b-0ddb8a3e0269-0
differ
diff --git
a/test/test_data/orc/append_types_compatibility.db/java_array_blob_types/manifest/manifest-list-8ebc8260-da53-49fd-a42b-0ddb8a3e0269-1
b/test/test_data/orc/append_types_compatibility.db/java_array_blob_types/manifest/manifest-list-8ebc8260-da53-49fd-a42b-0ddb8a3e0269-1
new file mode 100644
index 00000000..1e2c2e53
Binary files /dev/null and
b/test/test_data/orc/append_types_compatibility.db/java_array_blob_types/manifest/manifest-list-8ebc8260-da53-49fd-a42b-0ddb8a3e0269-1
differ
diff --git
a/test/test_data/parquet/append_types_compatibility.db/java_array_blob_types/schema/schema-0
b/test/test_data/orc/append_types_compatibility.db/java_array_blob_types/schema/schema-0
similarity index 81%
copy from
test/test_data/parquet/append_types_compatibility.db/java_array_blob_types/schema/schema-0
copy to
test/test_data/orc/append_types_compatibility.db/java_array_blob_types/schema/schema-0
index 0bce94c9..3e5015e6 100644
---
a/test/test_data/parquet/append_types_compatibility.db/java_array_blob_types/schema/schema-0
+++
b/test/test_data/orc/append_types_compatibility.db/java_array_blob_types/schema/schema-0
@@ -21,8 +21,8 @@
"blob-field" : "f_array_blob",
"row-tracking.enabled" : "true",
"data-evolution.enabled" : "true",
- "manifest.format" : "avro",
- "file.format" : "parquet"
+ "file.format" : "orc",
+ "orc.timestamp-ltz.legacy.type" : "false"
},
- "timeMillis" : 1788859707631
-}
\ No newline at end of file
+ "timeMillis" : 1789541075356
+}
diff --git
a/test/test_data/orc/append_types_compatibility.db/java_array_blob_types/snapshot/EARLIEST
b/test/test_data/orc/append_types_compatibility.db/java_array_blob_types/snapshot/EARLIEST
new file mode 100644
index 00000000..56a6051c
--- /dev/null
+++
b/test/test_data/orc/append_types_compatibility.db/java_array_blob_types/snapshot/EARLIEST
@@ -0,0 +1 @@
+1
\ No newline at end of file
diff --git
a/test/test_data/orc/append_types_compatibility.db/java_array_blob_types/snapshot/LATEST
b/test/test_data/orc/append_types_compatibility.db/java_array_blob_types/snapshot/LATEST
new file mode 100644
index 00000000..56a6051c
--- /dev/null
+++
b/test/test_data/orc/append_types_compatibility.db/java_array_blob_types/snapshot/LATEST
@@ -0,0 +1 @@
+1
\ No newline at end of file
diff --git
a/test/test_data/orc/append_types_compatibility.db/java_array_blob_types/snapshot/snapshot-1
b/test/test_data/orc/append_types_compatibility.db/java_array_blob_types/snapshot/snapshot-1
new file mode 100644
index 00000000..a2baf51f
--- /dev/null
+++
b/test/test_data/orc/append_types_compatibility.db/java_array_blob_types/snapshot/snapshot-1
@@ -0,0 +1,18 @@
+{
+ "version" : 3,
+ "uuid" : "8b1c9fcd-1d43-4800-86ad-d9a3f43e1a9d",
+ "id" : 1,
+ "schemaId" : 0,
+ "baseManifestList" : "manifest-list-8ebc8260-da53-49fd-a42b-0ddb8a3e0269-0",
+ "baseManifestListSize" : 1158,
+ "deltaManifestList" : "manifest-list-8ebc8260-da53-49fd-a42b-0ddb8a3e0269-1",
+ "deltaManifestListSize" : 1258,
+ "commitUser" : "3da29e72-d559-458a-95f5-2b1354bb0693",
+ "writerVersion" :
"java-2.2-SNAPSHOT-bbae07d37545cf2cf65b397007fa68c387bb521f",
+ "commitIdentifier" : 9223372036854775807,
+ "commitKind" : "APPEND",
+ "timeMillis" : 1789541075423,
+ "totalRecordCount" : 6,
+ "deltaRecordCount" : 6,
+ "nextRowId" : 3
+}
\ No newline at end of file
diff --git
a/test/test_data/orc/append_types_compatibility.db/java_map_blob_types/README.md
b/test/test_data/orc/append_types_compatibility.db/java_map_blob_types/README.md
new file mode 100644
index 00000000..5cb98751
--- /dev/null
+++
b/test/test_data/orc/append_types_compatibility.db/java_map_blob_types/README.md
@@ -0,0 +1,18 @@
+Schema: id INT NOT NULL, f_map_blob MAP<STRING NOT NULL, BLOB>.
+
+Options:
+
+bucket = -1
+file.format = orc
+orc.timestamp-ltz.legacy.type = false
+blob-field = f_map_blob
+data-evolution.enabled = true
+row-tracking.enabled = true
+
+The table is unpartitioned and has no primary key.
+
+Add: (1, {"left":"blob-map-left","right":null})
+Add: (2, null)
+Add: (3, {})
+
+This writer stores map BLOB values in Paimon's external BLOB representation.
diff --git
a/test/test_data/orc/append_types_compatibility.db/java_map_blob_types/bucket-0/data-56bef3f1-cd23-4fe9-9411-d52f5bf1db9d-0.orc
b/test/test_data/orc/append_types_compatibility.db/java_map_blob_types/bucket-0/data-56bef3f1-cd23-4fe9-9411-d52f5bf1db9d-0.orc
new file mode 100644
index 00000000..63a72400
Binary files /dev/null and
b/test/test_data/orc/append_types_compatibility.db/java_map_blob_types/bucket-0/data-56bef3f1-cd23-4fe9-9411-d52f5bf1db9d-0.orc
differ
diff --git
a/test/test_data/orc/append_types_compatibility.db/java_map_blob_types/bucket-0/data-56bef3f1-cd23-4fe9-9411-d52f5bf1db9d-1.blob
b/test/test_data/orc/append_types_compatibility.db/java_map_blob_types/bucket-0/data-56bef3f1-cd23-4fe9-9411-d52f5bf1db9d-1.blob
new file mode 100644
index 00000000..bf82127d
Binary files /dev/null and
b/test/test_data/orc/append_types_compatibility.db/java_map_blob_types/bucket-0/data-56bef3f1-cd23-4fe9-9411-d52f5bf1db9d-1.blob
differ
diff --git
a/test/test_data/orc/append_types_compatibility.db/java_map_blob_types/manifest/manifest-be1d7959-ae2c-4e46-84d0-3f42732e6560-0
b/test/test_data/orc/append_types_compatibility.db/java_map_blob_types/manifest/manifest-be1d7959-ae2c-4e46-84d0-3f42732e6560-0
new file mode 100644
index 00000000..b460734c
Binary files /dev/null and
b/test/test_data/orc/append_types_compatibility.db/java_map_blob_types/manifest/manifest-be1d7959-ae2c-4e46-84d0-3f42732e6560-0
differ
diff --git
a/test/test_data/orc/append_types_compatibility.db/java_map_blob_types/manifest/manifest-list-9fe2cdf2-7bce-48cc-8111-decf7e1e0232-0
b/test/test_data/orc/append_types_compatibility.db/java_map_blob_types/manifest/manifest-list-9fe2cdf2-7bce-48cc-8111-decf7e1e0232-0
new file mode 100644
index 00000000..9c0e72fb
Binary files /dev/null and
b/test/test_data/orc/append_types_compatibility.db/java_map_blob_types/manifest/manifest-list-9fe2cdf2-7bce-48cc-8111-decf7e1e0232-0
differ
diff --git
a/test/test_data/orc/append_types_compatibility.db/java_map_blob_types/manifest/manifest-list-9fe2cdf2-7bce-48cc-8111-decf7e1e0232-1
b/test/test_data/orc/append_types_compatibility.db/java_map_blob_types/manifest/manifest-list-9fe2cdf2-7bce-48cc-8111-decf7e1e0232-1
new file mode 100644
index 00000000..011f1232
Binary files /dev/null and
b/test/test_data/orc/append_types_compatibility.db/java_map_blob_types/manifest/manifest-list-9fe2cdf2-7bce-48cc-8111-decf7e1e0232-1
differ
diff --git
a/test/test_data/parquet/append_types_compatibility.db/java_map_blob_types/schema/schema-0
b/test/test_data/orc/append_types_compatibility.db/java_map_blob_types/schema/schema-0
similarity index 82%
copy from
test/test_data/parquet/append_types_compatibility.db/java_map_blob_types/schema/schema-0
copy to
test/test_data/orc/append_types_compatibility.db/java_map_blob_types/schema/schema-0
index 340c0ade..c1211fb7 100644
---
a/test/test_data/parquet/append_types_compatibility.db/java_map_blob_types/schema/schema-0
+++
b/test/test_data/orc/append_types_compatibility.db/java_map_blob_types/schema/schema-0
@@ -22,8 +22,8 @@
"blob-field" : "f_map_blob",
"row-tracking.enabled" : "true",
"data-evolution.enabled" : "true",
- "manifest.format" : "avro",
- "file.format" : "parquet"
+ "file.format" : "orc",
+ "orc.timestamp-ltz.legacy.type" : "false"
},
- "timeMillis" : 1788859708882
-}
\ No newline at end of file
+ "timeMillis" : 1789541075427
+}
diff --git
a/test/test_data/orc/append_types_compatibility.db/java_map_blob_types/snapshot/EARLIEST
b/test/test_data/orc/append_types_compatibility.db/java_map_blob_types/snapshot/EARLIEST
new file mode 100644
index 00000000..56a6051c
--- /dev/null
+++
b/test/test_data/orc/append_types_compatibility.db/java_map_blob_types/snapshot/EARLIEST
@@ -0,0 +1 @@
+1
\ No newline at end of file
diff --git
a/test/test_data/orc/append_types_compatibility.db/java_map_blob_types/snapshot/LATEST
b/test/test_data/orc/append_types_compatibility.db/java_map_blob_types/snapshot/LATEST
new file mode 100644
index 00000000..56a6051c
--- /dev/null
+++
b/test/test_data/orc/append_types_compatibility.db/java_map_blob_types/snapshot/LATEST
@@ -0,0 +1 @@
+1
\ No newline at end of file
diff --git
a/test/test_data/orc/append_types_compatibility.db/java_map_blob_types/snapshot/snapshot-1
b/test/test_data/orc/append_types_compatibility.db/java_map_blob_types/snapshot/snapshot-1
new file mode 100644
index 00000000..81b4dfb3
--- /dev/null
+++
b/test/test_data/orc/append_types_compatibility.db/java_map_blob_types/snapshot/snapshot-1
@@ -0,0 +1,18 @@
+{
+ "version" : 3,
+ "uuid" : "86711cf1-74e2-478b-b5e0-bc9cc076cd7c",
+ "id" : 1,
+ "schemaId" : 0,
+ "baseManifestList" : "manifest-list-9fe2cdf2-7bce-48cc-8111-decf7e1e0232-0",
+ "baseManifestListSize" : 1158,
+ "deltaManifestList" : "manifest-list-9fe2cdf2-7bce-48cc-8111-decf7e1e0232-1",
+ "deltaManifestListSize" : 1261,
+ "commitUser" : "07518da5-5e79-4d4c-872a-ec3c542a56ae",
+ "writerVersion" :
"java-2.2-SNAPSHOT-bbae07d37545cf2cf65b397007fa68c387bb521f",
+ "commitIdentifier" : 9223372036854775807,
+ "commitKind" : "APPEND",
+ "timeMillis" : 1789541075479,
+ "totalRecordCount" : 6,
+ "deltaRecordCount" : 6,
+ "nextRowId" : 3
+}
\ No newline at end of file
diff --git
a/test/test_data/orc/append_types_compatibility.db/java_time_types/README.md
b/test/test_data/orc/append_types_compatibility.db/java_time_types/README.md
new file mode 100644
index 00000000..c3a0992c
--- /dev/null
+++ b/test/test_data/orc/append_types_compatibility.db/java_time_types/README.md
@@ -0,0 +1,14 @@
+Schema:
+
+id INT NOT NULL
+f_time_0 TIME(0)
+f_time_3 TIME(3)
+f_time_6 TIME(6)
+f_time_9 TIME(9)
+
+Options: bucket = -1, file.format = orc, and orc.timestamp-ltz.legacy.type =
false. The table
+is unpartitioned and has no primary key.
+
+Add: (1, 12:34:56, 12:34:56.123, 12:34:56.123000, 12:34:56.123000000)
+Add: (2, null, null, null, null)
+Add: (3, 00:00:00, 00:00:00.000, 00:00:00.000000, 00:00:00.000000000)
diff --git
a/test/test_data/orc/append_types_compatibility.db/java_time_types/bucket-0/data-c3c43658-047f-42b1-bfae-26f67cd77c5f-0.orc
b/test/test_data/orc/append_types_compatibility.db/java_time_types/bucket-0/data-c3c43658-047f-42b1-bfae-26f67cd77c5f-0.orc
new file mode 100644
index 00000000..e1c840ea
Binary files /dev/null and
b/test/test_data/orc/append_types_compatibility.db/java_time_types/bucket-0/data-c3c43658-047f-42b1-bfae-26f67cd77c5f-0.orc
differ
diff --git
a/test/test_data/orc/append_types_compatibility.db/java_time_types/manifest/manifest-306250ad-71a2-42a3-9d47-a7146425bc2b-0
b/test/test_data/orc/append_types_compatibility.db/java_time_types/manifest/manifest-306250ad-71a2-42a3-9d47-a7146425bc2b-0
new file mode 100644
index 00000000..61efacdc
Binary files /dev/null and
b/test/test_data/orc/append_types_compatibility.db/java_time_types/manifest/manifest-306250ad-71a2-42a3-9d47-a7146425bc2b-0
differ
diff --git
a/test/test_data/orc/append_types_compatibility.db/java_time_types/manifest/manifest-list-e0a1ab29-c5e3-438c-b82f-753a4006e310-0
b/test/test_data/orc/append_types_compatibility.db/java_time_types/manifest/manifest-list-e0a1ab29-c5e3-438c-b82f-753a4006e310-0
new file mode 100644
index 00000000..ae076f33
Binary files /dev/null and
b/test/test_data/orc/append_types_compatibility.db/java_time_types/manifest/manifest-list-e0a1ab29-c5e3-438c-b82f-753a4006e310-0
differ
diff --git
a/test/test_data/orc/append_types_compatibility.db/java_time_types/manifest/manifest-list-e0a1ab29-c5e3-438c-b82f-753a4006e310-1
b/test/test_data/orc/append_types_compatibility.db/java_time_types/manifest/manifest-list-e0a1ab29-c5e3-438c-b82f-753a4006e310-1
new file mode 100644
index 00000000..23fa8207
Binary files /dev/null and
b/test/test_data/orc/append_types_compatibility.db/java_time_types/manifest/manifest-list-e0a1ab29-c5e3-438c-b82f-753a4006e310-1
differ
diff --git
a/test/test_data/parquet/append_types_compatibility.db/java_time_types/schema/schema-0
b/test/test_data/orc/append_types_compatibility.db/java_time_types/schema/schema-0
similarity index 82%
copy from
test/test_data/parquet/append_types_compatibility.db/java_time_types/schema/schema-0
copy to
test/test_data/orc/append_types_compatibility.db/java_time_types/schema/schema-0
index 02f0fbff..62822ad6 100644
---
a/test/test_data/parquet/append_types_compatibility.db/java_time_types/schema/schema-0
+++
b/test/test_data/orc/append_types_compatibility.db/java_time_types/schema/schema-0
@@ -27,8 +27,8 @@
"primaryKeys" : [ ],
"options" : {
"bucket" : "-1",
- "manifest.format" : "avro",
- "file.format" : "parquet"
+ "file.format" : "orc",
+ "orc.timestamp-ltz.legacy.type" : "false"
},
- "timeMillis" : 1788853436258
-}
\ No newline at end of file
+ "timeMillis" : 1789541075484
+}
diff --git
a/test/test_data/orc/append_types_compatibility.db/java_time_types/snapshot/EARLIEST
b/test/test_data/orc/append_types_compatibility.db/java_time_types/snapshot/EARLIEST
new file mode 100644
index 00000000..56a6051c
--- /dev/null
+++
b/test/test_data/orc/append_types_compatibility.db/java_time_types/snapshot/EARLIEST
@@ -0,0 +1 @@
+1
\ No newline at end of file
diff --git
a/test/test_data/orc/append_types_compatibility.db/java_time_types/snapshot/LATEST
b/test/test_data/orc/append_types_compatibility.db/java_time_types/snapshot/LATEST
new file mode 100644
index 00000000..56a6051c
--- /dev/null
+++
b/test/test_data/orc/append_types_compatibility.db/java_time_types/snapshot/LATEST
@@ -0,0 +1 @@
+1
\ No newline at end of file
diff --git
a/test/test_data/orc/append_types_compatibility.db/java_time_types/snapshot/snapshot-1
b/test/test_data/orc/append_types_compatibility.db/java_time_types/snapshot/snapshot-1
new file mode 100644
index 00000000..178610c8
--- /dev/null
+++
b/test/test_data/orc/append_types_compatibility.db/java_time_types/snapshot/snapshot-1
@@ -0,0 +1,18 @@
+{
+ "version" : 3,
+ "uuid" : "f3e8a686-c553-447c-a644-a4bc4462a1e6",
+ "id" : 1,
+ "schemaId" : 0,
+ "baseManifestList" : "manifest-list-e0a1ab29-c5e3-438c-b82f-753a4006e310-0",
+ "baseManifestListSize" : 1158,
+ "deltaManifestList" : "manifest-list-e0a1ab29-c5e3-438c-b82f-753a4006e310-1",
+ "deltaManifestListSize" : 1264,
+ "commitUser" : "93535f72-946f-4916-b851-45b816d009cf",
+ "writerVersion" :
"java-2.2-SNAPSHOT-bbae07d37545cf2cf65b397007fa68c387bb521f",
+ "commitIdentifier" : 9223372036854775807,
+ "commitKind" : "APPEND",
+ "timeMillis" : 1789541075550,
+ "totalRecordCount" : 3,
+ "deltaRecordCount" : 3,
+ "nextRowId" : 0
+}
\ No newline at end of file
diff --git
a/test/test_data/orc/append_types_compatibility.db/java_types/README.md
b/test/test_data/orc/append_types_compatibility.db/java_types/README.md
new file mode 100644
index 00000000..1d04825b
--- /dev/null
+++ b/test/test_data/orc/append_types_compatibility.db/java_types/README.md
@@ -0,0 +1,100 @@
+Schema:
+
+id INT NOT NULL
+f_boolean BOOLEAN
+f_tinyint TINYINT
+f_smallint SMALLINT
+f_int INT
+f_bigint BIGINT
+f_float FLOAT
+f_double DOUBLE
+f_char CHAR(8)
+f_varchar VARCHAR(64)
+f_string STRING
+f_binary BINARY(8)
+f_varbinary VARBINARY(64)
+f_bytes BYTES
+f_blob BLOB
+f_blob_descriptor BLOB
+f_decimal_1_0 DECIMAL(1, 0)
+f_decimal_9_2 DECIMAL(9, 2)
+f_decimal_18_2 DECIMAL(18, 2)
+f_decimal_19_2 DECIMAL(19, 2)
+f_decimal_38_18 DECIMAL(38, 18)
+f_decimal_38_38 DECIMAL(38, 38)
+f_date DATE
+f_timestamp_0 TIMESTAMP(0)
+f_timestamp_3 TIMESTAMP(3)
+f_timestamp_6 TIMESTAMP(6)
+f_timestamp_9 TIMESTAMP(9)
+f_timestamp_ltz_0 TIMESTAMP_LTZ(0)
+f_timestamp_ltz_3 TIMESTAMP_LTZ(3)
+f_timestamp_ltz_6 TIMESTAMP_LTZ(6)
+f_timestamp_ltz_9 TIMESTAMP_LTZ(9)
+f_array_int ARRAY<INT>
+f_map_string_bigint MAP<STRING NOT NULL, BIGINT>
+f_row ROW<nested_int INT, nested_string STRING, nested_decimal DECIMAL(19, 4),
+ nested_timestamp TIMESTAMP(9), nested_timestamp_ltz TIMESTAMP_LTZ(9)>
+f_array_array_int ARRAY<ARRAY<INT>>
+f_array_map ARRAY<MAP<STRING NOT NULL, INT>>
+f_map_array MAP<STRING NOT NULL, ARRAY<INT>>
+f_array_row ARRAY<ROW<name STRING, score DECIMAL(9, 2)>>
+f_map_row MAP<STRING NOT NULL, ROW<enabled BOOLEAN, event_time TIMESTAMP(6)>>
+
+Options:
+
+bucket = -1
+file.format = orc
+orc.timestamp-ltz.legacy.type = false
+blob-field = f_blob,f_blob_descriptor
+blob-descriptor-field = f_blob_descriptor
+data-evolution.enabled = true
+row-tracking.enabled = true
+
+The table has no partition key or primary key. Values below are listed as
[id=1, id=2, id=3].
+Timestamps and local-zoned timestamps are shown in Asia/Shanghai; binary
values are hexadecimal.
+
+id: [1, 2, 3]
+f_boolean: [true, null, null]
+f_tinyint: [-8, null, null]
+f_smallint: [1234, null, null]
+f_int: [-123456, null, null]
+f_bigint: [9223372036854770000, null, null]
+f_float: [1.25, null, null]
+f_double: [-12345.6789, null, null]
+f_char: ["char ", null, " "]
+f_varchar: ["varchar-中文", null, ""]
+f_string: ["pypaimon 2.0.0", null, ""]
+f_binary: [0x3132333435363738, null, 0x4142434445464748]
+f_varbinary: [0x76617262696e6172790076616c7565, null, 0x]
+f_bytes: [0x62797465730076616c7565, null, 0x]
+f_blob: ["ordinary blob payload from pypaimon 2.0.0", null, ""]
+f_blob_descriptor:
[Blob("file:///nonexistent/pypaimon-all-types-external-blob.bin", 7, 11), null,
null]
+f_decimal_1_0: [9, null, null]
+f_decimal_9_2: [1234567.89, null, null]
+f_decimal_18_2: [1234567890123456.78, null, null]
+f_decimal_19_2: [12345678901234567.89, null, null]
+f_decimal_38_18: [12345678901234567890.123456789012345678, null, null]
+f_decimal_38_38: [0.12345678901234567890123456789012345678, null, null]
+f_date: [2024-02-29, null, null]
+f_timestamp_0: [2024-02-29 12:34:56, null, null]
+f_timestamp_3: [2024-02-29 12:34:56.123, null, null]
+f_timestamp_6: [2024-02-29 12:34:56.123456, null, null]
+f_timestamp_9: [2024-02-29 12:34:56.123456000, null, null]
+f_timestamp_ltz_0: [2024-02-29 12:34:56, null, null]
+f_timestamp_ltz_3: [2024-02-29 12:34:56.123, null, null]
+f_timestamp_ltz_6: [2024-02-29 12:34:56.123456, null, null]
+f_timestamp_ltz_9: [2024-02-29 12:34:56.123456000, null, null]
+f_array_int: [[1, null, 3], null, []]
+f_map_string_bigint: [{"one":1,"null":null}, null, {}]
+f_row: [(7,"nested",123456789012345.6789,2024-02-29
12:34:56.123456000,2024-02-29 12:34:56.123456000), null, null]
+f_array_array_int: [[[1,2],null,[]], null, []]
+f_array_map: [[{"a":1,"b":null},null,{}], null, []]
+f_map_array: [{"numbers":[1,null,3],"empty":[]}, null, {}]
+f_array_row: [[("alice",99.50),null,("bob",null)], null, []]
+f_map_row: [{"first":(true,2024-02-29 12:34:56.123456),"second":null}, null,
{}]
+
+The two top-level precision-9 timestamp fields and the two precision-9
timestamp children of
+f_row are written with microsecond data. Their complete nanosecond
representation is shown with
+the trailing three zeros (.123456000) instead of abbreviating it to .123456.
VARIANT and VECTOR
+are omitted because Java's ORC path does not support them.
diff --git
a/test/test_data/orc/append_types_compatibility.db/java_types/bucket-0/data-4135518c-e709-4232-ad15-508e494bdcf8-0.orc
b/test/test_data/orc/append_types_compatibility.db/java_types/bucket-0/data-4135518c-e709-4232-ad15-508e494bdcf8-0.orc
new file mode 100644
index 00000000..64e7be78
Binary files /dev/null and
b/test/test_data/orc/append_types_compatibility.db/java_types/bucket-0/data-4135518c-e709-4232-ad15-508e494bdcf8-0.orc
differ
diff --git
a/test/test_data/orc/append_types_compatibility.db/java_types/bucket-0/data-4135518c-e709-4232-ad15-508e494bdcf8-1.blob
b/test/test_data/orc/append_types_compatibility.db/java_types/bucket-0/data-4135518c-e709-4232-ad15-508e494bdcf8-1.blob
new file mode 100644
index 00000000..6561d11d
Binary files /dev/null and
b/test/test_data/orc/append_types_compatibility.db/java_types/bucket-0/data-4135518c-e709-4232-ad15-508e494bdcf8-1.blob
differ
diff --git
a/test/test_data/orc/append_types_compatibility.db/java_types/manifest/manifest-6b6f74b3-783e-4138-84a2-343b997c2f53-0
b/test/test_data/orc/append_types_compatibility.db/java_types/manifest/manifest-6b6f74b3-783e-4138-84a2-343b997c2f53-0
new file mode 100644
index 00000000..d1f6a696
Binary files /dev/null and
b/test/test_data/orc/append_types_compatibility.db/java_types/manifest/manifest-6b6f74b3-783e-4138-84a2-343b997c2f53-0
differ
diff --git
a/test/test_data/orc/append_types_compatibility.db/java_types/manifest/manifest-list-76873624-e06e-4313-b7ae-ec0e45180cc6-0
b/test/test_data/orc/append_types_compatibility.db/java_types/manifest/manifest-list-76873624-e06e-4313-b7ae-ec0e45180cc6-0
new file mode 100644
index 00000000..e8b4feaa
Binary files /dev/null and
b/test/test_data/orc/append_types_compatibility.db/java_types/manifest/manifest-list-76873624-e06e-4313-b7ae-ec0e45180cc6-0
differ
diff --git
a/test/test_data/orc/append_types_compatibility.db/java_types/manifest/manifest-list-76873624-e06e-4313-b7ae-ec0e45180cc6-1
b/test/test_data/orc/append_types_compatibility.db/java_types/manifest/manifest-list-76873624-e06e-4313-b7ae-ec0e45180cc6-1
new file mode 100644
index 00000000..1edb5e34
Binary files /dev/null and
b/test/test_data/orc/append_types_compatibility.db/java_types/manifest/manifest-list-76873624-e06e-4313-b7ae-ec0e45180cc6-1
differ
diff --git
a/test/test_data/parquet/append_types_compatibility.db/java_types/schema/schema-0
b/test/test_data/orc/append_types_compatibility.db/java_types/schema/schema-0
similarity index 79%
copy from
test/test_data/parquet/append_types_compatibility.db/java_types/schema/schema-0
copy to
test/test_data/orc/append_types_compatibility.db/java_types/schema/schema-0
index 554c947a..ea80ddb6 100644
---
a/test/test_data/parquet/append_types_compatibility.db/java_types/schema/schema-0
+++
b/test/test_data/orc/append_types_compatibility.db/java_types/schema/schema-0
@@ -125,10 +125,6 @@
"id" : 30,
"name" : "f_timestamp_ltz_9",
"type" : "TIMESTAMP(9) WITH LOCAL TIME ZONE"
- }, {
- "id" : 31,
- "name" : "f_variant",
- "type" : "VARIANT"
}, {
"id" : 32,
"name" : "f_array_int",
@@ -240,56 +236,8 @@
} ]
}
}
- }, {
- "id" : 49,
- "name" : "f_deep_row",
- "type" : {
- "type" : "ROW",
- "fields" : [ {
- "id" : 52,
- "name" : "children",
- "type" : {
- "type" : "ARRAY",
- "element" : {
- "type" : "ROW",
- "fields" : [ {
- "id" : 50,
- "name" : "leaf_id",
- "type" : "BIGINT"
- }, {
- "id" : 51,
- "name" : "leaf_variant",
- "type" : "VARIANT"
- } ]
- }
- }
- }, {
- "id" : 53,
- "name" : "labels",
- "type" : {
- "type" : "MAP",
- "key" : "STRING NOT NULL",
- "value" : "STRING"
- }
- } ]
- }
- }, {
- "id" : 54,
- "name" : "f_array_variant",
- "type" : {
- "type" : "ARRAY",
- "element" : "VARIANT"
- }
- }, {
- "id" : 55,
- "name" : "f_map_variant",
- "type" : {
- "type" : "MAP",
- "key" : "STRING NOT NULL",
- "value" : "VARIANT"
- }
} ],
- "highestFieldId" : 55,
+ "highestFieldId" : 48,
"partitionKeys" : [ ],
"primaryKeys" : [ ],
"options" : {
@@ -297,10 +245,9 @@
"blob-field" : "f_blob,f_blob_descriptor",
"row-tracking.enabled" : "true",
"data-evolution.enabled" : "true",
- "manifest.format" : "avro",
- "file.format" : "parquet",
+ "file.format" : "orc",
+ "orc.timestamp-ltz.legacy.type" : "false",
"blob-descriptor-field" : "f_blob_descriptor"
},
- "comment" : "All Paimon data types written by Java Paimon",
- "timeMillis" : 1788853434699
-}
\ No newline at end of file
+ "timeMillis" : 1789541073351
+}
diff --git
a/test/test_data/orc/append_types_compatibility.db/java_types/snapshot/EARLIEST
b/test/test_data/orc/append_types_compatibility.db/java_types/snapshot/EARLIEST
new file mode 100644
index 00000000..56a6051c
--- /dev/null
+++
b/test/test_data/orc/append_types_compatibility.db/java_types/snapshot/EARLIEST
@@ -0,0 +1 @@
+1
\ No newline at end of file
diff --git
a/test/test_data/orc/append_types_compatibility.db/java_types/snapshot/LATEST
b/test/test_data/orc/append_types_compatibility.db/java_types/snapshot/LATEST
new file mode 100644
index 00000000..56a6051c
--- /dev/null
+++
b/test/test_data/orc/append_types_compatibility.db/java_types/snapshot/LATEST
@@ -0,0 +1 @@
+1
\ No newline at end of file
diff --git
a/test/test_data/orc/append_types_compatibility.db/java_types/snapshot/snapshot-1
b/test/test_data/orc/append_types_compatibility.db/java_types/snapshot/snapshot-1
new file mode 100644
index 00000000..3444f7fe
--- /dev/null
+++
b/test/test_data/orc/append_types_compatibility.db/java_types/snapshot/snapshot-1
@@ -0,0 +1,18 @@
+{
+ "version" : 3,
+ "uuid" : "e86ee647-90a5-4fc0-b88e-10c2b1641d89",
+ "id" : 1,
+ "schemaId" : 0,
+ "baseManifestList" : "manifest-list-76873624-e06e-4313-b7ae-ec0e45180cc6-0",
+ "baseManifestListSize" : 1158,
+ "deltaManifestList" : "manifest-list-76873624-e06e-4313-b7ae-ec0e45180cc6-1",
+ "deltaManifestListSize" : 1261,
+ "commitUser" : "eaeb0288-350f-4fab-a4ec-dabf1fb99899",
+ "writerVersion" :
"java-2.2-SNAPSHOT-bbae07d37545cf2cf65b397007fa68c387bb521f",
+ "commitIdentifier" : 9223372036854775807,
+ "commitKind" : "APPEND",
+ "timeMillis" : 1789541075249,
+ "totalRecordCount" : 6,
+ "deltaRecordCount" : 6,
+ "nextRowId" : 3
+}
\ No newline at end of file
diff --git a/test/test_data/parquet/append_types_compatibility.db/README.md
b/test/test_data/parquet/append_types_compatibility.db/README.md
deleted file mode 100644
index a1ac373a..00000000
--- a/test/test_data/parquet/append_types_compatibility.db/README.md
+++ /dev/null
@@ -1,55 +0,0 @@
-<!--
- 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.
--->
-
-# Paimon writer compatibility fixtures
-
-The `append_types_compatibility.db` database contains append-only
compatibility tables written by
-Python, Rust, and Java Paimon. Table names use the writer as a prefix and
describe the group of
-types in that table; no individual table is claimed to contain every Paimon
type.
-
-The writers and Parquet implementations are:
-
-- `python_*`: `pypaimon==2.0.0` with `pyarrow==19.0.1`. The Parquet files
contain `ARROW:schema` metadata.
-- `rust_*`: Paimon Rust 0.4.0 at commit
`ced0c86b4db76265b5b2aedcbc9909a208f2c130`, using `parquet-rs version 58.4.0`.
The Parquet files contain `ARROW:schema` metadata.
-- `java_*`: the Java batch-write API from `paimon-bundle-2-ali-2.6.jar`, using
`parquet-mr version 1.16.0`. The Parquet files do not contain `ARROW:schema`
metadata.
-
-## Table groups
-
-Each writer prefix has five tables with the same declared schema and intended
logical values:
-
-- `<writer>_types`: 43 columns and 3 rows covering integral and floating
types, BOOLEAN, CHAR/VARCHAR/STRING, BINARY/VARBINARY/BYTES, BLOB, DATE,
TIMESTAMP and TIMESTAMP_LTZ at precision 0/3/6/9, multiple DECIMAL precisions,
VARIANT, ARRAY, MAP, ROW, and deeply nested combinations. Row 2 is null in
every nullable column and row 3 exercises empty values.
-- `<writer>_vector_types`: VECTOR length 3 for BOOLEAN, TINYINT, SMALLINT,
INT, BIGINT, FLOAT, and DOUBLE.
-- `<writer>_array_blob_types`: Paimon C++ does not currently support
ARRAY<BLOB>.
-- `<writer>_map_blob_types`: MAP<STRING, BLOB>, including non-null,
null, and empty map
- values. Python and Java store these values in standard separate BLOB files,
which Paimon C++
- can read. Rust stores the raw values inline as Parquet `binary`; this is not
the Paimon BLOB
- descriptor representation, cannot be read as BLOB by Java, and is
intentionally rejected by
- Paimon C++.
-- `<writer>_time_types`: TIME declarations at precision 0/3/6/9. Paimon C++
currently rejects `TIME` while parsing the table schema.
-
-The tables are separated because Paimon C++ does not allow VECTOR in a
data-evolution table, BLOB requires data evolution, and a schema-level
incompatibility must not prevent compatible columns from being tested.
-
-`MULTISET` is absent because the Python batch writer cannot produce it through
its PyArrow conversion and Paimon C++ rejects it while parsing the table
schema. Paimon Rust 0.4.0 supports `MULTISET` and represents it as an Arrow map
from each element to its `INT` count, but it cannot be included in an
equivalent three-writer fixture. Consequently, this fixture is a compatibility
matrix, not an assertion that every type supported by every Paimon
implementation can be represented by one table.
-
-The `f_blob_descriptor` value intentionally points at a nonexistent external
URI. Read it with `blob-as-descriptor=true`; it exercises the inline descriptor
and Parquet `ARROW:schema` path rather than external blob fetching.
-
-Both PyArrow and parquet-rs persist the original Arrow type in `ARROW:schema`,
but the stored types
-differ for `f_blob_descriptor`. The Python fixture records the physical
Parquet `binary` column as
-Arrow `large_binary`, while the Rust fixture records it as Arrow `binary`. The
compatibility test
-verifies that Paimon C++ can read both representations and preserve the
descriptor value.
diff --git
a/test/test_data/parquet/append_types_compatibility.db/java_array_blob_types/README.md
b/test/test_data/parquet/append_types_compatibility.db/java_array_blob_types/README.md
new file mode 100644
index 00000000..c4f2883b
--- /dev/null
+++
b/test/test_data/parquet/append_types_compatibility.db/java_array_blob_types/README.md
@@ -0,0 +1,17 @@
+Schema: id INT NOT NULL, f_array_blob ARRAY<BLOB>.
+
+Options:
+
+bucket = -1
+file.format = parquet
+blob-field = f_array_blob
+data-evolution.enabled = true
+row-tracking.enabled = true
+
+The table is unpartitioned and has no primary key.
+
+Add: (1, ["blob-array-0", null, "blob-array-2"])
+Add: (2, null)
+Add: (3, [])
+
+Paimon C++ is expected to reject this table while ARRAY<BLOB> is unsupported.
diff --git
a/test/test_data/parquet/append_types_compatibility.db/java_array_blob_types/schema/schema-0
b/test/test_data/parquet/append_types_compatibility.db/java_array_blob_types/schema/schema-0
index 0bce94c9..dbaf8d3d 100644
---
a/test/test_data/parquet/append_types_compatibility.db/java_array_blob_types/schema/schema-0
+++
b/test/test_data/parquet/append_types_compatibility.db/java_array_blob_types/schema/schema-0
@@ -21,8 +21,7 @@
"blob-field" : "f_array_blob",
"row-tracking.enabled" : "true",
"data-evolution.enabled" : "true",
- "manifest.format" : "avro",
"file.format" : "parquet"
},
"timeMillis" : 1788859707631
-}
\ No newline at end of file
+}
diff --git
a/test/test_data/parquet/append_types_compatibility.db/java_map_blob_types/README.md
b/test/test_data/parquet/append_types_compatibility.db/java_map_blob_types/README.md
new file mode 100644
index 00000000..92bbda8d
--- /dev/null
+++
b/test/test_data/parquet/append_types_compatibility.db/java_map_blob_types/README.md
@@ -0,0 +1,17 @@
+Schema: id INT NOT NULL, f_map_blob MAP<STRING NOT NULL, BLOB>.
+
+Options:
+
+bucket = -1
+file.format = parquet
+blob-field = f_map_blob
+data-evolution.enabled = true
+row-tracking.enabled = true
+
+The table is unpartitioned and has no primary key.
+
+Add: (1, {"left":"blob-map-left","right":null})
+Add: (2, null)
+Add: (3, {})
+
+This writer stores map BLOB values in Paimon's external BLOB representation.
diff --git
a/test/test_data/parquet/append_types_compatibility.db/java_map_blob_types/schema/schema-0
b/test/test_data/parquet/append_types_compatibility.db/java_map_blob_types/schema/schema-0
index 340c0ade..51695bbc 100644
---
a/test/test_data/parquet/append_types_compatibility.db/java_map_blob_types/schema/schema-0
+++
b/test/test_data/parquet/append_types_compatibility.db/java_map_blob_types/schema/schema-0
@@ -22,8 +22,7 @@
"blob-field" : "f_map_blob",
"row-tracking.enabled" : "true",
"data-evolution.enabled" : "true",
- "manifest.format" : "avro",
"file.format" : "parquet"
},
"timeMillis" : 1788859708882
-}
\ No newline at end of file
+}
diff --git
a/test/test_data/parquet/append_types_compatibility.db/java_time_types/README.md
b/test/test_data/parquet/append_types_compatibility.db/java_time_types/README.md
new file mode 100644
index 00000000..500634f1
--- /dev/null
+++
b/test/test_data/parquet/append_types_compatibility.db/java_time_types/README.md
@@ -0,0 +1,13 @@
+Schema:
+
+id INT NOT NULL
+f_time_0 TIME(0)
+f_time_3 TIME(3)
+f_time_6 TIME(6)
+f_time_9 TIME(9)
+
+Options: bucket = -1, file.format = parquet. The table is unpartitioned and
has no primary
+key.
+
+Add: (1, 12:34:56, 12:34:56.123, 12:34:56.123000, 12:34:56.123000000)
+Add: (2, null, null, null, null)
diff --git
a/test/test_data/parquet/append_types_compatibility.db/java_time_types/schema/schema-0
b/test/test_data/parquet/append_types_compatibility.db/java_time_types/schema/schema-0
index 02f0fbff..b9ef0aae 100644
---
a/test/test_data/parquet/append_types_compatibility.db/java_time_types/schema/schema-0
+++
b/test/test_data/parquet/append_types_compatibility.db/java_time_types/schema/schema-0
@@ -27,8 +27,7 @@
"primaryKeys" : [ ],
"options" : {
"bucket" : "-1",
- "manifest.format" : "avro",
"file.format" : "parquet"
},
"timeMillis" : 1788853436258
-}
\ No newline at end of file
+}
diff --git
a/test/test_data/parquet/append_types_compatibility.db/java_types/README.md
b/test/test_data/parquet/append_types_compatibility.db/java_types/README.md
new file mode 100644
index 00000000..bdd1e737
--- /dev/null
+++ b/test/test_data/parquet/append_types_compatibility.db/java_types/README.md
@@ -0,0 +1,103 @@
+Schema:
+
+id INT NOT NULL
+f_boolean BOOLEAN
+f_tinyint TINYINT
+f_smallint SMALLINT
+f_int INT
+f_bigint BIGINT
+f_float FLOAT
+f_double DOUBLE
+f_char CHAR(8)
+f_varchar VARCHAR(64)
+f_string STRING
+f_binary BINARY(8)
+f_varbinary VARBINARY(64)
+f_bytes BYTES
+f_blob BLOB
+f_blob_descriptor BLOB
+f_decimal_1_0 DECIMAL(1, 0)
+f_decimal_9_2 DECIMAL(9, 2)
+f_decimal_18_2 DECIMAL(18, 2)
+f_decimal_19_2 DECIMAL(19, 2)
+f_decimal_38_18 DECIMAL(38, 18)
+f_decimal_38_38 DECIMAL(38, 38)
+f_date DATE
+f_timestamp_0 TIMESTAMP(0)
+f_timestamp_3 TIMESTAMP(3)
+f_timestamp_6 TIMESTAMP(6)
+f_timestamp_9 TIMESTAMP(9)
+f_timestamp_ltz_0 TIMESTAMP_LTZ(0)
+f_timestamp_ltz_3 TIMESTAMP_LTZ(3)
+f_timestamp_ltz_6 TIMESTAMP_LTZ(6)
+f_timestamp_ltz_9 TIMESTAMP_LTZ(9)
+f_variant VARIANT
+f_array_int ARRAY<INT>
+f_map_string_bigint MAP<STRING NOT NULL, BIGINT>
+f_row ROW<nested_int INT, nested_string STRING, nested_decimal DECIMAL(19, 4),
+ nested_timestamp TIMESTAMP(9), nested_timestamp_ltz TIMESTAMP_LTZ(9)>
+f_array_array_int ARRAY<ARRAY<INT>>
+f_array_map ARRAY<MAP<STRING NOT NULL, INT>>
+f_map_array MAP<STRING NOT NULL, ARRAY<INT>>
+f_array_row ARRAY<ROW<name STRING, score DECIMAL(9, 2)>>
+f_map_row MAP<STRING NOT NULL, ROW<enabled BOOLEAN, event_time TIMESTAMP(6)>>
+f_deep_row ROW<children ARRAY<ROW<leaf_id BIGINT, leaf_variant VARIANT>>,
+ labels MAP<STRING NOT NULL, STRING>>
+f_array_variant ARRAY<VARIANT>
+f_map_variant MAP<STRING NOT NULL, VARIANT>
+
+Options:
+
+bucket = -1
+file.format = parquet
+blob-field = f_blob,f_blob_descriptor
+blob-descriptor-field = f_blob_descriptor
+data-evolution.enabled = true
+row-tracking.enabled = true
+
+The table has no partition key or primary key. Values below are listed as
[id=1, id=2, id=3].
+Timestamps and local-zoned timestamps are shown in Asia/Shanghai; binary
values are hexadecimal.
+
+id: [1, 2, 3]
+f_boolean: [true, null, null]
+f_tinyint: [-8, null, null]
+f_smallint: [1234, null, null]
+f_int: [-123456, null, null]
+f_bigint: [9223372036854770000, null, null]
+f_float: [1.25, null, null]
+f_double: [-12345.6789, null, null]
+f_char: ["char", null, ""]
+f_varchar: ["varchar-中文", null, ""]
+f_string: ["pypaimon 2.0.0", null, ""]
+f_binary: [0x3132333435363738, null, 0x4142434445464748]
+f_varbinary: [0x76617262696e6172790076616c7565, null, 0x]
+f_bytes: [0x62797465730076616c7565, null, 0x]
+f_blob: ["ordinary blob payload from pypaimon 2.0.0", null, ""]
+f_blob_descriptor:
[Blob("file:///nonexistent/pypaimon-all-types-external-blob.bin", 7, 11), null,
null]
+f_decimal_1_0: [9, null, null]
+f_decimal_9_2: [1234567.89, null, null]
+f_decimal_18_2: [1234567890123456.78, null, null]
+f_decimal_19_2: [12345678901234567.89, null, null]
+f_decimal_38_18: [12345678901234567890.123456789012345678, null, null]
+f_decimal_38_38: [0.12345678901234567890123456789012345678, null, null]
+f_date: [2024-02-29, null, null]
+f_timestamp_0: [2024-02-29 12:34:56, null, null]
+f_timestamp_3: [2024-02-29 12:34:56.123, null, null]
+f_timestamp_6: [2024-02-29 12:34:56.123456, null, null]
+f_timestamp_9: [2024-02-29 12:34:56.123456000, null, null]
+f_timestamp_ltz_0: [2024-02-29 12:34:56, null, null]
+f_timestamp_ltz_3: [2024-02-29 12:34:56.123, null, null]
+f_timestamp_ltz_6: [2024-02-29 12:34:56.123456, null, null]
+f_timestamp_ltz_9: [2024-02-29 12:34:56.123456000, null, null]
+f_variant:
[{"name":"variant-object","count":42,"active":true,"items":[null,1,"x"],"nested":{"decimal":12.34}},
null, null]
+f_array_int: [[1, null, 3], null, []]
+f_map_string_bigint: [{"one":1,"null":null}, null, {}]
+f_row: [(7,"nested",123456789012345.6789,2024-02-29
12:34:56.123456000,2024-02-29 12:34:56.123456000), null, null]
+f_array_array_int: [[[1,2],null,[]], null, []]
+f_array_map: [[{"a":1,"b":null},null,{}], null, []]
+f_map_array: [{"numbers":[1,null,3],"empty":[]}, null, {}]
+f_array_row: [[("alice",99.50),null,("bob",null)], null, []]
+f_map_row: [{"first":(true,2024-02-29 12:34:56.123456),"second":null}, null,
{}]
+f_deep_row:
[([{"leaf_id":10,"leaf_variant":[1,"two",false,{"k":"v"}]},{"leaf_id":11,"leaf_variant":null}],{"language":"python","format":"parquet"}),
null, null]
+f_array_variant:
[[{"name":"variant-object","count":42,"active":true,"items":[null,1,"x"],"nested":{"decimal":12.34}},null,[1,"two",false,{"k":"v"}]],
null, []]
+f_map_variant:
[{"object":{"name":"variant-object","count":42,"active":true,"items":[null,1,"x"],"nested":{"decimal":12.34}},"array":[1,"two",false,{"k":"v"}]},
null, {}]
diff --git
a/test/test_data/parquet/append_types_compatibility.db/java_types/schema/schema-0
b/test/test_data/parquet/append_types_compatibility.db/java_types/schema/schema-0
index 554c947a..5f07dc57 100644
---
a/test/test_data/parquet/append_types_compatibility.db/java_types/schema/schema-0
+++
b/test/test_data/parquet/append_types_compatibility.db/java_types/schema/schema-0
@@ -297,10 +297,9 @@
"blob-field" : "f_blob,f_blob_descriptor",
"row-tracking.enabled" : "true",
"data-evolution.enabled" : "true",
- "manifest.format" : "avro",
"file.format" : "parquet",
"blob-descriptor-field" : "f_blob_descriptor"
},
"comment" : "All Paimon data types written by Java Paimon",
"timeMillis" : 1788853434699
-}
\ No newline at end of file
+}
diff --git
a/test/test_data/parquet/append_types_compatibility.db/java_vector_types/README.md
b/test/test_data/parquet/append_types_compatibility.db/java_vector_types/README.md
new file mode 100644
index 00000000..e9c06524
--- /dev/null
+++
b/test/test_data/parquet/append_types_compatibility.db/java_vector_types/README.md
@@ -0,0 +1,16 @@
+Schema:
+
+id INT NOT NULL
+f_vector_boolean VECTOR<BOOLEAN, 3>
+f_vector_tinyint VECTOR<TINYINT, 3>
+f_vector_smallint VECTOR<SMALLINT, 3>
+f_vector_int VECTOR<INT, 3>
+f_vector_bigint VECTOR<BIGINT, 3>
+f_vector_float VECTOR<FLOAT, 3>
+f_vector_double VECTOR<DOUBLE, 3>
+
+Options: bucket = -1, file.format = parquet. The table is unpartitioned and
has no primary
+key.
+
+Add: (1, [true,false,true], [-1,0,1], [-1000,0,1000], [-100000,0,100000],
[-10000000000,0,10000000000], [1.25,-2.5,3.75], [1.125,-2.25,3.5])
+Add: (2, [false,true,false], [2,3,4], [2000,3000,4000],
[200000,300000,400000], [20000000000,30000000000,40000000000], [4.25,5.5,6.75],
[4.125,5.25,6.5])
diff --git
a/test/test_data/parquet/append_types_compatibility.db/java_vector_types/schema/schema-0
b/test/test_data/parquet/append_types_compatibility.db/java_vector_types/schema/schema-0
index 6e93d2b4..6d841b85 100644
---
a/test/test_data/parquet/append_types_compatibility.db/java_vector_types/schema/schema-0
+++
b/test/test_data/parquet/append_types_compatibility.db/java_vector_types/schema/schema-0
@@ -67,8 +67,7 @@
"primaryKeys" : [ ],
"options" : {
"bucket" : "-1",
- "manifest.format" : "avro",
"file.format" : "parquet"
},
"timeMillis" : 1788853436194
-}
\ No newline at end of file
+}
diff --git
a/test/test_data/parquet/append_types_compatibility.db/python_array_blob_types/README.md
b/test/test_data/parquet/append_types_compatibility.db/python_array_blob_types/README.md
new file mode 100644
index 00000000..c4f2883b
--- /dev/null
+++
b/test/test_data/parquet/append_types_compatibility.db/python_array_blob_types/README.md
@@ -0,0 +1,17 @@
+Schema: id INT NOT NULL, f_array_blob ARRAY<BLOB>.
+
+Options:
+
+bucket = -1
+file.format = parquet
+blob-field = f_array_blob
+data-evolution.enabled = true
+row-tracking.enabled = true
+
+The table is unpartitioned and has no primary key.
+
+Add: (1, ["blob-array-0", null, "blob-array-2"])
+Add: (2, null)
+Add: (3, [])
+
+Paimon C++ is expected to reject this table while ARRAY<BLOB> is unsupported.
diff --git
a/test/test_data/parquet/append_types_compatibility.db/python_array_blob_types/schema/schema-0
b/test/test_data/parquet/append_types_compatibility.db/python_array_blob_types/schema/schema-0
index 9eff531e..01009c4e 100644
---
a/test/test_data/parquet/append_types_compatibility.db/python_array_blob_types/schema/schema-0
+++
b/test/test_data/parquet/append_types_compatibility.db/python_array_blob_types/schema/schema-0
@@ -23,11 +23,10 @@
"options": {
"bucket": "-1",
"file.format": "parquet",
- "manifest.format": "avro",
"row-tracking.enabled": "true",
"data-evolution.enabled": "true",
"blob-field": "f_array_blob"
},
"comment": "Generated by pypaimon 2.0.0 with ARRAY<BLOB>.",
"timeMillis": 1788859561835
-}
\ No newline at end of file
+}
diff --git
a/test/test_data/parquet/append_types_compatibility.db/python_map_blob_types/README.md
b/test/test_data/parquet/append_types_compatibility.db/python_map_blob_types/README.md
new file mode 100644
index 00000000..92bbda8d
--- /dev/null
+++
b/test/test_data/parquet/append_types_compatibility.db/python_map_blob_types/README.md
@@ -0,0 +1,17 @@
+Schema: id INT NOT NULL, f_map_blob MAP<STRING NOT NULL, BLOB>.
+
+Options:
+
+bucket = -1
+file.format = parquet
+blob-field = f_map_blob
+data-evolution.enabled = true
+row-tracking.enabled = true
+
+The table is unpartitioned and has no primary key.
+
+Add: (1, {"left":"blob-map-left","right":null})
+Add: (2, null)
+Add: (3, {})
+
+This writer stores map BLOB values in Paimon's external BLOB representation.
diff --git
a/test/test_data/parquet/append_types_compatibility.db/python_map_blob_types/schema/schema-0
b/test/test_data/parquet/append_types_compatibility.db/python_map_blob_types/schema/schema-0
index 08ed496f..f4571d59 100644
---
a/test/test_data/parquet/append_types_compatibility.db/python_map_blob_types/schema/schema-0
+++
b/test/test_data/parquet/append_types_compatibility.db/python_map_blob_types/schema/schema-0
@@ -24,11 +24,10 @@
"options": {
"bucket": "-1",
"file.format": "parquet",
- "manifest.format": "avro",
"row-tracking.enabled": "true",
"data-evolution.enabled": "true",
"blob-field": "f_map_blob"
},
"comment": "Generated by pypaimon 2.0.0 with MAP<STRING, BLOB>.",
"timeMillis": 1788859561850
-}
\ No newline at end of file
+}
diff --git
a/test/test_data/parquet/append_types_compatibility.db/python_time_types/README.md
b/test/test_data/parquet/append_types_compatibility.db/python_time_types/README.md
new file mode 100644
index 00000000..500634f1
--- /dev/null
+++
b/test/test_data/parquet/append_types_compatibility.db/python_time_types/README.md
@@ -0,0 +1,13 @@
+Schema:
+
+id INT NOT NULL
+f_time_0 TIME(0)
+f_time_3 TIME(3)
+f_time_6 TIME(6)
+f_time_9 TIME(9)
+
+Options: bucket = -1, file.format = parquet. The table is unpartitioned and
has no primary
+key.
+
+Add: (1, 12:34:56, 12:34:56.123, 12:34:56.123000, 12:34:56.123000000)
+Add: (2, null, null, null, null)
diff --git
a/test/test_data/parquet/append_types_compatibility.db/python_time_types/schema/schema-0
b/test/test_data/parquet/append_types_compatibility.db/python_time_types/schema/schema-0
index 99509c46..3f8ae8bb 100644
---
a/test/test_data/parquet/append_types_compatibility.db/python_time_types/schema/schema-0
+++
b/test/test_data/parquet/append_types_compatibility.db/python_time_types/schema/schema-0
@@ -33,9 +33,8 @@
"primaryKeys": [],
"options": {
"bucket": "-1",
- "file.format": "parquet",
- "manifest.format": "avro"
+ "file.format": "parquet"
},
"comment": "Generated by pypaimon 2.0.0 with Python-supported TIME
declarations.",
"timeMillis": 1788513128460
-}
\ No newline at end of file
+}
diff --git
a/test/test_data/parquet/append_types_compatibility.db/python_types/README.md
b/test/test_data/parquet/append_types_compatibility.db/python_types/README.md
new file mode 100644
index 00000000..bdd1e737
--- /dev/null
+++
b/test/test_data/parquet/append_types_compatibility.db/python_types/README.md
@@ -0,0 +1,103 @@
+Schema:
+
+id INT NOT NULL
+f_boolean BOOLEAN
+f_tinyint TINYINT
+f_smallint SMALLINT
+f_int INT
+f_bigint BIGINT
+f_float FLOAT
+f_double DOUBLE
+f_char CHAR(8)
+f_varchar VARCHAR(64)
+f_string STRING
+f_binary BINARY(8)
+f_varbinary VARBINARY(64)
+f_bytes BYTES
+f_blob BLOB
+f_blob_descriptor BLOB
+f_decimal_1_0 DECIMAL(1, 0)
+f_decimal_9_2 DECIMAL(9, 2)
+f_decimal_18_2 DECIMAL(18, 2)
+f_decimal_19_2 DECIMAL(19, 2)
+f_decimal_38_18 DECIMAL(38, 18)
+f_decimal_38_38 DECIMAL(38, 38)
+f_date DATE
+f_timestamp_0 TIMESTAMP(0)
+f_timestamp_3 TIMESTAMP(3)
+f_timestamp_6 TIMESTAMP(6)
+f_timestamp_9 TIMESTAMP(9)
+f_timestamp_ltz_0 TIMESTAMP_LTZ(0)
+f_timestamp_ltz_3 TIMESTAMP_LTZ(3)
+f_timestamp_ltz_6 TIMESTAMP_LTZ(6)
+f_timestamp_ltz_9 TIMESTAMP_LTZ(9)
+f_variant VARIANT
+f_array_int ARRAY<INT>
+f_map_string_bigint MAP<STRING NOT NULL, BIGINT>
+f_row ROW<nested_int INT, nested_string STRING, nested_decimal DECIMAL(19, 4),
+ nested_timestamp TIMESTAMP(9), nested_timestamp_ltz TIMESTAMP_LTZ(9)>
+f_array_array_int ARRAY<ARRAY<INT>>
+f_array_map ARRAY<MAP<STRING NOT NULL, INT>>
+f_map_array MAP<STRING NOT NULL, ARRAY<INT>>
+f_array_row ARRAY<ROW<name STRING, score DECIMAL(9, 2)>>
+f_map_row MAP<STRING NOT NULL, ROW<enabled BOOLEAN, event_time TIMESTAMP(6)>>
+f_deep_row ROW<children ARRAY<ROW<leaf_id BIGINT, leaf_variant VARIANT>>,
+ labels MAP<STRING NOT NULL, STRING>>
+f_array_variant ARRAY<VARIANT>
+f_map_variant MAP<STRING NOT NULL, VARIANT>
+
+Options:
+
+bucket = -1
+file.format = parquet
+blob-field = f_blob,f_blob_descriptor
+blob-descriptor-field = f_blob_descriptor
+data-evolution.enabled = true
+row-tracking.enabled = true
+
+The table has no partition key or primary key. Values below are listed as
[id=1, id=2, id=3].
+Timestamps and local-zoned timestamps are shown in Asia/Shanghai; binary
values are hexadecimal.
+
+id: [1, 2, 3]
+f_boolean: [true, null, null]
+f_tinyint: [-8, null, null]
+f_smallint: [1234, null, null]
+f_int: [-123456, null, null]
+f_bigint: [9223372036854770000, null, null]
+f_float: [1.25, null, null]
+f_double: [-12345.6789, null, null]
+f_char: ["char", null, ""]
+f_varchar: ["varchar-中文", null, ""]
+f_string: ["pypaimon 2.0.0", null, ""]
+f_binary: [0x3132333435363738, null, 0x4142434445464748]
+f_varbinary: [0x76617262696e6172790076616c7565, null, 0x]
+f_bytes: [0x62797465730076616c7565, null, 0x]
+f_blob: ["ordinary blob payload from pypaimon 2.0.0", null, ""]
+f_blob_descriptor:
[Blob("file:///nonexistent/pypaimon-all-types-external-blob.bin", 7, 11), null,
null]
+f_decimal_1_0: [9, null, null]
+f_decimal_9_2: [1234567.89, null, null]
+f_decimal_18_2: [1234567890123456.78, null, null]
+f_decimal_19_2: [12345678901234567.89, null, null]
+f_decimal_38_18: [12345678901234567890.123456789012345678, null, null]
+f_decimal_38_38: [0.12345678901234567890123456789012345678, null, null]
+f_date: [2024-02-29, null, null]
+f_timestamp_0: [2024-02-29 12:34:56, null, null]
+f_timestamp_3: [2024-02-29 12:34:56.123, null, null]
+f_timestamp_6: [2024-02-29 12:34:56.123456, null, null]
+f_timestamp_9: [2024-02-29 12:34:56.123456000, null, null]
+f_timestamp_ltz_0: [2024-02-29 12:34:56, null, null]
+f_timestamp_ltz_3: [2024-02-29 12:34:56.123, null, null]
+f_timestamp_ltz_6: [2024-02-29 12:34:56.123456, null, null]
+f_timestamp_ltz_9: [2024-02-29 12:34:56.123456000, null, null]
+f_variant:
[{"name":"variant-object","count":42,"active":true,"items":[null,1,"x"],"nested":{"decimal":12.34}},
null, null]
+f_array_int: [[1, null, 3], null, []]
+f_map_string_bigint: [{"one":1,"null":null}, null, {}]
+f_row: [(7,"nested",123456789012345.6789,2024-02-29
12:34:56.123456000,2024-02-29 12:34:56.123456000), null, null]
+f_array_array_int: [[[1,2],null,[]], null, []]
+f_array_map: [[{"a":1,"b":null},null,{}], null, []]
+f_map_array: [{"numbers":[1,null,3],"empty":[]}, null, {}]
+f_array_row: [[("alice",99.50),null,("bob",null)], null, []]
+f_map_row: [{"first":(true,2024-02-29 12:34:56.123456),"second":null}, null,
{}]
+f_deep_row:
[([{"leaf_id":10,"leaf_variant":[1,"two",false,{"k":"v"}]},{"leaf_id":11,"leaf_variant":null}],{"language":"python","format":"parquet"}),
null, null]
+f_array_variant:
[[{"name":"variant-object","count":42,"active":true,"items":[null,1,"x"],"nested":{"decimal":12.34}},null,[1,"two",false,{"k":"v"}]],
null, []]
+f_map_variant:
[{"object":{"name":"variant-object","count":42,"active":true,"items":[null,1,"x"],"nested":{"decimal":12.34}},"array":[1,"two",false,{"k":"v"}]},
null, {}]
diff --git
a/test/test_data/parquet/append_types_compatibility.db/python_types/schema/schema-0
b/test/test_data/parquet/append_types_compatibility.db/python_types/schema/schema-0
index ccffbb67..bf4633ad 100644
---
a/test/test_data/parquet/append_types_compatibility.db/python_types/schema/schema-0
+++
b/test/test_data/parquet/append_types_compatibility.db/python_types/schema/schema-0
@@ -376,7 +376,6 @@
"options": {
"bucket": "-1",
"file.format": "parquet",
- "manifest.format": "avro",
"row-tracking.enabled": "true",
"data-evolution.enabled": "true",
"blob-field": "f_blob,f_blob_descriptor",
@@ -384,4 +383,4 @@
},
"comment": "Generated by pypaimon 2.0.0 with scalar, blob, variant, and
nested types.",
"timeMillis": 1788513128436
-}
\ No newline at end of file
+}
diff --git
a/test/test_data/parquet/append_types_compatibility.db/python_vector_types/README.md
b/test/test_data/parquet/append_types_compatibility.db/python_vector_types/README.md
new file mode 100644
index 00000000..e9c06524
--- /dev/null
+++
b/test/test_data/parquet/append_types_compatibility.db/python_vector_types/README.md
@@ -0,0 +1,16 @@
+Schema:
+
+id INT NOT NULL
+f_vector_boolean VECTOR<BOOLEAN, 3>
+f_vector_tinyint VECTOR<TINYINT, 3>
+f_vector_smallint VECTOR<SMALLINT, 3>
+f_vector_int VECTOR<INT, 3>
+f_vector_bigint VECTOR<BIGINT, 3>
+f_vector_float VECTOR<FLOAT, 3>
+f_vector_double VECTOR<DOUBLE, 3>
+
+Options: bucket = -1, file.format = parquet. The table is unpartitioned and
has no primary
+key.
+
+Add: (1, [true,false,true], [-1,0,1], [-1000,0,1000], [-100000,0,100000],
[-10000000000,0,10000000000], [1.25,-2.5,3.75], [1.125,-2.25,3.5])
+Add: (2, [false,true,false], [2,3,4], [2000,3000,4000],
[200000,300000,400000], [20000000000,30000000000,40000000000], [4.25,5.5,6.75],
[4.125,5.25,6.5])
diff --git
a/test/test_data/parquet/append_types_compatibility.db/python_vector_types/schema/schema-0
b/test/test_data/parquet/append_types_compatibility.db/python_vector_types/schema/schema-0
index f7cf4b49..3fd92c86 100644
---
a/test/test_data/parquet/append_types_compatibility.db/python_vector_types/schema/schema-0
+++
b/test/test_data/parquet/append_types_compatibility.db/python_vector_types/schema/schema-0
@@ -83,9 +83,8 @@
"primaryKeys": [],
"options": {
"bucket": "-1",
- "file.format": "parquet",
- "manifest.format": "avro"
+ "file.format": "parquet"
},
"comment": "Generated by pypaimon 2.0.0 with every supported VECTOR element
type.",
"timeMillis": 1788513128451
-}
\ No newline at end of file
+}
diff --git
a/test/test_data/parquet/append_types_compatibility.db/rust_array_blob_types/README.md
b/test/test_data/parquet/append_types_compatibility.db/rust_array_blob_types/README.md
new file mode 100644
index 00000000..c4f2883b
--- /dev/null
+++
b/test/test_data/parquet/append_types_compatibility.db/rust_array_blob_types/README.md
@@ -0,0 +1,17 @@
+Schema: id INT NOT NULL, f_array_blob ARRAY<BLOB>.
+
+Options:
+
+bucket = -1
+file.format = parquet
+blob-field = f_array_blob
+data-evolution.enabled = true
+row-tracking.enabled = true
+
+The table is unpartitioned and has no primary key.
+
+Add: (1, ["blob-array-0", null, "blob-array-2"])
+Add: (2, null)
+Add: (3, [])
+
+Paimon C++ is expected to reject this table while ARRAY<BLOB> is unsupported.
diff --git
a/test/test_data/parquet/append_types_compatibility.db/rust_array_blob_types/schema/schema-0
b/test/test_data/parquet/append_types_compatibility.db/rust_array_blob_types/schema/schema-0
index c090dea0..343c501c 100644
---
a/test/test_data/parquet/append_types_compatibility.db/rust_array_blob_types/schema/schema-0
+++
b/test/test_data/parquet/append_types_compatibility.db/rust_array_blob_types/schema/schema-0
@@ -1 +1 @@
-{"version":3,"id":0,"fields":[{"id":0,"name":"id","type":"INT NOT
NULL"},{"id":1,"name":"f_array_blob","type":{"type":"ARRAY","element":"BLOB"}}],"highestFieldId":1,"partitionKeys":[],"primaryKeys":[],"options":{"file.format":"parquet","manifest.format":"avro","data-evolution.enabled":"true","row-tracking.enabled":"true","bucket":"-1","blob-field":"f_array_blob"},"comment":null,"timeMillis":1788860192967}
\ No newline at end of file
+{"version":3,"id":0,"fields":[{"id":0,"name":"id","type":"INT NOT
NULL"},{"id":1,"name":"f_array_blob","type":{"type":"ARRAY","element":"BLOB"}}],"highestFieldId":1,"partitionKeys":[],"primaryKeys":[],"options":{"file.format":"parquet","data-evolution.enabled":"true","row-tracking.enabled":"true","bucket":"-1","blob-field":"f_array_blob"},"comment":null,"timeMillis":1788860192967}
diff --git
a/test/test_data/parquet/append_types_compatibility.db/rust_map_blob_types/README.md
b/test/test_data/parquet/append_types_compatibility.db/rust_map_blob_types/README.md
new file mode 100644
index 00000000..7c15b6ae
--- /dev/null
+++
b/test/test_data/parquet/append_types_compatibility.db/rust_map_blob_types/README.md
@@ -0,0 +1,17 @@
+Schema: id INT NOT NULL, f_map_blob MAP<STRING NOT NULL, BLOB>.
+
+Options:
+
+bucket = -1
+file.format = parquet
+blob-field = f_map_blob
+data-evolution.enabled = true
+row-tracking.enabled = true
+
+The table is unpartitioned and has no primary key.
+
+Add: (1, {"left":"blob-map-left","right":null})
+Add: (2, null)
+Add: (3, {})
+
+Paimon Rust stores these values inline as Parquet binary; Java and C++
intentionally reject that representation as a Paimon BLOB map.
diff --git
a/test/test_data/parquet/append_types_compatibility.db/rust_map_blob_types/schema/schema-0
b/test/test_data/parquet/append_types_compatibility.db/rust_map_blob_types/schema/schema-0
index b6cd8894..484b8f32 100644
---
a/test/test_data/parquet/append_types_compatibility.db/rust_map_blob_types/schema/schema-0
+++
b/test/test_data/parquet/append_types_compatibility.db/rust_map_blob_types/schema/schema-0
@@ -1 +1 @@
-{"version":3,"id":0,"fields":[{"id":0,"name":"id","type":"INT NOT
NULL"},{"id":1,"name":"f_map_blob","type":{"type":"MAP","key":"STRING NOT
NULL","value":"BLOB"}}],"highestFieldId":1,"partitionKeys":[],"primaryKeys":[],"options":{"blob-field":"f_map_blob","row-tracking.enabled":"true","file.format":"parquet","manifest.format":"avro","data-evolution.enabled":"true","bucket":"-1"},"comment":null,"timeMillis":1788860192979}
\ No newline at end of file
+{"version":3,"id":0,"fields":[{"id":0,"name":"id","type":"INT NOT
NULL"},{"id":1,"name":"f_map_blob","type":{"type":"MAP","key":"STRING NOT
NULL","value":"BLOB"}}],"highestFieldId":1,"partitionKeys":[],"primaryKeys":[],"options":{"blob-field":"f_map_blob","row-tracking.enabled":"true","file.format":"parquet","data-evolution.enabled":"true","bucket":"-1"},"comment":null,"timeMillis":1788860192979}
diff --git
a/test/test_data/parquet/append_types_compatibility.db/rust_time_types/README.md
b/test/test_data/parquet/append_types_compatibility.db/rust_time_types/README.md
new file mode 100644
index 00000000..500634f1
--- /dev/null
+++
b/test/test_data/parquet/append_types_compatibility.db/rust_time_types/README.md
@@ -0,0 +1,13 @@
+Schema:
+
+id INT NOT NULL
+f_time_0 TIME(0)
+f_time_3 TIME(3)
+f_time_6 TIME(6)
+f_time_9 TIME(9)
+
+Options: bucket = -1, file.format = parquet. The table is unpartitioned and
has no primary
+key.
+
+Add: (1, 12:34:56, 12:34:56.123, 12:34:56.123000, 12:34:56.123000000)
+Add: (2, null, null, null, null)
diff --git
a/test/test_data/parquet/append_types_compatibility.db/rust_time_types/schema/schema-0
b/test/test_data/parquet/append_types_compatibility.db/rust_time_types/schema/schema-0
index dccabf94..2a343a75 100644
---
a/test/test_data/parquet/append_types_compatibility.db/rust_time_types/schema/schema-0
+++
b/test/test_data/parquet/append_types_compatibility.db/rust_time_types/schema/schema-0
@@ -1 +1 @@
-{"version":3,"id":0,"fields":[{"id":0,"name":"id","type":"INT NOT
NULL"},{"id":1,"name":"f_time_0","type":"TIME(0)"},{"id":2,"name":"f_time_3","type":"TIME(3)"},{"id":3,"name":"f_time_6","type":"TIME(6)"},{"id":4,"name":"f_time_9","type":"TIME(9)"}],"highestFieldId":4,"partitionKeys":[],"primaryKeys":[],"options":{"file.format":"parquet","bucket":"-1","manifest.format":"avro"},"comment":null,"timeMillis":1788858155034}
\ No newline at end of file
+{"version":3,"id":0,"fields":[{"id":0,"name":"id","type":"INT NOT
NULL"},{"id":1,"name":"f_time_0","type":"TIME(0)"},{"id":2,"name":"f_time_3","type":"TIME(3)"},{"id":3,"name":"f_time_6","type":"TIME(6)"},{"id":4,"name":"f_time_9","type":"TIME(9)"}],"highestFieldId":4,"partitionKeys":[],"primaryKeys":[],"options":{"file.format":"parquet","bucket":"-1"},"comment":null,"timeMillis":1788858155034}
diff --git
a/test/test_data/parquet/append_types_compatibility.db/rust_types/README.md
b/test/test_data/parquet/append_types_compatibility.db/rust_types/README.md
new file mode 100644
index 00000000..bdd1e737
--- /dev/null
+++ b/test/test_data/parquet/append_types_compatibility.db/rust_types/README.md
@@ -0,0 +1,103 @@
+Schema:
+
+id INT NOT NULL
+f_boolean BOOLEAN
+f_tinyint TINYINT
+f_smallint SMALLINT
+f_int INT
+f_bigint BIGINT
+f_float FLOAT
+f_double DOUBLE
+f_char CHAR(8)
+f_varchar VARCHAR(64)
+f_string STRING
+f_binary BINARY(8)
+f_varbinary VARBINARY(64)
+f_bytes BYTES
+f_blob BLOB
+f_blob_descriptor BLOB
+f_decimal_1_0 DECIMAL(1, 0)
+f_decimal_9_2 DECIMAL(9, 2)
+f_decimal_18_2 DECIMAL(18, 2)
+f_decimal_19_2 DECIMAL(19, 2)
+f_decimal_38_18 DECIMAL(38, 18)
+f_decimal_38_38 DECIMAL(38, 38)
+f_date DATE
+f_timestamp_0 TIMESTAMP(0)
+f_timestamp_3 TIMESTAMP(3)
+f_timestamp_6 TIMESTAMP(6)
+f_timestamp_9 TIMESTAMP(9)
+f_timestamp_ltz_0 TIMESTAMP_LTZ(0)
+f_timestamp_ltz_3 TIMESTAMP_LTZ(3)
+f_timestamp_ltz_6 TIMESTAMP_LTZ(6)
+f_timestamp_ltz_9 TIMESTAMP_LTZ(9)
+f_variant VARIANT
+f_array_int ARRAY<INT>
+f_map_string_bigint MAP<STRING NOT NULL, BIGINT>
+f_row ROW<nested_int INT, nested_string STRING, nested_decimal DECIMAL(19, 4),
+ nested_timestamp TIMESTAMP(9), nested_timestamp_ltz TIMESTAMP_LTZ(9)>
+f_array_array_int ARRAY<ARRAY<INT>>
+f_array_map ARRAY<MAP<STRING NOT NULL, INT>>
+f_map_array MAP<STRING NOT NULL, ARRAY<INT>>
+f_array_row ARRAY<ROW<name STRING, score DECIMAL(9, 2)>>
+f_map_row MAP<STRING NOT NULL, ROW<enabled BOOLEAN, event_time TIMESTAMP(6)>>
+f_deep_row ROW<children ARRAY<ROW<leaf_id BIGINT, leaf_variant VARIANT>>,
+ labels MAP<STRING NOT NULL, STRING>>
+f_array_variant ARRAY<VARIANT>
+f_map_variant MAP<STRING NOT NULL, VARIANT>
+
+Options:
+
+bucket = -1
+file.format = parquet
+blob-field = f_blob,f_blob_descriptor
+blob-descriptor-field = f_blob_descriptor
+data-evolution.enabled = true
+row-tracking.enabled = true
+
+The table has no partition key or primary key. Values below are listed as
[id=1, id=2, id=3].
+Timestamps and local-zoned timestamps are shown in Asia/Shanghai; binary
values are hexadecimal.
+
+id: [1, 2, 3]
+f_boolean: [true, null, null]
+f_tinyint: [-8, null, null]
+f_smallint: [1234, null, null]
+f_int: [-123456, null, null]
+f_bigint: [9223372036854770000, null, null]
+f_float: [1.25, null, null]
+f_double: [-12345.6789, null, null]
+f_char: ["char", null, ""]
+f_varchar: ["varchar-中文", null, ""]
+f_string: ["pypaimon 2.0.0", null, ""]
+f_binary: [0x3132333435363738, null, 0x4142434445464748]
+f_varbinary: [0x76617262696e6172790076616c7565, null, 0x]
+f_bytes: [0x62797465730076616c7565, null, 0x]
+f_blob: ["ordinary blob payload from pypaimon 2.0.0", null, ""]
+f_blob_descriptor:
[Blob("file:///nonexistent/pypaimon-all-types-external-blob.bin", 7, 11), null,
null]
+f_decimal_1_0: [9, null, null]
+f_decimal_9_2: [1234567.89, null, null]
+f_decimal_18_2: [1234567890123456.78, null, null]
+f_decimal_19_2: [12345678901234567.89, null, null]
+f_decimal_38_18: [12345678901234567890.123456789012345678, null, null]
+f_decimal_38_38: [0.12345678901234567890123456789012345678, null, null]
+f_date: [2024-02-29, null, null]
+f_timestamp_0: [2024-02-29 12:34:56, null, null]
+f_timestamp_3: [2024-02-29 12:34:56.123, null, null]
+f_timestamp_6: [2024-02-29 12:34:56.123456, null, null]
+f_timestamp_9: [2024-02-29 12:34:56.123456000, null, null]
+f_timestamp_ltz_0: [2024-02-29 12:34:56, null, null]
+f_timestamp_ltz_3: [2024-02-29 12:34:56.123, null, null]
+f_timestamp_ltz_6: [2024-02-29 12:34:56.123456, null, null]
+f_timestamp_ltz_9: [2024-02-29 12:34:56.123456000, null, null]
+f_variant:
[{"name":"variant-object","count":42,"active":true,"items":[null,1,"x"],"nested":{"decimal":12.34}},
null, null]
+f_array_int: [[1, null, 3], null, []]
+f_map_string_bigint: [{"one":1,"null":null}, null, {}]
+f_row: [(7,"nested",123456789012345.6789,2024-02-29
12:34:56.123456000,2024-02-29 12:34:56.123456000), null, null]
+f_array_array_int: [[[1,2],null,[]], null, []]
+f_array_map: [[{"a":1,"b":null},null,{}], null, []]
+f_map_array: [{"numbers":[1,null,3],"empty":[]}, null, {}]
+f_array_row: [[("alice",99.50),null,("bob",null)], null, []]
+f_map_row: [{"first":(true,2024-02-29 12:34:56.123456),"second":null}, null,
{}]
+f_deep_row:
[([{"leaf_id":10,"leaf_variant":[1,"two",false,{"k":"v"}]},{"leaf_id":11,"leaf_variant":null}],{"language":"python","format":"parquet"}),
null, null]
+f_array_variant:
[[{"name":"variant-object","count":42,"active":true,"items":[null,1,"x"],"nested":{"decimal":12.34}},null,[1,"two",false,{"k":"v"}]],
null, []]
+f_map_variant:
[{"object":{"name":"variant-object","count":42,"active":true,"items":[null,1,"x"],"nested":{"decimal":12.34}},"array":[1,"two",false,{"k":"v"}]},
null, {}]
diff --git
a/test/test_data/parquet/append_types_compatibility.db/rust_types/schema/schema-0
b/test/test_data/parquet/append_types_compatibility.db/rust_types/schema/schema-0
index 8118fd30..e35892f7 100644
---
a/test/test_data/parquet/append_types_compatibility.db/rust_types/schema/schema-0
+++
b/test/test_data/parquet/append_types_compatibility.db/rust_types/schema/schema-0
@@ -1 +1 @@
-{"version":3,"id":0,"fields":[{"id":0,"name":"id","type":"INT NOT
NULL"},{"id":1,"name":"f_boolean","type":"BOOLEAN"},{"id":2,"name":"f_tinyint","type":"TINYINT"},{"id":3,"name":"f_smallint","type":"SMALLINT"},{"id":4,"name":"f_int","type":"INT"},{"id":5,"name":"f_bigint","type":"BIGINT"},{"id":6,"name":"f_float","type":"FLOAT"},{"id":7,"name":"f_double","type":"DOUBLE"},{"id":8,"name":"f_char","type":"CHAR(8)"},{"id":9,"name":"f_varchar","type":"VARCHAR(64)"},{"id":10,"name":"f_string",
[...]
\ No newline at end of file
+{"version":3,"id":0,"fields":[{"id":0,"name":"id","type":"INT NOT
NULL"},{"id":1,"name":"f_boolean","type":"BOOLEAN"},{"id":2,"name":"f_tinyint","type":"TINYINT"},{"id":3,"name":"f_smallint","type":"SMALLINT"},{"id":4,"name":"f_int","type":"INT"},{"id":5,"name":"f_bigint","type":"BIGINT"},{"id":6,"name":"f_float","type":"FLOAT"},{"id":7,"name":"f_double","type":"DOUBLE"},{"id":8,"name":"f_char","type":"CHAR(8)"},{"id":9,"name":"f_varchar","type":"VARCHAR(64)"},{"id":10,"name":"f_string",
[...]
diff --git
a/test/test_data/parquet/append_types_compatibility.db/rust_vector_types/README.md
b/test/test_data/parquet/append_types_compatibility.db/rust_vector_types/README.md
new file mode 100644
index 00000000..e9c06524
--- /dev/null
+++
b/test/test_data/parquet/append_types_compatibility.db/rust_vector_types/README.md
@@ -0,0 +1,16 @@
+Schema:
+
+id INT NOT NULL
+f_vector_boolean VECTOR<BOOLEAN, 3>
+f_vector_tinyint VECTOR<TINYINT, 3>
+f_vector_smallint VECTOR<SMALLINT, 3>
+f_vector_int VECTOR<INT, 3>
+f_vector_bigint VECTOR<BIGINT, 3>
+f_vector_float VECTOR<FLOAT, 3>
+f_vector_double VECTOR<DOUBLE, 3>
+
+Options: bucket = -1, file.format = parquet. The table is unpartitioned and
has no primary
+key.
+
+Add: (1, [true,false,true], [-1,0,1], [-1000,0,1000], [-100000,0,100000],
[-10000000000,0,10000000000], [1.25,-2.5,3.75], [1.125,-2.25,3.5])
+Add: (2, [false,true,false], [2,3,4], [2000,3000,4000],
[200000,300000,400000], [20000000000,30000000000,40000000000], [4.25,5.5,6.75],
[4.125,5.25,6.5])
diff --git
a/test/test_data/parquet/append_types_compatibility.db/rust_vector_types/schema/schema-0
b/test/test_data/parquet/append_types_compatibility.db/rust_vector_types/schema/schema-0
index 3ee403b9..afc1eb70 100644
---
a/test/test_data/parquet/append_types_compatibility.db/rust_vector_types/schema/schema-0
+++
b/test/test_data/parquet/append_types_compatibility.db/rust_vector_types/schema/schema-0
@@ -1 +1 @@
-{"version":3,"id":0,"fields":[{"id":0,"name":"id","type":"INT NOT
NULL"},{"id":1,"name":"f_vector_boolean","type":{"type":"VECTOR","element":"BOOLEAN","length":3}},{"id":2,"name":"f_vector_tinyint","type":{"type":"VECTOR","element":"TINYINT","length":3}},{"id":3,"name":"f_vector_smallint","type":{"type":"VECTOR","element":"SMALLINT","length":3}},{"id":4,"name":"f_vector_int","type":{"type":"VECTOR","element":"INT","length":3}},{"id":5,"name":"f_vector_bigint","type":{"type":"VECTOR","ele
[...]
\ No newline at end of file
+{"version":3,"id":0,"fields":[{"id":0,"name":"id","type":"INT NOT
NULL"},{"id":1,"name":"f_vector_boolean","type":{"type":"VECTOR","element":"BOOLEAN","length":3}},{"id":2,"name":"f_vector_tinyint","type":{"type":"VECTOR","element":"TINYINT","length":3}},{"id":3,"name":"f_vector_smallint","type":{"type":"VECTOR","element":"SMALLINT","length":3}},{"id":4,"name":"f_vector_int","type":{"type":"VECTOR","element":"INT","length":3}},{"id":5,"name":"f_vector_bigint","type":{"type":"VECTOR","ele
[...]