v6.2.0
What's new in v6.2
Two defects found by an audit, both of which had been documented as correct. That is what made them survive review: reading the code confirmed the comment, and the comment was the bug. Neither changes an outcome that was previously right.
⚠️ A null range now reads back asnullinstead of throwing. A nullInt32Range?property serialized to{"Seats":null}and threwJsonExceptionon the way back in — the package could not read a document it had just written, so an API could return a body it was unable to accept.nullis now left to System.Text.Json in both directions, asRangeSetand the value sets always did.nulland the empty range stay distinct: absent isnull, empty is the literal"empty". If you relied on the exception to reject a null where a non-nullable range was expected, that validation is gone — the property now receivesnull, as any other reference-typed property would. Malformed literals are still rejected. Applies to the NodaTime ranges too, which serialize through the same factory.Countover a union reached throughRemovecounted shared elements twice.Uniontranslates toarray_cat, which concatenates, soCountover a server-computed union has always been refused — but the check matched only the outermost call, andarray_removepreserves canonical form rather than establishing it. Against live PostgreSQL,{a,c}unioned with{a,b}answered 4 where the in-memory expression is{a,b,c}— 3. A query that previously ran now behaves differently: in a predicate it fails translation rather than filtering on an inflated number, and in a projection it falls back to client evaluation and returns the correct count.
Also in this release, for every package: symbol packages (.snupkg) and Source Link, so you can step into the code you are running and confirm it was built from the commit it claims; deterministic builds; and a CycloneDX SBOM per release. CodoMetis.ValueRanges and CodoMetis.ValueRanges.EFCore.PostgreSQL now ship their own package READMEs instead of this one.