UNION versus collations
Tom Lane <tgl@sss.pgh.pa.us>
From: Tom Lane <tgl@sss.pgh.pa.us>
To: pgsql-hackers@lists.postgresql.org
Date: 2024-11-18T22:56:19Z
Lists: pgsql-hackers
Attachments
- check-collations-when-merging-UNIONs.patch (text/x-diff) patch
prepunion.c's plan_union_children(), which merges identically-propertied UNION operations into one, has this comment: * NOTE: currently, we ignore collations while determining if a child has * the same properties. This is semantically sound only so long as all * collations have the same notion of equality. It is valid from an * implementation standpoint because we don't care about the ordering of * a UNION child's result: UNION ALL results are always unordered, and * generate_union_paths will force a fresh sort if the top level is a UNION. This argument seems well past its sell-by date. In the first place, now that we have nondeterministic collations we can't assume that "all collations have the same notion of equality". In the second place, since commit 66c0185a3 it's completely untrue that "we don't care about the ordering of a UNION child's result", and also untrue that "generate_union_paths will force a fresh sort". As far as I can tell from some desultory testing, the implementation issues don't lead to any observable bugs. Even though the code may try to produce wrongly-ordered paths for the sub-SELECTs, the pathkey logic will recognize that it's not really the same ordering, leading to injection of per-child Sorts. Nonetheless, we're wasting cycles producing useless ordered paths, and perhaps we might pick a less than optimal plan in some cases (not entirely sure about that). The point about nondeterministic collations is undeniable though. I've not bothered to build a test case, but surely one can be made wherein a sub-UNION acts differently than expected. So I think we ought to apply the attached as far back as we have nondeterministic collations. regards, tom lane
Commits
-
Compare collations before merging UNION operations.
- fd3383ff1107 15.11 landed
- f286f64bcf01 16.7 landed
- c1ebef3c10db 17.3 landed
- a43d7a8c7cce 18.0 landed
- 6b66dba3f8d8 13.19 landed
- 44a4a521d03a 14.16 landed
-
Allow planner to use Merge Append to efficiently implement UNION
- 66c0185a3d14 17.0 cited