Skip to content

Add DISTINCT to the CTE queries for hierarchies [RUN ALL RSPEC] [RUN AS-IF-FOSS]

Adam Hegyi requested to merge ahegyi-make-hierarchcy-cte-distinct into master

What does this MR do?

Adds distinct to the recursive CTE namespace queries while maintaining the original breadth first order.

Calling DISTINCT alters the original row order from PG (breadth first). We have some features, test cases depending on this order so to fix it, we'll need to restore the order by using the depth function provided by the ObjectHierarchy class.

Adding the calculated depth column to the returned rows breaks specific queries with UNION because the number of columns does not match. To solve this, the queries were nested as subqueries.

The queries are longer, more complex, but there is no significant performance difference.


Query and plan: https://explain.depesz.com/s/W7XeX

I tested it with DB lab and the planner is no longer using hash join.

There are more plans in the comment: !56509 (comment 529624296)

Does this MR meet the acceptance criteria?

Conformity

Availability and Testing

Security

If this MR contains changes to processing or storing of credentials or tokens, authorization and authentication methods and other items described in the security review guidelines:

  • Label as security and @ mention @gitlab-com/gl-security/appsec
  • The MR includes necessary changes to maintain consistency between UI, API, email, or other methods
  • Security reports checked/validated by a reviewer from the AppSec team
Edited by Adam Hegyi

Merge request reports