GraphQL query to fetch Epics fails when `sort` and `last` params are provided together
Summary
When fetching Epics list using GraphQL, Internal Server Error happens while running the query, following is the error trace;
ActiveRecord::IrreversibleOrderError (Order "start_date DESC NULLS LAST" cannot be reversed automatically): lib/gitlab/graphql/pagination/keyset/last_items.rb:17:in `take_items' lib/gitlab/graphql/pagination/keyset/connection.rb:113:in `block in limited_nodes' lib/gitlab/utils/strong_memoize.rb:30:in `strong_memoize' lib/gitlab/graphql/pagination/keyset/connection.rb:107:in `limited_nodes' lib/gitlab/graphql/pagination/keyset/connection.rb:100:in `nodes' lib/gitlab/graphql/authorize/authorize_field_service.rb:114:in `to_nodes' lib/gitlab/graphql/authorize/authorize_field_service.rb:87:in `block in filter_allowed' lib/gitlab/graphql/lazy.rb:17:in `block in then' lib/gitlab/graphql/lazy.rb:13:in `block in force' lib/gitlab/utils/strong_memoize.rb:30:in `strong_memoize' lib/gitlab/graphql/lazy.rb:13:in `force' lib/gitlab/graphql/generic_tracing.rb:48:in `with_labkit_tracing' lib/gitlab/graphql/generic_tracing.rb:30:in `platform_trace' lib/gitlab/graphql/generic_tracing.rb:48:in `with_labkit_tracing' lib/gitlab/graphql/generic_tracing.rb:30:in `platform_trace' lib/gitlab/graphql/generic_tracing.rb:48:in `with_labkit_tracing' lib/gitlab/graphql/generic_tracing.rb:30:in `platform_trace' app/graphql/gitlab_schema.rb:43:in `multiplex' app/graphql/gitlab_schema.rb:50:in `execute' app/controllers/graphql_controller.rb:71:in `execute_query' app/controllers/graphql_controller.rb:32:in `execute' ee/lib/gitlab/ip_address_state.rb:10:in `with' ee/app/controllers/ee/application_controller.rb:44:in `set_current_ip_address' app/controllers/application_controller.rb:493:in `set_current_admin' lib/gitlab/session.rb:11:in `with_session' app/controllers/application_controller.rb:484:in `set_session_storage' lib/gitlab/i18n.rb:73:in `with_locale' lib/gitlab/i18n.rb:79:in `with_user_locale' app/controllers/application_controller.rb:478:in `set_locale' lib/gitlab/error_tracking.rb:52:in `with_context' app/controllers/application_controller.rb:543:in `sentry_context' app/controllers/application_controller.rb:471:in `block in set_current_context' lib/gitlab/application_context.rb:54:in `block in use' lib/gitlab/application_context.rb:54:in `use' lib/gitlab/application_context.rb:21:in `with_context' app/controllers/application_controller.rb:463:in `set_current_context' lib/gitlab/metrics/elasticsearch_rack_middleware.rb:16:in `call' lib/gitlab/middleware/rails_queue_duration.rb:33:in `call' lib/gitlab/metrics/rack_middleware.rb:16:in `block in call' lib/gitlab/metrics/transaction.rb:61:in `run' lib/gitlab/metrics/rack_middleware.rb:16:in `call' lib/gitlab/request_profiler/middleware.rb:17:in `call' lib/gitlab/query_limiting/middleware.rb:17:in `block in call' lib/gitlab/query_limiting/transaction.rb:39:in `run' lib/gitlab/query_limiting/middleware.rb:16:in `call' lib/gitlab/jira/middleware.rb:19:in `call' lib/gitlab/middleware/go.rb:20:in `call' lib/gitlab/etag_caching/middleware.rb:13:in `call' lib/gitlab/middleware/multipart.rb:234:in `call' lib/gitlab/middleware/read_only/controller.rb:51:in `call' lib/gitlab/middleware/read_only.rb:18:in `call' lib/gitlab/middleware/same_site_cookies.rb:27:in `call' lib/gitlab/middleware/handle_malformed_strings.rb:19:in `call' lib/gitlab/middleware/basic_health_check.rb:25:in `call' lib/gitlab/middleware/handle_ip_spoof_attack_error.rb:25:in `call' lib/gitlab/middleware/request_context.rb:23:in `call' config/initializers/fix_local_cache_middleware.rb:9:in `call' lib/gitlab/middleware/static.rb:11:in `call' lib/gitlab/webpack/dev_server_middleware.rb:34:in `perform_request' lib/gitlab/metrics/requests_rack_middleware.rb:76:in `call' lib/gitlab/middleware/release_env.rb:12:in `call'
Following GraphQL query was used;
query groupEpics(
$groupPath: ID!
$state: EpicState
$labelName: [String!]
$sortBy: EpicSort
$firstPageSize: Int
$lastPageSize: Int
$prevPageCursor: String = ""
$nextPageCursor: String = ""
) {
group(fullPath: $groupPath) {
epics(
state: $state
labelName: $labelName
sort: $sortBy
first: $firstPageSize
last: $lastPageSize
after: $nextPageCursor
before: $prevPageCursor
) {
nodes {
id
iid
title
createdAt
updatedAt
startDate
dueDate
webUrl
author {
...Author
}
labels {
nodes {
...Label
}
}
discussions {
nodes {
id
}
}
}
pageInfo {
...PageInfo
}
}
}
}
And following variables were provided;
{
"groupPath": "gitlab-org",
"state": "opened",
"lastPageSize": 2,
"sortBy": "start_date_desc",
"prevPageCursor": "eyJpZCI6IjIiLCJzdGFydF9kYXRlIjoiMjAyMC0wNC0wMSJ9"
}
Please note that query runs fine if only one of either lastPageSize or sortBy is provided, it fails only when both are provided.