v0.26.0
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 theargsstruct (positional_N/named_<name>) DuckDB actually sends.ScalarValuecarries 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_specJSON in column 0 withvgi_filter_version, constants in_val_N, join keys as separate by-name batches. Predicates carry no column untilProjectedColumnsderives the index from the projection list —column_indexcounts 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 bothtable_function_cardinalityandtable_function_statisticstake, 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.