Add GraphQL query for shared groups
What does this MR do and why?
Related to #562256 (closed)
Needed for Setup "Shared groups" tab (#554631 - closed). We are refactoring the groups overview tabs to shared Vue components. Currently we are using a REST API to get shared groups but it doesn't support all the attributes we need and the shared Vue components work better with GraphQL. This MR adds a GraphQL query for shared groups.
Screenshots or screen recordings
Database review
This GraphQL query
Raw SQL
Click to expand
SELECT
"namespaces"."id",
"namespaces"."name",
"namespaces"."path",
"namespaces"."owner_id",
"namespaces"."created_at",
"namespaces"."updated_at",
"namespaces"."type",
"namespaces"."avatar",
"namespaces"."membership_lock",
"namespaces"."share_with_group_lock",
"namespaces"."visibility_level",
"namespaces"."request_access_enabled",
"namespaces"."ldap_sync_status",
"namespaces"."ldap_sync_error",
"namespaces"."ldap_sync_last_update_at",
"namespaces"."ldap_sync_last_successful_update_at",
"namespaces"."ldap_sync_last_sync_at",
"namespaces"."lfs_enabled",
"namespaces"."parent_id",
"namespaces"."shared_runners_minutes_limit",
"namespaces"."repository_size_limit",
"namespaces"."require_two_factor_authentication",
"namespaces"."two_factor_grace_period",
"namespaces"."project_creation_level",
"namespaces"."runners_token",
"namespaces"."file_template_project_id",
"namespaces"."saml_discovery_token",
"namespaces"."runners_token_encrypted",
"namespaces"."custom_project_templates_group_id",
"namespaces"."auto_devops_enabled",
"namespaces"."extra_shared_runners_minutes_limit",
"namespaces"."last_ci_minutes_notification_at",
"namespaces"."last_ci_minutes_usage_notification_level",
"namespaces"."subgroup_creation_level",
"namespaces"."max_pages_size",
"namespaces"."max_artifacts_size",
"namespaces"."mentions_disabled",
"namespaces"."default_branch_protection",
"namespaces"."max_personal_access_token_lifetime",
"namespaces"."push_rule_id",
"namespaces"."shared_runners_enabled",
"namespaces"."allow_descendants_override_disabled_shared_runners",
"namespaces"."traversal_ids",
"namespaces"."organization_id"
FROM
"namespaces"
INNER JOIN "group_group_links" ON "namespaces"."id" = "group_group_links"."shared_group_id"
WHERE
"namespaces"."type" = 'Group'
AND "group_group_links"."shared_with_group_id" = 9970
AND ("namespaces"."visibility_level" IN (0, 10, 20)
OR EXISTS (
SELECT
1
FROM (
SELECT
"namespaces"."id",
"namespaces"."name",
"namespaces"."path",
"namespaces"."owner_id",
"namespaces"."created_at",
"namespaces"."updated_at",
"namespaces"."type",
"namespaces"."avatar",
"namespaces"."membership_lock",
"namespaces"."share_with_group_lock",
"namespaces"."visibility_level",
"namespaces"."request_access_enabled",
"namespaces"."ldap_sync_status",
"namespaces"."ldap_sync_error",
"namespaces"."ldap_sync_last_update_at",
"namespaces"."ldap_sync_last_successful_update_at",
"namespaces"."ldap_sync_last_sync_at",
"namespaces"."lfs_enabled",
"namespaces"."parent_id",
"namespaces"."shared_runners_minutes_limit",
"namespaces"."repository_size_limit",
"namespaces"."require_two_factor_authentication",
"namespaces"."two_factor_grace_period",
"namespaces"."project_creation_level",
"namespaces"."runners_token",
"namespaces"."file_template_project_id",
"namespaces"."saml_discovery_token",
"namespaces"."runners_token_encrypted",
"namespaces"."custom_project_templates_group_id",
"namespaces"."auto_devops_enabled",
"namespaces"."extra_shared_runners_minutes_limit",
"namespaces"."last_ci_minutes_notification_at",
"namespaces"."last_ci_minutes_usage_notification_level",
"namespaces"."subgroup_creation_level",
"namespaces"."max_pages_size",
"namespaces"."max_artifacts_size",
"namespaces"."mentions_disabled",
"namespaces"."default_branch_protection",
"namespaces"."max_personal_access_token_lifetime",
"namespaces"."push_rule_id",
"namespaces"."shared_runners_enabled",
"namespaces"."allow_descendants_override_disabled_shared_runners",
"namespaces"."traversal_ids",
"namespaces"."organization_id"
FROM (( WITH "direct_groups" AS MATERIALIZED (
SELECT
"namespaces"."id",
"namespaces"."name",
"namespaces"."path",
"namespaces"."owner_id",
"namespaces"."created_at",
"namespaces"."updated_at",
"namespaces"."type",
"namespaces"."avatar",
"namespaces"."membership_lock",
"namespaces"."share_with_group_lock",
"namespaces"."visibility_level",
"namespaces"."request_access_enabled",
"namespaces"."ldap_sync_status",
"namespaces"."ldap_sync_error",
"namespaces"."ldap_sync_last_update_at",
"namespaces"."ldap_sync_last_successful_update_at",
"namespaces"."ldap_sync_last_sync_at",
"namespaces"."lfs_enabled",
"namespaces"."parent_id",
"namespaces"."shared_runners_minutes_limit",
"namespaces"."repository_size_limit",
"namespaces"."require_two_factor_authentication",
"namespaces"."two_factor_grace_period",
"namespaces"."project_creation_level",
"namespaces"."runners_token",
"namespaces"."file_template_project_id",
"namespaces"."saml_discovery_token",
"namespaces"."runners_token_encrypted",
"namespaces"."custom_project_templates_group_id",
"namespaces"."auto_devops_enabled",
"namespaces"."extra_shared_runners_minutes_limit",
"namespaces"."last_ci_minutes_notification_at",
"namespaces"."last_ci_minutes_usage_notification_level",
"namespaces"."subgroup_creation_level",
"namespaces"."max_pages_size",
"namespaces"."max_artifacts_size",
"namespaces"."mentions_disabled",
"namespaces"."default_branch_protection",
"namespaces"."max_personal_access_token_lifetime",
"namespaces"."push_rule_id",
"namespaces"."shared_runners_enabled",
"namespaces"."allow_descendants_override_disabled_shared_runners",
"namespaces"."traversal_ids",
"namespaces"."organization_id"
FROM
"namespaces"
INNER JOIN "members" ON "namespaces"."id" = "members"."source_id"
WHERE
"members"."type" = 'GroupMember'
AND "members"."source_type" = 'Namespace'
AND "namespaces"."type" = 'Group'
AND "members"."user_id" = 1
AND "members"."requested_at" IS NULL
AND (
access_level >= 10
))
SELECT
"namespaces"."id",
"namespaces"."name",
"namespaces"."path",
"namespaces"."owner_id",
"namespaces"."created_at",
"namespaces"."updated_at",
"namespaces"."type",
"namespaces"."avatar",
"namespaces"."membership_lock",
"namespaces"."share_with_group_lock",
"namespaces"."visibility_level",
"namespaces"."request_access_enabled",
"namespaces"."ldap_sync_status",
"namespaces"."ldap_sync_error",
"namespaces"."ldap_sync_last_update_at",
"namespaces"."ldap_sync_last_successful_update_at",
"namespaces"."ldap_sync_last_sync_at",
"namespaces"."lfs_enabled",
"namespaces"."parent_id",
"namespaces"."shared_runners_minutes_limit",
"namespaces"."repository_size_limit",
"namespaces"."require_two_factor_authentication",
"namespaces"."two_factor_grace_period",
"namespaces"."project_creation_level",
"namespaces"."runners_token",
"namespaces"."file_template_project_id",
"namespaces"."saml_discovery_token",
"namespaces"."runners_token_encrypted",
"namespaces"."custom_project_templates_group_id",
"namespaces"."auto_devops_enabled",
"namespaces"."extra_shared_runners_minutes_limit",
"namespaces"."last_ci_minutes_notification_at",
"namespaces"."last_ci_minutes_usage_notification_level",
"namespaces"."subgroup_creation_level",
"namespaces"."max_pages_size",
"namespaces"."max_artifacts_size",
"namespaces"."mentions_disabled",
"namespaces"."default_branch_protection",
"namespaces"."max_personal_access_token_lifetime",
"namespaces"."push_rule_id",
"namespaces"."shared_runners_enabled",
"namespaces"."allow_descendants_override_disabled_shared_runners",
"namespaces"."traversal_ids",
"namespaces"."organization_id"
FROM (( WITH "descendants_base_cte" AS MATERIALIZED (
SELECT
"id",
"traversal_ids"
FROM
"direct_groups" "namespaces"
WHERE
"namespaces"."type" = 'Group'
),
"superset" AS (
SELECT
d1.traversal_ids
FROM
descendants_base_cte d1
WHERE
NOT EXISTS (
SELECT
1
FROM
descendants_base_cte d2
WHERE
d2.id = ANY (d1.traversal_ids)
AND d2.id <> d1.id))
SELECT DISTINCT
"namespaces"."id",
"namespaces"."name",
"namespaces"."path",
"namespaces"."owner_id",
"namespaces"."created_at",
"namespaces"."updated_at",
"namespaces"."type",
"namespaces"."avatar",
"namespaces"."membership_lock",
"namespaces"."share_with_group_lock",
"namespaces"."visibility_level",
"namespaces"."request_access_enabled",
"namespaces"."ldap_sync_status",
"namespaces"."ldap_sync_error",
"namespaces"."ldap_sync_last_update_at",
"namespaces"."ldap_sync_last_successful_update_at",
"namespaces"."ldap_sync_last_sync_at",
"namespaces"."lfs_enabled",
"namespaces"."parent_id",
"namespaces"."shared_runners_minutes_limit",
"namespaces"."repository_size_limit",
"namespaces"."require_two_factor_authentication",
"namespaces"."two_factor_grace_period",
"namespaces"."project_creation_level",
"namespaces"."runners_token",
"namespaces"."file_template_project_id",
"namespaces"."saml_discovery_token",
"namespaces"."runners_token_encrypted",
"namespaces"."custom_project_templates_group_id",
"namespaces"."auto_devops_enabled",
"namespaces"."extra_shared_runners_minutes_limit",
"namespaces"."last_ci_minutes_notification_at",
"namespaces"."last_ci_minutes_usage_notification_level",
"namespaces"."subgroup_creation_level",
"namespaces"."max_pages_size",
"namespaces"."max_artifacts_size",
"namespaces"."mentions_disabled",
"namespaces"."default_branch_protection",
"namespaces"."max_personal_access_token_lifetime",
"namespaces"."push_rule_id",
"namespaces"."shared_runners_enabled",
"namespaces"."allow_descendants_override_disabled_shared_runners",
"namespaces"."traversal_ids",
"namespaces"."organization_id"
FROM
"superset",
"namespaces"
WHERE
"namespaces"."type" = 'Group'
AND next_traversal_ids_sibling ("superset"."traversal_ids") > "namespaces"."traversal_ids"
AND "superset"."traversal_ids" <= "namespaces"."traversal_ids")
UNION ( WITH "base_ancestors_cte" AS MATERIALIZED (
SELECT
"namespaces"."traversal_ids"
FROM
"namespaces"
WHERE
"namespaces"."type" = 'Group'
AND "namespaces"."id" IN (
SELECT
"projects"."namespace_id"
FROM
"projects"
INNER JOIN "project_authorizations" ON "projects"."id" = "project_authorizations"."project_id"
WHERE
"project_authorizations"."user_id" = 1
))
SELECT
"namespaces"."id",
"namespaces"."name",
"namespaces"."path",
"namespaces"."owner_id",
"namespaces"."created_at",
"namespaces"."updated_at",
"namespaces"."type",
"namespaces"."avatar",
"namespaces"."membership_lock",
"namespaces"."share_with_group_lock",
"namespaces"."visibility_level",
"namespaces"."request_access_enabled",
"namespaces"."ldap_sync_status",
"namespaces"."ldap_sync_error",
"namespaces"."ldap_sync_last_update_at",
"namespaces"."ldap_sync_last_successful_update_at",
"namespaces"."ldap_sync_last_sync_at",
"namespaces"."lfs_enabled",
"namespaces"."parent_id",
"namespaces"."shared_runners_minutes_limit",
"namespaces"."repository_size_limit",
"namespaces"."require_two_factor_authentication",
"namespaces"."two_factor_grace_period",
"namespaces"."project_creation_level",
"namespaces"."runners_token",
"namespaces"."file_template_project_id",
"namespaces"."saml_discovery_token",
"namespaces"."runners_token_encrypted",
"namespaces"."custom_project_templates_group_id",
"namespaces"."auto_devops_enabled",
"namespaces"."extra_shared_runners_minutes_limit",
"namespaces"."last_ci_minutes_notification_at",
"namespaces"."last_ci_minutes_usage_notification_level",
"namespaces"."subgroup_creation_level",
"namespaces"."max_pages_size",
"namespaces"."max_artifacts_size",
"namespaces"."mentions_disabled",
"namespaces"."default_branch_protection",
"namespaces"."max_personal_access_token_lifetime",
"namespaces"."push_rule_id",
"namespaces"."shared_runners_enabled",
"namespaces"."allow_descendants_override_disabled_shared_runners",
"namespaces"."traversal_ids",
"namespaces"."organization_id"
FROM
"namespaces"
INNER JOIN ( SELECT DISTINCT
unnest("base_ancestors_cte"."traversal_ids")
FROM
base_ancestors_cte) AS ancestors (ancestor_id) ON namespaces.id = ancestors.ancestor_id
WHERE
"namespaces"."type" = 'Group')
UNION ( WITH "descendants_base_cte" AS MATERIALIZED (
SELECT
"namespaces"."id",
"namespaces"."traversal_ids"
FROM
"namespaces"
INNER JOIN "group_group_links" ON "group_group_links"."shared_group_id" = "namespaces"."id"
WHERE
"namespaces"."type" = 'Group'
AND "group_group_links"."shared_with_group_id" IN (
SELECT
"namespaces"."id"
FROM
"direct_groups" "namespaces"
WHERE
"namespaces"."type" = 'Group'
)
),
"superset" AS (
SELECT
d1.traversal_ids
FROM
descendants_base_cte d1
WHERE
NOT EXISTS (
SELECT
1
FROM
descendants_base_cte d2
WHERE
d2.id = ANY (d1.traversal_ids)
AND d2.id <> d1.id))
SELECT DISTINCT
"namespaces"."id",
"namespaces"."name",
"namespaces"."path",
"namespaces"."owner_id",
"namespaces"."created_at",
"namespaces"."updated_at",
"namespaces"."type",
"namespaces"."avatar",
"namespaces"."membership_lock",
"namespaces"."share_with_group_lock",
"namespaces"."visibility_level",
"namespaces"."request_access_enabled",
"namespaces"."ldap_sync_status",
"namespaces"."ldap_sync_error",
"namespaces"."ldap_sync_last_update_at",
"namespaces"."ldap_sync_last_successful_update_at",
"namespaces"."ldap_sync_last_sync_at",
"namespaces"."lfs_enabled",
"namespaces"."parent_id",
"namespaces"."shared_runners_minutes_limit",
"namespaces"."repository_size_limit",
"namespaces"."require_two_factor_authentication",
"namespaces"."two_factor_grace_period",
"namespaces"."project_creation_level",
"namespaces"."runners_token",
"namespaces"."file_template_project_id",
"namespaces"."saml_discovery_token",
"namespaces"."runners_token_encrypted",
"namespaces"."custom_project_templates_group_id",
"namespaces"."auto_devops_enabled",
"namespaces"."extra_shared_runners_minutes_limit",
"namespaces"."last_ci_minutes_notification_at",
"namespaces"."last_ci_minutes_usage_notification_level",
"namespaces"."subgroup_creation_level",
"namespaces"."max_pages_size",
"namespaces"."max_artifacts_size",
"namespaces"."mentions_disabled",
"namespaces"."default_branch_protection",
"namespaces"."max_personal_access_token_lifetime",
"namespaces"."push_rule_id",
"namespaces"."shared_runners_enabled",
"namespaces"."allow_descendants_override_disabled_shared_runners",
"namespaces"."traversal_ids",
"namespaces"."organization_id"
FROM
"superset",
"namespaces"
WHERE
"namespaces"."type" = 'Group'
AND next_traversal_ids_sibling ("superset"."traversal_ids") > "namespaces"."traversal_ids"
AND "superset"."traversal_ids" <= "namespaces"."traversal_ids")) namespaces
WHERE
"namespaces"."type" = 'Group')
UNION (
SELECT
"namespaces"."id",
"namespaces"."name",
"namespaces"."path",
"namespaces"."owner_id",
"namespaces"."created_at",
"namespaces"."updated_at",
"namespaces"."type",
"namespaces"."avatar",
"namespaces"."membership_lock",
"namespaces"."share_with_group_lock",
"namespaces"."visibility_level",
"namespaces"."request_access_enabled",
"namespaces"."ldap_sync_status",
"namespaces"."ldap_sync_error",
"namespaces"."ldap_sync_last_update_at",
"namespaces"."ldap_sync_last_successful_update_at",
"namespaces"."ldap_sync_last_sync_at",
"namespaces"."lfs_enabled",
"namespaces"."parent_id",
"namespaces"."shared_runners_minutes_limit",
"namespaces"."repository_size_limit",
"namespaces"."require_two_factor_authentication",
"namespaces"."two_factor_grace_period",
"namespaces"."project_creation_level",
"namespaces"."runners_token",
"namespaces"."file_template_project_id",
"namespaces"."saml_discovery_token",
"namespaces"."runners_token_encrypted",
"namespaces"."custom_project_templates_group_id",
"namespaces"."auto_devops_enabled",
"namespaces"."extra_shared_runners_minutes_limit",
"namespaces"."last_ci_minutes_notification_at",
"namespaces"."last_ci_minutes_usage_notification_level",
"namespaces"."subgroup_creation_level",
"namespaces"."max_pages_size",
"namespaces"."max_artifacts_size",
"namespaces"."mentions_disabled",
"namespaces"."default_branch_protection",
"namespaces"."max_personal_access_token_lifetime",
"namespaces"."push_rule_id",
"namespaces"."shared_runners_enabled",
"namespaces"."allow_descendants_override_disabled_shared_runners",
"namespaces"."traversal_ids",
"namespaces"."organization_id"
FROM
"namespaces"
INNER JOIN "members" ON "namespaces"."id" = "members"."source_id"
WHERE
"members"."type" = 'GroupMember'
AND "members"."source_type" = 'Namespace'
AND "namespaces"."type" = 'Group'
AND "members"."user_id" = 1
AND "members"."access_level" = 5
AND (EXISTS (
SELECT
1
FROM
"plans"
INNER JOIN "gitlab_subscriptions" ON "gitlab_subscriptions"."hosted_plan_id" = "plans"."id"
WHERE
"plans"."name" IN ('silver', 'premium', 'premium_trial', 'gold', 'ultimate', 'ultimate_trial', 'ultimate_trial_paid_customer', 'opensource')
AND (gitlab_subscriptions.namespace_id = namespaces.id))))) namespaces
WHERE
"namespaces"."type" = 'Group') authorized
WHERE
authorized."id" = "namespaces"."id"))
ORDER BY
"namespaces"."id" DESC
LIMIT 21
Query plan
https://console.postgres.ai/gitlab/gitlab-production-main/sessions/42588/commands/130305
Click to expand
Limit (cost=0.99..101682.42 rows=1 width=370) (actual time=7.891..39.727 rows=11 loops=1)
Buffers: shared hit=27 read=38
I/O Timings: read=38.996 write=0.000
-> Nested Loop (cost=0.99..101682.42 rows=1 width=370) (actual time=7.890..39.715 rows=11 loops=1)
Buffers: shared hit=27 read=38
I/O Timings: read=38.996 write=0.000
-> Index Only Scan Backward using index_group_group_links_on_shared_with_group_and_shared_group on public.group_group_links (cost=0.42..1.95 rows=2 width=8) (actual time=2.189..2.220 rows=11 loops=1)
Index Cond: (group_group_links.shared_with_group_id = 9970)
Heap Fetches: 0
Buffers: shared hit=4 read=3
I/O Timings: read=2.140 write=0.000
-> Index Scan using index_namespaces_on_type_and_id on public.namespaces (cost=0.57..50840.23 rows=1 width=370) (actual time=3.401..3.402 rows=1 loops=11)
Index Cond: (((namespaces.type)::text = 'Group'::text) AND (namespaces.id = group_group_links.shared_group_id))
Filter: ((namespaces.visibility_level = ANY ('{0,10,20}'::integer[])) OR (SubPlan 5))
Rows Removed by Filter: 0
Buffers: shared hit=23 read=35
I/O Timings: read=36.856 write=0.000
SubPlan 5
-> Subquery Scan on namespaces_6 (cost=50836.62..50836.70 rows=4 width=0) (actual time=0.000..0.000 rows=0 loops=0)
I/O Timings: read=0.000 write=0.000
-> HashAggregate (cost=50836.62..50836.66 rows=4 width=2399) (actual time=0.000..0.000 rows=0 loops=0)
Group Key: namespaces_7.id, namespaces_7.name, namespaces_7.path, namespaces_7.owner_id, namespaces_7.created_at, namespaces_7.updated_at, namespaces_7.type, namespaces_7.avatar, namespaces_7.membership_lock, namespaces_7.share_with_group_lock, namespaces_7.visibility_level, namespaces_7.request_access_enabled, namespaces_7.ldap_sync_status, namespaces_7.ldap_sync_error, namespaces_7.ldap_sync_last_update_at, namespaces_7.ldap_sync_last_successful_update_at, namespaces_7.ldap_sync_last_sync_at, namespaces_7.lfs_enabled, namespaces_7.parent_id, namespaces_7.shared_runners_minutes_limit, namespaces_7.repository_size_limit, namespaces_7.require_two_factor_authentication, namespaces_7.two_factor_grace_period, namespaces_7.project_creation_level, namespaces_7.runners_token, namespaces_7.file_template_project_id, namespaces_7.saml_discovery_token, namespaces_7.runners_token_encrypted, namespaces_7.custom_project_templates_group_id, namespaces_7.auto_devops_enabled, namespaces_7.extra_shared_runners_minutes_limit, namespaces_7.last_ci_minutes_notification_at, namespaces_7.last_ci_minutes_usage_notification_level, namespaces_7.subgroup_creation_level, namespaces_7.max_pages_size, namespaces_7.max_artifacts_size, namespaces_7.mentions_disabled, namespaces_7.default_branch_protection, namespaces_7.max_personal_access_token_lifetime, namespaces_7.push_rule_id, namespaces_7.shared_runners_enabled, namespaces_7.allow_descendants_override_disabled_shared_runners, namespaces_7.traversal_ids, namespaces_7.organization_id
I/O Timings: read=0.000 write=0.000
-> Append (cost=50821.64..50836.18 rows=4 width=2399) (actual time=0.000..0.000 rows=0 loops=0)
I/O Timings: read=0.000 write=0.000
-> HashAggregate (cost=50788.99..50789.02 rows=3 width=2399) (actual time=0.000..0.000 rows=0 loops=0)
Group Key: namespaces_7.id, namespaces_7.name, namespaces_7.path, namespaces_7.owner_id, namespaces_7.created_at, namespaces_7.updated_at, namespaces_7.type, namespaces_7.avatar, namespaces_7.membership_lock, namespaces_7.share_with_group_lock, namespaces_7.visibility_level, namespaces_7.request_access_enabled, namespaces_7.ldap_sync_status, namespaces_7.ldap_sync_error, namespaces_7.ldap_sync_last_update_at, namespaces_7.ldap_sync_last_successful_update_at, namespaces_7.ldap_sync_last_sync_at, namespaces_7.lfs_enabled, namespaces_7.parent_id, namespaces_7.shared_runners_minutes_limit, namespaces_7.repository_size_limit, namespaces_7.require_two_factor_authentication, namespaces_7.two_factor_grace_period, namespaces_7.project_creation_level, namespaces_7.runners_token, namespaces_7.file_template_project_id, namespaces_7.saml_discovery_token, namespaces_7.runners_token_encrypted, namespaces_7.custom_project_templates_group_id, namespaces_7.auto_devops_enabled, namespaces_7.extra_shared_runners_minutes_limit, namespaces_7.last_ci_minutes_notification_at, namespaces_7.last_ci_minutes_usage_notification_level, namespaces_7.subgroup_creation_level, namespaces_7.max_pages_size, namespaces_7.max_artifacts_size, namespaces_7.mentions_disabled, namespaces_7.default_branch_protection, namespaces_7.max_personal_access_token_lifetime, namespaces_7.push_rule_id, namespaces_7.shared_runners_enabled, namespaces_7.allow_descendants_override_disabled_shared_runners, namespaces_7.traversal_ids, namespaces_7.organization_id
I/O Timings: read=0.000 write=0.000
CTE direct_groups
-> Nested Loop (cost=1.13..32.65 rows=1 width=370) (actual time=0.000..0.000 rows=0 loops=0)
I/O Timings: read=0.000 write=0.000
-> Index Scan using idx_members_on_user_and_source_and_source_type_and_member_role on public.members (cost=0.56..21.89 rows=3 width=4) (actual time=0.000..0.000 rows=0 loops=0)
Index Cond: ((members.user_id = 1) AND ((members.source_type)::text = 'Namespace'::text))
Filter: ((members.requested_at IS NULL) AND (members.access_level >= 10) AND ((members.type)::text = 'GroupMember'::text))
Rows Removed by Filter: 0
I/O Timings: read=0.000 write=0.000
-> Index Scan using index_namespaces_on_type_and_id on public.namespaces namespaces_1 (cost=0.57..3.59 rows=1 width=370) (actual time=0.000..0.000 rows=0 loops=0)
Index Cond: (((namespaces_1.type)::text = 'Group'::text) AND (namespaces_1.id = members.source_id))
I/O Timings: read=0.000 write=0.000
-> Append (cost=3.95..50788.66 rows=3 width=2399) (actual time=0.000..0.000 rows=0 loops=0)
I/O Timings: read=0.000 write=0.000
-> Unique (cost=3.95..4.06 rows=1 width=370) (actual time=0.000..0.000 rows=0 loops=0)
I/O Timings: read=0.000 write=0.000
CTE descendants_base_cte
-> CTE Scan on direct_groups namespaces_2 (cost=0.00..0.02 rows=1 width=36) (actual time=0.000..0.000 rows=0 loops=0)
Filter: ((namespaces_2.type)::text = 'Group'::text)
Rows Removed by Filter: 0
I/O Timings: read=0.000 write=0.000
-> Sort (cost=3.93..3.93 rows=1 width=370) (actual time=0.000..0.000 rows=0 loops=0)
Sort Key: namespaces_7.name, namespaces_7.path, namespaces_7.owner_id, namespaces_7.created_at, namespaces_7.updated_at, namespaces_7.avatar, namespaces_7.membership_lock, namespaces_7.share_with_group_lock, namespaces_7.visibility_level, namespaces_7.request_access_enabled, namespaces_7.ldap_sync_status, namespaces_7.ldap_sync_error, namespaces_7.ldap_sync_last_update_at, namespaces_7.ldap_sync_last_successful_update_at, namespaces_7.ldap_sync_last_sync_at, namespaces_7.lfs_enabled, namespaces_7.parent_id, namespaces_7.shared_runners_minutes_limit, namespaces_7.repository_size_limit, namespaces_7.require_two_factor_authentication, namespaces_7.two_factor_grace_period, namespaces_7.project_creation_level, namespaces_7.runners_token, namespaces_7.file_template_project_id, namespaces_7.saml_discovery_token, namespaces_7.runners_token_encrypted, namespaces_7.custom_project_templates_group_id, namespaces_7.auto_devops_enabled, namespaces_7.extra_shared_runners_minutes_limit, namespaces_7.last_ci_minutes_notification_at, namespaces_7.last_ci_minutes_usage_notification_level, namespaces_7.subgroup_creation_level, namespaces_7.max_pages_size, namespaces_7.max_artifacts_size, namespaces_7.mentions_disabled, namespaces_7.default_branch_protection, namespaces_7.max_personal_access_token_lifetime, namespaces_7.push_rule_id, namespaces_7.shared_runners_enabled, namespaces_7.allow_descendants_override_disabled_shared_runners, namespaces_7.traversal_ids, namespaces_7.organization_id
I/O Timings: read=0.000 write=0.000
-> Nested Loop (cost=0.57..3.92 rows=1 width=370) (actual time=0.000..0.000 rows=0 loops=0)
I/O Timings: read=0.000 write=0.000
-> Nested Loop Anti Join (cost=0.00..0.07 rows=1 width=32) (actual time=0.000..0.000 rows=0 loops=0)
I/O Timings: read=0.000 write=0.000
-> CTE Scan on descendants_base_cte d1 (cost=0.00..0.02 rows=1 width=36) (actual time=0.000..0.000 rows=0 loops=0)
I/O Timings: read=0.000 write=0.000
-> CTE Scan on descendants_base_cte d2 (cost=0.00..0.02 rows=1 width=4) (actual time=0.000..0.000 rows=0 loops=0)
I/O Timings: read=0.000 write=0.000
-> Index Scan using index_namespaces_on_type_and_id on public.namespaces namespaces_7 (cost=0.57..3.59 rows=1 width=370) (actual time=0.000..0.000 rows=0 loops=0)
Index Cond: (((namespaces_7.type)::text = 'Group'::text) AND (namespaces_7.id = namespaces.id))
I/O Timings: read=0.000 write=0.000
-> Nested Loop (cost=50713.12..50766.15 rows=1 width=370) (actual time=0.000..0.000 rows=0 loops=0)
I/O Timings: read=0.000 write=0.000
CTE base_ancestors_cte
-> Nested Loop (cost=33231.87..50606.16 rows=1038 width=28) (actual time=0.000..0.000 rows=0 loops=0)
I/O Timings: read=0.000 write=0.000
-> HashAggregate (cost=33231.30..33324.28 rows=9298 width=4) (actual time=0.000..0.000 rows=0 loops=0)
Group Key: projects.namespace_id
I/O Timings: read=0.000 write=0.000
-> Nested Loop (cost=1.14..33208.05 rows=9298 width=4) (actual time=0.000..0.000 rows=0 loops=0)
I/O Timings: read=0.000 write=0.000
-> Index Only Scan using project_authorizations_pkey on public.project_authorizations (cost=0.58..377.97 rows=9298 width=4) (actual time=0.000..0.000 rows=0 loops=0)
Index Cond: (project_authorizations.user_id = 1)
Heap Fetches: 0
I/O Timings: read=0.000 write=0.000
-> Index Scan using projects_pkey on public.projects (cost=0.56..3.53 rows=1 width=8) (actual time=0.000..0.000 rows=0 loops=0)
Index Cond: (projects.id = project_authorizations.project_id)
I/O Timings: read=0.000 write=0.000
-> Index Scan using namespaces_pkey on public.namespaces namespaces_3 (cost=0.57..1.86 rows=1 width=32) (actual time=0.000..0.000 rows=0 loops=0)
Index Cond: (namespaces_3.id = projects.namespace_id)
Filter: ((namespaces_3.type)::text = 'Group'::text)
Rows Removed by Filter: 0
I/O Timings: read=0.000 write=0.000
-> Index Scan using index_namespaces_on_type_and_id on public.namespaces namespaces_8 (cost=0.57..3.59 rows=1 width=370) (actual time=0.000..0.000 rows=0 loops=0)
Index Cond: (((namespaces_8.type)::text = 'Group'::text) AND (namespaces_8.id = namespaces.id))
I/O Timings: read=0.000 write=0.000
-> Subquery Scan on ancestors (cost=106.39..156.39 rows=1 width=4) (actual time=0.000..0.000 rows=0 loops=0)
Filter: (ancestors.ancestor_id = namespaces.id)
Rows Removed by Filter: 0
I/O Timings: read=0.000 write=0.000
-> HashAggregate (cost=106.39..131.39 rows=2000 width=4) (actual time=0.000..0.000 rows=0 loops=0)
Group Key: unnest(base_ancestors_cte.traversal_ids)
I/O Timings: read=0.000 write=0.000
-> ProjectSet (cost=0.00..80.44 rows=10380 width=4) (actual time=0.000..0.000 rows=0 loops=0)
I/O Timings: read=0.000 write=0.000
-> CTE Scan on base_ancestors_cte (cost=0.00..20.76 rows=1038 width=32) (actual time=0.000..0.000 rows=0 loops=0)
I/O Timings: read=0.000 write=0.000
-> Unique (cost=18.32..18.43 rows=1 width=370) (actual time=0.000..0.000 rows=0 loops=0)
I/O Timings: read=0.000 write=0.000
CTE descendants_base_cte
-> Nested Loop (cost=1.01..14.39 rows=1 width=32) (actual time=0.000..0.000 rows=0 loops=0)
I/O Timings: read=0.000 write=0.000
-> Nested Loop (cost=0.45..2.06 rows=4 width=8) (actual time=0.000..0.000 rows=0 loops=0)
I/O Timings: read=0.000 write=0.000
-> HashAggregate (cost=0.02..0.03 rows=1 width=4) (actual time=0.000..0.000 rows=0 loops=0)
Group Key: namespaces_5.id
I/O Timings: read=0.000 write=0.000
-> CTE Scan on direct_groups namespaces_5 (cost=0.00..0.02 rows=1 width=4) (actual time=0.000..0.000 rows=0 loops=0)
Filter: ((namespaces_5.type)::text = 'Group'::text)
Rows Removed by Filter: 0
I/O Timings: read=0.000 write=0.000
-> Index Only Scan using index_group_group_links_on_shared_with_group_and_shared_group on public.group_group_links group_group_links_1 (cost=0.42..1.99 rows=4 width=16) (actual time=0.000..0.000 rows=0 loops=0)
Index Cond: (group_group_links_1.shared_with_group_id = namespaces_5.id)
Heap Fetches: 0
I/O Timings: read=0.000 write=0.000
-> Index Scan using namespaces_pkey on public.namespaces namespaces_4 (cost=0.57..3.08 rows=1 width=32) (actual time=0.000..0.000 rows=0 loops=0)
Index Cond: (namespaces_4.id = group_group_links_1.shared_group_id)
Filter: ((namespaces_4.type)::text = 'Group'::text)
Rows Removed by Filter: 0
I/O Timings: read=0.000 write=0.000
-> Sort (cost=3.93..3.93 rows=1 width=370) (actual time=0.000..0.000 rows=0 loops=0)
Sort Key: namespaces_9.name, namespaces_9.path, namespaces_9.owner_id, namespaces_9.created_at, namespaces_9.updated_at, namespaces_9.avatar, namespaces_9.membership_lock, namespaces_9.share_with_group_lock, namespaces_9.visibility_level, namespaces_9.request_access_enabled, namespaces_9.ldap_sync_status, namespaces_9.ldap_sync_error, namespaces_9.ldap_sync_last_update_at, namespaces_9.ldap_sync_last_successful_update_at, namespaces_9.ldap_sync_last_sync_at, namespaces_9.lfs_enabled, namespaces_9.parent_id, namespaces_9.shared_runners_minutes_limit, namespaces_9.repository_size_limit, namespaces_9.require_two_factor_authentication, namespaces_9.two_factor_grace_period, namespaces_9.project_creation_level, namespaces_9.runners_token, namespaces_9.file_template_project_id, namespaces_9.saml_discovery_token, namespaces_9.runners_token_encrypted, namespaces_9.custom_project_templates_group_id, namespaces_9.auto_devops_enabled, namespaces_9.extra_shared_runners_minutes_limit, namespaces_9.last_ci_minutes_notification_at, namespaces_9.last_ci_minutes_usage_notification_level, namespaces_9.subgroup_creation_level, namespaces_9.max_pages_size, namespaces_9.max_artifacts_size, namespaces_9.mentions_disabled, namespaces_9.default_branch_protection, namespaces_9.max_personal_access_token_lifetime, namespaces_9.push_rule_id, namespaces_9.shared_runners_enabled, namespaces_9.allow_descendants_override_disabled_shared_runners, namespaces_9.traversal_ids, namespaces_9.organization_id
I/O Timings: read=0.000 write=0.000
-> Nested Loop (cost=0.57..3.92 rows=1 width=370) (actual time=0.000..0.000 rows=0 loops=0)
I/O Timings: read=0.000 write=0.000
-> Nested Loop Anti Join (cost=0.00..0.07 rows=1 width=32) (actual time=0.000..0.000 rows=0 loops=0)
I/O Timings: read=0.000 write=0.000
-> CTE Scan on descendants_base_cte d1_1 (cost=0.00..0.02 rows=1 width=36) (actual time=0.000..0.000 rows=0 loops=0)
I/O Timings: read=0.000 write=0.000
-> CTE Scan on descendants_base_cte d2_1 (cost=0.00..0.02 rows=1 width=4) (actual time=0.000..0.000 rows=0 loops=0)
I/O Timings: read=0.000 write=0.000
-> Index Scan using index_namespaces_on_type_and_id on public.namespaces namespaces_9 (cost=0.57..3.59 rows=1 width=370) (actual time=0.000..0.000 rows=0 loops=0)
Index Cond: (((namespaces_9.type)::text = 'Group'::text) AND (namespaces_9.id = namespaces.id))
I/O Timings: read=0.000 write=0.000
-> Nested Loop (cost=1.70..14.49 rows=1 width=370) (actual time=0.000..0.000 rows=0 loops=0)
I/O Timings: read=0.000 write=0.000
-> Nested Loop Semi Join (cost=1.14..10.89 rows=1 width=370) (actual time=0.000..0.000 rows=0 loops=0)
I/O Timings: read=0.000 write=0.000
-> Index Scan using index_namespaces_on_type_and_id on public.namespaces namespaces_10 (cost=0.57..3.59 rows=1 width=370) (actual time=0.000..0.000 rows=0 loops=0)
Index Cond: (((namespaces_10.type)::text = 'Group'::text) AND (namespaces_10.id = namespaces.id))
I/O Timings: read=0.000 write=0.000
-> Nested Loop (cost=0.57..7.29 rows=1 width=4) (actual time=0.000..0.000 rows=0 loops=0)
I/O Timings: read=0.000 write=0.000
-> Index Scan using index_gitlab_subscriptions_on_namespace_id on public.gitlab_subscriptions (cost=0.43..3.45 rows=1 width=8) (actual time=0.000..0.000 rows=0 loops=0)
Index Cond: (gitlab_subscriptions.namespace_id = namespaces.id)
I/O Timings: read=0.000 write=0.000
-> Index Scan using plans_pkey on public.plans (cost=0.14..3.16 rows=1 width=4) (actual time=0.000..0.000 rows=0 loops=0)
Index Cond: (plans.id = gitlab_subscriptions.hosted_plan_id)
Filter: ((plans.name)::text = ANY ('{silver,premium,premium_trial,gold,ultimate,ultimate_trial,ultimate_trial_paid_customer,opensource}'::text[]))
Rows Removed by Filter: 0
I/O Timings: read=0.000 write=0.000
-> Index Scan using index_members_on_source_and_type_and_access_level on public.members members_1 (cost=0.56..3.59 rows=1 width=4) (actual time=0.000..0.000 rows=0 loops=0)
Index Cond: ((members_1.source_id = namespaces.id) AND ((members_1.source_type)::text = 'Namespace'::text) AND ((members_1.type)::text = 'GroupMember'::text) AND (members_1.access_level = 5))
Filter: (members_1.user_id = 1)
Rows Removed by Filter: 0
I/O Timings: read=0.000 write=0.000
Settings: random_page_cost = '1.5', seq_page_cost = '4', effective_cache_size = '472585MB', jit = 'off', work_mem = '100MB'
GET /groups/:id/groups/shared REST API
Raw SQL
Click to expand
SELECT
"namespaces"."id",
"namespaces"."name",
"namespaces"."path",
"namespaces"."owner_id",
"namespaces"."created_at",
"namespaces"."updated_at",
"namespaces"."type",
"namespaces"."avatar",
"namespaces"."membership_lock",
"namespaces"."share_with_group_lock",
"namespaces"."visibility_level",
"namespaces"."request_access_enabled",
"namespaces"."ldap_sync_status",
"namespaces"."ldap_sync_error",
"namespaces"."ldap_sync_last_update_at",
"namespaces"."ldap_sync_last_successful_update_at",
"namespaces"."ldap_sync_last_sync_at",
"namespaces"."lfs_enabled",
"namespaces"."parent_id",
"namespaces"."shared_runners_minutes_limit",
"namespaces"."repository_size_limit",
"namespaces"."require_two_factor_authentication",
"namespaces"."two_factor_grace_period",
"namespaces"."project_creation_level",
"namespaces"."runners_token",
"namespaces"."file_template_project_id",
"namespaces"."saml_discovery_token",
"namespaces"."runners_token_encrypted",
"namespaces"."custom_project_templates_group_id",
"namespaces"."auto_devops_enabled",
"namespaces"."extra_shared_runners_minutes_limit",
"namespaces"."last_ci_minutes_notification_at",
"namespaces"."last_ci_minutes_usage_notification_level",
"namespaces"."subgroup_creation_level",
"namespaces"."max_pages_size",
"namespaces"."max_artifacts_size",
"namespaces"."mentions_disabled",
"namespaces"."default_branch_protection",
"namespaces"."max_personal_access_token_lifetime",
"namespaces"."push_rule_id",
"namespaces"."shared_runners_enabled",
"namespaces"."allow_descendants_override_disabled_shared_runners",
"namespaces"."traversal_ids",
"namespaces"."organization_id"
FROM
"namespaces"
INNER JOIN "group_group_links" ON "namespaces"."id" = "group_group_links"."shared_group_id"
WHERE
"namespaces"."type" = 'Group'
AND "group_group_links"."shared_with_group_id" = 9970
AND ("namespaces"."visibility_level" IN (0, 10, 20)
OR EXISTS (
SELECT
1
FROM (
SELECT
"namespaces"."id",
"namespaces"."name",
"namespaces"."path",
"namespaces"."owner_id",
"namespaces"."created_at",
"namespaces"."updated_at",
"namespaces"."type",
"namespaces"."avatar",
"namespaces"."membership_lock",
"namespaces"."share_with_group_lock",
"namespaces"."visibility_level",
"namespaces"."request_access_enabled",
"namespaces"."ldap_sync_status",
"namespaces"."ldap_sync_error",
"namespaces"."ldap_sync_last_update_at",
"namespaces"."ldap_sync_last_successful_update_at",
"namespaces"."ldap_sync_last_sync_at",
"namespaces"."lfs_enabled",
"namespaces"."parent_id",
"namespaces"."shared_runners_minutes_limit",
"namespaces"."repository_size_limit",
"namespaces"."require_two_factor_authentication",
"namespaces"."two_factor_grace_period",
"namespaces"."project_creation_level",
"namespaces"."runners_token",
"namespaces"."file_template_project_id",
"namespaces"."saml_discovery_token",
"namespaces"."runners_token_encrypted",
"namespaces"."custom_project_templates_group_id",
"namespaces"."auto_devops_enabled",
"namespaces"."extra_shared_runners_minutes_limit",
"namespaces"."last_ci_minutes_notification_at",
"namespaces"."last_ci_minutes_usage_notification_level",
"namespaces"."subgroup_creation_level",
"namespaces"."max_pages_size",
"namespaces"."max_artifacts_size",
"namespaces"."mentions_disabled",
"namespaces"."default_branch_protection",
"namespaces"."max_personal_access_token_lifetime",
"namespaces"."push_rule_id",
"namespaces"."shared_runners_enabled",
"namespaces"."allow_descendants_override_disabled_shared_runners",
"namespaces"."traversal_ids",
"namespaces"."organization_id"
FROM (( WITH "direct_groups" AS MATERIALIZED (
SELECT
"namespaces"."id",
"namespaces"."name",
"namespaces"."path",
"namespaces"."owner_id",
"namespaces"."created_at",
"namespaces"."updated_at",
"namespaces"."type",
"namespaces"."avatar",
"namespaces"."membership_lock",
"namespaces"."share_with_group_lock",
"namespaces"."visibility_level",
"namespaces"."request_access_enabled",
"namespaces"."ldap_sync_status",
"namespaces"."ldap_sync_error",
"namespaces"."ldap_sync_last_update_at",
"namespaces"."ldap_sync_last_successful_update_at",
"namespaces"."ldap_sync_last_sync_at",
"namespaces"."lfs_enabled",
"namespaces"."parent_id",
"namespaces"."shared_runners_minutes_limit",
"namespaces"."repository_size_limit",
"namespaces"."require_two_factor_authentication",
"namespaces"."two_factor_grace_period",
"namespaces"."project_creation_level",
"namespaces"."runners_token",
"namespaces"."file_template_project_id",
"namespaces"."saml_discovery_token",
"namespaces"."runners_token_encrypted",
"namespaces"."custom_project_templates_group_id",
"namespaces"."auto_devops_enabled",
"namespaces"."extra_shared_runners_minutes_limit",
"namespaces"."last_ci_minutes_notification_at",
"namespaces"."last_ci_minutes_usage_notification_level",
"namespaces"."subgroup_creation_level",
"namespaces"."max_pages_size",
"namespaces"."max_artifacts_size",
"namespaces"."mentions_disabled",
"namespaces"."default_branch_protection",
"namespaces"."max_personal_access_token_lifetime",
"namespaces"."push_rule_id",
"namespaces"."shared_runners_enabled",
"namespaces"."allow_descendants_override_disabled_shared_runners",
"namespaces"."traversal_ids",
"namespaces"."organization_id"
FROM
"namespaces"
INNER JOIN "members" ON "namespaces"."id" = "members"."source_id"
WHERE
"members"."type" = 'GroupMember'
AND "members"."source_type" = 'Namespace'
AND "namespaces"."type" = 'Group'
AND "members"."user_id" = 1
AND "members"."requested_at" IS NULL
AND (
access_level >= 10
))
SELECT
"namespaces"."id",
"namespaces"."name",
"namespaces"."path",
"namespaces"."owner_id",
"namespaces"."created_at",
"namespaces"."updated_at",
"namespaces"."type",
"namespaces"."avatar",
"namespaces"."membership_lock",
"namespaces"."share_with_group_lock",
"namespaces"."visibility_level",
"namespaces"."request_access_enabled",
"namespaces"."ldap_sync_status",
"namespaces"."ldap_sync_error",
"namespaces"."ldap_sync_last_update_at",
"namespaces"."ldap_sync_last_successful_update_at",
"namespaces"."ldap_sync_last_sync_at",
"namespaces"."lfs_enabled",
"namespaces"."parent_id",
"namespaces"."shared_runners_minutes_limit",
"namespaces"."repository_size_limit",
"namespaces"."require_two_factor_authentication",
"namespaces"."two_factor_grace_period",
"namespaces"."project_creation_level",
"namespaces"."runners_token",
"namespaces"."file_template_project_id",
"namespaces"."saml_discovery_token",
"namespaces"."runners_token_encrypted",
"namespaces"."custom_project_templates_group_id",
"namespaces"."auto_devops_enabled",
"namespaces"."extra_shared_runners_minutes_limit",
"namespaces"."last_ci_minutes_notification_at",
"namespaces"."last_ci_minutes_usage_notification_level",
"namespaces"."subgroup_creation_level",
"namespaces"."max_pages_size",
"namespaces"."max_artifacts_size",
"namespaces"."mentions_disabled",
"namespaces"."default_branch_protection",
"namespaces"."max_personal_access_token_lifetime",
"namespaces"."push_rule_id",
"namespaces"."shared_runners_enabled",
"namespaces"."allow_descendants_override_disabled_shared_runners",
"namespaces"."traversal_ids",
"namespaces"."organization_id"
FROM (( WITH "descendants_base_cte" AS MATERIALIZED (
SELECT
"id",
"traversal_ids"
FROM
"direct_groups" "namespaces"
WHERE
"namespaces"."type" = 'Group'
),
"superset" AS (
SELECT
d1.traversal_ids
FROM
descendants_base_cte d1
WHERE
NOT EXISTS (
SELECT
1
FROM
descendants_base_cte d2
WHERE
d2.id = ANY (d1.traversal_ids)
AND d2.id <> d1.id))
SELECT DISTINCT
"namespaces"."id",
"namespaces"."name",
"namespaces"."path",
"namespaces"."owner_id",
"namespaces"."created_at",
"namespaces"."updated_at",
"namespaces"."type",
"namespaces"."avatar",
"namespaces"."membership_lock",
"namespaces"."share_with_group_lock",
"namespaces"."visibility_level",
"namespaces"."request_access_enabled",
"namespaces"."ldap_sync_status",
"namespaces"."ldap_sync_error",
"namespaces"."ldap_sync_last_update_at",
"namespaces"."ldap_sync_last_successful_update_at",
"namespaces"."ldap_sync_last_sync_at",
"namespaces"."lfs_enabled",
"namespaces"."parent_id",
"namespaces"."shared_runners_minutes_limit",
"namespaces"."repository_size_limit",
"namespaces"."require_two_factor_authentication",
"namespaces"."two_factor_grace_period",
"namespaces"."project_creation_level",
"namespaces"."runners_token",
"namespaces"."file_template_project_id",
"namespaces"."saml_discovery_token",
"namespaces"."runners_token_encrypted",
"namespaces"."custom_project_templates_group_id",
"namespaces"."auto_devops_enabled",
"namespaces"."extra_shared_runners_minutes_limit",
"namespaces"."last_ci_minutes_notification_at",
"namespaces"."last_ci_minutes_usage_notification_level",
"namespaces"."subgroup_creation_level",
"namespaces"."max_pages_size",
"namespaces"."max_artifacts_size",
"namespaces"."mentions_disabled",
"namespaces"."default_branch_protection",
"namespaces"."max_personal_access_token_lifetime",
"namespaces"."push_rule_id",
"namespaces"."shared_runners_enabled",
"namespaces"."allow_descendants_override_disabled_shared_runners",
"namespaces"."traversal_ids",
"namespaces"."organization_id"
FROM
"superset",
"namespaces"
WHERE
"namespaces"."type" = 'Group'
AND next_traversal_ids_sibling ("superset"."traversal_ids") > "namespaces"."traversal_ids"
AND "superset"."traversal_ids" <= "namespaces"."traversal_ids")
UNION ( WITH "base_ancestors_cte" AS MATERIALIZED (
SELECT
"namespaces"."traversal_ids"
FROM
"namespaces"
WHERE
"namespaces"."type" = 'Group'
AND "namespaces"."id" IN (
SELECT
"projects"."namespace_id"
FROM
"projects"
INNER JOIN "project_authorizations" ON "projects"."id" = "project_authorizations"."project_id"
WHERE
"project_authorizations"."user_id" = 1
))
SELECT
"namespaces"."id",
"namespaces"."name",
"namespaces"."path",
"namespaces"."owner_id",
"namespaces"."created_at",
"namespaces"."updated_at",
"namespaces"."type",
"namespaces"."avatar",
"namespaces"."membership_lock",
"namespaces"."share_with_group_lock",
"namespaces"."visibility_level",
"namespaces"."request_access_enabled",
"namespaces"."ldap_sync_status",
"namespaces"."ldap_sync_error",
"namespaces"."ldap_sync_last_update_at",
"namespaces"."ldap_sync_last_successful_update_at",
"namespaces"."ldap_sync_last_sync_at",
"namespaces"."lfs_enabled",
"namespaces"."parent_id",
"namespaces"."shared_runners_minutes_limit",
"namespaces"."repository_size_limit",
"namespaces"."require_two_factor_authentication",
"namespaces"."two_factor_grace_period",
"namespaces"."project_creation_level",
"namespaces"."runners_token",
"namespaces"."file_template_project_id",
"namespaces"."saml_discovery_token",
"namespaces"."runners_token_encrypted",
"namespaces"."custom_project_templates_group_id",
"namespaces"."auto_devops_enabled",
"namespaces"."extra_shared_runners_minutes_limit",
"namespaces"."last_ci_minutes_notification_at",
"namespaces"."last_ci_minutes_usage_notification_level",
"namespaces"."subgroup_creation_level",
"namespaces"."max_pages_size",
"namespaces"."max_artifacts_size",
"namespaces"."mentions_disabled",
"namespaces"."default_branch_protection",
"namespaces"."max_personal_access_token_lifetime",
"namespaces"."push_rule_id",
"namespaces"."shared_runners_enabled",
"namespaces"."allow_descendants_override_disabled_shared_runners",
"namespaces"."traversal_ids",
"namespaces"."organization_id"
FROM
"namespaces"
INNER JOIN ( SELECT DISTINCT
unnest("base_ancestors_cte"."traversal_ids")
FROM
base_ancestors_cte) AS ancestors (ancestor_id) ON namespaces.id = ancestors.ancestor_id
WHERE
"namespaces"."type" = 'Group')
UNION ( WITH "descendants_base_cte" AS MATERIALIZED (
SELECT
"namespaces"."id",
"namespaces"."traversal_ids"
FROM
"namespaces"
INNER JOIN "group_group_links" ON "group_group_links"."shared_group_id" = "namespaces"."id"
WHERE
"namespaces"."type" = 'Group'
AND "group_group_links"."shared_with_group_id" IN (
SELECT
"namespaces"."id"
FROM
"direct_groups" "namespaces"
WHERE
"namespaces"."type" = 'Group'
)
),
"superset" AS (
SELECT
d1.traversal_ids
FROM
descendants_base_cte d1
WHERE
NOT EXISTS (
SELECT
1
FROM
descendants_base_cte d2
WHERE
d2.id = ANY (d1.traversal_ids)
AND d2.id <> d1.id))
SELECT DISTINCT
"namespaces"."id",
"namespaces"."name",
"namespaces"."path",
"namespaces"."owner_id",
"namespaces"."created_at",
"namespaces"."updated_at",
"namespaces"."type",
"namespaces"."avatar",
"namespaces"."membership_lock",
"namespaces"."share_with_group_lock",
"namespaces"."visibility_level",
"namespaces"."request_access_enabled",
"namespaces"."ldap_sync_status",
"namespaces"."ldap_sync_error",
"namespaces"."ldap_sync_last_update_at",
"namespaces"."ldap_sync_last_successful_update_at",
"namespaces"."ldap_sync_last_sync_at",
"namespaces"."lfs_enabled",
"namespaces"."parent_id",
"namespaces"."shared_runners_minutes_limit",
"namespaces"."repository_size_limit",
"namespaces"."require_two_factor_authentication",
"namespaces"."two_factor_grace_period",
"namespaces"."project_creation_level",
"namespaces"."runners_token",
"namespaces"."file_template_project_id",
"namespaces"."saml_discovery_token",
"namespaces"."runners_token_encrypted",
"namespaces"."custom_project_templates_group_id",
"namespaces"."auto_devops_enabled",
"namespaces"."extra_shared_runners_minutes_limit",
"namespaces"."last_ci_minutes_notification_at",
"namespaces"."last_ci_minutes_usage_notification_level",
"namespaces"."subgroup_creation_level",
"namespaces"."max_pages_size",
"namespaces"."max_artifacts_size",
"namespaces"."mentions_disabled",
"namespaces"."default_branch_protection",
"namespaces"."max_personal_access_token_lifetime",
"namespaces"."push_rule_id",
"namespaces"."shared_runners_enabled",
"namespaces"."allow_descendants_override_disabled_shared_runners",
"namespaces"."traversal_ids",
"namespaces"."organization_id"
FROM
"superset",
"namespaces"
WHERE
"namespaces"."type" = 'Group'
AND next_traversal_ids_sibling ("superset"."traversal_ids") > "namespaces"."traversal_ids"
AND "superset"."traversal_ids" <= "namespaces"."traversal_ids")) namespaces
WHERE
"namespaces"."type" = 'Group')
UNION (
SELECT
"namespaces"."id",
"namespaces"."name",
"namespaces"."path",
"namespaces"."owner_id",
"namespaces"."created_at",
"namespaces"."updated_at",
"namespaces"."type",
"namespaces"."avatar",
"namespaces"."membership_lock",
"namespaces"."share_with_group_lock",
"namespaces"."visibility_level",
"namespaces"."request_access_enabled",
"namespaces"."ldap_sync_status",
"namespaces"."ldap_sync_error",
"namespaces"."ldap_sync_last_update_at",
"namespaces"."ldap_sync_last_successful_update_at",
"namespaces"."ldap_sync_last_sync_at",
"namespaces"."lfs_enabled",
"namespaces"."parent_id",
"namespaces"."shared_runners_minutes_limit",
"namespaces"."repository_size_limit",
"namespaces"."require_two_factor_authentication",
"namespaces"."two_factor_grace_period",
"namespaces"."project_creation_level",
"namespaces"."runners_token",
"namespaces"."file_template_project_id",
"namespaces"."saml_discovery_token",
"namespaces"."runners_token_encrypted",
"namespaces"."custom_project_templates_group_id",
"namespaces"."auto_devops_enabled",
"namespaces"."extra_shared_runners_minutes_limit",
"namespaces"."last_ci_minutes_notification_at",
"namespaces"."last_ci_minutes_usage_notification_level",
"namespaces"."subgroup_creation_level",
"namespaces"."max_pages_size",
"namespaces"."max_artifacts_size",
"namespaces"."mentions_disabled",
"namespaces"."default_branch_protection",
"namespaces"."max_personal_access_token_lifetime",
"namespaces"."push_rule_id",
"namespaces"."shared_runners_enabled",
"namespaces"."allow_descendants_override_disabled_shared_runners",
"namespaces"."traversal_ids",
"namespaces"."organization_id"
FROM
"namespaces"
INNER JOIN "members" ON "namespaces"."id" = "members"."source_id"
WHERE
"members"."type" = 'GroupMember'
AND "members"."source_type" = 'Namespace'
AND "namespaces"."type" = 'Group'
AND "members"."user_id" = 1
AND "members"."access_level" = 5
AND (EXISTS (
SELECT
1
FROM
"plans"
INNER JOIN "gitlab_subscriptions" ON "gitlab_subscriptions"."hosted_plan_id" = "plans"."id"
WHERE
"plans"."name" IN ('silver', 'premium', 'premium_trial', 'gold', 'ultimate', 'ultimate_trial', 'ultimate_trial_paid_customer', 'opensource')
AND (gitlab_subscriptions.namespace_id = namespaces.id))))) namespaces
WHERE
"namespaces"."type" = 'Group') authorized
WHERE
authorized."id" = "namespaces"."id"))
ORDER BY
"namespaces"."name" DESC,
"namespaces"."id" ASC
LIMIT 20 OFFSET 0
Query plan
https://postgres.ai/console/gitlab/gitlab-production-main/sessions/42588/commands/130307
Click to expand
Limit (cost=101682.43..101682.44 rows=1 width=370) (actual time=0.207..0.213 rows=11 loops=1)
Buffers: shared hit=71
I/O Timings: read=0.000 write=0.000
-> Sort (cost=101682.43..101682.44 rows=1 width=370) (actual time=0.206..0.211 rows=11 loops=1)
Sort Key: namespaces.name DESC, namespaces.id
Sort Method: quicksort Memory: 27kB
Buffers: shared hit=71
I/O Timings: read=0.000 write=0.000
-> Nested Loop (cost=0.99..101682.42 rows=1 width=370) (actual time=0.053..0.154 rows=11 loops=1)
Buffers: shared hit=65
I/O Timings: read=0.000 write=0.000
-> Index Only Scan using index_group_group_links_on_shared_with_group_and_shared_group on public.group_group_links (cost=0.42..1.95 rows=2 width=8) (actual time=0.016..0.019 rows=11 loops=1)
Index Cond: (group_group_links.shared_with_group_id = 9970)
Heap Fetches: 0
Buffers: shared hit=7
I/O Timings: read=0.000 write=0.000
-> Index Scan using index_namespaces_on_type_and_id on public.namespaces (cost=0.57..50840.23 rows=1 width=370) (actual time=0.011..0.012 rows=1 loops=11)
Index Cond: (((namespaces.type)::text = 'Group'::text) AND (namespaces.id = group_group_links.shared_group_id))
Filter: ((namespaces.visibility_level = ANY ('{0,10,20}'::integer[])) OR (SubPlan 5))
Rows Removed by Filter: 0
Buffers: shared hit=58
I/O Timings: read=0.000 write=0.000
SubPlan 5
-> Subquery Scan on namespaces_6 (cost=50836.62..50836.70 rows=4 width=0) (actual time=0.000..0.000 rows=0 loops=0)
I/O Timings: read=0.000 write=0.000
-> HashAggregate (cost=50836.62..50836.66 rows=4 width=2399) (actual time=0.000..0.000 rows=0 loops=0)
Group Key: namespaces_7.id, namespaces_7.name, namespaces_7.path, namespaces_7.owner_id, namespaces_7.created_at, namespaces_7.updated_at, namespaces_7.type, namespaces_7.avatar, namespaces_7.membership_lock, namespaces_7.share_with_group_lock, namespaces_7.visibility_level, namespaces_7.request_access_enabled, namespaces_7.ldap_sync_status, namespaces_7.ldap_sync_error, namespaces_7.ldap_sync_last_update_at, namespaces_7.ldap_sync_last_successful_update_at, namespaces_7.ldap_sync_last_sync_at, namespaces_7.lfs_enabled, namespaces_7.parent_id, namespaces_7.shared_runners_minutes_limit, namespaces_7.repository_size_limit, namespaces_7.require_two_factor_authentication, namespaces_7.two_factor_grace_period, namespaces_7.project_creation_level, namespaces_7.runners_token, namespaces_7.file_template_project_id, namespaces_7.saml_discovery_token, namespaces_7.runners_token_encrypted, namespaces_7.custom_project_templates_group_id, namespaces_7.auto_devops_enabled, namespaces_7.extra_shared_runners_minutes_limit, namespaces_7.last_ci_minutes_notification_at, namespaces_7.last_ci_minutes_usage_notification_level, namespaces_7.subgroup_creation_level, namespaces_7.max_pages_size, namespaces_7.max_artifacts_size, namespaces_7.mentions_disabled, namespaces_7.default_branch_protection, namespaces_7.max_personal_access_token_lifetime, namespaces_7.push_rule_id, namespaces_7.shared_runners_enabled, namespaces_7.allow_descendants_override_disabled_shared_runners, namespaces_7.traversal_ids, namespaces_7.organization_id
I/O Timings: read=0.000 write=0.000
-> Append (cost=50821.64..50836.18 rows=4 width=2399) (actual time=0.000..0.000 rows=0 loops=0)
I/O Timings: read=0.000 write=0.000
-> HashAggregate (cost=50788.99..50789.02 rows=3 width=2399) (actual time=0.000..0.000 rows=0 loops=0)
Group Key: namespaces_7.id, namespaces_7.name, namespaces_7.path, namespaces_7.owner_id, namespaces_7.created_at, namespaces_7.updated_at, namespaces_7.type, namespaces_7.avatar, namespaces_7.membership_lock, namespaces_7.share_with_group_lock, namespaces_7.visibility_level, namespaces_7.request_access_enabled, namespaces_7.ldap_sync_status, namespaces_7.ldap_sync_error, namespaces_7.ldap_sync_last_update_at, namespaces_7.ldap_sync_last_successful_update_at, namespaces_7.ldap_sync_last_sync_at, namespaces_7.lfs_enabled, namespaces_7.parent_id, namespaces_7.shared_runners_minutes_limit, namespaces_7.repository_size_limit, namespaces_7.require_two_factor_authentication, namespaces_7.two_factor_grace_period, namespaces_7.project_creation_level, namespaces_7.runners_token, namespaces_7.file_template_project_id, namespaces_7.saml_discovery_token, namespaces_7.runners_token_encrypted, namespaces_7.custom_project_templates_group_id, namespaces_7.auto_devops_enabled, namespaces_7.extra_shared_runners_minutes_limit, namespaces_7.last_ci_minutes_notification_at, namespaces_7.last_ci_minutes_usage_notification_level, namespaces_7.subgroup_creation_level, namespaces_7.max_pages_size, namespaces_7.max_artifacts_size, namespaces_7.mentions_disabled, namespaces_7.default_branch_protection, namespaces_7.max_personal_access_token_lifetime, namespaces_7.push_rule_id, namespaces_7.shared_runners_enabled, namespaces_7.allow_descendants_override_disabled_shared_runners, namespaces_7.traversal_ids, namespaces_7.organization_id
I/O Timings: read=0.000 write=0.000
CTE direct_groups
-> Nested Loop (cost=1.13..32.65 rows=1 width=370) (actual time=0.000..0.000 rows=0 loops=0)
I/O Timings: read=0.000 write=0.000
-> Index Scan using idx_members_on_user_and_source_and_source_type_and_member_role on public.members (cost=0.56..21.89 rows=3 width=4) (actual time=0.000..0.000 rows=0 loops=0)
Index Cond: ((members.user_id = 1) AND ((members.source_type)::text = 'Namespace'::text))
Filter: ((members.requested_at IS NULL) AND (members.access_level >= 10) AND ((members.type)::text = 'GroupMember'::text))
Rows Removed by Filter: 0
I/O Timings: read=0.000 write=0.000
-> Index Scan using index_namespaces_on_type_and_id on public.namespaces namespaces_1 (cost=0.57..3.59 rows=1 width=370) (actual time=0.000..0.000 rows=0 loops=0)
Index Cond: (((namespaces_1.type)::text = 'Group'::text) AND (namespaces_1.id = members.source_id))
I/O Timings: read=0.000 write=0.000
-> Append (cost=3.95..50788.66 rows=3 width=2399) (actual time=0.000..0.000 rows=0 loops=0)
I/O Timings: read=0.000 write=0.000
-> Unique (cost=3.95..4.06 rows=1 width=370) (actual time=0.000..0.000 rows=0 loops=0)
I/O Timings: read=0.000 write=0.000
CTE descendants_base_cte
-> CTE Scan on direct_groups namespaces_2 (cost=0.00..0.02 rows=1 width=36) (actual time=0.000..0.000 rows=0 loops=0)
Filter: ((namespaces_2.type)::text = 'Group'::text)
Rows Removed by Filter: 0
I/O Timings: read=0.000 write=0.000
-> Sort (cost=3.93..3.93 rows=1 width=370) (actual time=0.000..0.000 rows=0 loops=0)
Sort Key: namespaces_7.name, namespaces_7.path, namespaces_7.owner_id, namespaces_7.created_at, namespaces_7.updated_at, namespaces_7.avatar, namespaces_7.membership_lock, namespaces_7.share_with_group_lock, namespaces_7.visibility_level, namespaces_7.request_access_enabled, namespaces_7.ldap_sync_status, namespaces_7.ldap_sync_error, namespaces_7.ldap_sync_last_update_at, namespaces_7.ldap_sync_last_successful_update_at, namespaces_7.ldap_sync_last_sync_at, namespaces_7.lfs_enabled, namespaces_7.parent_id, namespaces_7.shared_runners_minutes_limit, namespaces_7.repository_size_limit, namespaces_7.require_two_factor_authentication, namespaces_7.two_factor_grace_period, namespaces_7.project_creation_level, namespaces_7.runners_token, namespaces_7.file_template_project_id, namespaces_7.saml_discovery_token, namespaces_7.runners_token_encrypted, namespaces_7.custom_project_templates_group_id, namespaces_7.auto_devops_enabled, namespaces_7.extra_shared_runners_minutes_limit, namespaces_7.last_ci_minutes_notification_at, namespaces_7.last_ci_minutes_usage_notification_level, namespaces_7.subgroup_creation_level, namespaces_7.max_pages_size, namespaces_7.max_artifacts_size, namespaces_7.mentions_disabled, namespaces_7.default_branch_protection, namespaces_7.max_personal_access_token_lifetime, namespaces_7.push_rule_id, namespaces_7.shared_runners_enabled, namespaces_7.allow_descendants_override_disabled_shared_runners, namespaces_7.traversal_ids, namespaces_7.organization_id
I/O Timings: read=0.000 write=0.000
-> Nested Loop (cost=0.57..3.92 rows=1 width=370) (actual time=0.000..0.000 rows=0 loops=0)
I/O Timings: read=0.000 write=0.000
-> Nested Loop Anti Join (cost=0.00..0.07 rows=1 width=32) (actual time=0.000..0.000 rows=0 loops=0)
I/O Timings: read=0.000 write=0.000
-> CTE Scan on descendants_base_cte d1 (cost=0.00..0.02 rows=1 width=36) (actual time=0.000..0.000 rows=0 loops=0)
I/O Timings: read=0.000 write=0.000
-> CTE Scan on descendants_base_cte d2 (cost=0.00..0.02 rows=1 width=4) (actual time=0.000..0.000 rows=0 loops=0)
I/O Timings: read=0.000 write=0.000
-> Index Scan using index_namespaces_on_type_and_id on public.namespaces namespaces_7 (cost=0.57..3.59 rows=1 width=370) (actual time=0.000..0.000 rows=0 loops=0)
Index Cond: (((namespaces_7.type)::text = 'Group'::text) AND (namespaces_7.id = namespaces.id))
I/O Timings: read=0.000 write=0.000
-> Nested Loop (cost=50713.12..50766.15 rows=1 width=370) (actual time=0.000..0.000 rows=0 loops=0)
I/O Timings: read=0.000 write=0.000
CTE base_ancestors_cte
-> Nested Loop (cost=33231.87..50606.16 rows=1038 width=28) (actual time=0.000..0.000 rows=0 loops=0)
I/O Timings: read=0.000 write=0.000
-> HashAggregate (cost=33231.30..33324.28 rows=9298 width=4) (actual time=0.000..0.000 rows=0 loops=0)
Group Key: projects.namespace_id
I/O Timings: read=0.000 write=0.000
-> Nested Loop (cost=1.14..33208.05 rows=9298 width=4) (actual time=0.000..0.000 rows=0 loops=0)
I/O Timings: read=0.000 write=0.000
-> Index Only Scan using project_authorizations_pkey on public.project_authorizations (cost=0.58..377.97 rows=9298 width=4) (actual time=0.000..0.000 rows=0 loops=0)
Index Cond: (project_authorizations.user_id = 1)
Heap Fetches: 0
I/O Timings: read=0.000 write=0.000
-> Index Scan using projects_pkey on public.projects (cost=0.56..3.53 rows=1 width=8) (actual time=0.000..0.000 rows=0 loops=0)
Index Cond: (projects.id = project_authorizations.project_id)
I/O Timings: read=0.000 write=0.000
-> Index Scan using namespaces_pkey on public.namespaces namespaces_3 (cost=0.57..1.86 rows=1 width=32) (actual time=0.000..0.000 rows=0 loops=0)
Index Cond: (namespaces_3.id = projects.namespace_id)
Filter: ((namespaces_3.type)::text = 'Group'::text)
Rows Removed by Filter: 0
I/O Timings: read=0.000 write=0.000
-> Index Scan using index_namespaces_on_type_and_id on public.namespaces namespaces_8 (cost=0.57..3.59 rows=1 width=370) (actual time=0.000..0.000 rows=0 loops=0)
Index Cond: (((namespaces_8.type)::text = 'Group'::text) AND (namespaces_8.id = namespaces.id))
I/O Timings: read=0.000 write=0.000
-> Subquery Scan on ancestors (cost=106.39..156.39 rows=1 width=4) (actual time=0.000..0.000 rows=0 loops=0)
Filter: (ancestors.ancestor_id = namespaces.id)
Rows Removed by Filter: 0
I/O Timings: read=0.000 write=0.000
-> HashAggregate (cost=106.39..131.39 rows=2000 width=4) (actual time=0.000..0.000 rows=0 loops=0)
Group Key: unnest(base_ancestors_cte.traversal_ids)
I/O Timings: read=0.000 write=0.000
-> ProjectSet (cost=0.00..80.44 rows=10380 width=4) (actual time=0.000..0.000 rows=0 loops=0)
I/O Timings: read=0.000 write=0.000
-> CTE Scan on base_ancestors_cte (cost=0.00..20.76 rows=1038 width=32) (actual time=0.000..0.000 rows=0 loops=0)
I/O Timings: read=0.000 write=0.000
-> Unique (cost=18.32..18.43 rows=1 width=370) (actual time=0.000..0.000 rows=0 loops=0)
I/O Timings: read=0.000 write=0.000
CTE descendants_base_cte
-> Nested Loop (cost=1.01..14.39 rows=1 width=32) (actual time=0.000..0.000 rows=0 loops=0)
I/O Timings: read=0.000 write=0.000
-> Nested Loop (cost=0.45..2.06 rows=4 width=8) (actual time=0.000..0.000 rows=0 loops=0)
I/O Timings: read=0.000 write=0.000
-> HashAggregate (cost=0.02..0.03 rows=1 width=4) (actual time=0.000..0.000 rows=0 loops=0)
Group Key: namespaces_5.id
I/O Timings: read=0.000 write=0.000
-> CTE Scan on direct_groups namespaces_5 (cost=0.00..0.02 rows=1 width=4) (actual time=0.000..0.000 rows=0 loops=0)
Filter: ((namespaces_5.type)::text = 'Group'::text)
Rows Removed by Filter: 0
I/O Timings: read=0.000 write=0.000
-> Index Only Scan using index_group_group_links_on_shared_with_group_and_shared_group on public.group_group_links group_group_links_1 (cost=0.42..1.99 rows=4 width=16) (actual time=0.000..0.000 rows=0 loops=0)
Index Cond: (group_group_links_1.shared_with_group_id = namespaces_5.id)
Heap Fetches: 0
I/O Timings: read=0.000 write=0.000
-> Index Scan using namespaces_pkey on public.namespaces namespaces_4 (cost=0.57..3.08 rows=1 width=32) (actual time=0.000..0.000 rows=0 loops=0)
Index Cond: (namespaces_4.id = group_group_links_1.shared_group_id)
Filter: ((namespaces_4.type)::text = 'Group'::text)
Rows Removed by Filter: 0
I/O Timings: read=0.000 write=0.000
-> Sort (cost=3.93..3.93 rows=1 width=370) (actual time=0.000..0.000 rows=0 loops=0)
Sort Key: namespaces_9.name, namespaces_9.path, namespaces_9.owner_id, namespaces_9.created_at, namespaces_9.updated_at, namespaces_9.avatar, namespaces_9.membership_lock, namespaces_9.share_with_group_lock, namespaces_9.visibility_level, namespaces_9.request_access_enabled, namespaces_9.ldap_sync_status, namespaces_9.ldap_sync_error, namespaces_9.ldap_sync_last_update_at, namespaces_9.ldap_sync_last_successful_update_at, namespaces_9.ldap_sync_last_sync_at, namespaces_9.lfs_enabled, namespaces_9.parent_id, namespaces_9.shared_runners_minutes_limit, namespaces_9.repository_size_limit, namespaces_9.require_two_factor_authentication, namespaces_9.two_factor_grace_period, namespaces_9.project_creation_level, namespaces_9.runners_token, namespaces_9.file_template_project_id, namespaces_9.saml_discovery_token, namespaces_9.runners_token_encrypted, namespaces_9.custom_project_templates_group_id, namespaces_9.auto_devops_enabled, namespaces_9.extra_shared_runners_minutes_limit, namespaces_9.last_ci_minutes_notification_at, namespaces_9.last_ci_minutes_usage_notification_level, namespaces_9.subgroup_creation_level, namespaces_9.max_pages_size, namespaces_9.max_artifacts_size, namespaces_9.mentions_disabled, namespaces_9.default_branch_protection, namespaces_9.max_personal_access_token_lifetime, namespaces_9.push_rule_id, namespaces_9.shared_runners_enabled, namespaces_9.allow_descendants_override_disabled_shared_runners, namespaces_9.traversal_ids, namespaces_9.organization_id
I/O Timings: read=0.000 write=0.000
-> Nested Loop (cost=0.57..3.92 rows=1 width=370) (actual time=0.000..0.000 rows=0 loops=0)
I/O Timings: read=0.000 write=0.000
-> Nested Loop Anti Join (cost=0.00..0.07 rows=1 width=32) (actual time=0.000..0.000 rows=0 loops=0)
I/O Timings: read=0.000 write=0.000
-> CTE Scan on descendants_base_cte d1_1 (cost=0.00..0.02 rows=1 width=36) (actual time=0.000..0.000 rows=0 loops=0)
I/O Timings: read=0.000 write=0.000
-> CTE Scan on descendants_base_cte d2_1 (cost=0.00..0.02 rows=1 width=4) (actual time=0.000..0.000 rows=0 loops=0)
I/O Timings: read=0.000 write=0.000
-> Index Scan using index_namespaces_on_type_and_id on public.namespaces namespaces_9 (cost=0.57..3.59 rows=1 width=370) (actual time=0.000..0.000 rows=0 loops=0)
Index Cond: (((namespaces_9.type)::text = 'Group'::text) AND (namespaces_9.id = namespaces.id))
I/O Timings: read=0.000 write=0.000
-> Nested Loop (cost=1.70..14.49 rows=1 width=370) (actual time=0.000..0.000 rows=0 loops=0)
I/O Timings: read=0.000 write=0.000
-> Nested Loop Semi Join (cost=1.14..10.89 rows=1 width=370) (actual time=0.000..0.000 rows=0 loops=0)
I/O Timings: read=0.000 write=0.000
-> Index Scan using index_namespaces_on_type_and_id on public.namespaces namespaces_10 (cost=0.57..3.59 rows=1 width=370) (actual time=0.000..0.000 rows=0 loops=0)
Index Cond: (((namespaces_10.type)::text = 'Group'::text) AND (namespaces_10.id = namespaces.id))
I/O Timings: read=0.000 write=0.000
-> Nested Loop (cost=0.57..7.29 rows=1 width=4) (actual time=0.000..0.000 rows=0 loops=0)
I/O Timings: read=0.000 write=0.000
-> Index Scan using index_gitlab_subscriptions_on_namespace_id on public.gitlab_subscriptions (cost=0.43..3.45 rows=1 width=8) (actual time=0.000..0.000 rows=0 loops=0)
Index Cond: (gitlab_subscriptions.namespace_id = namespaces.id)
I/O Timings: read=0.000 write=0.000
-> Index Scan using plans_pkey on public.plans (cost=0.14..3.16 rows=1 width=4) (actual time=0.000..0.000 rows=0 loops=0)
Index Cond: (plans.id = gitlab_subscriptions.hosted_plan_id)
Filter: ((plans.name)::text = ANY ('{silver,premium,premium_trial,gold,ultimate,ultimate_trial,ultimate_trial_paid_customer,opensource}'::text[]))
Rows Removed by Filter: 0
I/O Timings: read=0.000 write=0.000
-> Index Scan using index_members_on_source_and_type_and_access_level on public.members members_1 (cost=0.56..3.59 rows=1 width=4) (actual time=0.000..0.000 rows=0 loops=0)
Index Cond: ((members_1.source_id = namespaces.id) AND ((members_1.source_type)::text = 'Namespace'::text) AND ((members_1.type)::text = 'GroupMember'::text) AND (members_1.access_level = 5))
Filter: (members_1.user_id = 1)
Rows Removed by Filter: 0
I/O Timings: read=0.000 write=0.000
Settings: random_page_cost = '1.5', seq_page_cost = '4', effective_cache_size = '472585MB', jit = 'off', work_mem = '100MB'
How to set up and validate locally
- Go to a group -> Manage -> Members
- Click
Invite a group - Choose a group and invite
- Make note of the group's path
- Go to
/-/graphql-explorer - Run the following query
{
group(fullPath: "gitlab-org") {
sharedGroups {
nodes {
id
fullName
}
count
}
}
}
MR acceptance checklist
Evaluate this MR against the MR acceptance checklist. It helps you analyze changes to reduce risks in quality, performance, reliability, security, and maintainability.
Edited by Peter Hegman
