Skip to content

v0.21.0

Choose a tag to compare

@rustyconover rustyconover released this 24 Jul 15:11
· 143 commits to main since this release

Serialize embedded bind_call as binary (cross-language wire format)

InitRequest.bind_call — and the TableFunctionCardinality / Statistics / DynamicToString requests — had no ArrowType annotation, so Python serialized the embedded BindRequest as an inline Arrow struct. Every other VGI implementation (the DuckDB C++ client and the Rust / Go / Java SDKs) encodes bind_call as an opaque binary IPC blob (Rust: ipc::read_batch(&dto.bind_call.0)).

Python's deserializer tolerantly read the binary form (so direct C++→Python worked), but its serializer emitted a struct. That asymmetry surfaced through the Cedar proxy: when it re-serialized an attribution-stripped InitRequest and forwarded it to a non-Python worker, the worker rejected it with expected Binary array.

bind_call is now Annotated[BindRequest, ArrowType(pa.binary())] on all four request classes, matching the wire standard and Python's own reader.

Also

  • ScanBranchesResult accepts an empty branch list (lenient producers omit the IPC stream for an empty nested value).
  • Test fixtures: the vgi-fixture-http MetaWorker now composes the twin_a / twin_b colliding-catalog fixtures (catalog-qualified dispatch).