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

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions