`join` on empty collection — FHIRPath says empty, our tests say empty string, fixing it breaks implementations — Jan 13, 2026
The join mismatch
FHIRPath's own test suite says join on an empty collection returns an empty collection; the SQL on FHIR tests expect an empty string.
The group leaned towards following FHIRPath and stating explicitly that an empty collection is null in the result.
That's a breaking change with a real cost: implementations were forced to return an empty string to make the tests green, so they'll have to go and fix their engines, and it needs a release note and a changelog.
A second mess to clean up: join isn't in normative FHIRPath, so its tests belong under the experimental tag, but some of them leaked into the non-experimental part, which quietly misleads everyone.
The harder sub-question nobody settled
With collection: true, what does an empty collection come back as?
FHIRPath can't distinguish null from an empty collection in the first place — emptiness propagates through functions exactly like null, so you can't tell whether a filter matched nothing or the element was never there.
Null is the only representation that makes sense across every engine, but a zero-length array is what ANSI SQL would give you.
canonical + special extension for ViewDefinition
ViewDefinition isn't a real FHIR resource type, so the operation's parameter has to be typed canonical with a special extension marking it as actually being a ViewDefinition — a workaround suggested by Graham, because otherwise the IG builder simply can't build it.
It works, but the published documentation then reads as though the parameter really is a canonical, which is confusing to anyone learning from it. The follow-up is to get the IG builder to honour the extension and render ViewDefinition instead.
SQL on FHIR 2.0.0 never appeared in the package registry
The IG registry pull request was accepted, but the version never actually appeared.
It surfaced by accident: building an unrelated IG throws an error saying it can't find SQL on FHIR. The theory: only published releases get picked up, and there's no such thing as publishing a nightly or CI build — so the released version needs to land there, separate from whatever the current snapshot is.
John — Pathling side working end to end
SQL on FHIR $run and $export working, alongside bulk export, two flavours of bulk import, and an experimental bulk submit.
The notable part: making the query builder UI work meant supporting ViewDefinition as a full CRUD resource across the API — create it, read it, run it — not just implementing $run.