What's Changed
- chore: bump version to 0.3.0 by @luoyuxia in #335
- build: fix clippy on Windows GNU with Rust 1.95 by @JaydenHD in #329
- ci: revert pypa/gh-action-pypi-publish to v1.13.0 by @luoyuxia in #337
- feat: support input changelog for primary key writes by @QuakeWang in #318
- fix: cap VarCharType/VarBinaryType MAX_LENGTH at i32::MAX by @shyjsarah in #339
- fix: validate filesystem catalog identifiers by @fallintoplace in #334
- [feature] support python scalar udf:video_snapshot for video by @jerry-024 in #336
- fix: validate changelog producer for first-row merge engine by @QuakeWang in #342
- fix: classify physical files by path context by @liujiwen-up in #341
- feat: expose catalog metadata api for pypaimon_rust by @SML0127 in #306
- feat: support canonical Lumina index type by @QuakeWang in #344
- [datafusion] Allow callers to skip default-database init in register_catalog by @shyjsarah in #345
- docs: update release docs and fix bump-version script by @luoyuxia in #348
- feature: add more object storage backends by @liujiwen-up in #346
- feat: add bucket and level statistics to ManifestFileMeta by @shyjsarah in #350
- [INFRA] Set up default rulesets for default and release branches by @asf-gitbox-commits in #322
- build: pin unicode-segmentation for vortex tests by @JingsongLi in #353
- fix: write valid empty BinaryRow bytes for empty table stats by @shyjsarah in #349
- test: add full types boundary consistency coverage by @QuakeWang in #351
- test: add mixed-format schema evolution coverage by @QuakeWang in #354
- chore(deps): update constant_time_eq requirement from >=0.4.0, <0.4.3 to >=0.4.0, <0.5.1 by @dependabot[bot] in #361
- chore(deps): update unicode-segmentation requirement from =1.13.2 to =1.13.3 by @dependabot[bot] in #359
- chore(deps): update libloading requirement from 0.8 to 0.9 by @dependabot[bot] in #358
- chore(deps): bump pypa/gh-action-pypi-publish from 1.13.0 to 1.14.0 by @dependabot[bot] in #357
- chore(deps): bump astral-sh/setup-uv from 7.6.0 to 8.1.0 by @dependabot[bot] in #356
- chore(deps): bump actions/cache from 4 to 5 by @dependabot[bot] in #355
- test: add mixed-format rename column coverage by @liujiwen-up in #365
- feat: add write builder configuration by @QuakeWang in #367
- fix: keep Vortex runtime alive during async IO by @QuakeWang in #375
- fix(scan): net manifest add/delete by full file identity including level by @TheR1sing3un in #377
- test: add mixed-format drop column schema evolution coverage by @liujiwen-up in #363
- feat: add table update to write builder by @QuakeWang in #372
- fix: merge primary-key rows correctly when bucket files span multiple splits by @TheR1sing3un in #374
- fix(table): use the snapshot's schema version for time travel reads by @TheR1sing3un in #379
- feat: support merge-engine=aggregation (basic mode) by @TheR1sing3un in #340
- fix: stabilize Vortex runtime for async IO by @JingsongLi in #387
- feat: add conservative ORC predicate pushdown by @liujiwen-up in #388
- feat: add Mosaic data file reader by @QuakeWang in #386
- feat: support core Lumina index build by @QuakeWang in #347
- fix: reject truncated BinaryRow serialized bytes instead of panicking by @tonghuaroot in #364
- test: cover mixed-format reorder column reads by @liujiwen-up in #366
- feat(datafusion): consolidate DML WriteBuilder usage by @QuakeWang in #384
- fix: support missing columns in Mosaic reads by @QuakeWang in #389
- test: cover filters for mixed-format schema evolution by @liujiwen-up in #390
- feat(catalog): support column-level alter table by @TheR1sing3un in #370
- feat(table/write): merge partial-update rows at flush by @TheR1sing3un in #380
- feat: add Mosaic row-group predicate pruning by @QuakeWang in #393
- feat(spec): implement Display for DataFileMeta by @Aitozi in #394
- fix: preserve snapshot properties by @Aitozi in #395
- feat(table): support mod and hive bucket functions by @Aitozi in #396
- feat: support vindex vector search by @JingsongLi in #399
- fix(io): preserve Windows drive letter in local filesystem paths by @TheR1sing3un in #398
- test(datafusion): cover SQL schema evolution reads by @liujiwen-up in #391
- fix(vortex): avoid footer read deadlock by @QuakeWang in #402
- test: cover Mosaic read path combinations by @QuakeWang in #401
- test: cover Mosaic read compatibility by @QuakeWang in #403
- test(datafusion): add Lumina index build procedure by @liujiwen-up in #392
- feat(rest-server): add FileSystemCatalog-backed REST catalog server by @TheR1sing3un in #371
- test: add schema evolution time travel coverage by @liujiwen-up in #407
- test: add partitioned schema evolution coverage by @liujiwen-up in #406
- test: add mixed-format data evolution coverage by @liujiwen-up in #405
- [btree] Add support for prefix range scan on btree global index by @ArnavBalyan in #408
- test: cover aggregation merge engine bucket modes by @QuakeWang in #404
- Add Java-compatible row format and sidecar path support by @JingsongLi in #416
- [python] Expose DataFrame-style scan/split planning API by @JunRuiLee in #415
- fix: reject aggregation on sequence fields by @QuakeWang in #409
- [type] Add native VectorType to the type system (#410 PR 1) by @JunRuiLee in #411
- fix: handle DataType::Vector in row.rs exhaustive match arms by @SML0127 in #418
- [python] Add ReadBuilder.with_filter (predicate pushdown) by @JunRuiLee in #419
- [arrow] Read inline VECTOR columns via Arrow FixedSizeList by @JunRuiLee in #412
- Align TableCommit with FileStoreCommit commit semantics by @JingsongLi in #422
- perf: avoid expanding Mosaic row selections by @QuakeWang in #421
- [table] Support reading dedicated and rolling (multi-segment) vector files by @JunRuiLee in #423
- feat(predicate): add string and range leaf operators (StartsWith/EndsWith/Contains/Like/Between) by @JunRuiLee in #425
- feat(parquet): add page-level pruning via ColumnIndex/OffsetIndex by @JunRuiLee in #427
- fix(scan): prune OR predicates using stats by @QuakeWang in #426
- [python] Expose DataFrame-style batch write + commit loop by @JunRuiLee in #420
- [python] Add TableRead.read(splits) returning Arrow batches by @JunRuiLee in #428
- fix: avoid whole-file reads for Mosaic by @QuakeWang in #424
- feat: support orc is null predicate pushdown by @liujiwen-up in #429
- chore(deps): bump actions/checkout from 6 to 7 by @dependabot[bot] in #433
- chore(deps): bump actions/cache from 5 to 6 by @dependabot[bot] in #432
- chore(deps): bump astral-sh/setup-uv from 8.1.0 to 8.2.0 by @dependabot[bot] in #431
- fix(scan): prune data-evolution files by projection by @QuakeWang in #442
- [table] Accept VECTOR in Lumina index build by @JunRuiLee in #440
- Implement global index search modes by @JingsongLi in #446
- [python] Push down like/startsWith/endsWith/contains predicates by @JunRuiLee in #445
- [python] Support Date/Time/Timestamp/Decimal filter literals in py_to_datum by @JunRuiLee in #443
- feat(scan): add pruning trace baselines by @hhhizzz in #381
- Add batch vector search core by @JingsongLi in #450
- Support data evolution DELETE with deletion vectors by @JingsongLi in #451
- [table] Fail closed when reading a query-auth.enabled table by @plusplusjiajia in #447
- [python] Wire per-read scan options (time travel) into the Rust read kernel by @JunRuiLee in #441
- fix(scan): prune IN predicates using file stats by @hhhizzz in #382
- fix(scan): use evaluated fields for global index fallback by @QuakeWang in #449
- Support DataFusion lateral vector search joins by @JingsongLi in #452
- chore: upgrade DataFusion to 54 by @JingsongLi in #453
- Add Variant support and DataFusion functions by @JingsongLi in #458
- feat(variant): support shredding read and write by @JingsongLi in #459
- docs: refresh Rust docs version and project status by @hechao-ustc in #456
- Apply exact residual filtering for ORC, Avro, and Row reads by @JunRuiLee in #448
- Push down variant extractions in DataFusion by @JingsongLi in #460
- feat(datafusion): support SHOW CREATE TABLE via get_table_definition by @shyjsarah in #444
- Add video_frame SQL UDF by @JingsongLi in #465
- Add multimodal SQL helper UDFs by @JingsongLi in #467
- docs(python): fix README fence and document current read/write APIs by @hechao-ustc in #457
- docs: mark unreleased storage backends and mosaic feature in getting-started.md by @JRVector9 in #462
- feat(datafusion): add push down temporal literals by @liujiwen-up in #430
- feat(index): add single-column btree global index build by @QuakeWang in #454
- fix(datafusion): keep dynamic options out of show create by @shyjsarah in #468
- fix(index): propagate fallible with_projection in btree index build by @JunRuiLee in #471
- Add hybrid search support for DataFusion by @JingsongLi in #473
- feat(index): add btree global index drop by @QuakeWang in #472
- perf(scan): stop split construction after limit coverage by @hhhizzz in #470
- Apply exact predicate filtering on the primary-key merge read path by @JunRuiLee in #463
- Upgrade vindex and support vector create index by @JingsongLi in #476
- Support Java-compatible bitmap global index by @JingsongLi in #478
- feat(core): incremental global index build for btree, lumina, and vindex by @JunRuiLee in #479
- fix(core): correct BTREE_INDEX_TYPE typo breaking the build by @liwuhen in #481
- fix(core): compute bitmap build gap on its own index type, not btree by @JunRuiLee in #480
- Support dedicated vector storage writes by @JingsongLi in #484
- feat: Implement Blob View support by @JingsongLi in #486
- fix(core): align BinaryRow timestamp write path with euclidean representation by @liwuhen in #485
- feat: add inexact not filter pushdown by @liujiwen-up in #488
- feat(index): support lumina and vindex global index drop by @JunRuiLee in #487
- fix(datafusion): guard CoW MERGE partition pruning by @JaydenHD in #475
- Add cross-language Split.serialize() by @XiaoHongbo-Hope in #455
- Enable Mosaic reads by default by @JingsongLi in #491
- Support Java-style blob field directives by @JingsongLi in #490
- Support REST format table reads by @JingsongLi in #492
- feat(index): Support vector index rerank by @JingsongLi in #493
- feat(datafusion): support reading branch tables by @shyjsarah in #482
- Support REST catalog views and SQL functions by @JingsongLi in #494
- feat(datafusion): support REST Catalog CREATE VIEW by @JingsongLi in #497
- feat(datafusion): support REST Catalog CREATE FUNCTION by @JingsongLi in #499
- [core] Parse primary-key vector index source metadata (_SOURCE_META) by @JunRuiLee in #515
- docs: add AI-assisted contribution policy by @QuakeWang in #512
- feat: support batch incremental delta scans by @Pandas886 in #508
- feat: support rowkind.field write semantics by @Pandas886 in #507
- feat(datafusion): implement DROP VIEW functionality in REST Catalog by @QuakeWang in #501
- [api] Add authTableQuery method to RESTApi by @plusplusjiajia in #498
- feat: support case-insensitive column matching on reads (read-time parameter) by @JunRuiLee in #496
- expose table observability API for pypaimon_rust by @SML0127 in #307
- fix(datafusion): skip view lookup for table functions by @shyjsarah in #518
- feat(datafusion): expose hybrid search scores by @QuakeWang in #519
- [core] Add primary-key vector bucket search kernel by @JunRuiLee in #516
- feat: write value stats for append data files by @QuakeWang in #477
- feat(c): expose string and range predicates through the C binding by @JunRuiLee in #523
- fix(blob): support unknown-length BlobDescriptor ranges by @QuakeWang in #521
- feat(datafusion): add BlobDescriptor SQL helper functions by @QuakeWang in #525
- feat(c): expose read builder scan options and time-travel through the C binding by @JunRuiLee in #524
- [core] Add primary-key vector read kernel by @JunRuiLee in #517
- feat: support existing changelog incremental reads by @Pandas886 in #509
- fix(datafusion): remove unneeded wildcard pattern for clippy 1.97.0 by @hechao-ustc in #529
- [core] Add primary-key vector search read integration by @JunRuiLee in #526
- feat(c): add write/commit C FFI bindings by @suxiaogang223 in #522
- [core] Align primary-key vector source metadata with Java by @JunRuiLee in #531
- perf(blob): parallelize descriptor range reads by @JingsongLi in #534
- [core] Support MAP shared-shredding in Parquet by @JingsongLi in #536
- [core] Support scalar residual filter on primary-key vector search by @JunRuiLee in #533
- fix(blob): support placeholder fallback reads by @QuakeWang in #530
- fix(catalog): handle filesystem catalog existence on object stores by @Pandas886 in #528
- [core] Create primary-key vector exact-fallback readers on demand by @JunRuiLee in #535
- [benchmark] Add DataFusion TPC-DS benchmark harness by @JingsongLi in #542
- [datafusion] Support Utf8View schemas and residual filtering by @JingsongLi in #543
- [datafusion] Honor Paimon read.batch-size by @JingsongLi in #547
- [datafusion] Align Paimon scan statistics with Parquet by @JingsongLi in #548
- feat(python): add BETWEEN/NOT BETWEEN predicate support by @hechao-ustc in #546
- fix(index): deduplicate vector search top-k results by @QuakeWang in #541
- fix(core): resolve storage config aliases to canonical keys by @liwuhen in #540
- perf(blob): finalize blob bunch metadata once by @QuakeWang in #539
- docs(python): add Python Integration documentation page by @hechao-ustc in #538
- feat(table): align primary-key vector read to physical-coordinate model by @JunRuiLee in #544
- [datafusion] Support runtime filters for Paimon scans by @JingsongLi in #549
- fix(table): fail closed for query-auth batch vector search by @liwuhen in #551
- [c] Support vector search materialized read in C FFI bindings by @JunRuiLee in #537
- feat(table): support the Lumina/DiskANN backend in primary-key vector read by @JunRuiLee in #555
- [core] Rerank primary-key vector candidates with exact distances by @JunRuiLee in #550
- fix(datafusion): enforce blob reader location boundaries by @QuakeWang in #552
- feat(blob): support ARRAY reads by @QuakeWang in #566
- [core] Stream primary-key vector exact fallback one batch at a time by @JunRuiLee in #559
- fix(row): guard timestamp conversion against overflow from corrupt data by @hechao-ustc in #545
- build(python): give RC artifacts unique versions by @XiaoHongbo-Hope in #557
- perf(datafusion): push filters into Paimon Parquet readers by @JingsongLi in #574
- fix(api): honor REST config overrides by @shyjsarah in #570
- fix(datafusion): avoid loading tables for SHOW TABLES by @shyjsarah in #576
- feat(partial-update): support ignore-delete semantics by @shyjsarah in #573
- feat: deserialize DataSplit from Paimon-native bytes (core + C binding) by @JunRuiLee in #565
- build: lock and verify release dependencies by @XiaoHongbo-Hope in #558
- docs: add TPC-DS SF100 performance report by @JingsongLi in #553
- docs: add C integration guide by @JingsongLi in #581
- fix(blob): validate entry integrity on reads by @QuakeWang in #582
- feat(table): read materialized deletion-vector PK splits by @shyjsarah in #580
- [core] Batch primary-key vector search over a shared plan by @JunRuiLee in #560
- build: harden Rust crate publishing by @XiaoHongbo-Hope in #562
- fix(table): reject invalid global index metadata by @XiaoHongbo-Hope in #578
- [core] Search primary-key vector buckets and files concurrently by @JunRuiLee in #556
- feat(ftindex): read Java full-text archives via paimon-ftindex-core by @JunRuiLee in #563
- fix(table): enable global index by default by @XiaoHongbo-Hope in #587
- fix: use i64 for index file size by @XiaoHongbo-Hope in #586
- partial_update: support sequence-group reads by @shyjsarah in #584
- build(bindings): package complete legal metadata by @XiaoHongbo-Hope in #561
- perf(table): search global index shards concurrently by @XiaoHongbo-Hope in #589
- fix(table): match Java NaN ordering in aggregation by @liwuhen in #588
- build: correct Jieba release license metadata by @shyjsarah in #593
- feat(fulltext): read global indexes via paimon-ftindex-core by @shyjsarah in #571
- feat(table): add primary-key full-text read data layer by @JunRuiLee in #594
- feat(table): support selected ranges for rolled dedicated files by @XiaoHongbo-Hope in #592
- perf(parquet): prune row selection with OffsetIndex by @XiaoHongbo-Hope in #597
- fix(table): align bitmap index ordering with Java by @QuakeWang in #601
- feat(table): add primary-key full-text read path by @JunRuiLee in #599
- partial_update: support field aggregation reads by @shyjsarah in #598
- perf(table): push row-range pruning into manifest scan by @XiaoHongbo-Hope in #590
- feat: add local disk cache by @JingsongLi in #600
- fix: serialize empty BinaryRow with fixed part by @yanbinyang in #604
- ci: install cargo-about CLI on Intel macOS by @XiaoHongbo-Hope in #605
New Contributors
- @JaydenHD made their first contribution in #329
- @fallintoplace made their first contribution in #334
- @asf-gitbox-commits made their first contribution in #322
- @TheR1sing3un made their first contribution in #377
- @tonghuaroot made their first contribution in #364
- @ArnavBalyan made their first contribution in #408
- @hhhizzz made their first contribution in #381
- @JRVector9 made their first contribution in #462
- @suxiaogang223 made their first contribution in #522
- @yanbinyang made their first contribution in #604
Full Changelog: v0.2.0...v0.3.0