If there’s not a projection at the front of a pipeline during planning, we'll try to create one to push down by doing dependency analysis on the pipeline, then constructing a projection from the results. The logic for converting the dependency analysis results to a projection spec relies on set iterators going in lexicographic order so that a string is always directly before all of the fields it prefixes.
That is true in some cases. If the pipeline has dependencies on “a.b” and “a.b.c”, then we process the strings in that order and we create a projection indicating that “a.b” should be included.
However, if the pipeline has dependencies on “a.b”, “a.b.c”, and “a.b-d”, then the order we process the fields in is “a.b”, “a.b-d”, “a.b.c”. As a result, we try to create a projection indicating that all three fields should be included. This fails with a path collision error.