Repository navigation
Releases
v0.47.0
Protocol vgi.v3 3.2.0: filtered scan planning (TableInfo.scan_planning, pushdown_filters on catalog_table_scan_branches_get, ScanBranch row_count/column_statistics). 3.1 peers are rejected.
Java API: Worker.registerPlannedTable(stub, ScanPlanning, ScanBranchesPlanner), Worker.scanBranchesPlanner(..), ScanBranchesPlanner (DEFAULT serves the 3.1 branches), ScanBranchesResult, ScanPlanningFilters (decode(), mayMatch(statistics)), ScanBranch.withStatistics(rowCount, columnStatistics), TableInfo.scan_planning, client ScanBranchesDecoder. The generated VgiService.catalog_table_scan_branches_get gains a trailing pushdown_filters parameter (pass null from clients that cannot defer planning).
v0.46.4
Secret ATTACH options now follow the cross-SDK spec (docs).
- The AEAD key is
HKDF-SHA256(root, info "vgi.attach_secret_options.v1"); the configured signing key, HTTP sealing key or host-local key is never used directly. - Encrypted blob is
version(0x01) || nonce || ciphertext || tag, AAD-bound to the attach uuid. - A blob that does not open (another deployment, deleted/rotated host key file, moved blob) is refused with the uniform
attach_opaque_data not recognizederror (INVALID_ARGUMENT/opaque_data_not_recognized) instead of secrets silently reading as absent. - Host-local key file path matches every SDK:
$VGI_ATTACH_SECRET_KEY_FILE, else$XDG_RUNTIME_DIR/vgi/attach-secret-options.key, else<$TMPDIR or java.io.tmpdir>/vgi-<user>/attach-secret-options.key. - New
AttachOptions.open(attachId): producers and exchanges keep only the attach id in their state and re-open the options (secret ones included) while producing. - txfix fixture:
whoami().token_in_attach_data; CI runs vgi v2.022140b0.
Attaches made by a 0.46.3 worker that carried secret options must be re-attached after upgrading.
v0.46.3
Writable tables, transaction hooks and ATTACH options for the main catalog (docs).
- Writable catalog tables:
CatalogTable.Builder#insertFunction/updateFunction/deleteFunction/writeResultMode;TableInfoadvertises them andcatalog_table_{insert,update,delete}_function_getnow answer. Newfarm.query.vgi.writepackage:WriteOptions,WriteResultMode,WriteOperation,WriteResults(rowIdField,resultSchema,resultBatch, ...). - Constraint enforcement: a writable table with constraint records negotiates
vgi.constraint.enforce.v1automatically; a provider advertising enforce without records-read is no longer dropped. Worker.onAttach(AttachHook)returnsAttachSettings(per-attachsupports_transactions/supports_time_travel);Worker.supportsTransactions(boolean)/supportsTimeTravel(boolean)set the worker-wide defaults (stilltrue).Worker.transactionHooks(TransactionHooks): begin mints the plaintext transaction id; commit (throw to fail COMMIT) and rollback get the same bytes on every transport, HTTP included.CatalogInterfacegains the same hooks.- Functions get
transactionId()andattachOptions()(AttachOptions, secret options included) on table and table in-out bind/init params;TableInOutInitParamsalso getsattachId()andbindOpaqueData(). - Secret ATTACH options reach functions: they are encrypted into
attach_opaque_data(configured signing key, else HTTP sealing key, else a per-user host key file shared by pooled/stdio processes), never plaintext. - The main catalog's resolved data version now survives on a process that never served the ATTACH.
FunctionMetadata.withStability,Schemas.serialize;TransactionStoragedocs corrected.txfixfixture worker; CI runs the vgiwritable_txsuite (vgi c4a9fea) on launch, shm and http.
v0.46.2
Secret-lookup conformance fix.
Secrets.lookup(type),lookupNamed(type, name),require(type): select by the secret'stypefield (columns are keyed by secret name, e.g.__default_<type>), with column-name fallback only for secrets lacking atypefield;requireerrors name the type, never a value.FunctionRequiredSecretrejects a blank type and gainsofType/scoped/namedfactories; a null declaration fails the listing instead of being dropped.requiredSecrets()moved toFunctionDescriptor: scalar, table-in-out and buffering functions can now declare required secrets (previously silently advertised as empty).- Example worker implements the five secret-lookup conformance fixtures; CI runs the vgi 5575cff suite with
VGI_SECRET_LOOKUP_FIXTURES=1.
v0.46.1
Bug-fix release (no wire or API changes).
- Constraints on named-only arguments (
ArgSpec.named) are now enforced against the named value; they no longer consume positional slots. Varargs consts check every value. patternconstraints are an unanchored search (like JSON Schema / ECMA, Rust, Go). Anchor with ^/$ for a full match.- HTTP: with no explicit
tokenKey, the stream-state token key is derived fromVGI_SIGNING_KEY/Worker.signingKey(HKDF-SHA256, labelvgi.http.state_token_key.v1), so table-function streams resume across replicas and restarts. Without a signing key a warning is logged at startup. - Catalog listing: a function whose
onBindthrows on the empty-argument probe no longer breaks ATTACH; it is advertised with an empty output schema and validated at the real bind.
vgi-java 0.46.0
Protocol 3.1 release adding typed key grouping and range partitioning metadata, strict distribution validation, authoritative-schema filter decoding, and expanded planning/client coverage.
v0.45.1
VGI protocol v3 (vgi.v3) fixes: public canonical constraint record builder and decoder; automatic constraint read-profile negotiation; Arrow nullability relaxed automatically for columns no NOT_NULL/PRIMARY KEY record names; SDK-side validation matching the DuckDB extension's ATTACH rules; generated-column rules checked and legacy generated_expression metadata translated; legacy constraint fields deprecated. See the commit log for language-specific fixes.
Java: versioned tables re-own their constraint records (AT VERSION no longer throws); viewCreate override chain restored; capability hooks for hosted and extra catalogs; public virtualGenerated and MacroInfo.of helpers.
v0.45.0
VGI Java 0.45.0 introduces the VGI 3.0.0 wire protocol under vgi.v3, including the consolidated catalog, metadata, typed query parameters and explicit remote-query contracts prepared for DuckDB 2.0.
Upgrade native clients and workers together: vgi.v2 peers are incompatible. This release requires farm.query:vgirpc:0.33.2, now available from Maven Central, which preserves catalog record dictionary annotations.
Validation includes the full Java test suites, publication Javadoc checks and worker distribution against the published RPC artifact with local source substitution disabled. The candidate also passed the prior DuckDB 1.5 and DuckDB 2.0 native integration qualification, including the HTTP matrix. CI pins the immutable VGI 3 native 1.5 runner.
v0.44.0
This release adds continued table-in-out output and input_rows_per_call. It requires the vgi DuckDB extension at or after fc3e08f (Query-farm/vgi main, published to the haybarn community channel as 454fefa). The wire stays vgi.v2 2.2.0.
- A table-in-out exchange can answer one input batch with several replies: it emits each reply but the last with
TableInOutExchangeState.withMoreOutput(true, metadata)(vgi.status: HAVE_MORE_OUTPUT), and the framework answers the client's zero-rowCONTINUEticks through the exchange'sresume(). The exchange object is the resume state; its pending flag rides the HTTP state token. A continuing function declares its exchange class throughTableInOutFunction.continuationState(). RowTransformFunction.inputRowsPerCall()sets the new nullableFunctionInfo.input_rows_per_call(regenerated protocol code, new contract hash).- New framework refusals: a table-in-out turn (
onInputBatchorresume) that emits no batch now fails instead of leaving the pipe client waiting forever; ticks with nothing pending or with rows, real input while output is pending, cache control on a tick's reply, "more" withoutresume()and "more" from a table producer are refused. At startup (and again on the exchange's runtime class) a continuation state withoutresume(), a no-arg constructor or fields of its own, aPortableStreamState, or a function withmaxWorkers()of 1 is refused. - A turn that throws releases what it emitted before failing.
- Adds the standard
blended_paged,blended_slicedandpaged_explodefixtures.
Requires farm.query:vgirpc:0.33.1 (unchanged).
Release validation: the Maven-only build (VGI_RPC_JAVA_DIR=/nonexistent ./gradlew :vgi:test :vgi:javadoc) passed with sibling RPC source disabled.
v0.43.0
This release upgrades catalog metadata to VGI wire 2.2.0 (vgi.v2). Native clients and workers must both speak wire 2.2.x; wire 2.1 clients are incompatible, so upgrade them together.
catalog_contentsbatches every metadata object type into six catalog-wide Arrow IPC streams spanning schema boundaries. Readers handle every row, multiple batches, and dictionary replacement.- Function argument schemas, output schemas, and parameter defaults share binary dictionary entries without changing the byte-array authoring API.
- Optional catalog publication supports durable S3/R2 manifests, validated externalized results, recovery after restart, scoped authentication, ETags, bounded caches, expiry, renewal, conditional invalidation, and concurrent publication per identity.
SchemaInfono longer includes attachment bytes. Actual attachment requests/results and function state remain unchanged.
Requires farm.query:vgirpc:0.33.1, published separately to Maven Central. CI and release builds use the public package rather than an RPC source override.
See catalog metadata and publication for configuration and migration details.
Release validation: the Maven-only build, all 637 SDK tests (635 passed, 2 skipped), Javadoc, example-worker distribution, and generated package metadata passed with sibling RPC source disabled. Package metadata pins RPC 0.33.1.