summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBob Van Landuyt <bob@vanlanduyt.co>2017-11-17 15:55:43 +0100
committerBob Van Landuyt <bob@vanlanduyt.co>2017-11-17 16:20:47 +0100
commit5a335c4d955bbb74a50ca30ac45d30f6ef66774d (patch)
tree490aae02c5cb2a2d1774c8b7094e9c7bc4c2c3a8
parent4aa18590b3af27c9cb3cd3c2fc8c0a70e9a8758e (diff)
downloadgitlab-ce-5a335c4d955bbb74a50ca30ac45d30f6ef66774d.tar.gz
Remove the selects when counting the last page
The last page of the first collection is only loaded into memory when it is being viewed. If it isn't loaded into memory, the `#size` call triggers a count query. This `#count` would generate an invalid query if our custom preloaded counts are included by adding a separate `as count_column` alias on top of the count aliases. Removing the selects in this case will make sure a valid `COUNT(*)` is generated.
-rw-r--r--changelogs/unreleased/bvl-fix-count-with-selects.yml6
-rw-r--r--lib/gitlab/multi_collection_paginator.rb4
-rw-r--r--spec/controllers/groups/children_controller_spec.rb11
3 files changed, 20 insertions, 1 deletions
diff --git a/changelogs/unreleased/bvl-fix-count-with-selects.yml b/changelogs/unreleased/bvl-fix-count-with-selects.yml
new file mode 100644
index 00000000000..46a882de524
--- /dev/null
+++ b/changelogs/unreleased/bvl-fix-count-with-selects.yml
@@ -0,0 +1,6 @@
+---
+title: Fix crash when navigating to second page of the group dashbaord when there
+ are projects and groups on the first page
+merge_request: 15456
+author:
+type: fixed
diff --git a/lib/gitlab/multi_collection_paginator.rb b/lib/gitlab/multi_collection_paginator.rb
index eb3c9002710..c22d0a84860 100644
--- a/lib/gitlab/multi_collection_paginator.rb
+++ b/lib/gitlab/multi_collection_paginator.rb
@@ -55,7 +55,9 @@ module Gitlab
def first_collection_last_page_size
return @first_collection_last_page_size if defined?(@first_collection_last_page_size)
- @first_collection_last_page_size = paginated_first_collection(first_collection_page_count).count
+ @first_collection_last_page_size = paginated_first_collection(first_collection_page_count)
+ .except(:select)
+ .size
end
end
end
diff --git a/spec/controllers/groups/children_controller_spec.rb b/spec/controllers/groups/children_controller_spec.rb
index 4262d474e59..cb1b460fc0e 100644
--- a/spec/controllers/groups/children_controller_spec.rb
+++ b/spec/controllers/groups/children_controller_spec.rb
@@ -280,6 +280,17 @@ describe Groups::ChildrenController do
expect(assigns(:children)).to contain_exactly(other_subgroup, *next_page_projects.take(per_page - 1))
end
+
+ context 'with a mixed first page' do
+ let!(:first_page_subgroups) { [create(:group, :public, parent: group)] }
+ let!(:first_page_projects) { create_list(:project, per_page, :public, namespace: group) }
+
+ it 'correctly calculates the counts' do
+ get :index, group_id: group.to_param, sort: 'id_asc', page: 2, format: :json
+
+ expect(response).to have_gitlab_http_status(200)
+ end
+ end
end
end
end