Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
95 commits
Select commit Hold shift + click to select a range
7ff1855
feat(read): support file index and predicate pushdown for data evolut…
lxy-9602 Aug 19, 2026
ec85415
chore(build): reformat arrow.diff patch sections (#217)
lucasfang Aug 19, 2026
223e566
feat(prefetch): support read-ahead cache for Parquet reads (#209)
lucasfang Aug 19, 2026
c7f23c6
feat(parquet): support vector type storage (#198)
ChaomingZhangCN Aug 20, 2026
afc8471
fix: optimize shared-shredding read & fix ORC read-size estimation fo…
lszskye Aug 20, 2026
b0e411b
fix(parquet): pass ReadHints into VECTOR ParquetFileBatchReader tests…
ChaomingZhangCN Aug 20, 2026
8a110d4
feat(file-index): support writing file indexes (#210)
zjw1111 Aug 20, 2026
dbdce8f
perf(parquet): reuse leaf column index set across fields in page-filt…
zhf999 Aug 20, 2026
aa60634
perf(scan): lazily decode manifest bucket entries (#212)
gripleaf Aug 20, 2026
eafe14e
fix(build): repair singleton double-checked locking race and harden a…
u70b3 Aug 21, 2026
05d6497
fix(parquet): support nullable fixed-size lists for vector (#231)
lxy-9602 Aug 21, 2026
3b93d6a
fix(rest): support libcurl versions before 7.49 (#237)
wangyong9999 Aug 24, 2026
d602c2c
perf: avoid shared pointer contention in manifest and Avro decode (#239)
gripleaf Aug 24, 2026
15d079a
feat(realtime): improve append table lifecycle and query support (#213)
lxy-9602 Aug 24, 2026
6650b42
chore: remove required status checks in .asf.yaml (#241)
zjw1111 Aug 24, 2026
6a2c90f
feat(rest): support DLF authentication (#244)
JingsongLi Aug 25, 2026
83773eb
chore: fix REST Catalog license headers (#246)
zjw1111 Aug 25, 2026
ff38c0d
refactor(shredding): unify shredding read plans for map shredding and…
lxy-9602 Aug 25, 2026
370582d
feat(file-index): support BSI and Bloom filter writers (#234)
zjw1111 Aug 25, 2026
7d992ca
perf(read): reduce Arrow read-path overhead (#242)
gripleaf Aug 25, 2026
c329090
feat(benchmark): add format-level Parquet read/write micro-benchmarks…
SteNicholas Aug 26, 2026
d76c2a6
fix(compaction): persist keys in lookup SST files while first-row mer…
lszskye Aug 26, 2026
50d4207
feat(realtime): add primary-key in-memory writes
HaHaJeff Aug 19, 2026
82949b3
feat(read): merge primary-key realtime memory with snapshots
HaHaJeff Aug 19, 2026
f8078a5
test(realtime): cover primary-key realtime lifecycle
HaHaJeff Aug 19, 2026
949356a
refactor(realtime): consolidate PK state and validation
HaHaJeff Aug 20, 2026
7f4b60b
fix(read): close PK realtime query readers
HaHaJeff Aug 20, 2026
3dee339
fix(realtime): close rejected plugin readers
HaHaJeff Aug 20, 2026
b36b24f
fix(read): preserve PK reader metrics after close
HaHaJeff Aug 20, 2026
20b834e
refactor(realtime): colocate PK realtime option validation
HaHaJeff Aug 20, 2026
b89a9fc
test(realtime): improve primary key coverage
HaHaJeff Aug 20, 2026
b3862d1
fix(realtime): prevent sequence reuse and align nested projections
HaHaJeff Aug 21, 2026
3acae03
fix(realtime): align PK reads across schema changes
HaHaJeff Aug 21, 2026
74d4fee
fix(realtime): align PK projections by field ID
HaHaJeff Aug 21, 2026
2f7d228
refactor(mergetree): accept sorted key-value readers
HaHaJeff Aug 24, 2026
3df2037
feat(realtime): adapt prepared primary-key batches
HaHaJeff Aug 24, 2026
232d587
refactor(realtime): prepare primary-key batches in framework
HaHaJeff Aug 24, 2026
62108e2
refactor(realtime): simplify primary-key write preparation
HaHaJeff Aug 24, 2026
b6bf461
test(mergetree): reuse reader failure mock
HaHaJeff Aug 24, 2026
8c4c4c8
fix(realtime): preserve PK sequence across writer handoff
HaHaJeff Aug 24, 2026
aec0a2e
refactor(realtime): simplify primary key merge readers
HaHaJeff Aug 24, 2026
c248373
fix(realtime): validate PK reader contracts
HaHaJeff Aug 24, 2026
1e1c7d2
refactor(realtime): simplify reader lifecycle cleanup
HaHaJeff Aug 24, 2026
352ce21
fix(realtime): harden primary-key prepared batches
HaHaJeff Aug 24, 2026
d818466
refactor(realtime): simplify primary-key contracts
HaHaJeff Aug 24, 2026
ff0c7bd
fix(realtime): strengthen primary-key recovery coverage
HaHaJeff Aug 24, 2026
83ff3cb
test(realtime): strengthen failure recovery coverage
HaHaJeff Aug 25, 2026
5558182
refactor(realtime): simplify primary key state and tests
HaHaJeff Aug 25, 2026
e68ac16
test(realtime): simplify integration test setup
HaHaJeff Aug 25, 2026
f92fe6a
fix(realtime): reject PK read-optimized scans
HaHaJeff Aug 25, 2026
b187e07
fix(realtime): harden prepared store handling
HaHaJeff Aug 25, 2026
5a6dcb6
refactor(realtime): simplify PK store boundary
HaHaJeff Aug 25, 2026
808cc59
refactor(realtime): simplify PK offset coverage
HaHaJeff Aug 25, 2026
7e59253
refactor(realtime): simplify stores around framework-owned PK offsets
HaHaJeff Aug 25, 2026
7a59f9e
refactor(realtime): align PK query projection with store
HaHaJeff Aug 25, 2026
884270f
refactor(realtime): address review feedback
HaHaJeff Aug 25, 2026
bf00d53
fix(realtime): tighten primary key framework boundaries
HaHaJeff Aug 25, 2026
52ee6bd
fix(realtime): harden query schema alignment
HaHaJeff Aug 25, 2026
ace7e1d
fix(realtime): validate exact commit reader coverage
HaHaJeff Aug 25, 2026
607cac7
fix(realtime): enforce store reader boundaries
HaHaJeff Aug 25, 2026
86123e0
refactor(realtime): align primary key query projection
HaHaJeff Aug 26, 2026
32844c1
refactor(realtime): centralize Arrow array memory retention
HaHaJeff Aug 26, 2026
3476342
fix(realtime): refine primary key option validation
HaHaJeff Aug 26, 2026
961aaaa
fix(realtime): validate plugin bitmap bounds
HaHaJeff Aug 26, 2026
69d9693
fix(realtime): preserve primary keys in projected reads
HaHaJeff Aug 26, 2026
09c53c9
fix(read): bound realtime merge fan-in
HaHaJeff Aug 26, 2026
712b1e7
refactor(realtime): simplify primary key maintenance
HaHaJeff Aug 26, 2026
3392f39
refactor(realtime): simplify primary key schema and reader setup
HaHaJeff Aug 26, 2026
dfb3329
refactor(realtime): remove duplicate offset validation
HaHaJeff Aug 26, 2026
c73f008
feat(reader): support late materialization with probe/payload two-pha…
zhf999 Aug 27, 2026
b2e5fba
feat(core): support per-column maximum sequence numbers (#247)
Zouxxyy Aug 27, 2026
4027601
refactor(utils): consolidate string and option handling (#249)
lxy-9602 Aug 27, 2026
e448f7a
refactor(realtime): localize primary-key split validation
HaHaJeff Aug 27, 2026
0082544
fix(io): preserve merged reader initialization errors
HaHaJeff Aug 27, 2026
b4fb4d0
fix(realtime): validate prepared reader coverage
HaHaJeff Aug 27, 2026
226cd85
fix(mergetree): transfer sorted reader ownership safely
HaHaJeff Aug 27, 2026
3b65e10
refactor(realtime): simplify reader lifecycle
HaHaJeff Aug 27, 2026
e8a5b29
refactor(realtime): simplify prepared reader validation
HaHaJeff Aug 27, 2026
87796a3
fix(read): close realtime readers on setup failure
HaHaJeff Aug 27, 2026
982eb59
refactor(realtime): clarify primary-key reader contracts
HaHaJeff Aug 27, 2026
9142758
Merge branch 'main' into jeff/pk-realtime-v1
lxy-9602 Aug 28, 2026
d4ebe09
fix(realtime): resolve CI failures
HaHaJeff Aug 28, 2026
49f0ea7
test(realtime): remove redundant reader test code
HaHaJeff Aug 28, 2026
34d0cb2
feat(mosaic): support Mosaic file format (#238)
lxy-9602 Aug 28, 2026
813c644
test(realtime): streamline realtime test coverage
HaHaJeff Aug 28, 2026
e357418
fix(style): apply clang-format
HaHaJeff Aug 28, 2026
feb511e
fix: canonicalize floating-point NaN values (#255)
zjw1111 Aug 28, 2026
71e415c
feat(metrics): expose scan and prefetch metrics (#211)
gripleaf Aug 28, 2026
8644975
fix(executor): support destruction from worker threads (#233)
mrdrivingduck Aug 28, 2026
020a14d
docs: preserve comments across refactoring
HaHaJeff Aug 28, 2026
a77b5f4
test(realtime): streamline primary key reader coverage
HaHaJeff Aug 28, 2026
a51b207
test(realtime): remove redundant close coverage
HaHaJeff Aug 28, 2026
19cba8d
feat(fs): add OSS file system (#205)
mrdrivingduck Aug 29, 2026
53f9c86
feat(core): support input and lookup changelog producers (#248)
lszskye Aug 29, 2026
e6ac99e
chore: merge upstream main
HaHaJeff Aug 29, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
34 changes: 1 addition & 33 deletions .asf.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -54,39 +54,7 @@ github:
dismiss_stale_reviews: true
require_last_push_approval: true
required_approving_review_count: 1
required_status_checks:
- name: "pre-commit"
app_slug: -1
- name: "rat-license-check"
app_slug: -1
- name: "script-tests"
app_slug: -1
- name: "asan-ubsan-x86_64"
app_slug: -1
- name: "tsan-x86_64"
app_slug: -1
- name: "clang-debug-x86_64"
app_slug: -1
- name: "clang-release-x86_64"
app_slug: -1
- name: "gcc-debug-x86_64"
app_slug: -1
- name: "gcc-release-x86_64"
app_slug: -1
- name: "gcc-debug-aarch64"
app_slug: -1
- name: "gcc-release-aarch64"
app_slug: -1
- name: "clang-debug-aarch64"
app_slug: -1
- name: "asan-ubsan-aarch64"
app_slug: -1
- name: "clang-release-aarch64"
app_slug: -1
- name: "tsan-aarch64"
app_slug: -1
- name: "gcc8-test"
app_slug: -1

pull_requests:
allow_auto_merge: false
allow_update_branch: true
Expand Down
5 changes: 1 addition & 4 deletions .github/workflows/build_and_test.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,6 @@ jobs:
- name: asan-ubsan-x86_64
build_args: --enable_asan --enable_ubsan
- name: tsan-x86_64
skip_rust: true
build_args: --enable_tsan
- name: gcc-debug-aarch64
runner: ubuntu-24.04-arm
Expand All @@ -96,7 +95,6 @@ jobs:
build_args: --build_type Release
- name: tsan-aarch64
runner: ubuntu-24.04-arm
skip_rust: true
build_args: --enable_tsan
steps:
- name: Checkout paimon-cpp
Expand All @@ -108,8 +106,7 @@ jobs:
uses: ./.github/actions/setup-ccache
with:
cache-key-prefix: ccache-${{ matrix.name }}
- name: Install Rust toolchain (tantivy-fts)
if: ${{ !matrix.skip_rust }}
- name: Install Rust toolchain (Mosaic and tantivy-fts)
shell: bash
run: ci/scripts/setup_rust.sh
- name: Install HTTP and TLS development dependencies
Expand Down
3 changes: 3 additions & 0 deletions .github/workflows/gcc8_test.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,9 @@ jobs:
ls -la
- name: Checkout paimon-cpp
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
- name: Install Rust toolchain (Mosaic)
shell: bash
run: ci/scripts/setup_rust.sh
- name: Setup ccache
uses: ./.github/actions/setup-ccache
with:
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/release_candidate.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -131,7 +131,7 @@ jobs:
name: source-archive
path: release/ci

- name: Install Rust toolchain (tantivy-fts)
- name: Install Rust toolchain (Mosaic and tantivy-fts)
shell: bash
run: ci/scripts/setup_rust.sh

Expand Down
44 changes: 41 additions & 3 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -60,31 +60,45 @@ option(PAIMON_USE_UBSAN "Use Undefined Behavior Sanitizer" OFF)
option(PAIMON_USE_CXX11_ABI "Use C++11 ABI" ON)
option(PAIMON_ENABLE_AVRO "Whether to enable avro file format" ON)
option(PAIMON_ENABLE_ORC "Whether to enable orc file format" ON)
option(PAIMON_ENABLE_MOSAIC "Whether to enable mosaic file format (Rust FFI)" OFF)
option(PAIMON_ENABLE_JINDO "Whether to enable jindo file system" OFF)
option(PAIMON_ENABLE_OSS "Whether to enable OSS SDK v2 file system" OFF)
option(PAIMON_ENABLE_S3 "Whether to enable S3 file system" OFF)
option(PAIMON_ENABLE_NETWORK_TESTS
"Whether to enable tests that access real remote services over the network" OFF)
option(PAIMON_ENABLE_LUMINA "Whether to enable lumina vector index" OFF)
option(PAIMON_ENABLE_LUCENE "Whether to enable lucene index" OFF)
option(PAIMON_ENABLE_TANTIVY
"Whether to enable tantivy-fulltext global index (Rust FFI, experimental)" OFF)
option(PAIMON_ENABLE_REST "Whether to enable the rest catalog (requires libcurl)" OFF)
option(PAIMON_ENABLE_REST
"Whether to enable the rest catalog (requires libcurl and OpenSSL)" OFF)
if(PAIMON_ENABLE_ORC)
add_definitions(-DPAIMON_ENABLE_ORC)
endif()
if(PAIMON_ENABLE_REST)
add_definitions(-DPAIMON_ENABLE_REST)
endif()
# libcurl backs the HTTP client shared by the S3 file system and the rest catalog.
if(PAIMON_ENABLE_S3 OR PAIMON_ENABLE_REST)
# libcurl supports the REST and S3 HTTP clients, the OSS SDK transport, and object store timestamps.
if(PAIMON_ENABLE_OSS
OR PAIMON_ENABLE_S3
OR PAIMON_ENABLE_REST)
find_package(CURL REQUIRED)
endif()
if(PAIMON_ENABLE_REST)
find_package(OpenSSL 1.1.0 REQUIRED)
endif()
if(PAIMON_ENABLE_AVRO)
add_definitions(-DPAIMON_ENABLE_AVRO)
endif()
if(PAIMON_ENABLE_MOSAIC)
add_definitions(-DPAIMON_ENABLE_MOSAIC)
endif()
if(PAIMON_ENABLE_JINDO)
add_definitions(-DPAIMON_ENABLE_JINDO)
endif()
if(PAIMON_ENABLE_OSS)
add_definitions(-DPAIMON_ENABLE_OSS)
endif()
if(PAIMON_ENABLE_S3)
add_definitions(-DPAIMON_ENABLE_S3)
endif()
Expand Down Expand Up @@ -384,6 +398,11 @@ if(PAIMON_BUILD_TESTS OR PAIMON_BUILD_BENCHMARKS)
paimon_link_libraries_whole_archive(PAIMON_PARQUET_FILE_FORMAT_STATIC_LINK_LIBS
paimon_parquet_file_format_static)

if(PAIMON_ENABLE_MOSAIC)
paimon_link_libraries_whole_archive(PAIMON_MOSAIC_FILE_FORMAT_STATIC_LINK_LIBS
paimon_mosaic_file_format_static)
endif()

if(PAIMON_ENABLE_ORC)
paimon_link_libraries_whole_archive(PAIMON_ORC_FILE_FORMAT_STATIC_LINK_LIBS
paimon_orc_file_format_static)
Expand Down Expand Up @@ -435,6 +454,14 @@ if(PAIMON_BUILD_TESTS)
paimon_link_libraries_whole_archive(PAIMON_PARQUET_FILE_FORMAT_STATIC_LINK_LIBS
paimon_parquet_file_format_static)

if(PAIMON_ENABLE_MOSAIC)
paimon_link_libraries_no_as_needed(TEST_PLUGIN_LINK_LIBS
paimon_mosaic_file_format_shared)
list(APPEND TEST_STATIC_LINK_LIBS ${TEST_PLUGIN_LINK_LIBS})
paimon_link_libraries_whole_archive(PAIMON_MOSAIC_FILE_FORMAT_STATIC_LINK_LIBS
paimon_mosaic_file_format_static)
endif()

if(PAIMON_ENABLE_ORC)
paimon_link_libraries_no_as_needed(TEST_PLUGIN_LINK_LIBS
paimon_orc_file_format_shared)
Expand All @@ -452,6 +479,13 @@ if(PAIMON_BUILD_TESTS)
paimon_jindo_file_system_shared)
list(APPEND TEST_STATIC_LINK_LIBS ${TEST_PLUGIN_LINK_LIBS})
endif()
if(PAIMON_ENABLE_OSS)
paimon_link_libraries_whole_archive(PAIMON_OSS_FILE_SYSTEM_STATIC_LINK_LIBS
paimon_oss_file_system_static)
paimon_link_libraries_no_as_needed(TEST_PLUGIN_LINK_LIBS
paimon_oss_file_system_shared)
list(APPEND TEST_STATIC_LINK_LIBS ${TEST_PLUGIN_LINK_LIBS})
endif()
if(PAIMON_ENABLE_S3)
paimon_link_libraries_whole_archive(PAIMON_S3_FILE_SYSTEM_STATIC_LINK_LIBS
paimon_s3_file_system_static)
Expand Down Expand Up @@ -511,11 +545,15 @@ add_subdirectory(src/paimon/fs/local)
if(PAIMON_ENABLE_JINDO)
add_subdirectory(src/paimon/fs/jindo)
endif()
add_subdirectory(src/paimon/fs/oss)
add_subdirectory(src/paimon/fs/s3)
add_subdirectory(src/paimon/format/blob)
add_subdirectory(src/paimon/format/orc)
add_subdirectory(src/paimon/format/parquet)
add_subdirectory(src/paimon/format/avro)
if(PAIMON_ENABLE_MOSAIC)
add_subdirectory(src/paimon/format/mosaic)
endif()
if(PAIMON_ENABLE_LUMINA)
add_subdirectory(src/paimon/global_index/lumina)
endif()
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ Paimon C++ currently provides:
- **Scan**: batch and stream scan for append tables and primary key tables without changelog.
- **Read**: append table read, primary key table read with deletion vector, and primary key table merge-on-read.
- **Arrow integration**: batch read and write interfaces based on the [Arrow Columnar In-Memory Format](https://arrow.apache.org).
- **File systems**: file system abstraction with built-in local and Jindo file system support.
- **File systems**: file system abstraction with built-in local, Jindo, OSS, and S3 file system support.
- **File formats**: file format abstraction with built-in ORC, Parquet, and Avro support.
- **Runtime utilities**: memory pool and thread pool abstractions with default implementations.
- **AI-Oriented Features**: supports RowTracking and DataEvolution mode and provides Global Index
Expand Down
31 changes: 31 additions & 0 deletions benchmark/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,20 @@ if(PAIMON_BUILD_BENCHMARKS)
${PAIMON_BENCHMARK_LINK_TOOLCHAIN}
EXTRA_INCLUDES
${CMAKE_SOURCE_DIR})

add_paimon_benchmark(parquet_format_benchmark
SOURCES
parquet_format_benchmark.cpp
STATIC_LINK_LIBS
arrow
parquet
${PAIMON_BENCHMARK_STATIC_LINK_LIBS}
test_utils_static
Threads::Threads
${PAIMON_BENCHMARK_PLATFORM_LINK_LIBS}
${PAIMON_BENCHMARK_LINK_TOOLCHAIN}
EXTRA_INCLUDES
${CMAKE_SOURCE_DIR})
endif()

if(PAIMON_BUILD_TESTS)
Expand All @@ -74,4 +88,21 @@ if(PAIMON_BUILD_TESTS)
STATIC_LINK_LIBS
paimon_shared
${GTEST_LINK_TOOLCHAIN})

# Guards the format-layer assumptions parquet_format_benchmark.cpp is built on. The benchmark
# itself is only compiled under PAIMON_BUILD_BENCHMARKS, which CI does not set, so this test is
# what keeps those assumptions covered.
add_paimon_test(parquet_format_benchmark_test
SOURCES
parquet_format_benchmark_test.cpp
EXTRA_INCLUDES
${CMAKE_SOURCE_DIR}
STATIC_LINK_LIBS
arrow
parquet
paimon_shared
${PAIMON_LOCAL_FILE_SYSTEM_SHARED_LINK_LIBS}
${PAIMON_PARQUET_FILE_FORMAT_STATIC_LINK_LIBS}
test_utils_static
${GTEST_LINK_TOOLCHAIN})
endif()
Loading
Loading