Skip to content

v0.26.0

Choose a tag to compare

@rustyconover rustyconover released this 15 Aug 00:48
· 2 commits to main since this release

A Java client can now build the payloads it sends.

vgi-java was written as a worker SDK, so every codec is decode-only. A Java client could bind and drain a scan — proven in 0.25.0 — but could not construct the payloads it needs to send. The new farm.query.vgi.client package is the inverse half.

  • ArgumentsEncoder — emits the args struct (positional_N / named_<name>) DuckDB actually sends. ScalarValue carries value and Arrow type, so typed nulls and narrow widths stay expressible.
  • SettingsEncoder — the one-column-per-setting batch.
  • PushdownFiltersEncoder — a port of the C++ FilterSerializer: filter_spec JSON in column 0 with vgi_filter_version, constants in _val_N, join keys as separate by-name batches. Predicates carry no column until ProjectedColumns derives the index from the projection list — column_index counts the projected columns, not the base schema, and confusing the two silently filters the wrong column, so the API makes that hard to get wrong rather than merely documenting it.
  • TableFunctionRequests + ColumnStatisticsDecoder — the packed request both table_function_cardinality and table_function_statistics take, and the reply reader including the sparse-union min/max.

Filter encoding is verified twice: through the Java decoder, and cross-language against vgi-python's deserialize_filters — the reference implementation — by handing the encoded batches to a real interpreter.

Also includes the scalar exchange round trip that found the cancel and error-handling bugs fixed in vgirpc 0.21.6, which this release pins.

Worker-side behaviour is unchanged.