Skip to content

Epic: Harden Type System #10730

Open
0 of 7 issues completed
Open

Description

@connortsui20

This Epic is for hardening Vortex's type system, ensuring it is sound, consistent, and robust.

Status

Active. Canonical decimal foundations and integer Widen have merged. Recent extension fixes cover temporal validation, nullability, scalar read errors, matching comparison dtypes, and DataFusion literals. The broader extension model and the decimal reader/writer stack remain in progress.

The current design is in #10633 and #11237, especially the extension type decisions and the Decimal decisions. Both PRs are for research and discussion and are not intended to merge.

Goal

We want to ensure that users of Vortex do not run into any issues with Vortex's type system. In an ideal world, all of these are true:

  • Using provided types do not cause any issues (types are sound and consistent)
  • Logical / physical boundary is always consistent
  • Provided types are sufficient for most use cases (no missing provided types)
  • Users (and us as well) can easily add their types via extension types
  • Working with extension types is easy

Motivation

A robust type system means less bugs and easier abstractions. By ensuring this, users can interact with Vortex more confidently.

Examples that motivated this work include the multiple canonical decimal forms behind the fuzzer crashes in #5820 (#10701), and extension operations that leaked storage semantics or disagreed between execution paths (#7683).

Workstreams

  • Tracking Issue: Fix Canonical Decimal #10701: one canonical decimal width per dtype. The width mapping, imports, compatibility fixtures and faster widening copy have merged. Decimal Widen, DecimalByteParts decoding, old-node conversion and constructor enforcement remain open. CD5 and CD6 wait for the fixtures in 0.91.0, which is still a draft as of 2026-11-02.
  • Tracking Issue: Add Widen encoding for integers and decimals #10733: Widen for integers and decimals. Integer encoding and compute kernels have merged. Structural lifting, internal-child migration, decimal support, the wire format and editions remain open.
  • Epic: Extension Types #7683: extension types. The updated plan makes types opaque by default, with explicit Eq and Ord claims, function declarations that govern storage use and result wrapping, and rewrite rules owned by each type. Storage is declared from metadata, top-level nullability follows storage, and nested nullability belongs to the type. The dedicated tracking issue for this implementation will follow separately.
  • Epic: Logical Union type #7705: logical Union support.
  • First class FixedSizeBinary support #9902: first-class FixedSizeBinary. The plan makes it a core type.
  • Wide primitive integers: add I128, I256, U128 and U256. A dedicated tracking issue follows when the work is scheduled. This and FixedSizeBinary are outside the canonical decimal fix.

The design permits casts only through explicit rules for each dtype pair. The extension plan uses exact casts, with named functions for lossy unit changes. Existing lossy primitive casts and broader decimal arithmetic changes remain separate work.

Recent merged extension foundations and fixes

#10953 remains open. It makes Timestamp accept every i64 count, keeps jiff limits at conversion and display boundaries, and widens DateTimeParts days when needed. #11099 contains documentation split from the comparison PR. The full extension phase plan stays in the research notes until the dedicated tracking issue is written.

Unresolved questions

Metadata

Metadata

Assignees

Labels

epicPublic roadmap umbrella for a major initiative, with work tracked in sub-issues.

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions