Skip to content

Resolve "Linear queries for GroupsFinder"

Alex Pooley requested to merge 333515-linear-queries-for-groupsfinder into master

What does this MR do?

Change GroupsFinder to use the new group querying scopes.

This work is behind feature flag use_traversal_ids_for_groups_finder. There are three secondary dependent feature flags:

  • use_traversal_ids
  • traversal_ids_btree
  • use_traversal_ids_for_ancestor_scopes

SQL Changes

group = FactoryBot.create(:group, :with_hierarchy)
user = FactoryBot.create(:user)
group.add_owner(user)

gf = GroupsFinder.new(user)
items = gf.send(:all_groups)
puts items.map(&:to_sql)

SQL query for original recursive version:

WITH RECURSIVE "base_and_ancestors" AS (
  (
    SELECT 
      "namespaces"."id", 
      "namespaces"."name", 
      "namespaces"."path", 
      "namespaces"."owner_id", 
      "namespaces"."created_at", 
      "namespaces"."updated_at", 
      "namespaces"."type", 
      "namespaces"."description", 
      "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"."description_html", 
      "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"."cached_markdown_version", 
      "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"."emails_disabled", 
      "namespaces"."max_pages_size", 
      "namespaces"."max_artifacts_size", 
      "namespaces"."mentions_disabled", 
      "namespaces"."default_branch_protection", 
      "namespaces"."unlock_membership_to_ldap", 
      "namespaces"."max_personal_access_token_lifetime", 
      "namespaces"."push_rule_id", 
      "namespaces"."shared_runners_enabled", 
      "namespaces"."allow_descendants_override_disabled_shared_runners", 
      "namespaces"."traversal_ids" 
    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"."description", 
              "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"."description_html", 
              "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"."cached_markdown_version", 
              "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"."emails_disabled", 
              "namespaces"."max_pages_size", 
              "namespaces"."max_artifacts_size", 
              "namespaces"."mentions_disabled", 
              "namespaces"."default_branch_protection", 
              "namespaces"."unlock_membership_to_ldap", 
              "namespaces"."max_personal_access_token_lifetime", 
              "namespaces"."push_rule_id", 
              "namespaces"."shared_runners_enabled", 
              "namespaces"."allow_descendants_override_disabled_shared_runners", 
              "namespaces"."traversal_ids" 
            FROM 
              (
                (
                  SELECT 
                    "namespaces".* 
                  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)
                ) 
                UNION 
                  (
                    SELECT 
                      "namespaces".* 
                    FROM 
                      "projects" 
                      INNER JOIN "project_authorizations" ON "projects"."id" = "project_authorizations"."project_id" 
                      INNER JOIN "namespaces" ON "namespaces"."id" = "projects"."namespace_id" 
                    WHERE 
                      "project_authorizations"."user_id" = 1
                  )
              ) namespaces 
            WHERE 
              "namespaces"."type" = 'Group'
          ) 
          SELECT 
            "namespaces"."id", 
            "namespaces"."name", 
            "namespaces"."path", 
            "namespaces"."owner_id", 
            "namespaces"."created_at", 
            "namespaces"."updated_at", 
            "namespaces"."type", 
            "namespaces"."description", 
            "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"."description_html", 
            "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"."cached_markdown_version", 
            "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"."emails_disabled", 
            "namespaces"."max_pages_size", 
            "namespaces"."max_artifacts_size", 
            "namespaces"."mentions_disabled", 
            "namespaces"."default_branch_protection", 
            "namespaces"."unlock_membership_to_ldap", 
            "namespaces"."max_personal_access_token_lifetime", 
            "namespaces"."push_rule_id", 
            "namespaces"."shared_runners_enabled", 
            "namespaces"."allow_descendants_override_disabled_shared_runners", 
            "namespaces"."traversal_ids" 
          FROM 
            (
              (
                SELECT 
                  "namespaces"."id", 
                  "namespaces"."name", 
                  "namespaces"."path", 
                  "namespaces"."owner_id", 
                  "namespaces"."created_at", 
                  "namespaces"."updated_at", 
                  "namespaces"."type", 
                  "namespaces"."description", 
                  "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"."description_html", 
                  "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"."cached_markdown_version", 
                  "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"."emails_disabled", 
                  "namespaces"."max_pages_size", 
                  "namespaces"."max_artifacts_size", 
                  "namespaces"."mentions_disabled", 
                  "namespaces"."default_branch_protection", 
                  "namespaces"."unlock_membership_to_ldap", 
                  "namespaces"."max_personal_access_token_lifetime", 
                  "namespaces"."push_rule_id", 
                  "namespaces"."shared_runners_enabled", 
                  "namespaces"."allow_descendants_override_disabled_shared_runners", 
                  "namespaces"."traversal_ids" 
                FROM 
                  "direct_groups" "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"."description", 
                    "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"."description_html", 
                    "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"."cached_markdown_version", 
                    "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"."emails_disabled", 
                    "namespaces"."max_pages_size", 
                    "namespaces"."max_artifacts_size", 
                    "namespaces"."mentions_disabled", 
                    "namespaces"."default_branch_protection", 
                    "namespaces"."unlock_membership_to_ldap", 
                    "namespaces"."max_personal_access_token_lifetime", 
                    "namespaces"."push_rule_id", 
                    "namespaces"."shared_runners_enabled", 
                    "namespaces"."allow_descendants_override_disabled_shared_runners", 
                    "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'
                    )
                )
            ) namespaces 
          WHERE 
            "namespaces"."type" = 'Group'
        )
      ) 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"."description", 
        "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"."description_html", 
        "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"."cached_markdown_version", 
        "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"."emails_disabled", 
        "namespaces"."max_pages_size", 
        "namespaces"."max_artifacts_size", 
        "namespaces"."mentions_disabled", 
        "namespaces"."default_branch_protection", 
        "namespaces"."unlock_membership_to_ldap", 
        "namespaces"."max_personal_access_token_lifetime", 
        "namespaces"."push_rule_id", 
        "namespaces"."shared_runners_enabled", 
        "namespaces"."allow_descendants_override_disabled_shared_runners", 
        "namespaces"."traversal_ids" 
      FROM 
        "namespaces", 
        "base_and_ancestors" 
      WHERE 
        "namespaces"."type" = 'Group' 
        AND "namespaces"."id" = "base_and_ancestors"."parent_id"
    )
) 
SELECT 
  "namespaces"."id", 
  "namespaces"."name", 
  "namespaces"."path", 
  "namespaces"."owner_id", 
  "namespaces"."created_at", 
  "namespaces"."updated_at", 
  "namespaces"."type", 
  "namespaces"."description", 
  "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"."description_html", 
  "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"."cached_markdown_version", 
  "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"."emails_disabled", 
  "namespaces"."max_pages_size", 
  "namespaces"."max_artifacts_size", 
  "namespaces"."mentions_disabled", 
  "namespaces"."default_branch_protection", 
  "namespaces"."unlock_membership_to_ldap", 
  "namespaces"."max_personal_access_token_lifetime", 
  "namespaces"."push_rule_id", 
  "namespaces"."shared_runners_enabled", 
  "namespaces"."allow_descendants_override_disabled_shared_runners", 
  "namespaces"."traversal_ids" 
FROM 
  "base_and_ancestors" AS "namespaces" WITH RECURSIVE "base_and_descendants" AS (
    (
      SELECT 
        "namespaces"."id", 
        "namespaces"."name", 
        "namespaces"."path", 
        "namespaces"."owner_id", 
        "namespaces"."created_at", 
        "namespaces"."updated_at", 
        "namespaces"."type", 
        "namespaces"."description", 
        "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"."description_html", 
        "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"."cached_markdown_version", 
        "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"."emails_disabled", 
        "namespaces"."max_pages_size", 
        "namespaces"."max_artifacts_size", 
        "namespaces"."mentions_disabled", 
        "namespaces"."default_branch_protection", 
        "namespaces"."unlock_membership_to_ldap", 
        "namespaces"."max_personal_access_token_lifetime", 
        "namespaces"."push_rule_id", 
        "namespaces"."shared_runners_enabled", 
        "namespaces"."allow_descendants_override_disabled_shared_runners", 
        "namespaces"."traversal_ids" 
      FROM 
        "namespaces" 
      WHERE 
        "namespaces"."type" = 'Group' 
        AND "namespaces"."id" IN (
          SELECT 
            "namespaces"."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)
        )
    ) 
    UNION 
      (
        SELECT 
          "namespaces"."id", 
          "namespaces"."name", 
          "namespaces"."path", 
          "namespaces"."owner_id", 
          "namespaces"."created_at", 
          "namespaces"."updated_at", 
          "namespaces"."type", 
          "namespaces"."description", 
          "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"."description_html", 
          "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"."cached_markdown_version", 
          "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"."emails_disabled", 
          "namespaces"."max_pages_size", 
          "namespaces"."max_artifacts_size", 
          "namespaces"."mentions_disabled", 
          "namespaces"."default_branch_protection", 
          "namespaces"."unlock_membership_to_ldap", 
          "namespaces"."max_personal_access_token_lifetime", 
          "namespaces"."push_rule_id", 
          "namespaces"."shared_runners_enabled", 
          "namespaces"."allow_descendants_override_disabled_shared_runners", 
          "namespaces"."traversal_ids" 
        FROM 
          "namespaces", 
          "base_and_descendants" 
        WHERE 
          "namespaces"."type" = 'Group' 
          AND "namespaces"."parent_id" = "base_and_descendants"."id"
      )
  ) 
SELECT 
  "namespaces"."id", 
  "namespaces"."name", 
  "namespaces"."path", 
  "namespaces"."owner_id", 
  "namespaces"."created_at", 
  "namespaces"."updated_at", 
  "namespaces"."type", 
  "namespaces"."description", 
  "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"."description_html", 
  "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"."cached_markdown_version", 
  "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"."emails_disabled", 
  "namespaces"."max_pages_size", 
  "namespaces"."max_artifacts_size", 
  "namespaces"."mentions_disabled", 
  "namespaces"."default_branch_protection", 
  "namespaces"."unlock_membership_to_ldap", 
  "namespaces"."max_personal_access_token_lifetime", 
  "namespaces"."push_rule_id", 
  "namespaces"."shared_runners_enabled", 
  "namespaces"."allow_descendants_override_disabled_shared_runners", 
  "namespaces"."traversal_ids" 
FROM 
  "base_and_descendants" AS "namespaces" 
SELECT 
  "namespaces"."id", 
  "namespaces"."name", 
  "namespaces"."path", 
  "namespaces"."owner_id", 
  "namespaces"."created_at", 
  "namespaces"."updated_at", 
  "namespaces"."type", 
  "namespaces"."description", 
  "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"."description_html", 
  "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"."cached_markdown_version", 
  "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"."emails_disabled", 
  "namespaces"."max_pages_size", 
  "namespaces"."max_artifacts_size", 
  "namespaces"."mentions_disabled", 
  "namespaces"."default_branch_protection", 
  "namespaces"."unlock_membership_to_ldap", 
  "namespaces"."max_personal_access_token_lifetime", 
  "namespaces"."push_rule_id", 
  "namespaces"."shared_runners_enabled", 
  "namespaces"."allow_descendants_override_disabled_shared_runners", 
  "namespaces"."traversal_ids" 
FROM 
  "namespaces" 
WHERE 
  "namespaces"."type" = 'Group' 
  AND "namespaces"."visibility_level" IN (10, 20)
Feature.enable :use_traversal_ids
Feature.enable :use_traversal_ids_for_groups_finder
Feature.enable :traversal_ids_btree
Feature.enable :use_traversal_ids_for_ancestor_scopes

gf = GroupsFinder.new(user)
items = gf.send(:all_groups)
puts items.map(&:to_sql)

SQL query for new linear version:

SELECT 
  "namespaces"."id", 
  "namespaces"."name", 
  "namespaces"."path", 
  "namespaces"."owner_id", 
  "namespaces"."created_at", 
  "namespaces"."updated_at", 
  "namespaces"."type", 
  "namespaces"."description", 
  "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"."description_html", 
  "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"."cached_markdown_version", 
  "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"."emails_disabled", 
  "namespaces"."max_pages_size", 
  "namespaces"."max_artifacts_size", 
  "namespaces"."mentions_disabled", 
  "namespaces"."default_branch_protection", 
  "namespaces"."unlock_membership_to_ldap", 
  "namespaces"."max_personal_access_token_lifetime", 
  "namespaces"."push_rule_id", 
  "namespaces"."shared_runners_enabled", 
  "namespaces"."allow_descendants_override_disabled_shared_runners", 
  "namespaces"."traversal_ids" 
FROM 
  (
    SELECT 
      "namespaces"."id", 
      "namespaces"."name", 
      "namespaces"."path", 
      "namespaces"."owner_id", 
      "namespaces"."created_at", 
      "namespaces"."updated_at", 
      "namespaces"."type", 
      "namespaces"."description", 
      "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"."description_html", 
      "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"."cached_markdown_version", 
      "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"."emails_disabled", 
      "namespaces"."max_pages_size", 
      "namespaces"."max_artifacts_size", 
      "namespaces"."mentions_disabled", 
      "namespaces"."default_branch_protection", 
      "namespaces"."unlock_membership_to_ldap", 
      "namespaces"."max_personal_access_token_lifetime", 
      "namespaces"."push_rule_id", 
      "namespaces"."shared_runners_enabled", 
      "namespaces"."allow_descendants_override_disabled_shared_runners", 
      "namespaces"."traversal_ids" 
    FROM 
      "namespaces" 
    WHERE 
      "namespaces"."type" = 'Group' 
      AND "namespaces"."id" IN (
        SELECT 
          unnest(traversal_ids) 
        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"."description", 
                  "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"."description_html", 
                  "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"."cached_markdown_version", 
                  "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"."emails_disabled", 
                  "namespaces"."max_pages_size", 
                  "namespaces"."max_artifacts_size", 
                  "namespaces"."mentions_disabled", 
                  "namespaces"."default_branch_protection", 
                  "namespaces"."unlock_membership_to_ldap", 
                  "namespaces"."max_personal_access_token_lifetime", 
                  "namespaces"."push_rule_id", 
                  "namespaces"."shared_runners_enabled", 
                  "namespaces"."allow_descendants_override_disabled_shared_runners", 
                  "namespaces"."traversal_ids" 
                FROM 
                  (
                    (
                      SELECT 
                        "namespaces".* 
                      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)
                    ) 
                    UNION 
                      (
                        SELECT 
                          "namespaces".* 
                        FROM 
                          "projects" 
                          INNER JOIN "project_authorizations" ON "projects"."id" = "project_authorizations"."project_id" 
                          INNER JOIN "namespaces" ON "namespaces"."id" = "projects"."namespace_id" 
                        WHERE 
                          "project_authorizations"."user_id" = 1
                      )
                  ) namespaces 
                WHERE 
                  "namespaces"."type" = 'Group'
              ) 
              SELECT 
                "namespaces"."id", 
                "namespaces"."name", 
                "namespaces"."path", 
                "namespaces"."owner_id", 
                "namespaces"."created_at", 
                "namespaces"."updated_at", 
                "namespaces"."type", 
                "namespaces"."description", 
                "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"."description_html", 
                "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"."cached_markdown_version", 
                "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"."emails_disabled", 
                "namespaces"."max_pages_size", 
                "namespaces"."max_artifacts_size", 
                "namespaces"."mentions_disabled", 
                "namespaces"."default_branch_protection", 
                "namespaces"."unlock_membership_to_ldap", 
                "namespaces"."max_personal_access_token_lifetime", 
                "namespaces"."push_rule_id", 
                "namespaces"."shared_runners_enabled", 
                "namespaces"."allow_descendants_override_disabled_shared_runners", 
                "namespaces"."traversal_ids" 
              FROM 
                (
                  (
                    SELECT 
                      "namespaces"."id", 
                      "namespaces"."name", 
                      "namespaces"."path", 
                      "namespaces"."owner_id", 
                      "namespaces"."created_at", 
                      "namespaces"."updated_at", 
                      "namespaces"."type", 
                      "namespaces"."description", 
                      "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"."description_html", 
                      "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"."cached_markdown_version", 
                      "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"."emails_disabled", 
                      "namespaces"."max_pages_size", 
                      "namespaces"."max_artifacts_size", 
                      "namespaces"."mentions_disabled", 
                      "namespaces"."default_branch_protection", 
                      "namespaces"."unlock_membership_to_ldap", 
                      "namespaces"."max_personal_access_token_lifetime", 
                      "namespaces"."push_rule_id", 
                      "namespaces"."shared_runners_enabled", 
                      "namespaces"."allow_descendants_override_disabled_shared_runners", 
                      "namespaces"."traversal_ids" 
                    FROM 
                      "direct_groups" "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"."description", 
                        "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"."description_html", 
                        "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"."cached_markdown_version", 
                        "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"."emails_disabled", 
                        "namespaces"."max_pages_size", 
                        "namespaces"."max_artifacts_size", 
                        "namespaces"."mentions_disabled", 
                        "namespaces"."default_branch_protection", 
                        "namespaces"."unlock_membership_to_ldap", 
                        "namespaces"."max_personal_access_token_lifetime", 
                        "namespaces"."push_rule_id", 
                        "namespaces"."shared_runners_enabled", 
                        "namespaces"."allow_descendants_override_disabled_shared_runners", 
                        "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'
                        )
                    )
                ) namespaces 
              WHERE 
                "namespaces"."type" = 'Group'
            )
          ) namespaces 
        WHERE 
          "namespaces"."type" = 'Group'
      )
  ) namespaces 
WHERE 
  "namespaces"."type" = 'Group' WITH "base_cte" AS MATERIALIZED (
    SELECT 
      "namespaces"."traversal_ids", 
      LEAD (namespaces.traversal_ids, 1) OVER (
        ORDER BY 
          namespaces.traversal_ids ASC
      ) next_traversal_ids 
    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"."description", 
  "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"."description_html", 
  "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"."cached_markdown_version", 
  "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"."emails_disabled", 
  "namespaces"."max_pages_size", 
  "namespaces"."max_artifacts_size", 
  "namespaces"."mentions_disabled", 
  "namespaces"."default_branch_protection", 
  "namespaces"."unlock_membership_to_ldap", 
  "namespaces"."max_personal_access_token_lifetime", 
  "namespaces"."push_rule_id", 
  "namespaces"."shared_runners_enabled", 
  "namespaces"."allow_descendants_override_disabled_shared_runners", 
  "namespaces"."traversal_ids" 
FROM 
  "base_cte", 
  "namespaces" 
WHERE 
  "namespaces"."type" = 'Group' 
  AND (
    "base_cte"."next_traversal_ids" IS NULL 
    OR "base_cte"."next_traversal_ids" > "namespaces"."traversal_ids"
  ) 
  AND next_traversal_ids_sibling("base_cte"."traversal_ids") > "namespaces"."traversal_ids" 
  AND "base_cte"."traversal_ids" <= "namespaces"."traversal_ids" 
SELECT 
  "namespaces"."id", 
  "namespaces"."name", 
  "namespaces"."path", 
  "namespaces"."owner_id", 
  "namespaces"."created_at", 
  "namespaces"."updated_at", 
  "namespaces"."type", 
  "namespaces"."description", 
  "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"."description_html", 
  "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"."cached_markdown_version", 
  "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"."emails_disabled", 
  "namespaces"."max_pages_size", 
  "namespaces"."max_artifacts_size", 
  "namespaces"."mentions_disabled", 
  "namespaces"."default_branch_protection", 
  "namespaces"."unlock_membership_to_ldap", 
  "namespaces"."max_personal_access_token_lifetime", 
  "namespaces"."push_rule_id", 
  "namespaces"."shared_runners_enabled", 
  "namespaces"."allow_descendants_override_disabled_shared_runners", 
  "namespaces"."traversal_ids" 
FROM 
  "namespaces" 
WHERE 
  "namespaces"."type" = 'Group' 
  AND "namespaces"."visibility_level" IN (10, 20)

Screenshots or Screencasts (strongly suggested)

How to setup and validate locally (strongly suggested)

Does this MR meet the acceptance criteria?

Conformity

Availability and Testing

Security

Does this MR contain changes to processing or storing of credentials or tokens, authorization and authentication methods or other items described in the security review guidelines? If not, then delete this Security section.

  • 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

Related to #333515 (closed)

Edited by Alex Pooley

Merge request reports

Loading