Add DISTINCT to the CTE queries for hierarchies [RUN ALL RSPEC] [RUN AS-IF-FOSS]
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
-
📋 Does this MR need a changelog?-
I have included a changelog entry. -
I have not included a changelog entry because _____.
-
-
Documentation (if required) -
Code review guidelines -
Merge request performance guidelines -
Style guides -
Database guides -
Separation of EE specific content
Availability and Testing
-
Review and add/update tests for this feature/bug. Consider all test levels. See the Test Planning Process. -
Tested in all supported browsers -
Informed Infrastructure department of a default or new setting change, if applicable per definition of done
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