Skip to content

Show private group invited members to shared group members

What does this MR do and why?

We're doing this to enable shared group members to see who all can access the group which will enable better collaboration among all the group members.

Read the issue description to understand more about it Expose private group members to public shared g... (#418888 - closed).

We will hide the source of the membership in this follow-up https://gitlab.com/gitlab-org/gitlab/-/issues/418789+ and then enable the feature flag.

Query plans

Before

https://console.postgres.ai/gitlab/gitlab-production-tunnel-pg12/sessions/25990/commands/81754

Raw query
--Before
SELECT "members".*, "users"."name" AS member_user_full_name
FROM (SELECT DISTINCT ON (user_id, invite_email) *
      FROM ((SELECT "members"."id",
                    "members"."access_level",
                    "members"."source_id",
                    "members"."source_type",
                    "members"."user_id",
                    "members"."notification_level",
                    "members"."type",
                    "members"."created_at",
                    "members"."updated_at",
                    "members"."created_by_id",
                    "members"."invite_email",
                    "members"."invite_token",
                    "members"."invite_accepted_at",
                    "members"."requested_at",
                    "members"."expires_at",
                    "members"."ldap",
                    "members"."override",
                    "members"."state",
                    "members"."invite_email_success",
                    "members"."member_namespace_id",
                    "members"."member_role_id",
                    "members"."expiry_notified_at"
             FROM "members"
             WHERE "members"."type" = 'GroupMember'
               AND "members"."source_type" = 'Namespace'
               AND "members"."requested_at" IS NULL
               AND "members"."source_id" IN (SELECT "namespaces"."id"
                                             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"."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"
                                                    WHERE "namespaces"."type" = 'Group'
                                                      AND "namespaces"."id" = 5754869)) namespaces
                                             WHERE "namespaces"."type" = 'Group'))
            UNION
            (SELECT "members"."id",
                    LEAST("group_group_links"."group_access", "members"."access_level") AS access_level,
                    "members"."source_id",
                    "members"."source_type",
                    "members"."user_id",
                    "members"."notification_level",
                    "members"."type",
                    "members"."created_at",
                    "members"."updated_at",
                    "members"."created_by_id",
                    "members"."invite_email",
                    "members"."invite_token",
                    "members"."invite_accepted_at",
                    "members"."requested_at",
                    "members"."expires_at",
                    "members"."ldap",
                    "members"."override",
                    "members"."state",
                    "members"."invite_email_success",
                    "members"."member_namespace_id",
                    "members"."member_role_id",
                    "members"."expiry_notified_at"
             FROM "members"
                      LEFT OUTER JOIN group_group_links ON members.source_id = group_group_links.shared_with_group_id
             WHERE "members"."type" = 'GroupMember'
               AND "members"."source_type" = 'Namespace'
               AND "members"."requested_at" IS NULL
               AND "members"."source_id" IN (SELECT "namespaces"."id"
                                             FROM "namespaces"
                                                      INNER JOIN "group_group_links"
                                                                 ON "group_group_links"."shared_with_group_id" = "namespaces"."id"
                                             WHERE "namespaces"."type" = 'Group'
                                               AND "group_group_links"."shared_group_id" IN (SELECT "namespaces"."id"
                                                                                             FROM "namespaces"
                                                                                             WHERE "namespaces"."type" = 'Group'
                                                                                               AND "namespaces"."id" = 5754869)
                                               AND ("namespaces"."visibility_level" IN (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"."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"."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"."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"."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 ((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"."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" = 6628500
                                                                                                                                                           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"."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"
                                                                                                                                                         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" = 6628500))) 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"."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 ((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"."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 "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"."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 "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')
                                                                                                                       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"."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" = 6628500
                                                                                                                          AND "members"."access_level" = 5)) namespaces
                                                                                                                 WHERE "namespaces"."type" = 'Group') authorized
                                                                                                           WHERE authorized."id" = "namespaces"."id"))))) members
      WHERE "members"."type" = 'GroupMember'
        AND "members"."source_type" = 'Namespace'
      ORDER BY user_id, invite_email, access_level DESC, expires_at DESC, created_at ASC) members
         LEFT OUTER JOIN "users" ON "users"."id" = "members"."user_id"
WHERE "members"."type" = 'GroupMember'
  AND "members"."invite_token" IS NULL
  AND "members"."state" != 1
ORDER BY "users"."name" ASC NULLS LAST, "members"."id" DESC
LIMIT 50 OFFSET 0;

After

https://console.postgres.ai/gitlab/gitlab-production-tunnel-pg12/sessions/25990/commands/81756

Raw query
--After
SELECT "members".*, "users"."name" AS member_user_full_name
FROM (SELECT DISTINCT ON (user_id, invite_email) *
      FROM ((SELECT "members"."id",
                    "members"."access_level",
                    "members"."source_id",
                    "members"."source_type",
                    "members"."user_id",
                    "members"."notification_level",
                    "members"."type",
                    "members"."created_at",
                    "members"."updated_at",
                    "members"."created_by_id",
                    "members"."invite_email",
                    "members"."invite_token",
                    "members"."invite_accepted_at",
                    "members"."requested_at",
                    "members"."expires_at",
                    "members"."ldap",
                    "members"."override",
                    "members"."state",
                    "members"."invite_email_success",
                    "members"."member_namespace_id",
                    "members"."member_role_id",
                    "members"."expiry_notified_at"
             FROM "members"
             WHERE "members"."type" = 'GroupMember'
               AND "members"."source_type" = 'Namespace'
               AND "members"."requested_at" IS NULL
               AND "members"."source_id" IN (SELECT "namespaces"."id"
                                             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"."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"
                                                    WHERE "namespaces"."type" = 'Group'
                                                      AND "namespaces"."id" = 5754869)) namespaces
                                             WHERE "namespaces"."type" = 'Group'))
            UNION
            (SELECT "members"."id",
                    LEAST("group_group_links"."group_access", "members"."access_level") AS access_level,
                    "members"."source_id",
                    "members"."source_type",
                    "members"."user_id",
                    "members"."notification_level",
                    "members"."type",
                    "members"."created_at",
                    "members"."updated_at",
                    "members"."created_by_id",
                    "members"."invite_email",
                    "members"."invite_token",
                    "members"."invite_accepted_at",
                    "members"."requested_at",
                    "members"."expires_at",
                    "members"."ldap",
                    "members"."override",
                    "members"."state",
                    "members"."invite_email_success",
                    "members"."member_namespace_id",
                    "members"."member_role_id",
                    "members"."expiry_notified_at"
             FROM "members"
                      LEFT OUTER JOIN group_group_links ON members.source_id = group_group_links.shared_with_group_id
             WHERE "members"."type" = 'GroupMember'
               AND "members"."source_type" = 'Namespace'
               AND "members"."requested_at" IS NULL
               AND "members"."source_id" IN (SELECT "namespaces"."id"
                                             FROM "namespaces"
                                                      INNER JOIN "group_group_links"
                                                                 ON "group_group_links"."shared_with_group_id" = "namespaces"."id"
                                             WHERE "namespaces"."type" = 'Group'
                                               AND "group_group_links"."shared_group_id" IN (SELECT "namespaces"."id"
                                                                                             FROM "namespaces"
                                                                                             WHERE "namespaces"."type" = 'Group'
                                                                                               AND "namespaces"."id" = 5754869)))) members
      WHERE "members"."type" = 'GroupMember'
        AND "members"."source_type" = 'Namespace'
      ORDER BY user_id, invite_email, access_level DESC, expires_at DESC, created_at ASC) members
         LEFT OUTER JOIN "users" ON "users"."id" = "members"."user_id"
WHERE "members"."type" = 'GroupMember'
  AND "members"."invite_token" IS NULL
  AND "members"."state" != 1
ORDER BY "users"."name" ASC NULLS LAST, "members"."id" DESC
LIMIT 50 OFFSET 0;

MR acceptance checklist

Please evaluate this MR against the MR acceptance checklist. It helps you analyze changes to reduce risks in quality, performance, reliability, security, and maintainability.

Screenshots or screen recordings

Before After
Screenshot_2024-02-05_at_5.00.38_PM Screenshot_2024-02-05_at_5.00.14_PM

How to set up and validate locally

  1. Log-in using user1 and create 2 groups called Shared-group & Invited-group.
  2. Invite user2 to Invited-group and user3 to Shared-group.
  3. Now invite Invited-group to Shared-group using the Invite a group button on https://gdk.test:3000/groups/shared-group/-/group_members?tab=0
  4. Enable the feature flag: Feature.enable :webui_members_inherited_users.
  5. Now log-in using user3.
  6. Check out this branch and you can now see user2 on the Shared-group members page which you can't see on the master branch.

Related to #418888 (closed)

Edited by Abdul Wadood

Merge request reports