Skip to content

Windows: loose exchange-mode result-cache memos never reach the disk tier #4

Description

@rustyconover

Found while greening the vgi-rust SDK CI (windows-latest / http lane), 2026-07-16.

Symptom: with vgi_result_cache_pack = false, vgi_result_cache_dir + vgi_result_cache_disk_max_bytes set, and per-value memoization at its default, a correlated LATERAL over a temp table (SELECT count(*) FROM t, LATERAL ex.cached_double(t.x) after a flush) writes zero objects/*.vrc and refs/*.ref on Windows — deterministic across reruns (vgi-rust Integration run 29546814011, twice). The in-memory exchange cache works (hit/miss assertions earlier in the same file pass).

What DOES work on the same Windows runner, which narrows it down:

  • the loose ref-count-cap flow later in the same file (vgi_result_cache_per_value = false, single-row VALUES inputs) persists refs fine;
  • producer-mode disk tests (cache/disk.test, cache/disk_streaming.test) persist fine;
  • macOS / Linux pass the identical section.

So the failing combination is roughly: loose store + per-value default ON + multi-row temp-table LATERAL input, Windows only. VgiResultCache::PersistToDisk has a best-effort catch (...) that swallows whatever throws (src/vgi_result_cache.cpp), so the cause is invisible in logs — instrumenting that catch on a Windows box is probably the fastest route.

Mitigation in tree: 400fac7 split the assertions into test/sql/integration/cache/exchange_lateral_disk.test gated require notwindows, so SDK CIs stay green on Windows. Re-merge that file into cache/exchange_lateral.test when fixing this.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions