Repository navigation
Epic: 10.4.0 #472
Copy link
Copy link
Closed
21 / 2121 of 21 issues completedLabels
area/releaseVersioning, changelogs, release wiringVersioning, changelogs, release wiringepicTracks a release or a theme; its sub-issues are the workTracks a release or a theme; its sub-issues are the work
Milestone
Description
Goal
10.4.0 is the fourth release on the 10.x LTS line, shipped from release/10.x. It is opened right after v10.3.0 (#470) so that fixes and ports have a version to land in. Additions can still ship on 10.x until six months after v11.0.0 (CONTRIBUTING.md#branches-and-releases).
Scope
Decided (2026-10-26):
- Translate value set Intersect, Except, Add and a canonical Union for the non-text families with composed SQL #478: value set
Intersect,Except,Addand a canonicalUniontranslated for the non-text families. Done (2026-10-26): merged intomainby PR feat: translate value set Union, Add, Intersect and Except canonically for every family but text (#478) #480 and ported torelease/10.xby 10.x: translate value set Union, Add, Intersect and Except canonically (port of #478) #481 (PR feat: translate value set Union, Add, Intersect and Except canonically, on 10.x (port of #478, #481) #482). - Translate RangeSet.Count as a counted unnest of the multirange, built after the alias pass as #478 builds its subqueries (split from #94) #484:
RangeSet.Count, split from Translate enumeration of a multirange column: Count, Any, All, SelectMany over a RangeSet (unnest) #94. It's built after the alias pass, as Translate value set Intersect, Except, Add and a canonical Union for the non-text families with composed SQL #478 builds its subqueries. Merged intomainby PR feat: translate RangeSet.Count as a counted unnest of the multirange (#484) #491 (848fc0f); ported by PR feat: translate RangeSet.Count, on 10.x (port of #484, #495) #499 (7525c3e). - Translate text value set Intersect, Except, Add, Count and equality where the result needs no order (StringSet, StringSet<T>) #485: text value sets:
Intersect,Except,Add,Countand equality, where the result needs no order. It's the 10.x answer for text until Decide the canonical order of string-backed value sets for 11.0.0: code point order, which PostgreSQL can sort, or ordinal #479. Merged intomainby PR feat: run text value set operations as SQL where order and repeats don't count (#485) #493 (40c81da; GitHub shows the PR closed, see its comment); ported by PR feat: run text value set operations as SQL where order and repeats don't count, on 10.x (port of #485, #497) #501 (61308c6). - Translate Clamp on the remaining range types, each once it agrees with memory as Int32Range, Int64Range and DecimalRange do #486:
Clampon the remaining range types, each once it agrees with memory. Merged intomainby PR feat: translate Clamp on every range type (#486) #490 (ac9bd90); ported by PR feat: translate Clamp on every range type, on 10.x (port of #486, #494) #498 (a5cc7da). - Text value set operators follow a nondeterministic column collation: on a case-insensitive column, Contains("a") is true for {A} and Remove("a") deletes A #483 (
silent): text value set operators follow a nondeterministic column collation, andExecuteUpdatewithRemovecan delete an element memory keeps. A fix that changes answers ships under### Changed answers, on every supported line. Decided: rejected at model build (Text value set operators follow a nondeterministic column collation: on a case-insensitive column, Contains("a") is true for {A} and Remove("a") deletes A #483 comment). Merged intomainby PR fix: reject a collation on a string set column unless it compares bytes (#483) #492 (3776504); ported by PR fix: reject a collation on a string set column unless it compares bytes, on 10.x (port of #483, #496) #500 (6cbddaf). - LowerBound(), UpperBound() and Clamp in a query read a date range another tool wrote with an exclusive infinite bound one day wider than memory loads it #489 (
silent):LowerBound(),UpperBound()andClampin a query read a date range another tool wrote with an exclusive infinite bound one day wider than memory loads it, which contradicts this release'sClamprow. Decided (2026-10-26): option 1, read the bound as memory does. Also fixesLowerBoundInclusive()and theRangeSetreaders. Merged intomainby PR fix: read an exclusive infinite date bound as memory loads it (#489) #503 (2949415); ported by PR fix: read an exclusive infinite date bound as memory loads it (port of #489, #502) #504 (a958bef, 10.x: read an exclusive infinite date bound as memory loads it (port of #489) #502).
Still candidates, carried over from #408's "Not in scope" list:
- Translate enumeration and the bridge conversions — a batch after 10.3.0 #407: enumeration and the multirange-to-set bridges (with Translate enumeration of a multirange column: Count, Any, All, SelectMany over a RangeSet (unnest) #94, Translate element-wise predicates over a value set column: Any, All, SelectMany (unnest) #95 and Aggregate a column into a value set in a GroupBy projection (array_agg) #96). Value set
Intersect/Exceptmoved from it to Translate value set Intersect, Except, Add and a canonical Union for the non-text families with composed SQL #478, and its bridges into value sets use Translate value set Intersect, Except, Add and a canonical Union for the non-text families with composed SQL #478's canonicalizing expression. - Opt-in strict finite factory: refuse start > end as written, translated to the bare PostgreSQL constructor #429: the strict finite factory, once its public API is settled.
Not in 10.4.0 (decided 2026-10-26):
- Translate ToRangeSet() from Int32Set, Int64Set, DateSet, LocalDateSet and YearMonthSet (split from #407) #487:
ToRangeSet()from a value set, split from Translate enumeration and the bridge conversions — a batch after 10.3.0 #407. Deferred to 10.5.0. - EF Core: a value set column reads and writes wrapper elements through the element's Parse, so a rule tightened after the rows were written makes them unreadable #488: reading wrapper elements without their
Parse. Its option is undecided.
A change for both lines merges into main first and is cherry-picked with -x into release/10.x.
Sequence
- Open 10.4.0 on
release/10.x:Version, the baseline, the SECURITY.md row, the walkthrough sample and undated changelog sections (sub-issue). - Decide the scope and attach it as sub-issues.
- Tag.
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
area/releaseVersioning, changelogs, release wiringVersioning, changelogs, release wiringepicTracks a release or a theme; its sub-issues are the workTracks a release or a theme; its sub-issues are the work
Activity
CaffeinatedCoder commentedon Oct 26, 2026
10.4.0 shipped on 2026-10-26.
v10.4.0is on 88a1628 (date PR #520). Release run 40377184310 published all four packages to nuget.org, and the GitHub release is Latest.What shipped, every item merged into
mainfirst and ported torelease/10.x:Union/Add/Intersect/Exceptas SQL for the non-text families (Translate value set Intersect, Except, Add and a canonical Union for the non-text families with composed SQL #478/10.x: translate value set Union, Add, Intersect and Except canonically (port of #478) #481),RangeSet.Count(Translate RangeSet.Count as a counted unnest of the multirange, built after the alias pass as #478 builds its subqueries (split from #94) #484/10.x: translate RangeSet.Count (port of #484) #495), text value set operations where order and repeats don't count (Translate text value set Intersect, Except, Add, Count and equality where the result needs no order (StringSet, StringSet<T>) #485/10.x: run text value set operations as SQL where order and repeats don't count (port of #485) #497), andClampas SQL on every range type (Translate Clamp on the remaining range types, each once it agrees with memory as Int32Range, Int64Range and DecimalRange do #486/10.x: translate Clamp on every range type (port of #486) #494).YearMonthRangeupper bounds now compare with a month as in memory (YearMonthRange Clamp and UpperBound() in a filter compare as the month's last day, so == against the month is false #506/10.x: read a YearMonthRange upper bound in a query as the first day of its month (port of #506) #511).Release steps (#519):
mainis chore: carry the 10.4.0 sections to main (#519) #523 (4720d57). It adds## Changed answers in 10.4.0and moves the baseline to 10.4.0.release/10.xby chore: open 10.5.0 on release/10.x (#522) #524 (367fd41, Open 10.5.0 on release/10.x #522), under epic Epic: 10.5.0 #521. Translate ToRangeSet() from Int32Set, Int64Set, DateSet, LocalDateSet and YearMonthSet (split from #407) #487 moved there.Not shipped, carried to #521: #407, #429 and #488.