Querying board issues produces a DB query without LIMIT
When issues are queried for boards GraphQL API, we need to check and initialize their relative positions if nil and this was implemented in !68715 (merged).
However, the implementation was faulty because it returned the wrong attribute of a pagination connections instance and this resulted in a db query without LIMIT
(first discovered here)
To reproduce the issue, visit any board page and checkout the issues DB query in the performance bar.
Sample (notice that it doesn't have LIMIT
):
SELECT issues.*, highest_priorities.label_priority as highest_priority
FROM issues JOIN LATERAL(SELECT MIN("label_priorities"."priority") AS label_priority FROM "labels" LEFT OUTER JOIN "label_priorities" ON "labels"."id" = "label_priorities"."label_id" INNER JOIN "label_links" ON "label_links"."label_id" = "labels"."id"
WHERE (label_priorities.project_id = issues.project_id) AND (label_links.target_id = issues.id) AND "label_links"."target_type" = 'Issue') as highest_priorities ON TRUE WHERE (NOT EXISTS (SELECT 1 FROM "banned_users" WHERE (issues.author_id = banned_users.user_id))) AND "issues"."project_id" = 278964 AND ("issues"."state_id" IN (1)) AND "issues"."issue_type" IN (0, 1) AND (NOT EXISTS (SELECT 1 FROM "issue_assignees" WHERE "issue_assignees"."user_id" IN (SELECT "lists"."user_id" FROM "lists" WHERE "lists"."board_id" = 1947445 AND "lists"."list_type" = 3 AND "lists"."user_id" IS NOT NULL) AND (issue_id = issues.id)))
GROUP BY "issues"."id", "highest_priorities"."label_priority"
ORDER BY issues.relative_position ASC NULLS LAST, highest_priorities.label_priority ASC NULLS LAST, "issues"."id" DESC
service = :Boards::Issues::ListService.new(...)
paginations_connections = Gitlab::Graphql::Pagination::Keyset::Connection.new(service.execute)
paginations_connections.items # simply returns service.execute
pagiantions_connections.nodes # this returns the paginated results
Edited by euko