Skip to content
Permalink

Comparing changes

Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: vortex-data/vortex
Failed to load repositories. Confirm that selected base ref is valid, then try again.
Loading
base: develop
Choose a base ref
...
head repository: vortex-data/vortex
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: claude/double-encoding-issue-prxkfa
Choose a head ref
Checking mergeability… Don’t worry, you can still create the pull request.
  • 1 commit
  • 8 files changed
  • 1 contributor

Commits on Aug 15, 2026

  1. fix: stop percent-encoding object keys on the way to the request

    `vx.io.read_url("s3://bucket/repro~tilde~key/data.vortex")` 404s even though
    the object exists: the key is percent-encoded twice on its way to the HTTP
    request (`~` -> `%7E` -> `%257E`). `~` is unreserved per RFC 3986 §2.3 and
    must never be encoded.
    
    `object_store`'s `Path::from` percent-encodes `~ % # [ ] { } ^ | * ? < > " \`
    into the key *itself* (`a~b.vortex` becomes the key `a%7Eb.vortex`), and the
    request layer then encodes the resulting `%` again. Two conversions on the read
    path did this:
    
    - `VortexOpenOptions::open_object_store` converted its `&str` key with
      `path.into()`, i.e. `Path::from`.
    - `resolve_store` built the path for an explicitly-passed store with
      `Path::from`.
    
    The registry itself was already correct — it decodes URL path segments with
    `Path::from_url_path` — so the encoding was introduced downstream of it, and
    applied twice when both sites ran.
    
    `Path::parse` preserves those characters, so use it at both sites. That is
    already the convention for keys elsewhere: `ObjectStoreFileSystem` had a
    private `to_object_path` doing exactly this, so promote it to a public
    `vortex_io::object_store::object_path_from_literal` rather than add a third
    copy.
    
    Tests live in `vortex-cloud`, which owns URL-to-key resolution.
    `test_resolved_key_reaches_the_object` drives the whole chain — seed a store
    with the literal key out of band, resolve the URL, open through `vortex-file` —
    and fails on 7 of its 9 keys without the fix, with the reported error verbatim
    (`Object at location repro%7Etilde%7Ekey/data.vortex not found`); the `space`
    and `plain` cases are controls that pass either way. This needs a test-only
    dependency on `vortex-file`; nothing in that crate's tree reaches back here, so
    it is not a cycle.
    
    Fixes #9420
    
    Signed-off-by: "Robert" <robert@spiraldb.com>
    claude committed Aug 15, 2026
    Configuration menu
    Copy the full SHA
    e7369dc View commit details
    Browse the repository at this point in the history
Loading