All notable changes to the hyperdb-bootstrap crate will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
- Upgraded
zipfrom 8 to 9 to pick up the fixes for RUSTSEC-2026-0367, RUSTSEC-2026-0368 and RUSTSEC-2026-0369 (symlink and SUID/SGID handling inZipArchive::extract).extract_hyperdwalks entries itself and never callsextract, so it was not exercising the vulnerable path, but the dependency now clearscargo auditandcargo deny. No source changes were needed. - The installer now validates the release
versionbefore using it as a directory name. A version such as../victimmade the install stepremove_dir_alla path outside the install root. A version containing anything other than ASCII alphanumerics,.,-,_or+(or equal to./..) is rejected with the newError::InvalidVersionvariant.
Entries accumulated under [Unreleased] from 0.1.1 until this section was
dated, so several first shipped in earlier releases. The root CHANGELOG.md
records where each shipped: the 0.0.26359 pin in 0.7.1, and the PyPI wheels
with the 0.0.26479 pin in 1.0.0-rc.2.
-
BREAKING:
hyperdis now downloaded from the PyPItableauhyperapiwheels instead of Tableau's Hyper Java API zips, and the pin moves to0.0.26479. The motivation is that a wheel URL is fully constructible from the version plus the platform's wheel tag:https://files.pythonhosted.org/packages/py3/t/tableauhyperapi/tableauhyperapi-{version}-py3-none-{wheel_tag}.whlwhereas the Tableau zip filenames embed an opaque
build_id(r07abb490) that cannot be derived from the version — which is why bumping the pin used to require scraping an HTML page. And because PyPI publishes a sha256 per file, the four pinned digests are now read offhttps://pypi.org/pypi/tableauhyperapi/<version>/jsonrather than produced by downloading four ~80 MB archives and hashing them by hand. The digests are still committed: a hash in git is an attestation independent of the host serving the bytes.The bytes are unchanged. The
hyperdinside themacosx_13_0_arm64wheel is bit-identical to the one extracted from the corresponding Java zip — sha256aef5c81970bb4d84d06fb9513d5ffd722526fce779632a0c5f63d87b6450e478, 277,836,448 bytes. Same build, different envelope; the wheels are ~3.6–4.5% smaller. Both binaries reportminos 13.0, so themacosx_13_0wheel tag is not a raised support floor and no contributor loses support.BREAKING consequences for the pin format and the public API:
hyperd-version.tomlnow holdsversion, a[wheel_tag]table, and[sha256].build_idis gone. The wheel tags are pin data rather than Rust constants because they are not stable across releases (arm64 wheels only exist from0.0.19484; a future macOS floor bump would changemacosx_13_0_arm64) and a wrong tag yields a silent 404 — keeping them in the pin makes any such change a visible pin edit.build.rsnow validatesversion, the[wheel_tag]entries, and the sha256 shapes; it no longer validatesbuild_id.- The install layout is keyed on the version alone: the versioned cache
directory is
<dest>/0.0.26479/(was<dest>/0.0.26479.r96880f6a/) andcurrent/VERSIONcontains just0.0.26479. hyperdis extracted fromtableauhyperapi/bin/hyper/inside the wheel rather thanlib/hyper/inside the zip.- New
PinnedRelease::wheel_tag_for(Platform) -> Option<&str>. url::build_download_urlis now fallible, returningResult<String, Error>— a platform with no pinned wheel tag is an error (Error::MissingWheelTag, a new variant).verifynow additionally cross-checks every pinned sha256 against the digest PyPI publishes for that exact wheel filename, on top of HEAD-ing the four download URLs. It therefore validates the exact pinned bytes rather than merely that the CDN serves something at that path.
-
The minimum supported Rust version is now 1.88, up from 1.81, and the crate is compiled with edition 2024. 1.88 is the version Red Hat Enterprise Linux 9.7 ships as
rust-toolset. -
BREAKING: the TLS crypto provider is now ring rather than AWS-LC. This crate declares its own
reqwestdependency rather than inheriting the workspace entry, and asked for therustlsfeature — which forces theaws-lc-rsprovider and, through Cargo's feature unification, imposed it on every crate in the workspace. It now usesrustls-no-provider.That feature links no provider at all, and
reqwestresolves one throughCryptoProvider::get_default(), which has no crate-feature fallback — soscrape_latestnow installs ring as the process-wide default before building its HTTP client. Embedders take note: if your application installs its ownCryptoProvider, install it before calling into this crate; ours defers to an already-installed provider rather than replacing it.Guarded by a unit test that builds a
reqwestclient, which needs no network because the failure is a panic insidebuild().This entire workaround is retired by the PyPI migration above, which drops
reqwestandrustlsfrom the crate: there is no in-process HTTP client left, so there is no crypto provider to select.ensure_crypto_provider, therustls-no-providerfeature, and the ring pin are all gone, and the feature-unification pressure this bullet describes no longer exists for the rest of the workspace. -
Bump the pinned
hyperdrelease to0.0.26359(r07abb490). This supersedes the never-shipped0.0.26225bump attempt (PR #219), which was held because0.0.26225deadlocked on Apple Silicon Macs running macOS versions prior to 26 during JIT exception-frame registration.0.0.26359fixes that engine defect ("Fixed an issue in Hyper on Apple Silicon Macs running macOS versions prior to version 26"). Updates the version, build id, and all four per-platform sha256s inhyperd-version.toml. Performance (same-session A/B vs the live0.0.25080pin, median of 3 runs at 100M rows, single-connection):full_scanqueries +67% sync / +33% async on the dominant scan path, filtered queries ~flat; bulk inserts show a small regression (Inserter −11%, ChunkSender −6%, async −4%) — soft numbers, as the insert path carries cold-start variance and multi-connection deltas throttle thermally on a laptop. Verified native arm64 and all 1485 workspace tests pass; the macOS-14 CI runner is green (the deadlock is gone). -
Bump the pinned
hyperdrelease to0.0.26479(engine buildr96880f6a). The engine bump rides with the PyPI migration above, which is what now carries the pin. Verified native arm64 —filereportsMach-O 64-bit executable arm64for the extractedmacos-arm64binary. All four platform URLs return HTTP 200 at the new pin, and the workspace test suite passes against the new engine. Performance (interleaved same-session A/B vs the previous0.0.26359pin, medians of 5 runs per engine at 100M rows, single-connection): the async Arrow insert path more than doubles (AsyncArrowInserter+127%, 30.4 → 68.9 M rows/s), reproduced as +75% at 10M rows. Everything else is flat — syncInserter+0.1%,ChunkSender+1.4%, and all four query paths within ±0.7%. The async insert gain survives its own wide (±25–35%) run-to-run spread because the old and new sample ranges do not overlap at either scale. Multi-connection (× 4) deltas are not reported: on this 14-core laptop they throttle thermally and spread 17–41% run to run, enough to have read +23% at 100M and −20% at 10M for the same workload in the same session.
Everything here follows from the move to PyPI wheels described under Changed: the build id no longer exists as a concept, and nothing needs to be discovered by scraping.
- BREAKING: the
--build-idCLI flag is removed.--version Xon its own is now a complete version source: it inherits the builtin pin's[wheel_tag]values and carries no digests, so the download is unverified and logs a WARN. The four wheel tags are unchanged from0.0.19484through0.0.26479, so this covers any realistic ad-hoc pin or A/B baseline; for a release whose tags differ, use--version-filewith a full pin. - BREAKING: the
--latestCLI flag, theVersionSource::ScrapeLatestvariant, and the wholescrapemodule are removed. The scraper had been broken for three-plus releases without anyone noticing, because its tests passed against a synthetic fixture rather than the live page. It had two independent defects: the heading regex expected<h3>VERSION [DATE]</h3>, but Docusaurus renders0.0.26479 <!-- -->[September 3 2026], which\s*cannot span; and the build-id capture hardcoded(rc[a-z0-9]+)while every build id since0.0.24457has beenrfollowed by hex. It is deleted rather than fixed — with a constructible URL and published digests, there is nothing left for it to do. Version-source precedence is now, highest to lowest:--version X,--version-file PATH, an auto-discovered./hyperd-version.toml, then the compiled-in default. - BREAKING:
PinnedRelease::build_idandInstalledHyperd::build_idare removed, as isPinnedRelease::version_tag(). Use.version, which is now the only release identifier, andPinnedRelease::wheel_tag_for()for the per-platform tag. - BREAKING: the
Error::Http,Error::HttpStatus, andError::ScrapeFailedvariants are removed. All three existed only to serve the scraper. - BREAKING: the
regex,reqwest, andrustlsdependencies are dropped entirely.download.rsandverify.rsalready shell out tocurl— deliberately, because Akamai bot protection blocked non-browser TLS stacks from GitHub runner IPs — so removing the scraper leaves no in-process HTTP client behind.
-
The "no hyperd installed" error suggested
hyperd-bootstrap download, but the binary ishyperdb-bootstrap— the suggested command did not exist. Doc comments across the crate carried the same pre-rename name, as did thehyperdb-bootstrap/hyperd-version.tomlpath inrelease.rs. -
The extracted macOS arm64
hyperdis a native arm64 binary. Earlier releases of Tableau's C++macos-arm64zip shipped an x86_64hyperd(an upstream packaging defect), so on Apple Silicon the extracted binary only ran under Rosetta; this crate switched to the Java bundle to get a native one. Tableau fixed the C++ packaging in0.0.26225, and from that release the C++ and Java binaries are byte-identical, so the bundle choice stopped mattering — and the move to PyPI wheels under Changed supersedes it entirely. The wheels carry the same native arm64 build.
install()library function andhyperdb-bootstrapCLI binaryInstallOptionsfor configuring an install (destination, version source, sha256 verification)InstalledHyperddescribing a successful install (path, platform, release metadata)VersionSourceenum (pinned compile-time metadata, custom version file, or--latestscrape)Platformenum and detection for macOS (arm64/x86_64), Linux (x86_64), Windows (x86_64)PinnedReleasefor the pinned release metadata baked in at compile time viahyperd-version.tomlverify_release()library API andverifyCLI subcommand that HEADs every supported platform's URL — wired into a GitHub Actions workflow for CIVerifyOutcomedescribing the result of a verificationErrortype for structured error handling--latestbest-effort scrape of the public Tableau releases page--version-fileoverride plus auto-discovery of./hyperd-version.toml- sha256 verification when hashes are available
build.rscompile-time validation ofhyperd-version.toml(shape, hex sha256s, known platform keys; empty sha256s warn)DEFAULT_DEST_ROOTconstant for the default install destination