Skip to content

Fix paginatable namespace search where users can create projects

Mario Celi requested to merge 296817-user-namespaces-fix-parent-search into master

What does this MR do and why?

Follow up on !91538 (comment 1045150103)

Fixes a regression where searching for groups where a user can create projects on will not match searches containing keywords in the parent group. With this fix you can now search by group full_path.

Will also fix an API change not visible in the UI yet. Follow up on !91538 (merged) will make the fix visible by using the query in the frontend.

How to set up and validate locally

Try to create a new project and search the group by full path. It should not appear on the list before this change

  1. Go to /projects/new#blank_project
  2. Search for a parent group, it's children should also show up on the list
  3. Searching by a exact match of the subgroup full path should also return a match

Screen_Recording_2022-08-01_at_12.21.32

Database review

Existing query

All groups where user can create projects searched by path

RAW SQL
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 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" 
            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" = 8110537 
            AND "members"."requested_at" IS NULL 
            AND (access_level >= 10) 
            AND "members"."access_level" IN (40, 50)
        ) 
        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"
    ) 
    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 
          (
            SELECT 
              DISTINCT on(namespaces.id) namespaces.* 
            FROM 
              namespaces, 
              (
                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" = 8110537 
                  AND "members"."requested_at" IS NULL 
                  AND (access_level >= 10) 
                  AND "members"."access_level" = 30
              ) base 
            WHERE 
              "namespaces"."type" = 'Group' 
              AND (
                namespaces.traversal_ids @ > ARRAY[base.id]
              )
          ) namespaces 
        WHERE 
          "namespaces"."type" = 'Group' 
          AND (
            "namespaces"."project_creation_level" = 2 
            OR "namespaces"."project_creation_level" IS NULL
          )
      )
  ) namespaces 
WHERE 
  "namespaces"."type" = 'Group' 
  AND "namespaces"."type" != 'Project' 
  AND (
    "namespaces"."path" ILIKE '%gitlab%' 
    OR "namespaces"."name" ILIKE '%gitlab%'
  ) 
ORDER BY 
  "namespaces"."path" ASC, 
  "namespaces"."id" ASC 
LIMIT 
  100

New query

All groups where user can create projects searched by path (including parent groups)

RAW SQL
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 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" 
            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" = 8110537 
            AND "members"."requested_at" IS NULL 
            AND (access_level >= 10) 
            AND "members"."access_level" IN (40, 50)
        ) 
        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"
    ) 
    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 
          (
            SELECT 
              DISTINCT on(namespaces.id) namespaces.* 
            FROM 
              namespaces, 
              (
                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" = 8110537 
                  AND "members"."requested_at" IS NULL 
                  AND (access_level >= 10) 
                  AND "members"."access_level" = 30
              ) base 
            WHERE 
              "namespaces"."type" = 'Group' 
              AND (
                namespaces.traversal_ids @ > ARRAY[base.id]
              )
          ) namespaces 
        WHERE 
          "namespaces"."type" = 'Group' 
          AND (
            "namespaces"."project_creation_level" = 2 
            OR "namespaces"."project_creation_level" IS NULL
          )
      )
  ) namespaces 
WHERE 
  "namespaces"."type" = 'Group' 
  AND "namespaces"."type" != 'Project' 
  AND "namespaces"."id" IN (
    SELECT 
      "routes"."source_id" 
    FROM 
      "routes" 
    WHERE 
      "routes"."source_type" = 'Namespace' 
      AND (
        "routes"."path" ILIKE '%gitlab%' 
        OR "routes"."name" ILIKE '%gitlab%'
      )
  ) 
ORDER BY 
  "namespaces"."path" ASC, 
  "namespaces"."id" ASC 
LIMIT 
  100

MR acceptance checklist

This checklist encourages us to confirm any changes have been analyzed to reduce risks in quality, performance, reliability, security, and maintainability.

Related to #296817 (closed)

Edited by Mario Celi

Merge request reports

Loading