From e218a8df1e85c695e35e5c7212ccea528cdcae75 Mon Sep 17 00:00:00 2001
From: Heinrich Lee Yu <heinrich@gitlab.com>
Date: Wed, 24 Jul 2019 17:52:55 +0800
Subject: [PATCH] Remove code related to object hierarchy in MySQL

These are not required because MySQL is not
supported anymore
---
 app/controllers/application_controller.rb     |   2 +-
 app/controllers/concerns/group_tree.rb        |  20 ++-
 app/finders/group_descendants_finder.rb       |   2 -
 app/graphql/types/group_type.rb               |   8 +-
 app/helpers/groups_helper.rb                  |   4 -
 app/models/concerns/descendant.rb             |  11 --
 app/models/group.rb                           |   1 -
 app/models/namespace.rb                       |   2 -
 app/policies/group_policy.rb                  |   6 +-
 app/services/groups/nested_create_service.rb  |   4 -
 app/services/groups/transfer_service.rb       |   1 -
 app/services/members/destroy_service.rb       |   2 +-
 .../refresh_authorized_projects_service.rb    |   8 +-
 app/views/groups/settings/_advanced.html.haml |  25 ++--
 .../javascripts/epic/components/epic_body.vue |   3 +-
 ee/app/assets/javascripts/epic/store/state.js |   1 -
 .../groups/epic_links_controller.rb           |   6 -
 ee/app/helpers/ee/issuables_helper.rb         |   1 -
 ee/app/models/ee/epic.rb                      |   3 -
 .../ee/gitlab/quick_actions/epic_actions.rb   |   2 +-
 ee/lib/ee/gitlab/usage_data.rb                |   9 +-
 .../admin/geo/nodes_controller_spec.rb        |   2 +-
 .../sso_enforcement_redirect_spec.rb          |   4 +-
 .../concerns/routable_actions_spec.rb         |   4 +-
 .../groups/epic_links_controller_spec.rb      |   2 +-
 .../groups/saml_providers_controller_spec.rb  |   2 +-
 .../features/billings/billing_plans_spec.rb   |   2 +-
 ee/spec/features/epics/epic_issues_spec.rb    |   6 +-
 .../features/groups/group_settings_spec.rb    |   2 +-
 ee/spec/features/labels_hierarchy.rb          |   2 +-
 .../members/invite_group_and_members_spec.rb  |   2 +-
 ee/spec/features/projects/new_project_spec.rb |   2 +-
 .../finders/boards/milestones_finder_spec.rb  |   4 +-
 ee/spec/finders/epics_finder_spec.rb          |   2 +-
 .../repository_verification_finder_spec.rb    |   2 +-
 .../graphql/resolvers/epic_resolver_spec.rb   |   2 +-
 ee/spec/helpers/ee/issuables_helper_spec.rb   |   3 +-
 ee/spec/helpers/ee/namespaces_helper_spec.rb  |   2 +-
 .../ee/api/entities/geo_node_status_spec.rb   |   2 +-
 .../lib/gitlab/custom_file_templates_spec.rb  |   4 +-
 .../database/load_balancing/host_spec.rb      |   2 +-
 .../lib/gitlab/geo/log_cursor/daemon_spec.rb  |   2 +-
 .../gitlab/geo/log_cursor/event_logs_spec.rb  |   2 +-
 .../events/cache_invalidation_event_spec.rb   |   2 +-
 .../hashed_storage_attachments_event_spec.rb  |   2 +-
 .../hashed_storage_migrated_event_spec.rb     |   2 +-
 .../events/job_artifact_deleted_event_spec.rb |   2 +-
 .../events/lfs_object_deleted_event_spec.rb   |   2 +-
 .../events/repositories_changed_event_spec.rb |   2 +-
 .../events/repository_created_event_spec.rb   |   2 +-
 .../events/repository_deleted_event_spec.rb   |   2 +-
 .../events/repository_renamed_event_spec.rb   |   2 +-
 .../events/repository_updated_event_spec.rb   |   2 +-
 .../events/reset_checksum_event_spec.rb       |   2 +-
 .../events/upload_deleted_event_spec.rb       |   2 +-
 .../insights/finders/issuable_finder_spec.rb  |   2 +-
 ee/spec/lib/gitlab/usage_data_spec.rb         |   2 +-
 ee/spec/models/burndown_spec.rb               |   2 +-
 .../models/concerns/elastic/project_spec.rb   |   2 +-
 ee/spec/models/epic_spec.rb                   |  16 +--
 ee/spec/models/gitlab_subscription_spec.rb    |   4 +-
 ee/spec/models/namespace_spec.rb              |  16 +--
 ee/spec/models/pg_replication_slot_spec.rb    |   8 +-
 ee/spec/models/project_spec.rb                |   4 +-
 ee/spec/models/user_spec.rb                   |   2 +-
 ee/spec/policies/group_policy_spec.rb         |   2 +-
 ee/spec/presenters/epic_presenter_spec.rb     |   4 +-
 ee/spec/requests/api/geo_spec.rb              |   2 +-
 ee/spec/requests/api/v3/github_spec.rb        |   2 +-
 ee/spec/requests/groups_controller_spec.rb    |   2 +-
 .../geo_project_registry_entity_spec.rb       |   2 +-
 .../serializers/storage_shard_entity_spec.rb  |   2 +-
 .../services/ci/register_job_service_spec.rb  |   2 +-
 .../epic_issues/create_service_spec.rb        |   2 +-
 .../epic_links/create_service_spec.rb         |   2 +-
 .../epic_links/destroy_service_spec.rb        |   2 +-
 .../services/epic_links/list_service_spec.rb  |   2 +-
 .../groups/autocomplete_service_spec.rb       |  18 +--
 .../groups/participants_service_spec.rb       |   2 +-
 .../services/groups/update_service_spec.rb    |   2 +-
 .../create_from_template_service_spec.rb      |   2 +-
 .../quick_actions/interpret_service_spec.rb   |   4 +-
 .../update_build_minutes_service_spec.rb      |   2 +-
 .../models/member_shared_examples.rb          |   2 +-
 .../admin/groups/_form.html.haml_spec.rb      |   2 +-
 ee/spec/views/groups/edit.html.haml_spec.rb   |   2 +-
 ...lear_shared_runners_minutes_worker_spec.rb |   2 +-
 .../primary/batch_worker_spec.rb              |   2 +-
 .../primary/shard_worker_spec.rb              |   2 +-
 .../primary/single_worker_spec.rb             |   2 +-
 .../secondary/scheduler_worker_spec.rb        |   2 +-
 .../secondary/single_worker_spec.rb           |   2 +-
 ...or_gitlab_com_subscriptions_worker_spec.rb |   2 +-
 lib/api/entities.rb                           |   5 +-
 lib/api/groups.rb                             |   5 +-
 lib/gitlab/object_hierarchy.rb                |  17 ---
 lib/gitlab/project_authorizations.rb          | 121 +++++++++++++++++
 .../with_nested_groups.rb                     | 125 ------------------
 .../without_nested_groups.rb                  |  35 -----
 .../boards/issues_controller_spec.rb          |   2 +-
 spec/controllers/concerns/group_tree_spec.rb  |   4 +-
 .../dashboard/groups_controller_spec.rb       |   2 +-
 .../groups/children_controller_spec.rb        |   4 +-
 .../groups/labels_controller_spec.rb          |   4 +-
 spec/controllers/groups_controller_spec.rb    |   6 +-
 .../import/bitbucket_controller_spec.rb       |   6 +-
 .../import/gitlab_controller_spec.rb          |   6 +-
 .../projects/milestones_controller_spec.rb    |   2 +-
 spec/features/dashboard/groups_list_spec.rb   |   6 +-
 spec/features/groups/empty_states_spec.rb     |   2 +-
 spec/features/groups/group_settings_spec.rb   |   2 +-
 spec/features/groups/issues_spec.rb           |   2 +-
 .../groups/members/list_members_spec.rb       |   4 +-
 spec/features/groups/share_lock_spec.rb       |   2 +-
 spec/features/groups/show_spec.rb             |  38 +-----
 spec/features/groups_spec.rb                  |   4 +-
 spec/features/ide_spec.rb                     |   2 +-
 spec/features/import/manifest_import_spec.rb  |   2 +-
 spec/features/labels_hierarchy_spec.rb        |   2 +-
 .../projects/members/invite_group_spec.rb     |   4 +-
 spec/features/projects/new_project_spec.rb    |   2 +-
 .../settings/pipelines_settings_spec.rb       |   2 +-
 .../settings/user_transfers_a_project_spec.rb |   2 +-
 .../projects/sub_group_issuables_spec.rb      |   2 +-
 .../projects/user_creates_project_spec.rb     |   2 +-
 spec/features/projects_spec.rb                |   2 +-
 .../finders/autocomplete/users_finder_spec.rb |   2 +-
 spec/finders/cluster_ancestors_finder_spec.rb |   4 +-
 spec/finders/group_descendants_finder_spec.rb |   6 +-
 spec/finders/group_members_finder_spec.rb     |   4 +-
 spec/finders/group_projects_finder_spec.rb    |  12 +-
 spec/finders/groups_finder_spec.rb            |   2 +-
 spec/finders/issues_finder_spec.rb            |   2 +-
 spec/finders/labels_finder_spec.rb            |   6 +-
 spec/finders/members_finder_spec.rb           |   8 +-
 spec/finders/merge_requests_finder_spec.rb    |   2 +-
 spec/finders/todos_finder_spec.rb             |   2 +-
 .../namespace_projects_resolver_spec.rb       |   2 +-
 spec/helpers/auto_devops_helper_spec.rb       |   6 +-
 spec/helpers/groups_helper_spec.rb            |   6 +-
 spec/helpers/namespaces_helper_spec.rb        |   4 +-
 .../filter/milestone_reference_filter_spec.rb |   4 +-
 .../fix_cross_project_label_links_spec.rb     |   4 +-
 .../bare_repository_import/importer_spec.rb   |  16 +--
 .../count/reltuples_count_strategy_spec.rb    |   2 +-
 .../count/tablesample_count_strategy_spec.rb  |   2 +-
 spec/lib/gitlab/database/grant_spec.rb        |   2 +-
 spec/lib/gitlab/group_search_results_spec.rb  |   6 +-
 .../gitlab/manifest_import/manifest_spec.rb   |   2 +-
 .../manifest_import/project_creator_spec.rb   |   2 +-
 spec/lib/gitlab/object_hierarchy_spec.rb      |   2 +-
 spec/lib/gitlab/performance_bar_spec.rb       |   4 +-
 .../lib/gitlab/project_authorizations_spec.rb |  38 +++---
 spec/lib/gitlab/sql/cte_spec.rb               |   2 +-
 spec/lib/gitlab/sql/recursive_cte_spec.rb     |   2 +-
 spec/models/ci/runner_spec.rb                 |   2 +-
 spec/models/clusters/cluster_spec.rb          |   2 +-
 .../concerns/deployment_platform_spec.rb      |   2 +-
 spec/models/concerns/group_descendant_spec.rb |   6 +-
 spec/models/concerns/issuable_spec.rb         |   2 +-
 spec/models/group_spec.rb                     |  28 ++--
 spec/models/members/group_member_spec.rb      |   2 +-
 spec/models/members/project_member_spec.rb    |   2 +-
 .../namespace/root_storage_statistics_spec.rb |   2 +-
 spec/models/namespace_spec.rb                 |  20 +--
 spec/models/notification_recipient_spec.rb    |   2 +-
 .../postgresql/replication_slot_spec.rb       |   2 +-
 spec/models/project_group_link_spec.rb        |   2 +-
 spec/models/project_spec.rb                   |  28 ++--
 spec/models/todo_spec.rb                      |   6 +-
 spec/models/user_spec.rb                      |  38 ++----
 spec/policies/group_member_policy_spec.rb     |   2 +-
 spec/policies/group_policy_spec.rb            |  59 +--------
 .../clusters/cluster_presenter_spec.rb        |   2 +-
 spec/requests/api/boards_spec.rb              |   2 +-
 .../api/graphql/namespace/projects_spec.rb    |   2 +-
 spec/requests/api/group_labels_spec.rb        |   4 +-
 spec/requests/api/groups_spec.rb              |  10 +-
 .../api/issues/get_group_issues_spec.rb       |   2 +-
 spec/requests/api/members_spec.rb             |   6 +-
 spec/requests/api/merge_requests_spec.rb      |   2 +-
 spec/requests/api/projects_spec.rb            |   2 +-
 spec/requests/openid_connect_spec.rb          |   2 +-
 spec/serializers/group_child_entity_spec.rb   |   2 +-
 .../group_child_serializer_spec.rb            |   4 +-
 spec/serializers/pipeline_serializer_spec.rb  |   2 +-
 .../boards/issues/list_service_spec.rb        |   2 +-
 .../groups/auto_devops_service_spec.rb        |   2 +-
 spec/services/groups/create_service_spec.rb   |  46 +++----
 .../groups/nested_create_service_spec.rb      |  30 +----
 spec/services/groups/transfer_service_spec.rb |  17 +--
 spec/services/groups/update_service_spec.rb   |   2 +-
 spec/services/issues/update_service_spec.rb   |   4 +-
 spec/services/members/destroy_service_spec.rb |   6 +-
 spec/services/notification_service_spec.rb    |  50 +++----
 .../projects/autocomplete_service_spec.rb     |   2 +-
 .../destroy/entity_leave_service_spec.rb      |   2 +-
 .../destroy/group_private_service_spec.rb     |   2 +-
 ...efresh_authorized_projects_service_spec.rb |   4 +-
 spec/spec_helper.rb                           |   8 --
 ...ubish_import_controller_shared_examples.rb |   6 +-
 .../policies/group_policy_shared_context.rb   |   2 +-
 spec/views/groups/edit.html.haml_spec.rb      |   2 +-
 .../layouts/header/_new_dropdown.haml_spec.rb |   2 +-
 204 files changed, 515 insertions(+), 841 deletions(-)
 delete mode 100644 app/models/concerns/descendant.rb
 create mode 100644 lib/gitlab/project_authorizations.rb
 delete mode 100644 lib/gitlab/project_authorizations/with_nested_groups.rb
 delete mode 100644 lib/gitlab/project_authorizations/without_nested_groups.rb

diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb
index 9534ad568619..0d166619dd7b 100644
--- a/app/controllers/application_controller.rb
+++ b/app/controllers/application_controller.rb
@@ -421,7 +421,7 @@ def gitlab_project_import_enabled?
   end
 
   def manifest_import_enabled?
-    Group.supports_nested_objects? && Gitlab::CurrentSettings.import_sources.include?('manifest')
+    Gitlab::CurrentSettings.import_sources.include?('manifest')
   end
 
   def phabricator_import_enabled?
diff --git a/app/controllers/concerns/group_tree.rb b/app/controllers/concerns/group_tree.rb
index e9a7d6a31524..d076c62c707a 100644
--- a/app/controllers/concerns/group_tree.rb
+++ b/app/controllers/concerns/group_tree.rb
@@ -32,18 +32,14 @@ def render_group_tree(groups)
   def filtered_groups_with_ancestors(groups)
     filtered_groups = groups.search(params[:filter]).page(params[:page])
 
-    if Group.supports_nested_objects?
-      # We find the ancestors by ID of the search results here.
-      # Otherwise the ancestors would also have filters applied,
-      # which would cause them not to be preloaded.
-      #
-      # Pagination needs to be applied before loading the ancestors to
-      # make sure ancestors are not cut off by pagination.
-      Gitlab::ObjectHierarchy.new(Group.where(id: filtered_groups.select(:id)))
-        .base_and_ancestors
-    else
-      filtered_groups
-    end
+    # We find the ancestors by ID of the search results here.
+    # Otherwise the ancestors would also have filters applied,
+    # which would cause them not to be preloaded.
+    #
+    # Pagination needs to be applied before loading the ancestors to
+    # make sure ancestors are not cut off by pagination.
+    Gitlab::ObjectHierarchy.new(Group.where(id: filtered_groups.select(:id)))
+      .base_and_ancestors
   end
   # rubocop: enable CodeReuse/ActiveRecord
 end
diff --git a/app/finders/group_descendants_finder.rb b/app/finders/group_descendants_finder.rb
index ec340f38450f..4e489a9c930e 100644
--- a/app/finders/group_descendants_finder.rb
+++ b/app/finders/group_descendants_finder.rb
@@ -132,8 +132,6 @@ def ancestors_of_filtered_subgroups
   end
 
   def subgroups
-    return Group.none unless Group.supports_nested_objects?
-
     # When filtering subgroups, we want to find all matches within the tree of
     # descendants to show to the user
     groups = if params[:filter]
diff --git a/app/graphql/types/group_type.rb b/app/graphql/types/group_type.rb
index 2181b9320f59..0e539bd6b30f 100644
--- a/app/graphql/types/group_type.rb
+++ b/app/graphql/types/group_type.rb
@@ -14,11 +14,9 @@ class GroupType < NamespaceType
       group.avatar_url(only_path: false)
     end
 
-    if ::Group.supports_nested_objects?
-      field :parent, GroupType,
-            null: true,
-            resolve: -> (obj, _args, _ctx) { Gitlab::Graphql::Loaders::BatchModelLoader.new(Group, obj.parent_id).find }
-    end
+    field :parent, GroupType,
+          null: true,
+          resolve: -> (obj, _args, _ctx) { Gitlab::Graphql::Loaders::BatchModelLoader.new(Group, obj.parent_id).find }
   end
 end
 
diff --git a/app/helpers/groups_helper.rb b/app/helpers/groups_helper.rb
index 1a09ccce1f9d..27499d5b74c7 100644
--- a/app/helpers/groups_helper.rb
+++ b/app/helpers/groups_helper.rb
@@ -127,10 +127,6 @@ def parent_group_options(current_group)
     groups.to_json
   end
 
-  def supports_nested_groups?
-    Group.supports_nested_objects?
-  end
-
   private
 
   def get_group_sidebar_links
diff --git a/app/models/concerns/descendant.rb b/app/models/concerns/descendant.rb
deleted file mode 100644
index 4c4365221223..000000000000
--- a/app/models/concerns/descendant.rb
+++ /dev/null
@@ -1,11 +0,0 @@
-# frozen_string_literal: true
-
-module Descendant
-  extend ActiveSupport::Concern
-
-  class_methods do
-    def supports_nested_objects?
-      Gitlab::Database.postgresql?
-    end
-  end
-end
diff --git a/app/models/group.rb b/app/models/group.rb
index b5e95e01bb31..72d999626a10 100644
--- a/app/models/group.rb
+++ b/app/models/group.rb
@@ -10,7 +10,6 @@ class Group < Namespace
   include Referable
   include SelectForProjectAuthorization
   include LoadedInGroupList
-  include Descendant
   include GroupDescendant
   include TokenAuthenticatable
   include WithUploads
diff --git a/app/models/namespace.rb b/app/models/namespace.rb
index 8429493a7bfb..ad00d660a983 100644
--- a/app/models/namespace.rb
+++ b/app/models/namespace.rb
@@ -332,8 +332,6 @@ def sync_share_with_group_lock_with_parent
   end
 
   def force_share_with_group_lock_on_descendants
-    return unless Group.supports_nested_objects?
-
     # We can't use `descendants.update_all` since Rails will throw away the WITH
     # RECURSIVE statement. We also can't use WHERE EXISTS since we can't use
     # different table aliases, hence we're just using WHERE IN. Since we have a
diff --git a/app/policies/group_policy.rb b/app/policies/group_policy.rb
index 03e18dd7be32..2b67339a062b 100644
--- a/app/policies/group_policy.rb
+++ b/app/policies/group_policy.rb
@@ -16,8 +16,6 @@ class GroupPolicy < BasePolicy
   condition(:maintainer) { access_level >= GroupMember::MAINTAINER }
   condition(:reporter) { access_level >= GroupMember::REPORTER }
 
-  condition(:nested_groups_supported, scope: :global) { Group.supports_nested_objects? }
-
   condition(:has_parent, scope: :subject) { @subject.has_parent? }
   condition(:share_with_group_locked, scope: :subject) { @subject.share_with_group_lock? }
   condition(:parent_share_with_group_locked, scope: :subject) { @subject.parent&.share_with_group_lock? }
@@ -108,8 +106,8 @@ class GroupPolicy < BasePolicy
     enable :read_nested_project_resources
   end
 
-  rule { owner & nested_groups_supported }.enable :create_subgroup
-  rule { maintainer & maintainer_can_create_group & nested_groups_supported }.enable :create_subgroup
+  rule { owner }.enable :create_subgroup
+  rule { maintainer & maintainer_can_create_group }.enable :create_subgroup
 
   rule { public_group | logged_in_viewable }.enable :view_globally
 
diff --git a/app/services/groups/nested_create_service.rb b/app/services/groups/nested_create_service.rb
index 01bd685712bb..a51ac9aa593f 100644
--- a/app/services/groups/nested_create_service.rb
+++ b/app/services/groups/nested_create_service.rb
@@ -18,10 +18,6 @@ def execute
         return namespace
       end
 
-      if group_path.include?('/') && !Group.supports_nested_objects?
-        raise 'Nested groups are not supported on MySQL'
-      end
-
       create_group_path
     end
 
diff --git a/app/services/groups/transfer_service.rb b/app/services/groups/transfer_service.rb
index 98e7c3115721..fe7e07ef9f08 100644
--- a/app/services/groups/transfer_service.rb
+++ b/app/services/groups/transfer_service.rb
@@ -43,7 +43,6 @@ def proceed_to_transfer
 
     def ensure_allowed_transfer
       raise_transfer_error(:group_is_already_root) if group_is_already_root?
-      raise_transfer_error(:database_not_supported) unless Group.supports_nested_objects?
       raise_transfer_error(:same_parent_as_current) if same_parent?
       raise_transfer_error(:invalid_policies) unless valid_policies?
       raise_transfer_error(:namespace_with_same_path) if namespace_with_same_path?
diff --git a/app/services/members/destroy_service.rb b/app/services/members/destroy_service.rb
index 00a087b05ab5..6687b319dbfc 100644
--- a/app/services/members/destroy_service.rb
+++ b/app/services/members/destroy_service.rb
@@ -31,7 +31,7 @@ def delete_subresources(member)
       return unless member.is_a?(GroupMember) && member.user && member.group
 
       delete_project_members(member)
-      delete_subgroup_members(member) if Group.supports_nested_objects?
+      delete_subgroup_members(member)
     end
 
     def delete_project_members(member)
diff --git a/app/services/users/refresh_authorized_projects_service.rb b/app/services/users/refresh_authorized_projects_service.rb
index 4a26d2be2af1..ae67b4f52569 100644
--- a/app/services/users/refresh_authorized_projects_service.rb
+++ b/app/services/users/refresh_authorized_projects_service.rb
@@ -102,13 +102,7 @@ def current_authorizations
     end
 
     def fresh_authorizations
-      klass = if Group.supports_nested_objects?
-                Gitlab::ProjectAuthorizations::WithNestedGroups
-              else
-                Gitlab::ProjectAuthorizations::WithoutNestedGroups
-              end
-
-      klass.new(user).calculate
+      Gitlab::ProjectAuthorizations.new(user).calculate
     end
   end
 end
diff --git a/app/views/groups/settings/_advanced.html.haml b/app/views/groups/settings/_advanced.html.haml
index 5d211d0e186b..d1eb64789977 100644
--- a/app/views/groups/settings/_advanced.html.haml
+++ b/app/views/groups/settings/_advanced.html.haml
@@ -23,20 +23,19 @@
 
     = f.submit 'Change group path', class: 'btn btn-warning'
 
-- if supports_nested_groups?
-  .sub-section
-    %h4.warning-title Transfer group
-    = form_for @group, url: transfer_group_path(@group), method: :put do |f|
-      .form-group
-        = dropdown_tag('Select parent group', options: { toggle_class: 'js-groups-dropdown', title: 'Parent Group', filter: true, dropdown_class: 'dropdown-open-top dropdown-group-transfer', placeholder: 'Search groups', data: { data: parent_group_options(@group) } })
-        = hidden_field_tag 'new_parent_group_id'
+.sub-section
+  %h4.warning-title Transfer group
+  = form_for @group, url: transfer_group_path(@group), method: :put do |f|
+    .form-group
+      = dropdown_tag('Select parent group', options: { toggle_class: 'js-groups-dropdown', title: 'Parent Group', filter: true, dropdown_class: 'dropdown-open-top dropdown-group-transfer', placeholder: 'Search groups', data: { data: parent_group_options(@group) } })
+      = hidden_field_tag 'new_parent_group_id'
 
-      %ul
-        %li Be careful. Changing a group's parent can have unintended #{link_to 'side effects', 'https://docs.gitlab.com/ce/user/project/index.html#redirects-when-changing-repository-paths', target: 'blank'}.
-        %li You can only transfer the group to a group you manage.
-        %li You will need to update your local repositories to point to the new location.
-        %li If the parent group's visibility is lower than the group current visibility, visibility levels for subgroups and projects will be changed to match the new parent group's visibility.
-      = f.submit 'Transfer group', class: 'btn btn-warning'
+    %ul
+      %li Be careful. Changing a group's parent can have unintended #{link_to 'side effects', 'https://docs.gitlab.com/ce/user/project/index.html#redirects-when-changing-repository-paths', target: 'blank'}.
+      %li You can only transfer the group to a group you manage.
+      %li You will need to update your local repositories to point to the new location.
+      %li If the parent group's visibility is lower than the group current visibility, visibility levels for subgroups and projects will be changed to match the new parent group's visibility.
+    = f.submit 'Transfer group', class: 'btn btn-warning'
 
 .sub-section
   %h4.danger-title= _('Remove group')
diff --git a/ee/app/assets/javascripts/epic/components/epic_body.vue b/ee/app/assets/javascripts/epic/components/epic_body.vue
index c5ff3d520344..c25f397a2121 100644
--- a/ee/app/assets/javascripts/epic/components/epic_body.vue
+++ b/ee/app/assets/javascripts/epic/components/epic_body.vue
@@ -25,7 +25,6 @@ export default {
       'canUpdate',
       'canDestroy',
       'canAdmin',
-      'subepicsSupported',
       'initialTitleHtml',
       'initialTitleText',
       'initialDescriptionHtml',
@@ -64,7 +63,7 @@ export default {
       />
     </div>
     <related-items
-      v-if="subepicsSupported && !isEpicTreeEnabled"
+      v-if="!isEpicTreeEnabled"
       :endpoint="epicLinksEndpoint"
       :can-admin="canAdmin"
       :can-reorder="canAdmin"
diff --git a/ee/app/assets/javascripts/epic/store/state.js b/ee/app/assets/javascripts/epic/store/state.js
index 8c6a6a28d6ab..674b92f1e3af 100644
--- a/ee/app/assets/javascripts/epic/store/state.js
+++ b/ee/app/assets/javascripts/epic/store/state.js
@@ -21,7 +21,6 @@ export default () => ({
   canUpdate: false,
   canDestroy: false,
   canAdmin: false,
-  subepicsSupported: false,
 
   // Epic Information
   epicId: 0,
diff --git a/ee/app/controllers/groups/epic_links_controller.rb b/ee/app/controllers/groups/epic_links_controller.rb
index 513d5d16118c..eff2e1de08b0 100644
--- a/ee/app/controllers/groups/epic_links_controller.rb
+++ b/ee/app/controllers/groups/epic_links_controller.rb
@@ -3,8 +3,6 @@
 class Groups::EpicLinksController < Groups::ApplicationController
   include EpicRelations
 
-  before_action :check_nested_support!
-
   def update
     result = EpicLinks::UpdateService.new(child_epic, current_user, params[:epic]).execute
 
@@ -30,8 +28,4 @@ def list_service
   def child_epic
     @child_epic ||= Epic.find(params[:id])
   end
-
-  def check_nested_support!
-    render_404 unless Epic.supports_nested_objects?
-  end
 end
diff --git a/ee/app/helpers/ee/issuables_helper.rb b/ee/app/helpers/ee/issuables_helper.rb
index 72f345f70f3c..61da5f2bf57b 100644
--- a/ee/app/helpers/ee/issuables_helper.rb
+++ b/ee/app/helpers/ee/issuables_helper.rb
@@ -21,7 +21,6 @@ def issuable_initial_data(issuable)
       if parent.is_a?(Group)
         data[:issueLinksEndpoint] = group_epic_issues_path(parent, issuable)
         data[:epicLinksEndpoint] = group_epic_links_path(parent, issuable)
-        data[:subepicsSupported] = ::Epic.supports_nested_objects?
         data[:fullPath] = parent.full_path
       end
 
diff --git a/ee/app/models/ee/epic.rb b/ee/app/models/ee/epic.rb
index 2d24f6415f08..afa17d826d68 100644
--- a/ee/app/models/ee/epic.rb
+++ b/ee/app/models/ee/epic.rb
@@ -12,7 +12,6 @@ module Epic
       include Referable
       include Awardable
       include LabelEventable
-      include Descendant
       include RelativePositioning
 
       enum state: { opened: 1, closed: 2 }
@@ -164,8 +163,6 @@ def relative_positioning_parent_column
       # epic2 - parent: epic1
       # Returns: 2
       def deepest_relationship_level
-        return unless supports_nested_objects?
-
         ::Gitlab::ObjectHierarchy.new(self.where(parent_id: nil)).max_descendants_depth
       end
 
diff --git a/ee/lib/ee/gitlab/quick_actions/epic_actions.rb b/ee/lib/ee/gitlab/quick_actions/epic_actions.rb
index 23a021d5914a..097802e433a9 100644
--- a/ee/lib/ee/gitlab/quick_actions/epic_actions.rb
+++ b/ee/lib/ee/gitlab/quick_actions/epic_actions.rb
@@ -82,7 +82,7 @@ def extract_epic(params)
           end
 
           def action_allowed?
-            ::Epic.supports_nested_objects? && quick_action_target.group&.feature_available?(:epics) &&
+            quick_action_target.group&.feature_available?(:epics) &&
               current_user.can?(:"admin_#{quick_action_target.to_ability_name}", quick_action_target)
           end
         end
diff --git a/ee/lib/ee/gitlab/usage_data.rb b/ee/lib/ee/gitlab/usage_data.rb
index 35b180f0a2b0..1c644007c4f6 100644
--- a/ee/lib/ee/gitlab/usage_data.rb
+++ b/ee/lib/ee/gitlab/usage_data.rb
@@ -136,12 +136,9 @@ def system_usage_data
             projects_with_packages: count(::Packages::Package.select('distinct project_id')),
             projects_with_prometheus_alerts: count(PrometheusAlert.distinct_projects),
             projects_with_tracing_enabled: count(ProjectTracingSetting)
-          }).merge(service_desk_counts).merge(security_products_usage)
-
-          # MySql does not support recursive queries so we can't retrieve epics relationship depth
-          if ::Group.supports_nested_objects?
-            usage_data[:counts] = usage_data[:counts].merge(epics_deepest_relationship_level)
-          end
+          }).merge(service_desk_counts)
+            .merge(security_products_usage)
+            .merge(epics_deepest_relationship_level)
 
           usage_data
         end
diff --git a/ee/spec/controllers/admin/geo/nodes_controller_spec.rb b/ee/spec/controllers/admin/geo/nodes_controller_spec.rb
index 097a7695b71c..ab9f6878793c 100644
--- a/ee/spec/controllers/admin/geo/nodes_controller_spec.rb
+++ b/ee/spec/controllers/admin/geo/nodes_controller_spec.rb
@@ -1,7 +1,7 @@
 # frozen_string_literal: true
 require 'spec_helper'
 
-describe Admin::Geo::NodesController, :postgresql do
+describe Admin::Geo::NodesController do
   shared_examples 'unlicensed geo action' do
     it 'redirects to the license page' do
       expect(response).to redirect_to(admin_license_path)
diff --git a/ee/spec/controllers/concerns/ee/routable_actions/sso_enforcement_redirect_spec.rb b/ee/spec/controllers/concerns/ee/routable_actions/sso_enforcement_redirect_spec.rb
index 14366941b849..8b596f1ffa5c 100644
--- a/ee/spec/controllers/concerns/ee/routable_actions/sso_enforcement_redirect_spec.rb
+++ b/ee/spec/controllers/concerns/ee/routable_actions/sso_enforcement_redirect_spec.rb
@@ -93,7 +93,7 @@
       it_behaves_like 'a routable SSO url'
     end
 
-    context 'with a nested group', :nested_groups do
+    context 'with a nested group' do
       subject { described_class.new(nested_group) }
 
       it_behaves_like 'a routable SSO url'
@@ -105,7 +105,7 @@
       it_behaves_like 'a routable SSO url'
     end
 
-    context 'with a nested project', :nested_groups do
+    context 'with a nested project' do
       subject { described_class.new(nested_project) }
 
       it_behaves_like 'a routable SSO url'
diff --git a/ee/spec/controllers/concerns/routable_actions_spec.rb b/ee/spec/controllers/concerns/routable_actions_spec.rb
index 06758b1b53e0..4ea2f5741775 100644
--- a/ee/spec/controllers/concerns/routable_actions_spec.rb
+++ b/ee/spec/controllers/concerns/routable_actions_spec.rb
@@ -58,7 +58,7 @@ def request_params(routable)
         include_examples 'sso redirects'
       end
 
-      describe 'for a nested group', :nested_groups do
+      describe 'for a nested group' do
         let(:routable) { create(:group, :private, parent: root_group) }
 
         include_examples 'sso redirects'
@@ -70,7 +70,7 @@ def request_params(routable)
         include_examples 'sso redirects'
       end
 
-      describe 'for a nested project', :nested_groups do
+      describe 'for a nested project' do
         let(:routable) { create(:project, :private, group: create(:group, :private, parent: root_group)) }
 
         include_examples 'sso redirects'
diff --git a/ee/spec/controllers/groups/epic_links_controller_spec.rb b/ee/spec/controllers/groups/epic_links_controller_spec.rb
index 6f2c21156718..84e08920ccf6 100644
--- a/ee/spec/controllers/groups/epic_links_controller_spec.rb
+++ b/ee/spec/controllers/groups/epic_links_controller_spec.rb
@@ -2,7 +2,7 @@
 
 require 'spec_helper'
 
-describe Groups::EpicLinksController, :postgresql do
+describe Groups::EpicLinksController do
   let(:group) { create(:group, :public) }
   let(:parent_epic) { create(:epic, group: group) }
   let(:epic1) { create(:epic, group: group) }
diff --git a/ee/spec/controllers/groups/saml_providers_controller_spec.rb b/ee/spec/controllers/groups/saml_providers_controller_spec.rb
index eec2919c6907..654e5390372f 100644
--- a/ee/spec/controllers/groups/saml_providers_controller_spec.rb
+++ b/ee/spec/controllers/groups/saml_providers_controller_spec.rb
@@ -96,7 +96,7 @@ def stub_saml_config(enabled:)
         expect(assigns(:scim_token_url)).to eq("http://localhost/api/scim/v2/groups/#{group.full_path}")
       end
 
-      context 'not on a top level group', :nested_groups do
+      context 'not on a top level group' do
         let(:group) { create(:group, :nested) }
 
         it_behaves_like '404 status'
diff --git a/ee/spec/features/billings/billing_plans_spec.rb b/ee/spec/features/billings/billing_plans_spec.rb
index c57765d7879d..73fbe1165652 100644
--- a/ee/spec/features/billings/billing_plans_spec.rb
+++ b/ee/spec/features/billings/billing_plans_spec.rb
@@ -158,7 +158,7 @@
     end
   end
 
-  context 'on sub-group', :nested_groups do
+  context 'on sub-group' do
     let(:user2) { create(:user) }
     let(:user3) { create(:user) }
     let(:group) { create(:group, plan: :bronze_plan) }
diff --git a/ee/spec/features/epics/epic_issues_spec.rb b/ee/spec/features/epics/epic_issues_spec.rb
index da6884b1a878..b874ae1a0541 100644
--- a/ee/spec/features/epics/epic_issues_spec.rb
+++ b/ee/spec/features/epics/epic_issues_spec.rb
@@ -55,7 +55,7 @@ def visit_epic
       expect(page).not_to have_selector('.related-items-tree-container .js-add-issues-button')
     end
 
-    it 'user cannot add new epics to the epic', :postgresql do
+    it 'user cannot add new epics to the epic' do
       expect(page).not_to have_selector('.related-items-tree-container .js-add-epics-button')
     end
   end
@@ -109,7 +109,7 @@ def add_epics(references)
       end
     end
 
-    it 'user can see all epics of the group and delete the associations', :postgresql do
+    it 'user can see all epics of the group and delete the associations' do
       within('.related-items-tree-container ul.related-items-list') do
         expect(page).to have_selector('li.js-item-type-epic', count: 2)
         expect(page).to have_content(nested_epics[0].title)
@@ -146,7 +146,7 @@ def add_epics(references)
       end
     end
 
-    it 'user can add new epics to the epic', :postgresql do
+    it 'user can add new epics to the epic' do
       references = "#{epic_to_add.to_reference(full: true)}"
       add_epics(references)
 
diff --git a/ee/spec/features/groups/group_settings_spec.rb b/ee/spec/features/groups/group_settings_spec.rb
index 1ea5c6ab2c4d..cdddf30415b0 100644
--- a/ee/spec/features/groups/group_settings_spec.rb
+++ b/ee/spec/features/groups/group_settings_spec.rb
@@ -148,7 +148,7 @@
     end
   end
 
-  context 'when custom_project_templates feature', :postgresql do
+  context 'when custom_project_templates feature' do
     let!(:subgroup) { create(:group, :public, parent: group) }
     let!(:subgroup_1) { create(:group, :public, parent: subgroup) }
 
diff --git a/ee/spec/features/labels_hierarchy.rb b/ee/spec/features/labels_hierarchy.rb
index 7961c93f5120..424138739eb9 100644
--- a/ee/spec/features/labels_hierarchy.rb
+++ b/ee/spec/features/labels_hierarchy.rb
@@ -1,6 +1,6 @@
 require 'spec_helper'
 
-describe 'Labels Hierarchy', :js, :nested_groups do
+describe 'Labels Hierarchy', :js do
   let!(:user) { create(:user) }
   let!(:grandparent) { create(:group) }
   let!(:parent) { create(:group, parent: grandparent) }
diff --git a/ee/spec/features/projects/members/invite_group_and_members_spec.rb b/ee/spec/features/projects/members/invite_group_and_members_spec.rb
index 1535ca40df20..5fb688dc6640 100644
--- a/ee/spec/features/projects/members/invite_group_and_members_spec.rb
+++ b/ee/spec/features/projects/members/invite_group_and_members_spec.rb
@@ -104,7 +104,7 @@
       end
     end
 
-    context 'for a project in a subgroup', :nested_groups do
+    context 'for a project in a subgroup' do
       let(:root_group) { create(:group) }
       let(:subgroup) { create(:group, parent: root_group) }
       let(:project) { create(:project, namespace: subgroup) }
diff --git a/ee/spec/features/projects/new_project_spec.rb b/ee/spec/features/projects/new_project_spec.rb
index a3d6131b0b1c..c018c50fc181 100644
--- a/ee/spec/features/projects/new_project_spec.rb
+++ b/ee/spec/features/projects/new_project_spec.rb
@@ -177,7 +177,7 @@
     end
   end
 
-  context 'Group-level project templates', :js, :postgresql do
+  context 'Group-level project templates', :js do
     def visit_create_from_group_template_tab
       visit url
       click_link 'Create from template'
diff --git a/ee/spec/finders/boards/milestones_finder_spec.rb b/ee/spec/finders/boards/milestones_finder_spec.rb
index cb651040680a..170af2548032 100644
--- a/ee/spec/finders/boards/milestones_finder_spec.rb
+++ b/ee/spec/finders/boards/milestones_finder_spec.rb
@@ -18,7 +18,7 @@
     let(:user) { create(:user) }
     let(:finder) { described_class.new(board, user) }
 
-    context 'when project board', :nested_groups do
+    context 'when project board' do
       let(:board) { create(:board, project: nested_group_project, group: nil) }
 
       it 'returns milestones from board project and ancestors groups' do
@@ -32,7 +32,7 @@
       end
     end
 
-    context 'when group board', :nested_groups do
+    context 'when group board' do
       let(:board) { create(:board, project: nil, group: nested_group) }
 
       it 'returns milestones from board group and its ancestors' do
diff --git a/ee/spec/finders/epics_finder_spec.rb b/ee/spec/finders/epics_finder_spec.rb
index c55d460eedf5..067c9497ea62 100644
--- a/ee/spec/finders/epics_finder_spec.rb
+++ b/ee/spec/finders/epics_finder_spec.rb
@@ -110,7 +110,7 @@ def epics(params = {})
           end
         end
 
-        context 'when subgroups are supported', :nested_groups do
+        context 'when subgroups are supported' do
           let(:subgroup) { create(:group, :private, parent: group) }
           let(:subgroup2) { create(:group, :private, parent: subgroup) }
           let!(:subepic1) { create(:epic, group: subgroup) }
diff --git a/ee/spec/finders/geo/repository_verification_finder_spec.rb b/ee/spec/finders/geo/repository_verification_finder_spec.rb
index 5626768dcbcf..c7d8b1b6f6e0 100644
--- a/ee/spec/finders/geo/repository_verification_finder_spec.rb
+++ b/ee/spec/finders/geo/repository_verification_finder_spec.rb
@@ -1,6 +1,6 @@
 require 'spec_helper'
 
-describe Geo::RepositoryVerificationFinder, :postgresql do
+describe Geo::RepositoryVerificationFinder do
   set(:project) { create(:project) }
 
   describe '#find_failed_repositories' do
diff --git a/ee/spec/graphql/resolvers/epic_resolver_spec.rb b/ee/spec/graphql/resolvers/epic_resolver_spec.rb
index 7c1ad20b426e..e95a41a474d8 100644
--- a/ee/spec/graphql/resolvers/epic_resolver_spec.rb
+++ b/ee/spec/graphql/resolvers/epic_resolver_spec.rb
@@ -60,7 +60,7 @@
         end
       end
 
-      context 'with subgroups', :nested_groups do
+      context 'with subgroups' do
         let(:sub_group) { create(:group, parent: group) }
         let(:iids)      { [epic1, epic2].map(&:iid) }
         let!(:epic3)    { create(:epic, group: sub_group, iid: epic1.iid) }
diff --git a/ee/spec/helpers/ee/issuables_helper_spec.rb b/ee/spec/helpers/ee/issuables_helper_spec.rb
index 434c2ff09e78..265fafd495dc 100644
--- a/ee/spec/helpers/ee/issuables_helper_spec.rb
+++ b/ee/spec/helpers/ee/issuables_helper_spec.rb
@@ -35,8 +35,7 @@
         initialTitleText: epic.title,
         initialDescriptionHtml: '<p dir="auto">epic text</p>',
         initialDescriptionText: 'epic text',
-        initialTaskStatus: '0 of 0 tasks completed',
-        subepicsSupported: Gitlab::Database.postgresql?
+        initialTaskStatus: '0 of 0 tasks completed'
       }
       expect(helper.issuable_initial_data(epic)).to eq(expected_data)
     end
diff --git a/ee/spec/helpers/ee/namespaces_helper_spec.rb b/ee/spec/helpers/ee/namespaces_helper_spec.rb
index 6c45e1a8fb7c..78b0dcb02039 100644
--- a/ee/spec/helpers/ee/namespaces_helper_spec.rb
+++ b/ee/spec/helpers/ee/namespaces_helper_spec.rb
@@ -1,7 +1,7 @@
 # frozen_string_literal: true
 require 'spec_helper'
 
-describe EE::NamespacesHelper, :postgresql do
+describe EE::NamespacesHelper do
   let!(:admin) { create(:admin) }
   let!(:admin_project_creation_level) { nil }
   let!(:admin_group) do
diff --git a/ee/spec/lib/ee/api/entities/geo_node_status_spec.rb b/ee/spec/lib/ee/api/entities/geo_node_status_spec.rb
index a214f98bdc6e..2dd8848e9b29 100644
--- a/ee/spec/lib/ee/api/entities/geo_node_status_spec.rb
+++ b/ee/spec/lib/ee/api/entities/geo_node_status_spec.rb
@@ -1,6 +1,6 @@
 require 'spec_helper'
 
-describe EE::API::Entities::GeoNodeStatus, :postgresql do
+describe EE::API::Entities::GeoNodeStatus do
   include ::EE::GeoHelpers
 
   let(:geo_node_status) { build(:geo_node_status) }
diff --git a/ee/spec/lib/gitlab/custom_file_templates_spec.rb b/ee/spec/lib/gitlab/custom_file_templates_spec.rb
index 3763b2621c3c..fcea31fbf4a4 100644
--- a/ee/spec/lib/gitlab/custom_file_templates_spec.rb
+++ b/ee/spec/lib/gitlab/custom_file_templates_spec.rb
@@ -83,7 +83,7 @@ def template_files(prefix)
           end
         end
 
-        context 'in a subgroup', :nested_groups do
+        context 'in a subgroup' do
           set(:subgroup) { create(:group, parent: group) }
           set(:subproject) { create(:project, namespace: subgroup) }
           set(:subgroup_template_project) { create(:project, :custom_repo, namespace: subgroup, files: template_files('subgroup')) }
@@ -151,7 +151,7 @@ def be_template(key, category)
           end
         end
 
-        context 'in a subgroup', :nested_groups do
+        context 'in a subgroup' do
           let(:subgroup) { create(:group, parent: group) }
           let(:subproject) { create(:project, namespace: subgroup) }
           let(:subgroup_template_project) { create(:project, :custom_repo, namespace: subgroup, files: template_files('subgroup')) }
diff --git a/ee/spec/lib/gitlab/database/load_balancing/host_spec.rb b/ee/spec/lib/gitlab/database/load_balancing/host_spec.rb
index 2392c3f7b836..d32eed52f5e4 100644
--- a/ee/spec/lib/gitlab/database/load_balancing/host_spec.rb
+++ b/ee/spec/lib/gitlab/database/load_balancing/host_spec.rb
@@ -1,6 +1,6 @@
 require 'spec_helper'
 
-describe Gitlab::Database::LoadBalancing::Host, :postgresql do
+describe Gitlab::Database::LoadBalancing::Host do
   let(:load_balancer) do
     Gitlab::Database::LoadBalancing::LoadBalancer.new(%w[localhost])
   end
diff --git a/ee/spec/lib/gitlab/geo/log_cursor/daemon_spec.rb b/ee/spec/lib/gitlab/geo/log_cursor/daemon_spec.rb
index 347db221a480..4ad642be235d 100644
--- a/ee/spec/lib/gitlab/geo/log_cursor/daemon_spec.rb
+++ b/ee/spec/lib/gitlab/geo/log_cursor/daemon_spec.rb
@@ -1,6 +1,6 @@
 require 'spec_helper'
 
-describe Gitlab::Geo::LogCursor::Daemon, :postgresql, :clean_gitlab_redis_shared_state do
+describe Gitlab::Geo::LogCursor::Daemon, :clean_gitlab_redis_shared_state do
   include ::EE::GeoHelpers
   include ExclusiveLeaseHelpers
 
diff --git a/ee/spec/lib/gitlab/geo/log_cursor/event_logs_spec.rb b/ee/spec/lib/gitlab/geo/log_cursor/event_logs_spec.rb
index 0e7c5b917f34..7f523945620f 100644
--- a/ee/spec/lib/gitlab/geo/log_cursor/event_logs_spec.rb
+++ b/ee/spec/lib/gitlab/geo/log_cursor/event_logs_spec.rb
@@ -1,6 +1,6 @@
 require 'spec_helper'
 
-describe Gitlab::Geo::LogCursor::EventLogs, :postgresql, :clean_gitlab_redis_shared_state do
+describe Gitlab::Geo::LogCursor::EventLogs, :clean_gitlab_redis_shared_state do
   subject { described_class.new }
 
   describe '#fetch_in_batches' do
diff --git a/ee/spec/lib/gitlab/geo/log_cursor/events/cache_invalidation_event_spec.rb b/ee/spec/lib/gitlab/geo/log_cursor/events/cache_invalidation_event_spec.rb
index 949628ae20d2..4a9a770d8a83 100644
--- a/ee/spec/lib/gitlab/geo/log_cursor/events/cache_invalidation_event_spec.rb
+++ b/ee/spec/lib/gitlab/geo/log_cursor/events/cache_invalidation_event_spec.rb
@@ -2,7 +2,7 @@
 
 require 'spec_helper'
 
-describe Gitlab::Geo::LogCursor::Events::CacheInvalidationEvent, :postgresql, :clean_gitlab_redis_shared_state do
+describe Gitlab::Geo::LogCursor::Events::CacheInvalidationEvent, :clean_gitlab_redis_shared_state do
   let(:logger) { Gitlab::Geo::LogCursor::Logger.new(described_class, Logger::INFO) }
   let(:event_log) { create(:geo_event_log, :cache_invalidation_event) }
   let!(:event_log_state) { create(:geo_event_log_state, event_id: event_log.id - 1) }
diff --git a/ee/spec/lib/gitlab/geo/log_cursor/events/hashed_storage_attachments_event_spec.rb b/ee/spec/lib/gitlab/geo/log_cursor/events/hashed_storage_attachments_event_spec.rb
index 69f9325cd946..0056d86ce266 100644
--- a/ee/spec/lib/gitlab/geo/log_cursor/events/hashed_storage_attachments_event_spec.rb
+++ b/ee/spec/lib/gitlab/geo/log_cursor/events/hashed_storage_attachments_event_spec.rb
@@ -1,6 +1,6 @@
 require 'spec_helper'
 
-describe Gitlab::Geo::LogCursor::Events::HashedStorageAttachmentsEvent, :postgresql, :clean_gitlab_redis_shared_state do
+describe Gitlab::Geo::LogCursor::Events::HashedStorageAttachmentsEvent, :clean_gitlab_redis_shared_state do
   let(:logger) { Gitlab::Geo::LogCursor::Logger.new(described_class, Logger::INFO) }
   let(:event_log) { create(:geo_event_log, :hashed_storage_attachments_event) }
   let!(:event_log_state) { create(:geo_event_log_state, event_id: event_log.id - 1) }
diff --git a/ee/spec/lib/gitlab/geo/log_cursor/events/hashed_storage_migrated_event_spec.rb b/ee/spec/lib/gitlab/geo/log_cursor/events/hashed_storage_migrated_event_spec.rb
index 1432953a1357..965c2ae0d903 100644
--- a/ee/spec/lib/gitlab/geo/log_cursor/events/hashed_storage_migrated_event_spec.rb
+++ b/ee/spec/lib/gitlab/geo/log_cursor/events/hashed_storage_migrated_event_spec.rb
@@ -1,6 +1,6 @@
 require 'spec_helper'
 
-describe Gitlab::Geo::LogCursor::Events::HashedStorageMigratedEvent, :postgresql, :clean_gitlab_redis_shared_state do
+describe Gitlab::Geo::LogCursor::Events::HashedStorageMigratedEvent, :clean_gitlab_redis_shared_state do
   let(:logger) { Gitlab::Geo::LogCursor::Logger.new(described_class, Logger::INFO) }
   let(:event_log) { create(:geo_event_log, :hashed_storage_migration_event) }
   let!(:event_log_state) { create(:geo_event_log_state, event_id: event_log.id - 1) }
diff --git a/ee/spec/lib/gitlab/geo/log_cursor/events/job_artifact_deleted_event_spec.rb b/ee/spec/lib/gitlab/geo/log_cursor/events/job_artifact_deleted_event_spec.rb
index f140b86decf9..a1de7cf500f7 100644
--- a/ee/spec/lib/gitlab/geo/log_cursor/events/job_artifact_deleted_event_spec.rb
+++ b/ee/spec/lib/gitlab/geo/log_cursor/events/job_artifact_deleted_event_spec.rb
@@ -1,6 +1,6 @@
 require 'spec_helper'
 
-describe Gitlab::Geo::LogCursor::Events::JobArtifactDeletedEvent, :postgresql, :clean_gitlab_redis_shared_state do
+describe Gitlab::Geo::LogCursor::Events::JobArtifactDeletedEvent, :clean_gitlab_redis_shared_state do
   let(:logger) { Gitlab::Geo::LogCursor::Logger.new(described_class, Logger::INFO) }
   let(:event_log) { create(:geo_event_log, :job_artifact_deleted_event) }
   let!(:event_log_state) { create(:geo_event_log_state, event_id: event_log.id - 1) }
diff --git a/ee/spec/lib/gitlab/geo/log_cursor/events/lfs_object_deleted_event_spec.rb b/ee/spec/lib/gitlab/geo/log_cursor/events/lfs_object_deleted_event_spec.rb
index d8dd96f92159..45a9f6e51079 100644
--- a/ee/spec/lib/gitlab/geo/log_cursor/events/lfs_object_deleted_event_spec.rb
+++ b/ee/spec/lib/gitlab/geo/log_cursor/events/lfs_object_deleted_event_spec.rb
@@ -1,6 +1,6 @@
 require 'spec_helper'
 
-describe Gitlab::Geo::LogCursor::Events::LfsObjectDeletedEvent, :postgresql, :clean_gitlab_redis_shared_state do
+describe Gitlab::Geo::LogCursor::Events::LfsObjectDeletedEvent, :clean_gitlab_redis_shared_state do
   let(:logger) { Gitlab::Geo::LogCursor::Logger.new(described_class, Logger::INFO) }
   let(:event_log) { create(:geo_event_log, :lfs_object_deleted_event) }
   let!(:event_log_state) { create(:geo_event_log_state, event_id: event_log.id - 1) }
diff --git a/ee/spec/lib/gitlab/geo/log_cursor/events/repositories_changed_event_spec.rb b/ee/spec/lib/gitlab/geo/log_cursor/events/repositories_changed_event_spec.rb
index 15895e69ab4c..0c4481624d92 100644
--- a/ee/spec/lib/gitlab/geo/log_cursor/events/repositories_changed_event_spec.rb
+++ b/ee/spec/lib/gitlab/geo/log_cursor/events/repositories_changed_event_spec.rb
@@ -1,6 +1,6 @@
 require 'spec_helper'
 
-describe Gitlab::Geo::LogCursor::Events::RepositoriesChangedEvent, :postgresql, :clean_gitlab_redis_shared_state do
+describe Gitlab::Geo::LogCursor::Events::RepositoriesChangedEvent, :clean_gitlab_redis_shared_state do
   include ::EE::GeoHelpers
 
   let(:logger) { Gitlab::Geo::LogCursor::Logger.new(described_class, Logger::INFO) }
diff --git a/ee/spec/lib/gitlab/geo/log_cursor/events/repository_created_event_spec.rb b/ee/spec/lib/gitlab/geo/log_cursor/events/repository_created_event_spec.rb
index adc68ac7b89c..58391434d797 100644
--- a/ee/spec/lib/gitlab/geo/log_cursor/events/repository_created_event_spec.rb
+++ b/ee/spec/lib/gitlab/geo/log_cursor/events/repository_created_event_spec.rb
@@ -1,6 +1,6 @@
 require 'spec_helper'
 
-describe Gitlab::Geo::LogCursor::Events::RepositoryCreatedEvent, :postgresql, :clean_gitlab_redis_shared_state do
+describe Gitlab::Geo::LogCursor::Events::RepositoryCreatedEvent, :clean_gitlab_redis_shared_state do
   let(:logger) { Gitlab::Geo::LogCursor::Logger.new(described_class, Logger::INFO) }
   let(:project) { create(:project) }
   let(:repository_created_event) { create(:geo_repository_created_event, project: project) }
diff --git a/ee/spec/lib/gitlab/geo/log_cursor/events/repository_deleted_event_spec.rb b/ee/spec/lib/gitlab/geo/log_cursor/events/repository_deleted_event_spec.rb
index e9df8cfeca39..19f62b1b8ea7 100644
--- a/ee/spec/lib/gitlab/geo/log_cursor/events/repository_deleted_event_spec.rb
+++ b/ee/spec/lib/gitlab/geo/log_cursor/events/repository_deleted_event_spec.rb
@@ -1,6 +1,6 @@
 require 'spec_helper'
 
-describe Gitlab::Geo::LogCursor::Events::RepositoryDeletedEvent, :postgresql, :clean_gitlab_redis_shared_state do
+describe Gitlab::Geo::LogCursor::Events::RepositoryDeletedEvent, :clean_gitlab_redis_shared_state do
   let(:logger) { Gitlab::Geo::LogCursor::Logger.new(described_class, Logger::INFO) }
   let(:event_log) { create(:geo_event_log, :deleted_event) }
   let!(:event_log_state) { create(:geo_event_log_state, event_id: event_log.id - 1) }
diff --git a/ee/spec/lib/gitlab/geo/log_cursor/events/repository_renamed_event_spec.rb b/ee/spec/lib/gitlab/geo/log_cursor/events/repository_renamed_event_spec.rb
index aa0419a6e7d6..9e70dae47c96 100644
--- a/ee/spec/lib/gitlab/geo/log_cursor/events/repository_renamed_event_spec.rb
+++ b/ee/spec/lib/gitlab/geo/log_cursor/events/repository_renamed_event_spec.rb
@@ -1,6 +1,6 @@
 require 'spec_helper'
 
-describe Gitlab::Geo::LogCursor::Events::RepositoryRenamedEvent, :postgresql, :clean_gitlab_redis_shared_state do
+describe Gitlab::Geo::LogCursor::Events::RepositoryRenamedEvent, :clean_gitlab_redis_shared_state do
   let(:logger) { Gitlab::Geo::LogCursor::Logger.new(described_class, Logger::INFO) }
   let(:event_log) { create(:geo_event_log, :renamed_event) }
   let!(:event_log_state) { create(:geo_event_log_state, event_id: event_log.id - 1) }
diff --git a/ee/spec/lib/gitlab/geo/log_cursor/events/repository_updated_event_spec.rb b/ee/spec/lib/gitlab/geo/log_cursor/events/repository_updated_event_spec.rb
index d22de7ed5e4e..28e9b24d4b6f 100644
--- a/ee/spec/lib/gitlab/geo/log_cursor/events/repository_updated_event_spec.rb
+++ b/ee/spec/lib/gitlab/geo/log_cursor/events/repository_updated_event_spec.rb
@@ -1,6 +1,6 @@
 require 'spec_helper'
 
-describe Gitlab::Geo::LogCursor::Events::RepositoryUpdatedEvent, :postgresql, :clean_gitlab_redis_shared_state do
+describe Gitlab::Geo::LogCursor::Events::RepositoryUpdatedEvent, :clean_gitlab_redis_shared_state do
   include ::EE::GeoHelpers
 
   let(:logger) { Gitlab::Geo::LogCursor::Logger.new(described_class, Logger::INFO) }
diff --git a/ee/spec/lib/gitlab/geo/log_cursor/events/reset_checksum_event_spec.rb b/ee/spec/lib/gitlab/geo/log_cursor/events/reset_checksum_event_spec.rb
index 74be80878243..2e0d8b0fcf76 100644
--- a/ee/spec/lib/gitlab/geo/log_cursor/events/reset_checksum_event_spec.rb
+++ b/ee/spec/lib/gitlab/geo/log_cursor/events/reset_checksum_event_spec.rb
@@ -2,7 +2,7 @@
 
 require 'spec_helper'
 
-describe Gitlab::Geo::LogCursor::Events::ResetChecksumEvent, :postgresql, :clean_gitlab_redis_shared_state do
+describe Gitlab::Geo::LogCursor::Events::ResetChecksumEvent, :clean_gitlab_redis_shared_state do
   let(:logger) { Gitlab::Geo::LogCursor::Logger.new(described_class, Logger::INFO) }
   let(:event_log) { create(:geo_event_log, :reset_checksum_event) }
   let!(:event_log_state) { create(:geo_event_log_state, event_id: event_log.id - 1) }
diff --git a/ee/spec/lib/gitlab/geo/log_cursor/events/upload_deleted_event_spec.rb b/ee/spec/lib/gitlab/geo/log_cursor/events/upload_deleted_event_spec.rb
index b97f28f79286..7f6a7d90e3a9 100644
--- a/ee/spec/lib/gitlab/geo/log_cursor/events/upload_deleted_event_spec.rb
+++ b/ee/spec/lib/gitlab/geo/log_cursor/events/upload_deleted_event_spec.rb
@@ -1,6 +1,6 @@
 require 'spec_helper'
 
-describe Gitlab::Geo::LogCursor::Events::UploadDeletedEvent, :postgresql, :clean_gitlab_redis_shared_state do
+describe Gitlab::Geo::LogCursor::Events::UploadDeletedEvent, :clean_gitlab_redis_shared_state do
   let(:logger) { Gitlab::Geo::LogCursor::Logger.new(described_class, Logger::INFO) }
   let(:project) { create(:project) }
   let(:upload_deleted_event) { create(:geo_upload_deleted_event, project: project) }
diff --git a/ee/spec/lib/gitlab/insights/finders/issuable_finder_spec.rb b/ee/spec/lib/gitlab/insights/finders/issuable_finder_spec.rb
index dbc1591cdc6f..2962f6aff624 100644
--- a/ee/spec/lib/gitlab/insights/finders/issuable_finder_spec.rb
+++ b/ee/spec/lib/gitlab/insights/finders/issuable_finder_spec.rb
@@ -166,7 +166,7 @@ def find(entity, opts)
       end
     end
 
-    context 'for a group with subgroups', :nested_groups do
+    context 'for a group with subgroups' do
       include_examples 'group tests' do
         let(:project) { create(:project, :public, group: create(:group, parent: entity)) }
       end
diff --git a/ee/spec/lib/gitlab/usage_data_spec.rb b/ee/spec/lib/gitlab/usage_data_spec.rb
index 466f23b5c4a7..0a3ae0a5395b 100644
--- a/ee/spec/lib/gitlab/usage_data_spec.rb
+++ b/ee/spec/lib/gitlab/usage_data_spec.rb
@@ -88,7 +88,7 @@
       expect(count_data[:feature_flags]).to eq(1)
     end
 
-    it 'gathers deepest epic relationship level', :postgresql do
+    it 'gathers deepest epic relationship level' do
       expect(count_data.keys).to include(:epics_deepest_relationship_level)
     end
 
diff --git a/ee/spec/models/burndown_spec.rb b/ee/spec/models/burndown_spec.rb
index 67364ca32f8b..ee0a4ddabc51 100644
--- a/ee/spec/models/burndown_spec.rb
+++ b/ee/spec/models/burndown_spec.rb
@@ -169,7 +169,7 @@
     let(:parent_group_milestone) { create(:milestone, project: nil, group: parent_group, start_date: start_date, due_date: due_date) }
     let(:group_milestone) { create(:milestone, group: group, start_date: start_date, due_date: due_date) }
 
-    context 'when nested group milestone', :nested_groups do
+    context 'when nested group milestone' do
       before do
         parent_group.add_developer(user)
       end
diff --git a/ee/spec/models/concerns/elastic/project_spec.rb b/ee/spec/models/concerns/elastic/project_spec.rb
index 93f387948839..20d1433a9c78 100644
--- a/ee/spec/models/concerns/elastic/project_spec.rb
+++ b/ee/spec/models/concerns/elastic/project_spec.rb
@@ -74,7 +74,7 @@
         end
       end
 
-      it 'indexes only projects under the group', :nested_groups do
+      it 'indexes only projects under the group' do
         Sidekiq::Testing.inline! do
           create :project, name: 'test1', group: create(:group, parent: group)
           create :project, name: 'test2', description: 'awesome project'
diff --git a/ee/spec/models/epic_spec.rb b/ee/spec/models/epic_spec.rb
index b6b0d46540b1..7b966f398776 100644
--- a/ee/spec/models/epic_spec.rb
+++ b/ee/spec/models/epic_spec.rb
@@ -118,7 +118,7 @@ def epics(order_by)
         expect(epic.valid_parent?).to be_falsey
       end
 
-      it 'returns false when level is too deep', :nested_groups do
+      it 'returns false when level is too deep' do
         epic1 = create(:epic, group: group)
         epic2 = create(:epic, group: group, parent: epic1)
         epic3 = create(:epic, group: group, parent: epic2)
@@ -142,7 +142,7 @@ def epics(order_by)
         expect(epic.valid_parent?).to be_truthy
       end
 
-      it 'returns false when total depth after adding would exceed limit', :nested_groups do
+      it 'returns false when total depth after adding would exceed limit' do
         child_epic2 = create(:epic, group: group, parent: child_epic1)
         child_epic3 = create(:epic, group: group, parent: child_epic2)
         child_epic4 = create(:epic, group: group, parent: child_epic3)
@@ -166,7 +166,7 @@ def epics(order_by)
         expect(epic.valid_parent?).to be_truthy
       end
 
-      it 'returns false when total depth after adding would exceed limit', :nested_groups do
+      it 'returns false when total depth after adding would exceed limit' do
         root_epic.update(parent: create(:epic, group: group))
         create(:epic, group: group, parent: child_epic1)
 
@@ -185,14 +185,14 @@ def epics(order_by)
         expect(epic.valid_parent?).to be_falsey
       end
 
-      it 'returns false when child epic is parent of the given parent', :nested_groups do
+      it 'returns false when child epic is parent of the given parent' do
         epic1 = create(:epic, group: group, parent: epic)
         epic.parent = epic1
 
         expect(epic.valid_parent?).to be_falsey
       end
 
-      it 'returns false when child epic is an ancestor of the given parent', :nested_groups do
+      it 'returns false when child epic is an ancestor of the given parent' do
         epic1 = create(:epic, group: group, parent: epic)
         epic2 = create(:epic, group: group, parent: epic1)
         epic.parent = epic2
@@ -207,7 +207,7 @@ def epics(order_by)
     let(:epic2) { create(:epic, group: group, parent: epic1) }
     let(:epic3) { create(:epic, group: group, parent: epic2) }
 
-    describe '#ancestors', :nested_groups do
+    describe '#ancestors' do
       it 'returns all ancestors for an epic' do
         expect(epic3.ancestors).to eq [epic2, epic1]
       end
@@ -217,7 +217,7 @@ def epics(order_by)
       end
     end
 
-    describe '#descendants', :nested_groups do
+    describe '#descendants' do
       it 'returns all descendants for an epic' do
         expect(epic1.descendants).to match_array([epic2, epic3])
       end
@@ -576,7 +576,7 @@ def setup_control_group
     end
   end
 
-  describe '.deepest_relationship_level', :postgresql do
+  describe '.deepest_relationship_level' do
     context 'when there are no epics' do
       it 'returns nil' do
         expect(described_class.deepest_relationship_level).to be_nil
diff --git a/ee/spec/models/gitlab_subscription_spec.rb b/ee/spec/models/gitlab_subscription_spec.rb
index ada7d847bed4..ac74629d810e 100644
--- a/ee/spec/models/gitlab_subscription_spec.rb
+++ b/ee/spec/models/gitlab_subscription_spec.rb
@@ -48,14 +48,14 @@
       expect(gitlab_subscription.seats_in_use).to eq(1)
     end
 
-    it 'also counts users from subgroups', :postgresql do
+    it 'also counts users from subgroups' do
       group.add_developer(user_1)
       subgroup_1.add_developer(user_2)
 
       expect(gitlab_subscription.seats_in_use).to eq(2)
     end
 
-    it 'does not count duplicated members', :postgresql do
+    it 'does not count duplicated members' do
       group.add_developer(user_1)
       subgroup_1.add_developer(user_2)
       subgroup_2.add_developer(user_2)
diff --git a/ee/spec/models/namespace_spec.rb b/ee/spec/models/namespace_spec.rb
index f45712fb5898..e402b6775e62 100644
--- a/ee/spec/models/namespace_spec.rb
+++ b/ee/spec/models/namespace_spec.rb
@@ -213,13 +213,11 @@
           end
         end
 
-        if Group.supports_nested_objects?
-          context 'when license is applied to parent group' do
-            let(:child_group) { create :group, parent: group }
+        context 'when license is applied to parent group' do
+          let(:child_group) { create :group, parent: group }
 
-            it 'child group has feature available' do
-              expect(child_group.feature_available?(feature)).to be_truthy
-            end
+          it 'child group has feature available' do
+            expect(child_group.feature_available?(feature)).to be_truthy
           end
         end
       end
@@ -460,7 +458,7 @@
 
         it { is_expected.to be_truthy }
 
-        context 'when is subgroup', :nested_groups do
+        context 'when is subgroup' do
           before do
             namespace.parent = build(:group)
           end
@@ -478,7 +476,7 @@
   describe '#shared_runners_enabled?' do
     subject { namespace.shared_runners_enabled? }
 
-    context 'subgroup with shared runners enabled project', :nested_groups do
+    context 'subgroup with shared runners enabled project' do
       let(:subgroup) { create(:group, parent: namespace) }
       let!(:subproject) { create(:project, namespace: subgroup, shared_runners_enabled: true) }
 
@@ -776,7 +774,7 @@
     end
   end
 
-  describe '#membership_lock with subgroups', :nested_groups do
+  describe '#membership_lock with subgroups' do
     context 'when creating a subgroup' do
       let(:subgroup) { create(:group, parent: root_group) }
 
diff --git a/ee/spec/models/pg_replication_slot_spec.rb b/ee/spec/models/pg_replication_slot_spec.rb
index 541dc1ea91a3..8f334496eba3 100644
--- a/ee/spec/models/pg_replication_slot_spec.rb
+++ b/ee/spec/models/pg_replication_slot_spec.rb
@@ -1,13 +1,13 @@
 require 'spec_helper'
 
-describe PgReplicationSlot, :postgresql do
+describe PgReplicationSlot do
   if Gitlab::Database.replication_slots_supported?
     describe 'with replication slot support' do
       it '#max_replication_slots' do
         expect(described_class.max_replication_slots).to be >= 0
       end
 
-      skip_examples = PgReplicationSlot.max_replication_slots <= PgReplicationSlot.count
+      skip_examples = described_class.max_replication_slots <= described_class.count
       context 'with enough slots available' do
         before(:all) do
           skip('max_replication_slots too small') if skip_examples
@@ -37,11 +37,11 @@
         end
 
         it '#max_retained_wal' do
-          expect(PgReplicationSlot.max_retained_wal).not_to be_nil
+          expect(described_class.max_retained_wal).not_to be_nil
         end
 
         it '#slots_retained_bytes' do
-          slot = PgReplicationSlot.slots_retained_bytes.find {|x| x['slot_name'] == 'test_slot' }
+          slot = described_class.slots_retained_bytes.find {|x| x['slot_name'] == 'test_slot' }
 
           expect(slot).not_to be_nil
           expect(slot['retained_bytes']).to be_nil
diff --git a/ee/spec/models/project_spec.rb b/ee/spec/models/project_spec.rb
index 4902eae314c6..c82e3b310ba7 100644
--- a/ee/spec/models/project_spec.rb
+++ b/ee/spec/models/project_spec.rb
@@ -598,7 +598,7 @@
 
     subject { project.root_namespace }
 
-    context 'when namespace has parent group', :nested_groups do
+    context 'when namespace has parent group' do
       let(:root_ancestor) { create(:group) }
       let(:parent) { create(:group, parent: root_ancestor) }
 
@@ -616,7 +616,7 @@
     end
   end
 
-  describe '#shared_runners_limit_namespace', :nested_groups do
+  describe '#shared_runners_limit_namespace' do
     set(:root_ancestor) { create(:group) }
     set(:group) { create(:group, parent: root_ancestor) }
     let(:project) { create(:project, namespace: group) }
diff --git a/ee/spec/models/user_spec.rb b/ee/spec/models/user_spec.rb
index 81baccd18836..849ca839d157 100644
--- a/ee/spec/models/user_spec.rb
+++ b/ee/spec/models/user_spec.rb
@@ -329,7 +329,7 @@
     end
   end
 
-  describe '#available_subgroups_with_custom_project_templates', :postgresql do
+  describe '#available_subgroups_with_custom_project_templates' do
     let(:user) { create(:user) }
 
     context 'without Groups with custom project templates' do
diff --git a/ee/spec/policies/group_policy_spec.rb b/ee/spec/policies/group_policy_spec.rb
index 0d676bc25645..e87edba006f4 100644
--- a/ee/spec/policies/group_policy_spec.rb
+++ b/ee/spec/policies/group_policy_spec.rb
@@ -348,7 +348,7 @@
     end
   end
 
-  describe 'private nested group use the highest access level from the group and inherited permissions', :nested_groups do
+  describe 'private nested group use the highest access level from the group and inherited permissions' do
     let(:nested_group) { create(:group, :private, parent: group) }
 
     before do
diff --git a/ee/spec/presenters/epic_presenter_spec.rb b/ee/spec/presenters/epic_presenter_spec.rb
index 4ddf12d8b22b..18194a2280cf 100644
--- a/ee/spec/presenters/epic_presenter_spec.rb
+++ b/ee/spec/presenters/epic_presenter_spec.rb
@@ -29,7 +29,7 @@
       expect(presenter.show_data.keys).to match_array([:initial, :meta])
     end
 
-    it 'has correct ancestors', :nested_groups do
+    it 'has correct ancestors' do
       metadata     = JSON.parse(presenter.show_data[:meta])
       ancestor_url = metadata['ancestors'].first['url']
 
@@ -48,7 +48,7 @@
       expect(data[:meta]).to match_schema('epic_meta_data', dir: 'ee')
     end
 
-    it 'avoids N+1 database queries', :nested_groups do
+    it 'avoids N+1 database queries' do
       group1 = create(:group)
       group2 = create(:group, parent: group1)
       epic1 = create(:epic, group: group1)
diff --git a/ee/spec/requests/api/geo_spec.rb b/ee/spec/requests/api/geo_spec.rb
index e4412173ddfd..a04ccc638bcf 100644
--- a/ee/spec/requests/api/geo_spec.rb
+++ b/ee/spec/requests/api/geo_spec.rb
@@ -244,7 +244,7 @@
     end
   end
 
-  describe 'POST /geo/status', :postgresql do
+  describe 'POST /geo/status' do
     let(:geo_base_request) { Gitlab::Geo::BaseRequest.new(scope: ::Gitlab::Geo::API_SCOPE) }
 
     let(:data) do
diff --git a/ee/spec/requests/api/v3/github_spec.rb b/ee/spec/requests/api/v3/github_spec.rb
index 5284ad0f7f23..6ec434c604dd 100644
--- a/ee/spec/requests/api/v3/github_spec.rb
+++ b/ee/spec/requests/api/v3/github_spec.rb
@@ -308,7 +308,7 @@ def expect_project_under_namespace(projects, namespace, user)
       end
     end
 
-    context 'nested group namespace', :nested_groups do
+    context 'nested group namespace' do
       let(:group) { create(:group, :nested) }
       let!(:parent_group_project) { create(:project, group: group.parent, name: 'parent_group_project') }
       let!(:child_group_project) { create(:project, group: group, name: 'child_group_project') }
diff --git a/ee/spec/requests/groups_controller_spec.rb b/ee/spec/requests/groups_controller_spec.rb
index cd67dc1bab71..ab0998324d24 100644
--- a/ee/spec/requests/groups_controller_spec.rb
+++ b/ee/spec/requests/groups_controller_spec.rb
@@ -91,7 +91,7 @@
         end
       end
 
-      context 'subgroup', :nested_groups do
+      context 'subgroup' do
         let(:group) { create(:group, :nested) }
 
         it 'does not create ip restriction' do
diff --git a/ee/spec/serializers/geo_project_registry_entity_spec.rb b/ee/spec/serializers/geo_project_registry_entity_spec.rb
index 7112632fda6f..5cfaec6cf493 100644
--- a/ee/spec/serializers/geo_project_registry_entity_spec.rb
+++ b/ee/spec/serializers/geo_project_registry_entity_spec.rb
@@ -1,6 +1,6 @@
 require 'spec_helper'
 
-describe GeoProjectRegistryEntity, :postgresql do
+describe GeoProjectRegistryEntity do
   let(:registry) { create(:geo_project_registry, :synced) }
 
   let(:entity) do
diff --git a/ee/spec/serializers/storage_shard_entity_spec.rb b/ee/spec/serializers/storage_shard_entity_spec.rb
index 76a179ebff0f..a5f4679bc5ab 100644
--- a/ee/spec/serializers/storage_shard_entity_spec.rb
+++ b/ee/spec/serializers/storage_shard_entity_spec.rb
@@ -1,6 +1,6 @@
 require 'spec_helper'
 
-describe StorageShardEntity, :postgresql do
+describe StorageShardEntity do
   let(:entity) { described_class.new(StorageShard.new, request: double) }
 
   subject { entity.as_json }
diff --git a/ee/spec/services/ci/register_job_service_spec.rb b/ee/spec/services/ci/register_job_service_spec.rb
index 035b11dd8da9..a68a321bb672 100644
--- a/ee/spec/services/ci/register_job_service_spec.rb
+++ b/ee/spec/services/ci/register_job_service_spec.rb
@@ -86,7 +86,7 @@
         end
       end
 
-      context 'when group is subgroup', :nested_groups do
+      context 'when group is subgroup' do
         let!(:root_ancestor) { create(:group) }
         let!(:group) { create(:group, parent: root_ancestor) }
         let!(:project) { create :project, shared_runners_enabled: true, group: group }
diff --git a/ee/spec/services/epic_issues/create_service_spec.rb b/ee/spec/services/epic_issues/create_service_spec.rb
index e3fa5cc996c3..2f520eaee795 100644
--- a/ee/spec/services/epic_issues/create_service_spec.rb
+++ b/ee/spec/services/epic_issues/create_service_spec.rb
@@ -152,7 +152,7 @@ def assign_issue(references)
             include_examples 'returns success'
           end
 
-          context 'when a link of an issue in a subgroup is given', :nested_groups do
+          context 'when a link of an issue in a subgroup is given' do
             let(:subgroup) { create(:group, parent: group) }
             let(:project2) { create(:project, group: subgroup) }
             let(:issue) { create(:issue, project: project2) }
diff --git a/ee/spec/services/epic_links/create_service_spec.rb b/ee/spec/services/epic_links/create_service_spec.rb
index 40dc6cf57d51..b75e5d6ea943 100644
--- a/ee/spec/services/epic_links/create_service_spec.rb
+++ b/ee/spec/services/epic_links/create_service_spec.rb
@@ -2,7 +2,7 @@
 
 require 'spec_helper'
 
-describe EpicLinks::CreateService, :postgresql do
+describe EpicLinks::CreateService do
   describe '#execute' do
     let(:group) { create(:group) }
     let(:user) { create(:user) }
diff --git a/ee/spec/services/epic_links/destroy_service_spec.rb b/ee/spec/services/epic_links/destroy_service_spec.rb
index 58e8f0ef57d4..dee3303c4929 100644
--- a/ee/spec/services/epic_links/destroy_service_spec.rb
+++ b/ee/spec/services/epic_links/destroy_service_spec.rb
@@ -2,7 +2,7 @@
 
 require 'spec_helper'
 
-describe EpicLinks::DestroyService, :postgresql do
+describe EpicLinks::DestroyService do
   describe '#execute' do
     let(:group) { create(:group) }
     let(:user) { create(:user) }
diff --git a/ee/spec/services/epic_links/list_service_spec.rb b/ee/spec/services/epic_links/list_service_spec.rb
index 06d9ec97f711..b95f99788989 100644
--- a/ee/spec/services/epic_links/list_service_spec.rb
+++ b/ee/spec/services/epic_links/list_service_spec.rb
@@ -2,7 +2,7 @@
 
 require 'spec_helper'
 
-describe EpicLinks::ListService, :postgresql do
+describe EpicLinks::ListService do
   let(:user) { create :user }
   let(:group) { create(:group, :public) }
   let(:parent_epic) { create(:epic, group: group) }
diff --git a/ee/spec/services/groups/autocomplete_service_spec.rb b/ee/spec/services/groups/autocomplete_service_spec.rb
index 8bcfbd35297f..c211bd86695c 100644
--- a/ee/spec/services/groups/autocomplete_service_spec.rb
+++ b/ee/spec/services/groups/autocomplete_service_spec.rb
@@ -54,7 +54,7 @@ def expect_labels_to_equal(labels, expected_labels)
     end
   end
 
-  describe '#issues', :nested_groups do
+  describe '#issues' do
     let(:project) { create(:project, group: group) }
     let(:sub_group_project) { create(:project, group: sub_group) }
 
@@ -67,7 +67,7 @@ def expect_labels_to_equal(labels, expected_labels)
     end
   end
 
-  describe '#merge_requests', :nested_groups do
+  describe '#merge_requests' do
     let(:project) { create(:project, :repository, group: group) }
     let(:sub_group_project) { create(:project, :repository, group: sub_group) }
 
@@ -104,10 +104,10 @@ def expect_labels_to_equal(labels, expected_labels)
       end
 
       it 'returns available commands' do
-        available_commands = [:todo, :unsubscribe, :award, :shrug, :tableflip, :cc, :title, :close]
-        if ::Epic.supports_nested_objects?
-          available_commands += [:child_epic, :remove_child_epic, :parent_epic, :remove_parent_epic]
-        end
+        available_commands = [
+          :todo, :unsubscribe, :award, :shrug, :tableflip, :cc, :title, :close,
+          :child_epic, :remove_child_epic, :parent_epic, :remove_parent_epic
+        ]
 
         expect(subject.commands(epic).map { |c| c[:name] }).to match_array(available_commands)
       end
@@ -131,7 +131,7 @@ def expect_labels_to_equal(labels, expected_labels)
         subgroup_milestone.update(group: public_subgroup)
       end
 
-      it 'returns milestones from groups and subgroups', :nested_groups do
+      it 'returns milestones from groups and subgroups' do
         subject = described_class.new(public_subgroup, user)
 
         expect(subject.milestones.map(&:iid)).to contain_exactly(group_milestone.iid, subgroup_milestone.iid)
@@ -144,14 +144,14 @@ def expect_labels_to_equal(labels, expected_labels)
       expect(subject.milestones.map(&:title)).to contain_exactly(group_milestone.title)
     end
 
-    it 'returns milestones from groups and subgroups', :nested_groups do
+    it 'returns milestones from groups and subgroups' do
       milestones = described_class.new(sub_group, user).milestones
 
       expect(milestones.map(&:iid)).to contain_exactly(group_milestone.iid, subgroup_milestone.iid)
       expect(milestones.map(&:title)).to contain_exactly(group_milestone.title, subgroup_milestone.title)
     end
 
-    it 'returns only milestones that user can read', :nested_groups do
+    it 'returns only milestones that user can read' do
       user = create(:user)
       sub_group.add_guest(user)
 
diff --git a/ee/spec/services/groups/participants_service_spec.rb b/ee/spec/services/groups/participants_service_spec.rb
index d3ea80ff1433..5af9e7e054f1 100644
--- a/ee/spec/services/groups/participants_service_spec.rb
+++ b/ee/spec/services/groups/participants_service_spec.rb
@@ -47,7 +47,7 @@ def user_to_autocompletable(user)
     end
   end
 
-  describe '#group_members', :nested_groups do
+  describe '#group_members' do
     let(:parent_group) { create(:group) }
     let(:group) { create(:group, parent: parent_group) }
     let(:subgroup) { create(:group_with_members, parent: group) }
diff --git a/ee/spec/services/groups/update_service_spec.rb b/ee/spec/services/groups/update_service_spec.rb
index d46e658e3fb9..d88aaac871e3 100644
--- a/ee/spec/services/groups/update_service_spec.rb
+++ b/ee/spec/services/groups/update_service_spec.rb
@@ -108,7 +108,7 @@ def update_file_template_project_id(id)
         expect(group.errors[:file_template_project_id]).to include('is invalid')
       end
 
-      context 'in a subgroup', :nested_groups do
+      context 'in a subgroup' do
         let(:parent_group) { create(:group) }
         let(:hidden_project) { create(:project, :private, namespace: parent_group) }
         let(:group) { create(:group, parent: parent_group) }
diff --git a/ee/spec/services/projects/create_from_template_service_spec.rb b/ee/spec/services/projects/create_from_template_service_spec.rb
index 8b2d3bfee7a3..05d79738cf63 100644
--- a/ee/spec/services/projects/create_from_template_service_spec.rb
+++ b/ee/spec/services/projects/create_from_template_service_spec.rb
@@ -113,7 +113,7 @@
     it_behaves_like 'creates project from custom template', nil
     it_behaves_like 'creates project from custom template', ''
 
-    describe 'creating project from a Group project template', :postgresql do
+    describe 'creating project from a Group project template' do
       let(:project_name) { project_template.name }
       let(:group_with_project_templates_id) { subgroup_1_2.id }
       let(:group2) { create(:group) }
diff --git a/ee/spec/services/quick_actions/interpret_service_spec.rb b/ee/spec/services/quick_actions/interpret_service_spec.rb
index bac72f4a9d9e..e6513d762f6e 100644
--- a/ee/spec/services/quick_actions/interpret_service_spec.rb
+++ b/ee/spec/services/quick_actions/interpret_service_spec.rb
@@ -298,7 +298,7 @@
       end
     end
 
-    context 'child_epic command', :nested_groups do
+    context 'child_epic command' do
       let(:subgroup) { create(:group, parent: group) }
       let(:another_group) { create(:group) }
       let(:merge_request) { create(:merge_request, source_project: project) }
@@ -427,7 +427,7 @@
       end
     end
 
-    context 'remove_child_epic command', :nested_groups do
+    context 'remove_child_epic command' do
       let(:subgroup) { create(:group, parent: group) }
       let(:another_group) { create(:group) }
       let(:merge_request) { create(:merge_request, source_project: project) }
diff --git a/ee/spec/services/update_build_minutes_service_spec.rb b/ee/spec/services/update_build_minutes_service_spec.rb
index 6e5ae6cb4334..73088f709762 100644
--- a/ee/spec/services/update_build_minutes_service_spec.rb
+++ b/ee/spec/services/update_build_minutes_service_spec.rb
@@ -43,7 +43,7 @@
         end
       end
 
-      context 'when namespace is subgroup', :nested_groups do
+      context 'when namespace is subgroup' do
         let(:root_ancestor) { create(:group, shared_runners_minutes_limit: 100) }
         let(:namespace) { create(:namespace, parent: root_ancestor) }
 
diff --git a/ee/spec/support/shared_examples/models/member_shared_examples.rb b/ee/spec/support/shared_examples/models/member_shared_examples.rb
index addb8e3c519a..862d39514e45 100644
--- a/ee/spec/support/shared_examples/models/member_shared_examples.rb
+++ b/ee/spec/support/shared_examples/models/member_shared_examples.rb
@@ -31,7 +31,7 @@
           expect(member.errors.messages[:user]).to eq(['is not linked to a SAML account'])
         end
 
-        context 'subgroups', :nested_groups do
+        context 'subgroups' do
           let!(:subgroup) { create(:group, parent: group) }
 
           before do
diff --git a/ee/spec/views/admin/groups/_form.html.haml_spec.rb b/ee/spec/views/admin/groups/_form.html.haml_spec.rb
index 1fcef2bc2013..1b37df9c98fb 100644
--- a/ee/spec/views/admin/groups/_form.html.haml_spec.rb
+++ b/ee/spec/views/admin/groups/_form.html.haml_spec.rb
@@ -10,7 +10,7 @@
     allow(view).to receive(:visibility_level) { group.visibility_level }
   end
 
-  context 'when sub group is used', :nested_groups do
+  context 'when sub group is used' do
     let(:root_ancestor) { create(:group) }
     let(:group) { build(:group, parent: root_ancestor) }
 
diff --git a/ee/spec/views/groups/edit.html.haml_spec.rb b/ee/spec/views/groups/edit.html.haml_spec.rb
index 0d8f15ec29d8..3f087facf90c 100644
--- a/ee/spec/views/groups/edit.html.haml_spec.rb
+++ b/ee/spec/views/groups/edit.html.haml_spec.rb
@@ -33,7 +33,7 @@
       end
     end
 
-    context 'subgroup', :nested_groups do
+    context 'subgroup' do
       let(:group) { create(:group, :nested) }
 
       before do
diff --git a/ee/spec/workers/clear_shared_runners_minutes_worker_spec.rb b/ee/spec/workers/clear_shared_runners_minutes_worker_spec.rb
index a73906f84d2d..b2ad2fbd073a 100644
--- a/ee/spec/workers/clear_shared_runners_minutes_worker_spec.rb
+++ b/ee/spec/workers/clear_shared_runners_minutes_worker_spec.rb
@@ -48,7 +48,7 @@
       end
     end
 
-    context 'when namespace has extra shared runner minutes', :postgresql do
+    context 'when namespace has extra shared runner minutes' do
       let!(:namespace) do
         create(:namespace, shared_runners_minutes_limit: 100, extra_shared_runners_minutes_limit: 10 )
       end
diff --git a/ee/spec/workers/geo/repository_verification/primary/batch_worker_spec.rb b/ee/spec/workers/geo/repository_verification/primary/batch_worker_spec.rb
index ebf649c9a4a2..fe642054e294 100644
--- a/ee/spec/workers/geo/repository_verification/primary/batch_worker_spec.rb
+++ b/ee/spec/workers/geo/repository_verification/primary/batch_worker_spec.rb
@@ -1,6 +1,6 @@
 require 'spec_helper'
 
-describe Geo::RepositoryVerification::Primary::BatchWorker, :postgresql, :clean_gitlab_redis_cache do
+describe Geo::RepositoryVerification::Primary::BatchWorker, :clean_gitlab_redis_cache do
   include ::EE::GeoHelpers
 
   set(:healthy_not_verified) { create(:project) }
diff --git a/ee/spec/workers/geo/repository_verification/primary/shard_worker_spec.rb b/ee/spec/workers/geo/repository_verification/primary/shard_worker_spec.rb
index a8ce9af53a87..a81bc7c0efe8 100644
--- a/ee/spec/workers/geo/repository_verification/primary/shard_worker_spec.rb
+++ b/ee/spec/workers/geo/repository_verification/primary/shard_worker_spec.rb
@@ -1,6 +1,6 @@
 require 'spec_helper'
 
-describe Geo::RepositoryVerification::Primary::ShardWorker, :postgresql, :clean_gitlab_redis_cache do
+describe Geo::RepositoryVerification::Primary::ShardWorker, :clean_gitlab_redis_cache do
   include ::EE::GeoHelpers
   include ExclusiveLeaseHelpers
 
diff --git a/ee/spec/workers/geo/repository_verification/primary/single_worker_spec.rb b/ee/spec/workers/geo/repository_verification/primary/single_worker_spec.rb
index 65279c8de42a..9fafb4cb0fb2 100644
--- a/ee/spec/workers/geo/repository_verification/primary/single_worker_spec.rb
+++ b/ee/spec/workers/geo/repository_verification/primary/single_worker_spec.rb
@@ -1,6 +1,6 @@
 require 'spec_helper'
 
-describe Geo::RepositoryVerification::Primary::SingleWorker, :postgresql, :clean_gitlab_redis_cache do
+describe Geo::RepositoryVerification::Primary::SingleWorker, :clean_gitlab_redis_cache do
   include ::EE::GeoHelpers
   include ExclusiveLeaseHelpers
 
diff --git a/ee/spec/workers/geo/repository_verification/secondary/scheduler_worker_spec.rb b/ee/spec/workers/geo/repository_verification/secondary/scheduler_worker_spec.rb
index 7e8dfe61793e..d56d05ebe176 100644
--- a/ee/spec/workers/geo/repository_verification/secondary/scheduler_worker_spec.rb
+++ b/ee/spec/workers/geo/repository_verification/secondary/scheduler_worker_spec.rb
@@ -1,6 +1,6 @@
 require 'spec_helper'
 
-describe Geo::RepositoryVerification::Secondary::SchedulerWorker, :postgresql, :clean_gitlab_redis_cache do
+describe Geo::RepositoryVerification::Secondary::SchedulerWorker, :clean_gitlab_redis_cache do
   include ::EE::GeoHelpers
 
   set(:healthy_not_verified) { create(:project) }
diff --git a/ee/spec/workers/geo/repository_verification/secondary/single_worker_spec.rb b/ee/spec/workers/geo/repository_verification/secondary/single_worker_spec.rb
index a1b2ca229d25..7888ec41550d 100644
--- a/ee/spec/workers/geo/repository_verification/secondary/single_worker_spec.rb
+++ b/ee/spec/workers/geo/repository_verification/secondary/single_worker_spec.rb
@@ -1,6 +1,6 @@
 require 'spec_helper'
 
-describe Geo::RepositoryVerification::Secondary::SingleWorker, :postgresql, :clean_gitlab_redis_cache do
+describe Geo::RepositoryVerification::Secondary::SingleWorker, :clean_gitlab_redis_cache do
   include ::EE::GeoHelpers
   include ExclusiveLeaseHelpers
 
diff --git a/ee/spec/workers/update_max_seats_used_for_gitlab_com_subscriptions_worker_spec.rb b/ee/spec/workers/update_max_seats_used_for_gitlab_com_subscriptions_worker_spec.rb
index 81062dae1e75..815b90c64831 100644
--- a/ee/spec/workers/update_max_seats_used_for_gitlab_com_subscriptions_worker_spec.rb
+++ b/ee/spec/workers/update_max_seats_used_for_gitlab_com_subscriptions_worker_spec.rb
@@ -1,6 +1,6 @@
 require 'spec_helper'
 
-describe UpdateMaxSeatsUsedForGitlabComSubscriptionsWorker, :postgresql do
+describe UpdateMaxSeatsUsedForGitlabComSubscriptionsWorker do
   subject { described_class.new }
 
   let!(:user)                { create(:user) }
diff --git a/lib/api/entities.rb b/lib/api/entities.rb
index 10c81dd51047..300cb215af2e 100644
--- a/lib/api/entities.rb
+++ b/lib/api/entities.rb
@@ -366,10 +366,7 @@ class Group < BasicGroupDetails
       end
       expose :request_access_enabled
       expose :full_name, :full_path
-
-      if ::Group.supports_nested_objects?
-        expose :parent_id
-      end
+      expose :parent_id
 
       expose :custom_attributes, using: 'API::Entities::CustomAttribute', if: :with_custom_attributes
 
diff --git a/lib/api/groups.rb b/lib/api/groups.rb
index d0c7c4ade43e..ef95a9e5d8f4 100644
--- a/lib/api/groups.rb
+++ b/lib/api/groups.rb
@@ -114,10 +114,7 @@ def present_groups(params, groups)
       params do
         requires :name, type: String, desc: 'The name of the group'
         requires :path, type: String, desc: 'The path of the group'
-
-        if ::Group.supports_nested_objects?
-          optional :parent_id, type: Integer, desc: 'The parent group id for creating nested group'
-        end
+        optional :parent_id, type: Integer, desc: 'The parent group id for creating nested group'
 
         use :optional_params
       end
diff --git a/lib/gitlab/object_hierarchy.rb b/lib/gitlab/object_hierarchy.rb
index e3d67f40ec81..4f2f330ae3f8 100644
--- a/lib/gitlab/object_hierarchy.rb
+++ b/lib/gitlab/object_hierarchy.rb
@@ -32,11 +32,6 @@ def descendants
     # Returns the maximum depth starting from the base
     # A base object with no children has a maximum depth of `1`
     def max_descendants_depth
-      unless hierarchy_supported?
-        # This makes the return value consistent with the case where hierarchy is supported
-        return descendants_base.exists? ? 1 : nil
-      end
-
       base_and_descendants(with_depth: true).maximum(DEPTH_COLUMN)
     end
 
@@ -66,8 +61,6 @@ def ancestors(upto: nil, hierarchy_order: nil)
     # each parent.
     # rubocop: disable CodeReuse/ActiveRecord
     def base_and_ancestors(upto: nil, hierarchy_order: nil)
-      return ancestors_base unless hierarchy_supported?
-
       recursive_query = base_and_ancestors_cte(upto, hierarchy_order).apply_to(model.all)
       recursive_query = recursive_query.order(depth: hierarchy_order) if hierarchy_order
 
@@ -81,10 +74,6 @@ def base_and_ancestors(upto: nil, hierarchy_order: nil)
     # When `with_depth` is `true`, a `depth` column is included where it starts with `1` for the base objects
     # and incremented as we go down the descendant tree
     def base_and_descendants(with_depth: false)
-      unless hierarchy_supported?
-        return with_depth ? descendants_base.select("1 as #{DEPTH_COLUMN}", objects_table[Arel.star]) : descendants_base
-      end
-
       read_only(base_and_descendants_cte(with_depth: with_depth).apply_to(model.all))
     end
 
@@ -112,8 +101,6 @@ def base_and_descendants(with_depth: false)
     # If nested objects are not supported, ancestors_base is returned.
     # rubocop: disable CodeReuse/ActiveRecord
     def all_objects
-      return ancestors_base unless hierarchy_supported?
-
       ancestors = base_and_ancestors_cte
       descendants = base_and_descendants_cte
 
@@ -135,10 +122,6 @@ def all_objects
 
     private
 
-    def hierarchy_supported?
-      Gitlab::Database.postgresql?
-    end
-
     # rubocop: disable CodeReuse/ActiveRecord
     def base_and_ancestors_cte(stop_id = nil, hierarchy_order = nil)
       cte = SQL::RecursiveCTE.new(:base_and_ancestors)
diff --git a/lib/gitlab/project_authorizations.rb b/lib/gitlab/project_authorizations.rb
new file mode 100644
index 000000000000..a9270cd536e0
--- /dev/null
+++ b/lib/gitlab/project_authorizations.rb
@@ -0,0 +1,121 @@
+# frozen_string_literal: true
+
+# This class relies on Common Table Expressions to efficiently get all data,
+# including data for nested groups.
+module Gitlab
+  class ProjectAuthorizations
+    attr_reader :user
+
+    # user - The User object for which to calculate the authorizations.
+    def initialize(user)
+      @user = user
+    end
+
+    def calculate
+      cte = recursive_cte
+      cte_alias = cte.table.alias(Group.table_name)
+      projects = Project.arel_table
+      links = ProjectGroupLink.arel_table
+
+      relations = [
+        # The project a user has direct access to.
+        user.projects.select_for_project_authorization,
+
+        # The personal projects of the user.
+        user.personal_projects.select_as_maintainer_for_project_authorization,
+
+        # Projects that belong directly to any of the groups the user has
+        # access to.
+        Namespace
+          .unscoped
+          .select([alias_as_column(projects[:id], 'project_id'),
+                   cte_alias[:access_level]])
+          .from(cte_alias)
+          .joins(:projects),
+
+        # Projects shared with any of the namespaces the user has access to.
+        Namespace
+          .unscoped
+          .select([
+            links[:project_id],
+            least(cte_alias[:access_level], links[:group_access], 'access_level')
+          ])
+          .from(cte_alias)
+          .joins('INNER JOIN project_group_links ON project_group_links.group_id = namespaces.id')
+          .joins('INNER JOIN projects ON projects.id = project_group_links.project_id')
+          .joins('INNER JOIN namespaces p_ns ON p_ns.id = projects.namespace_id')
+          .where('p_ns.share_with_group_lock IS FALSE')
+      ]
+
+      ProjectAuthorization
+        .unscoped
+        .with
+        .recursive(cte.to_arel)
+        .select_from_union(relations)
+    end
+
+    private
+
+    # Builds a recursive CTE that gets all the groups the current user has
+    # access to, including any nested groups.
+    def recursive_cte
+      cte = Gitlab::SQL::RecursiveCTE.new(:namespaces_cte)
+      members = Member.arel_table
+      namespaces = Namespace.arel_table
+
+      # Namespaces the user is a member of.
+      cte << user.groups
+        .select([namespaces[:id], members[:access_level]])
+        .except(:order)
+
+      # Sub groups of any groups the user is a member of.
+      cte << Group.select([
+          namespaces[:id],
+          greatest(members[:access_level], cte.table[:access_level], 'access_level')
+        ])
+        .joins(join_cte(cte))
+        .joins(join_members)
+        .except(:order)
+
+      cte
+    end
+
+    # Builds a LEFT JOIN to join optional memberships onto the CTE.
+    def join_members
+      members = Member.arel_table
+      namespaces = Namespace.arel_table
+
+      cond = members[:source_id]
+        .eq(namespaces[:id])
+        .and(members[:source_type].eq('Namespace'))
+        .and(members[:requested_at].eq(nil))
+        .and(members[:user_id].eq(user.id))
+
+      Arel::Nodes::OuterJoin.new(members, Arel::Nodes::On.new(cond))
+    end
+
+    # Builds an INNER JOIN to join namespaces onto the CTE.
+    def join_cte(cte)
+      namespaces = Namespace.arel_table
+      cond = cte.table[:id].eq(namespaces[:parent_id])
+
+      Arel::Nodes::InnerJoin.new(cte.table, Arel::Nodes::On.new(cond))
+    end
+
+    def greatest(left, right, column_alias)
+      sql_function('GREATEST', [left, right], column_alias)
+    end
+
+    def least(left, right, column_alias)
+      sql_function('LEAST', [left, right], column_alias)
+    end
+
+    def sql_function(name, args, column_alias)
+      alias_as_column(Arel::Nodes::NamedFunction.new(name, args), column_alias)
+    end
+
+    def alias_as_column(value, alias_to)
+      Arel::Nodes::As.new(value, Arel::Nodes::SqlLiteral.new(alias_to))
+    end
+  end
+end
diff --git a/lib/gitlab/project_authorizations/with_nested_groups.rb b/lib/gitlab/project_authorizations/with_nested_groups.rb
deleted file mode 100644
index 2372a316ab0f..000000000000
--- a/lib/gitlab/project_authorizations/with_nested_groups.rb
+++ /dev/null
@@ -1,125 +0,0 @@
-# frozen_string_literal: true
-
-module Gitlab
-  module ProjectAuthorizations
-    # Calculating new project authorizations when supporting nested groups.
-    #
-    # This class relies on Common Table Expressions to efficiently get all data,
-    # including data for nested groups. As a result this class can only be used
-    # on PostgreSQL.
-    class WithNestedGroups
-      attr_reader :user
-
-      # user - The User object for which to calculate the authorizations.
-      def initialize(user)
-        @user = user
-      end
-
-      def calculate
-        cte = recursive_cte
-        cte_alias = cte.table.alias(Group.table_name)
-        projects = Project.arel_table
-        links = ProjectGroupLink.arel_table
-
-        relations = [
-          # The project a user has direct access to.
-          user.projects.select_for_project_authorization,
-
-          # The personal projects of the user.
-          user.personal_projects.select_as_maintainer_for_project_authorization,
-
-          # Projects that belong directly to any of the groups the user has
-          # access to.
-          Namespace
-            .unscoped
-            .select([alias_as_column(projects[:id], 'project_id'),
-                     cte_alias[:access_level]])
-            .from(cte_alias)
-            .joins(:projects),
-
-          # Projects shared with any of the namespaces the user has access to.
-          Namespace
-            .unscoped
-            .select([links[:project_id],
-                     least(cte_alias[:access_level],
-                           links[:group_access],
-                           'access_level')])
-            .from(cte_alias)
-            .joins('INNER JOIN project_group_links ON project_group_links.group_id = namespaces.id')
-            .joins('INNER JOIN projects ON projects.id = project_group_links.project_id')
-            .joins('INNER JOIN namespaces p_ns ON p_ns.id = projects.namespace_id')
-            .where('p_ns.share_with_group_lock IS FALSE')
-        ]
-
-        ProjectAuthorization
-          .unscoped
-          .with
-          .recursive(cte.to_arel)
-          .select_from_union(relations)
-      end
-
-      private
-
-      # Builds a recursive CTE that gets all the groups the current user has
-      # access to, including any nested groups.
-      def recursive_cte
-        cte = Gitlab::SQL::RecursiveCTE.new(:namespaces_cte)
-        members = Member.arel_table
-        namespaces = Namespace.arel_table
-
-        # Namespaces the user is a member of.
-        cte << user.groups
-          .select([namespaces[:id], members[:access_level]])
-          .except(:order)
-
-        # Sub groups of any groups the user is a member of.
-        cte << Group.select([namespaces[:id],
-                             greatest(members[:access_level],
-                                      cte.table[:access_level], 'access_level')])
-          .joins(join_cte(cte))
-          .joins(join_members)
-          .except(:order)
-
-        cte
-      end
-
-      # Builds a LEFT JOIN to join optional memberships onto the CTE.
-      def join_members
-        members = Member.arel_table
-        namespaces = Namespace.arel_table
-
-        cond = members[:source_id]
-          .eq(namespaces[:id])
-          .and(members[:source_type].eq('Namespace'))
-          .and(members[:requested_at].eq(nil))
-          .and(members[:user_id].eq(user.id))
-
-        Arel::Nodes::OuterJoin.new(members, Arel::Nodes::On.new(cond))
-      end
-
-      # Builds an INNER JOIN to join namespaces onto the CTE.
-      def join_cte(cte)
-        namespaces = Namespace.arel_table
-        cond = cte.table[:id].eq(namespaces[:parent_id])
-
-        Arel::Nodes::InnerJoin.new(cte.table, Arel::Nodes::On.new(cond))
-      end
-
-      def greatest(left, right, column_alias)
-        sql_function('GREATEST', [left, right], column_alias)
-      end
-
-      def least(left, right, column_alias)
-        sql_function('LEAST', [left, right], column_alias)
-      end
-
-      def sql_function(name, args, column_alias)
-        alias_as_column(Arel::Nodes::NamedFunction.new(name, args), column_alias)
-      end
-
-      def alias_as_column(value, alias_to)
-        Arel::Nodes::As.new(value, Arel::Nodes::SqlLiteral.new(alias_to))
-      end
-    end
-  end
-end
diff --git a/lib/gitlab/project_authorizations/without_nested_groups.rb b/lib/gitlab/project_authorizations/without_nested_groups.rb
deleted file mode 100644
index 50b41b176496..000000000000
--- a/lib/gitlab/project_authorizations/without_nested_groups.rb
+++ /dev/null
@@ -1,35 +0,0 @@
-# frozen_string_literal: true
-
-module Gitlab
-  module ProjectAuthorizations
-    # Calculating new project authorizations when not supporting nested groups.
-    class WithoutNestedGroups
-      attr_reader :user
-
-      # user - The User object for which to calculate the authorizations.
-      def initialize(user)
-        @user = user
-      end
-
-      def calculate
-        relations = [
-          # Projects the user is a direct member of
-          user.projects.select_for_project_authorization,
-
-          # Personal projects
-          user.personal_projects.select_as_maintainer_for_project_authorization,
-
-          # Projects of groups the user is a member of
-          user.groups_projects.select_for_project_authorization,
-
-          # Projects shared with groups the user is a member of
-          user.groups.joins(:shared_projects).select_for_project_authorization
-        ]
-
-        ProjectAuthorization
-          .unscoped
-          .select_from_union(relations)
-      end
-    end
-  end
-end
diff --git a/spec/controllers/boards/issues_controller_spec.rb b/spec/controllers/boards/issues_controller_spec.rb
index 0db58fbefc1a..d54f7ad33cf0 100644
--- a/spec/controllers/boards/issues_controller_spec.rb
+++ b/spec/controllers/boards/issues_controller_spec.rb
@@ -85,7 +85,7 @@
           expect { list_issues(user: user, board: group_board, list: list3) }.not_to exceed_query_limit(control_count + (2 * 8 - 1))
         end
 
-        it 'avoids N+1 database queries when adding a subgroup, project, and issue', :nested_groups do
+        it 'avoids N+1 database queries when adding a subgroup, project, and issue' do
           create(:project, group: sub_group_1)
           create(:labeled_issue, project: project, labels: [development])
           control_count = ActiveRecord::QueryRecorder.new { list_issues(user: user, board: group_board, list: list3) }.count
diff --git a/spec/controllers/concerns/group_tree_spec.rb b/spec/controllers/concerns/group_tree_spec.rb
index aa3cd690e3fd..835c3d9b3af6 100644
--- a/spec/controllers/concerns/group_tree_spec.rb
+++ b/spec/controllers/concerns/group_tree_spec.rb
@@ -30,7 +30,7 @@ def index
       expect(assigns(:groups)).to contain_exactly(other_group)
     end
 
-    context 'for subgroups', :nested_groups do
+    context 'for subgroups' do
       it 'only renders root groups when no parent was given' do
         create(:group, :public, parent: group)
 
@@ -85,7 +85,7 @@ def index
         expect(json_response.first['id']).to eq(group.id)
       end
 
-      context 'nested groups', :nested_groups do
+      context 'nested groups' do
         it 'expands the tree when filtering' do
           subgroup = create(:group, :public, parent: group, name: 'filter')
 
diff --git a/spec/controllers/dashboard/groups_controller_spec.rb b/spec/controllers/dashboard/groups_controller_spec.rb
index 48373d29412d..20a0951423bb 100644
--- a/spec/controllers/dashboard/groups_controller_spec.rb
+++ b/spec/controllers/dashboard/groups_controller_spec.rb
@@ -26,7 +26,7 @@
       expect(assigns(:groups)).to contain_exactly(member_of_group)
     end
 
-    context 'when rendering an expanded hierarchy with public groups you are not a member of', :nested_groups do
+    context 'when rendering an expanded hierarchy with public groups you are not a member of' do
       let!(:top_level_result) { create(:group, name: 'chef-top') }
       let!(:top_level_a) { create(:group, name: 'top-a') }
       let!(:sub_level_result_a) { create(:group, name: 'chef-sub-a', parent: top_level_a) }
diff --git a/spec/controllers/groups/children_controller_spec.rb b/spec/controllers/groups/children_controller_spec.rb
index 02fb971bd9a0..bced300a24cc 100644
--- a/spec/controllers/groups/children_controller_spec.rb
+++ b/spec/controllers/groups/children_controller_spec.rb
@@ -46,7 +46,7 @@
       end
     end
 
-    context 'for subgroups', :nested_groups do
+    context 'for subgroups' do
       let!(:public_subgroup) { create(:group, :public, parent: group) }
       let!(:private_subgroup) { create(:group, :private, parent: group) }
       let!(:public_project) { create(:project, :public, namespace: group) }
@@ -292,7 +292,7 @@ def get_filtered_list
         end
       end
 
-      context 'with subgroups and projects', :nested_groups do
+      context 'with subgroups and projects' do
         let!(:first_page_subgroups) { create_list(:group, per_page, :public, parent: group) }
         let!(:other_subgroup) { create(:group, :public, parent: group) }
         let!(:next_page_projects) { create_list(:project, per_page, :public, namespace: group) }
diff --git a/spec/controllers/groups/labels_controller_spec.rb b/spec/controllers/groups/labels_controller_spec.rb
index 3cc6fc6f066a..98a4c50fc495 100644
--- a/spec/controllers/groups/labels_controller_spec.rb
+++ b/spec/controllers/groups/labels_controller_spec.rb
@@ -24,7 +24,7 @@
       expect(label_ids).to match_array([label_1.title, group_label_1.title])
     end
 
-    context 'with ancestor group', :nested_groups do
+    context 'with ancestor group' do
       set(:subgroup) { create(:group, parent: group) }
       set(:subgroup_label_1) { create(:group_label, group: subgroup, title: 'subgroup_label_1') }
 
@@ -32,7 +32,7 @@
         subgroup.add_owner(user)
       end
 
-      it 'returns ancestor group labels', :nested_groups do
+      it 'returns ancestor group labels' do
         get :index, params: { group_id: subgroup, include_ancestor_groups: true, only_group_labels: true }, format: :json
 
         label_ids = json_response.map {|label| label['title']}
diff --git a/spec/controllers/groups_controller_spec.rb b/spec/controllers/groups_controller_spec.rb
index d2faef5b12b4..404e61c5271e 100644
--- a/spec/controllers/groups_controller_spec.rb
+++ b/spec/controllers/groups_controller_spec.rb
@@ -89,7 +89,7 @@
   end
 
   describe 'GET #new' do
-    context 'when creating subgroups', :nested_groups do
+    context 'when creating subgroups' do
       [true, false].each do |can_create_group_status|
         context "and can_create_group is #{can_create_group_status}" do
           before do
@@ -166,7 +166,7 @@
       end
     end
 
-    context 'when creating subgroups', :nested_groups do
+    context 'when creating subgroups' do
       [true, false].each do |can_create_group_status|
         context "and can_create_group is #{can_create_group_status}" do
           context 'and logged in as Owner' do
@@ -584,7 +584,7 @@ def group_moved_message(redirect_route, group)
     end
   end
 
-  describe 'PUT transfer', :postgresql do
+  describe 'PUT transfer' do
     before do
       sign_in(user)
     end
diff --git a/spec/controllers/import/bitbucket_controller_spec.rb b/spec/controllers/import/bitbucket_controller_spec.rb
index 64a665027328..38388c217497 100644
--- a/spec/controllers/import/bitbucket_controller_spec.rb
+++ b/spec/controllers/import/bitbucket_controller_spec.rb
@@ -231,7 +231,7 @@ def assign_session_tokens
       end
     end
 
-    context 'user has chosen an existing nested namespace and name for the project', :postgresql do
+    context 'user has chosen an existing nested namespace and name for the project' do
       let(:parent_namespace) { create(:group, name: 'foo') }
       let(:nested_namespace) { create(:group, name: 'bar', parent: parent_namespace) }
       let(:test_name) { 'test_name' }
@@ -250,7 +250,7 @@ def assign_session_tokens
       end
     end
 
-    context 'user has chosen a non-existent nested namespaces and name for the project', :postgresql do
+    context 'user has chosen a non-existent nested namespaces and name for the project' do
       let(:test_name) { 'test_name' }
 
       it 'takes the selected namespace and name' do
@@ -281,7 +281,7 @@ def assign_session_tokens
       end
     end
 
-    context 'user has chosen existent and non-existent nested namespaces and name for the project', :postgresql do
+    context 'user has chosen existent and non-existent nested namespaces and name for the project' do
       let(:test_name) { 'test_name' }
       let!(:parent_namespace) { create(:group, name: 'foo') }
 
diff --git a/spec/controllers/import/gitlab_controller_spec.rb b/spec/controllers/import/gitlab_controller_spec.rb
index 5af7572e74ea..e465eca6c713 100644
--- a/spec/controllers/import/gitlab_controller_spec.rb
+++ b/spec/controllers/import/gitlab_controller_spec.rb
@@ -197,7 +197,7 @@ def assign_session_token
         end
       end
 
-      context 'user has chosen an existing nested namespace for the project', :postgresql do
+      context 'user has chosen an existing nested namespace for the project' do
         let(:parent_namespace) { create(:group, name: 'foo') }
         let(:nested_namespace) { create(:group, name: 'bar', parent: parent_namespace) }
 
@@ -215,7 +215,7 @@ def assign_session_token
         end
       end
 
-      context 'user has chosen a non-existent nested namespaces for the project', :postgresql do
+      context 'user has chosen a non-existent nested namespaces for the project' do
         let(:test_name) { 'test_name' }
 
         it 'takes the selected namespace and name' do
@@ -246,7 +246,7 @@ def assign_session_token
         end
       end
 
-      context 'user has chosen existent and non-existent nested namespaces and name for the project', :postgresql do
+      context 'user has chosen existent and non-existent nested namespaces and name for the project' do
         let(:test_name) { 'test_name' }
         let!(:parent_namespace) { create(:group, name: 'foo') }
 
diff --git a/spec/controllers/projects/milestones_controller_spec.rb b/spec/controllers/projects/milestones_controller_spec.rb
index 767cee7d54ac..9b2025b836c7 100644
--- a/spec/controllers/projects/milestones_controller_spec.rb
+++ b/spec/controllers/projects/milestones_controller_spec.rb
@@ -115,7 +115,7 @@ def render_index(project:, page:, search_title: '')
         end
       end
 
-      context 'with nested groups', :nested_groups do
+      context 'with nested groups' do
         let!(:subgroup) { create(:group, :public, parent: group) }
         let!(:subgroup_milestone) { create(:milestone, group: subgroup) }
 
diff --git a/spec/features/dashboard/groups_list_spec.rb b/spec/features/dashboard/groups_list_spec.rb
index fb76e2b00146..bdab3c632443 100644
--- a/spec/features/dashboard/groups_list_spec.rb
+++ b/spec/features/dashboard/groups_list_spec.rb
@@ -27,7 +27,7 @@ def click_group_caret(group)
     expect(page).not_to have_content(another_group.name)
   end
 
-  it 'shows subgroups the user is member of', :nested_groups do
+  it 'shows subgroups the user is member of' do
     group.add_owner(user)
     nested_group.add_owner(user)
 
@@ -40,7 +40,7 @@ def click_group_caret(group)
     expect(page).to have_content(nested_group.name)
   end
 
-  context 'when filtering groups', :nested_groups do
+  context 'when filtering groups' do
     before do
       group.add_owner(user)
       nested_group.add_owner(user)
@@ -79,7 +79,7 @@ def click_group_caret(group)
     end
   end
 
-  context 'with subgroups', :nested_groups do
+  context 'with subgroups' do
     let!(:subgroup) { create(:group, :public, parent: group) }
 
     before do
diff --git a/spec/features/groups/empty_states_spec.rb b/spec/features/groups/empty_states_spec.rb
index e4eb0d355d16..3fbc0f78d38b 100644
--- a/spec/features/groups/empty_states_spec.rb
+++ b/spec/features/groups/empty_states_spec.rb
@@ -110,7 +110,7 @@
       end
 
       context 'group without a project' do
-        context 'group has a subgroup', :nested_groups do
+        context 'group has a subgroup' do
           let(:subgroup) { create(:group, parent: group) }
           let(:subgroup_project) { create(:project, namespace: subgroup) }
 
diff --git a/spec/features/groups/group_settings_spec.rb b/spec/features/groups/group_settings_spec.rb
index 676769c25fe2..257aeae7e23b 100644
--- a/spec/features/groups/group_settings_spec.rb
+++ b/spec/features/groups/group_settings_spec.rb
@@ -121,7 +121,7 @@
       expect(find(:css, '.group-root-path').text).to eq(root_url)
     end
 
-    it 'has a parent group URL label for a subgroup group', :postgresql do
+    it 'has a parent group URL label for a subgroup group' do
       subgroup = create(:group, parent: group)
 
       visit edit_group_path(subgroup)
diff --git a/spec/features/groups/issues_spec.rb b/spec/features/groups/issues_spec.rb
index 0ada530781c4..a16004c79cae 100644
--- a/spec/features/groups/issues_spec.rb
+++ b/spec/features/groups/issues_spec.rb
@@ -50,7 +50,7 @@
     end
   end
 
-  context 'issues list', :nested_groups do
+  context 'issues list' do
     let(:subgroup) { create(:group, parent: group) }
     let(:subgroup_project) { create(:project, :public, group: subgroup)}
     let(:user_in_group) { create(:group_member, :maintainer, user: create(:user), group: group ).user }
diff --git a/spec/features/groups/members/list_members_spec.rb b/spec/features/groups/members/list_members_spec.rb
index 4ba7161601e7..ffff755793ff 100644
--- a/spec/features/groups/members/list_members_spec.rb
+++ b/spec/features/groups/members/list_members_spec.rb
@@ -13,7 +13,7 @@
     sign_in(user1)
   end
 
-  it 'show members from current group and parent', :nested_groups do
+  it 'show members from current group and parent' do
     group.add_developer(user1)
     nested_group.add_developer(user2)
 
@@ -23,7 +23,7 @@
     expect(second_row.text).to include(user2.name)
   end
 
-  it 'show user once if member of both current group and parent', :nested_groups do
+  it 'show user once if member of both current group and parent' do
     group.add_developer(user1)
     nested_group.add_developer(user1)
 
diff --git a/spec/features/groups/share_lock_spec.rb b/spec/features/groups/share_lock_spec.rb
index 704d9f128889..86b523fbdd9e 100644
--- a/spec/features/groups/share_lock_spec.rb
+++ b/spec/features/groups/share_lock_spec.rb
@@ -9,7 +9,7 @@
     sign_in(root_owner)
   end
 
-  context 'with a subgroup', :nested_groups do
+  context 'with a subgroup' do
     let!(:subgroup) { create(:group, parent: root_group) }
 
     context 'when enabling the parent group share with group lock' do
diff --git a/spec/features/groups/show_spec.rb b/spec/features/groups/show_spec.rb
index bed998a08591..0d78bd23973e 100644
--- a/spec/features/groups/show_spec.rb
+++ b/spec/features/groups/show_spec.rb
@@ -75,11 +75,7 @@
         sign_in(owner)
       end
 
-      context 'when subgroups are supported', :nested_groups do
-        before do
-          allow(Group).to receive(:supports_nested_objects?) { true }
-        end
-
+      context 'when subgroups are supported' do
         it 'allows creating subgroups' do
           visit path
 
@@ -87,19 +83,6 @@
             .to have_css("li[data-text='New subgroup']", visible: false)
         end
       end
-
-      context 'when subgroups are not supported' do
-        before do
-          allow(Group).to receive(:supports_nested_objects?) { false }
-        end
-
-        it 'does not allow creating subgroups' do
-          visit path
-
-          expect(page)
-            .not_to have_selector("li[data-text='New subgroup']", visible: false)
-        end
-      end
     end
 
     context 'for maintainers' do
@@ -107,11 +90,7 @@
         sign_in(maintainer)
       end
 
-      context 'when subgroups are supported', :nested_groups do
-        before do
-          allow(Group).to receive(:supports_nested_objects?) { true }
-        end
-
+      context 'when subgroups are supported' do
         context 'when subgroup_creation_level is set to maintainers' do
           before do
             relaxed_group.add_maintainer(maintainer)
@@ -141,19 +120,6 @@
           end
         end
       end
-
-      context 'when subgroups are not supported' do
-        before do
-          allow(Group).to receive(:supports_nested_objects?) { false }
-        end
-
-        it 'does not allow creating subgroups' do
-          visit path
-
-          expect(page)
-            .not_to have_selector("li[data-text='New subgroup']", visible: false)
-        end
-      end
     end
   end
 
diff --git a/spec/features/groups_spec.rb b/spec/features/groups_spec.rb
index 8e7f78cab81d..ad645643919b 100644
--- a/spec/features/groups_spec.rb
+++ b/spec/features/groups_spec.rb
@@ -105,7 +105,7 @@
     end
   end
 
-  describe 'create a nested group', :nested_groups, :js do
+  describe 'create a nested group', :js do
     let(:group) { create(:group, path: 'foo') }
 
     context 'as admin' do
@@ -231,7 +231,7 @@
     end
   end
 
-  describe 'group page with nested groups', :nested_groups, :js do
+  describe 'group page with nested groups', :js do
     let!(:group) { create(:group) }
     let!(:nested_group) { create(:group, parent: group) }
     let!(:project) { create(:project, namespace: group) }
diff --git a/spec/features/ide_spec.rb b/spec/features/ide_spec.rb
index 6eb59ef72c25..65989c36c1e4 100644
--- a/spec/features/ide_spec.rb
+++ b/spec/features/ide_spec.rb
@@ -1,7 +1,7 @@
 require 'spec_helper'
 
 describe 'IDE', :js do
-  describe 'sub-groups', :nested_groups do
+  describe 'sub-groups' do
     let(:user) { create(:user) }
     let(:group) { create(:group) }
     let(:subgroup) { create(:group, parent: group) }
diff --git a/spec/features/import/manifest_import_spec.rb b/spec/features/import/manifest_import_spec.rb
index a90cdd8d9200..90b499efd72f 100644
--- a/spec/features/import/manifest_import_spec.rb
+++ b/spec/features/import/manifest_import_spec.rb
@@ -1,6 +1,6 @@
 require 'spec_helper'
 
-describe 'Import multiple repositories by uploading a manifest file', :js, :postgresql do
+describe 'Import multiple repositories by uploading a manifest file', :js do
   include Select2Helper
 
   let(:user) { create(:admin) }
diff --git a/spec/features/labels_hierarchy_spec.rb b/spec/features/labels_hierarchy_spec.rb
index 489651fea159..45bd2218ee6c 100644
--- a/spec/features/labels_hierarchy_spec.rb
+++ b/spec/features/labels_hierarchy_spec.rb
@@ -1,6 +1,6 @@
 require 'spec_helper'
 
-describe 'Labels Hierarchy', :js, :nested_groups do
+describe 'Labels Hierarchy', :js do
   include FilteredSearchHelpers
 
   let!(:user) { create(:user) }
diff --git a/spec/features/projects/members/invite_group_spec.rb b/spec/features/projects/members/invite_group_spec.rb
index 7432c600c1ec..c5423ec46626 100644
--- a/spec/features/projects/members/invite_group_spec.rb
+++ b/spec/features/projects/members/invite_group_spec.rb
@@ -58,7 +58,7 @@
       end
     end
 
-    context 'for a project in a subgroup', :nested_groups do
+    context 'for a project in a subgroup' do
       let!(:group_to_share_with) { create(:group) }
       let(:root_group) { create(:group) }
       let(:subgroup) { create(:group, parent: root_group) }
@@ -181,7 +181,7 @@
         group_to_share_with.add_maintainer(maintainer)
       end
 
-      it 'the groups dropdown does not show ancestors', :nested_groups do
+      it 'the groups dropdown does not show ancestors' do
         visit project_settings_members_path(project)
 
         click_on 'invite-group-tab'
diff --git a/spec/features/projects/new_project_spec.rb b/spec/features/projects/new_project_spec.rb
index 7602935b47e0..8cdaed43fbc2 100644
--- a/spec/features/projects/new_project_spec.rb
+++ b/spec/features/projects/new_project_spec.rb
@@ -294,7 +294,7 @@
         end
       end
 
-      context 'from manifest file', :postgresql do
+      context 'from manifest file' do
         before do
           first('.import_manifest').click
         end
diff --git a/spec/features/projects/settings/pipelines_settings_spec.rb b/spec/features/projects/settings/pipelines_settings_spec.rb
index bf0c0de89b21..31fdd3082926 100644
--- a/spec/features/projects/settings/pipelines_settings_spec.rb
+++ b/spec/features/projects/settings/pipelines_settings_spec.rb
@@ -126,7 +126,7 @@
           end
         end
 
-        context 'when auto devops is turned on group parent level', :nested_groups do
+        context 'when auto devops is turned on group parent level' do
           before do
             group = create(:group, parent: create(:group, :auto_devops_enabled))
             project.update!(namespace: group)
diff --git a/spec/features/projects/settings/user_transfers_a_project_spec.rb b/spec/features/projects/settings/user_transfers_a_project_spec.rb
index 2fdbc04fa621..9af2e47a3347 100644
--- a/spec/features/projects/settings/user_transfers_a_project_spec.rb
+++ b/spec/features/projects/settings/user_transfers_a_project_spec.rb
@@ -68,7 +68,7 @@ def transfer_project(project, group, confirm: true)
     end
   end
 
-  context 'when nested groups are available', :nested_groups do
+  context 'when nested groups are available' do
     it 'allows transferring a project to a subgroup' do
       subgroup = create(:group, parent: group)
 
diff --git a/spec/features/projects/sub_group_issuables_spec.rb b/spec/features/projects/sub_group_issuables_spec.rb
index 50e7e934cf6c..8afbcf72ca7d 100644
--- a/spec/features/projects/sub_group_issuables_spec.rb
+++ b/spec/features/projects/sub_group_issuables_spec.rb
@@ -1,6 +1,6 @@
 require 'spec_helper'
 
-describe 'Subgroup Issuables', :js, :nested_groups do
+describe 'Subgroup Issuables', :js do
   let!(:group)    { create(:group, name: 'group') }
   let!(:subgroup) { create(:group, parent: group, name: 'subgroup') }
   let!(:project)  { create(:project, namespace: subgroup, name: 'project') }
diff --git a/spec/features/projects/user_creates_project_spec.rb b/spec/features/projects/user_creates_project_spec.rb
index c0932539131f..19262a635ac7 100644
--- a/spec/features/projects/user_creates_project_spec.rb
+++ b/spec/features/projects/user_creates_project_spec.rb
@@ -26,7 +26,7 @@
     expect(page).to have_content(project.url_to_repo)
   end
 
-  context 'in a subgroup they do not own', :nested_groups do
+  context 'in a subgroup they do not own' do
     let(:parent) { create(:group) }
     let!(:subgroup) { create(:group, parent: parent) }
 
diff --git a/spec/features/projects_spec.rb b/spec/features/projects_spec.rb
index b51127584754..d1e2d17e9cc3 100644
--- a/spec/features/projects_spec.rb
+++ b/spec/features/projects_spec.rb
@@ -314,7 +314,7 @@
       end
     end
 
-    context 'for subgroups', :js, :nested_groups do
+    context 'for subgroups', :js do
       let(:group) { create(:group) }
       let(:subgroup) { create(:group, parent: group) }
       let(:project) { create(:project, :repository, group: subgroup) }
diff --git a/spec/finders/autocomplete/users_finder_spec.rb b/spec/finders/autocomplete/users_finder_spec.rb
index bcde115b1a66..f3b54ca0461d 100644
--- a/spec/finders/autocomplete/users_finder_spec.rb
+++ b/spec/finders/autocomplete/users_finder_spec.rb
@@ -50,7 +50,7 @@
       it { is_expected.to match_array([user1]) }
     end
 
-    context 'when passed a subgroup', :nested_groups do
+    context 'when passed a subgroup' do
       let(:grandparent) { create(:group, :public) }
       let(:parent) { create(:group, :public, parent: grandparent) }
       let(:child) { create(:group, :public, parent: parent) }
diff --git a/spec/finders/cluster_ancestors_finder_spec.rb b/spec/finders/cluster_ancestors_finder_spec.rb
index 750042b6b542..4aedb41d4460 100644
--- a/spec/finders/cluster_ancestors_finder_spec.rb
+++ b/spec/finders/cluster_ancestors_finder_spec.rb
@@ -32,7 +32,7 @@
       is_expected.to eq([project_cluster, group_cluster, instance_cluster])
     end
 
-    context 'nested groups', :nested_groups do
+    context 'nested groups' do
       let(:group) { create(:group, parent: parent_group) }
       let(:parent_group) { create(:group) }
 
@@ -65,7 +65,7 @@
       is_expected.to eq([group_cluster, instance_cluster])
     end
 
-    context 'nested groups', :nested_groups do
+    context 'nested groups' do
       let(:group) { create(:group, parent: parent_group) }
       let(:parent_group) { create(:group) }
 
diff --git a/spec/finders/group_descendants_finder_spec.rb b/spec/finders/group_descendants_finder_spec.rb
index c28fd7cad11e..5fb6739d6e25 100644
--- a/spec/finders/group_descendants_finder_spec.rb
+++ b/spec/finders/group_descendants_finder_spec.rb
@@ -19,7 +19,7 @@
       expect(finder.has_children?).to be_truthy
     end
 
-    context 'when there are subgroups', :nested_groups do
+    context 'when there are subgroups' do
       it 'is true when there are projects' do
         create(:group, parent: group)
 
@@ -99,7 +99,7 @@
         )
       end
 
-      context 'with nested groups', :nested_groups do
+      context 'with nested groups' do
         let!(:subgroup1) { create(:group, parent: group, name: 'a', path: 'sub-a') }
         let!(:subgroup2) { create(:group, parent: group, name: 'z', path: 'sub-z') }
 
@@ -126,7 +126,7 @@
     end
   end
 
-  context 'with nested groups', :nested_groups do
+  context 'with nested groups' do
     let!(:project) { create(:project, namespace: group) }
     let!(:subgroup) { create(:group, :private, parent: group) }
 
diff --git a/spec/finders/group_members_finder_spec.rb b/spec/finders/group_members_finder_spec.rb
index 8975ea0f063b..49b0e14241e9 100644
--- a/spec/finders/group_members_finder_spec.rb
+++ b/spec/finders/group_members_finder_spec.rb
@@ -18,7 +18,7 @@
     expect(result.to_a).to match_array([member3, member2, member1])
   end
 
-  it 'returns members for nested group', :nested_groups do
+  it 'returns members for nested group' do
     group.add_developer(user2)
     nested_group.request_access(user4)
     member1 = group.add_maintainer(user1)
@@ -30,7 +30,7 @@
     expect(result.to_a).to match_array([member1, member3, member4])
   end
 
-  it 'returns members for descendant groups if requested', :nested_groups do
+  it 'returns members for descendant groups if requested' do
     member1 = group.add_maintainer(user2)
     member2 = group.add_maintainer(user1)
     nested_group.add_maintainer(user2)
diff --git a/spec/finders/group_projects_finder_spec.rb b/spec/finders/group_projects_finder_spec.rb
index f8fcc2d0e40c..f4bd8a3f6ba7 100644
--- a/spec/finders/group_projects_finder_spec.rb
+++ b/spec/finders/group_projects_finder_spec.rb
@@ -19,7 +19,7 @@
     context "only owned" do
       let(:options) { { only_owned: true } }
 
-      context 'with subgroups projects', :nested_groups do
+      context 'with subgroups projects' do
         before do
           options[:include_subgroups] = true
         end
@@ -33,7 +33,7 @@
     end
 
     context "all" do
-      context 'with subgroups projects', :nested_groups do
+      context 'with subgroups projects' do
         before do
           options[:include_subgroups] = true
         end
@@ -78,7 +78,7 @@
           subgroup_private_project.add_maintainer(current_user)
         end
 
-        context 'with subgroups projects', :nested_groups do
+        context 'with subgroups projects' do
           before do
             options[:include_subgroups] = true
           end
@@ -96,7 +96,7 @@
           current_user.update(external: true)
         end
 
-        context 'with subgroups projects', :nested_groups do
+        context 'with subgroups projects' do
           before do
             options[:include_subgroups] = true
           end
@@ -111,7 +111,7 @@
     end
 
     context "all" do
-      context 'with subgroups projects', :nested_groups do
+      context 'with subgroups projects' do
         before do
           options[:include_subgroups] = true
         end
@@ -153,7 +153,7 @@
     context "only owned" do
       let(:options) { { only_owned: true } }
 
-      context 'with subgroups projects', :nested_groups do
+      context 'with subgroups projects' do
         before do
           options[:include_subgroups] = true
         end
diff --git a/spec/finders/groups_finder_spec.rb b/spec/finders/groups_finder_spec.rb
index 367ca43bdfe4..c8875d1f92db 100644
--- a/spec/finders/groups_finder_spec.rb
+++ b/spec/finders/groups_finder_spec.rb
@@ -65,7 +65,7 @@
       end
     end
 
-    context 'subgroups', :nested_groups do
+    context 'subgroups' do
       let(:user) { create(:user) }
       let!(:parent_group) { create(:group, :public) }
       let!(:public_subgroup) { create(:group, :public, parent: parent_group) }
diff --git a/spec/finders/issues_finder_spec.rb b/spec/finders/issues_finder_spec.rb
index bf38d083ca6b..7fbe27c19395 100644
--- a/spec/finders/issues_finder_spec.rb
+++ b/spec/finders/issues_finder_spec.rb
@@ -51,7 +51,7 @@
           end
         end
 
-        context 'when include_subgroup param is true', :nested_groups do
+        context 'when include_subgroup param is true' do
           before do
             params[:include_subgroups] = true
           end
diff --git a/spec/finders/labels_finder_spec.rb b/spec/finders/labels_finder_spec.rb
index 98b4933fef6e..ba41ded112a3 100644
--- a/spec/finders/labels_finder_spec.rb
+++ b/spec/finders/labels_finder_spec.rb
@@ -89,7 +89,7 @@
         end
       end
 
-      context 'when including labels from group ancestors', :nested_groups do
+      context 'when including labels from group ancestors' do
         it 'returns labels from group and its ancestors' do
           private_group_1.add_developer(user)
           private_subgroup_1.add_developer(user)
@@ -108,7 +108,7 @@
         end
       end
 
-      context 'when including labels from group descendants', :nested_groups do
+      context 'when including labels from group descendants' do
         it 'returns labels from group and its descendants' do
           private_group_1.add_developer(user)
           private_subgroup_1.add_developer(user)
@@ -128,7 +128,7 @@
       end
     end
 
-    context 'filtering by project_id', :nested_groups do
+    context 'filtering by project_id' do
       context 'when include_ancestor_groups is true' do
         let!(:sub_project) { create(:project, namespace: private_subgroup_1 ) }
         let!(:project_label) { create(:label, project: sub_project, title: 'Label 5') }
diff --git a/spec/finders/members_finder_spec.rb b/spec/finders/members_finder_spec.rb
index 83348457caa7..4203f58fe81a 100644
--- a/spec/finders/members_finder_spec.rb
+++ b/spec/finders/members_finder_spec.rb
@@ -9,7 +9,7 @@
   set(:user3)        { create(:user) }
   set(:user4)        { create(:user) }
 
-  it 'returns members for project and parent groups', :nested_groups do
+  it 'returns members for project and parent groups' do
     nested_group.request_access(user1)
     member1 = group.add_maintainer(user2)
     member2 = nested_group.add_maintainer(user3)
@@ -20,7 +20,7 @@
     expect(result.to_a).to match_array([member1, member2, member3])
   end
 
-  it 'includes nested group members if asked', :nested_groups do
+  it 'includes nested group members if asked' do
     project = create(:project, namespace: group)
     nested_group.request_access(user1)
     member1 = group.add_maintainer(user2)
@@ -32,7 +32,7 @@
     expect(result.to_a).to match_array([member1, member2, member3])
   end
 
-  context 'when include_invited_groups_members == true', :nested_groups do
+  context 'when include_invited_groups_members == true' do
     subject { described_class.new(project, user2).execute(include_invited_groups_members: true) }
 
     set(:linked_group) { create(:group, :public, :access_requestable) }
@@ -40,7 +40,7 @@
     set(:linked_group_member) { linked_group.add_developer(user1) }
     set(:nested_linked_group_member) { nested_linked_group.add_developer(user2) }
 
-    it 'includes all the invited_groups members including members inherited from ancestor groups', :nested_groups do
+    it 'includes all the invited_groups members including members inherited from ancestor groups' do
       create(:project_group_link, project: project, group: nested_linked_group)
 
       expect(subject).to contain_exactly(linked_group_member, nested_linked_group_member)
diff --git a/spec/finders/merge_requests_finder_spec.rb b/spec/finders/merge_requests_finder_spec.rb
index da5e9dab0585..78224f0b9da9 100644
--- a/spec/finders/merge_requests_finder_spec.rb
+++ b/spec/finders/merge_requests_finder_spec.rb
@@ -42,7 +42,7 @@
           expect(merge_requests).to contain_exactly(merge_request1, merge_request2)
         end
 
-        it 'filters by group including subgroups', :nested_groups do
+        it 'filters by group including subgroups' do
           params = { group_id: group.id, include_subgroups: true }
 
           merge_requests = described_class.new(user, params).execute
diff --git a/spec/finders/todos_finder_spec.rb b/spec/finders/todos_finder_spec.rb
index 22318a9946a4..f7b35e769254 100644
--- a/spec/finders/todos_finder_spec.rb
+++ b/spec/finders/todos_finder_spec.rb
@@ -36,7 +36,7 @@
           expect(todos).to match_array([todo1])
         end
 
-        context 'with subgroups', :nested_groups do
+        context 'with subgroups' do
           let(:subgroup) { create(:group, parent: group) }
           let!(:todo3) { create(:todo, user: user, group: subgroup, target: issue) }
 
diff --git a/spec/graphql/resolvers/namespace_projects_resolver_spec.rb b/spec/graphql/resolvers/namespace_projects_resolver_spec.rb
index 20e197e9f73e..47591445fc0f 100644
--- a/spec/graphql/resolvers/namespace_projects_resolver_spec.rb
+++ b/spec/graphql/resolvers/namespace_projects_resolver_spec.rb
@@ -2,7 +2,7 @@
 
 require 'spec_helper'
 
-describe Resolvers::NamespaceProjectsResolver, :nested_groups do
+describe Resolvers::NamespaceProjectsResolver do
   include GraphqlHelpers
 
   let(:current_user) { create(:user) }
diff --git a/spec/helpers/auto_devops_helper_spec.rb b/spec/helpers/auto_devops_helper_spec.rb
index d2540696b17e..e80388f9ea7f 100644
--- a/spec/helpers/auto_devops_helper_spec.rb
+++ b/spec/helpers/auto_devops_helper_spec.rb
@@ -118,7 +118,7 @@
           it { is_expected.to eq('instance enabled') }
         end
 
-        context 'with groups', :nested_groups do
+        context 'with groups' do
           before do
             receiver.update(parent: parent)
           end
@@ -170,7 +170,7 @@
           it { is_expected.to eq('instance enabled') }
         end
 
-        context 'with groups', :nested_groups do
+        context 'with groups' do
           let(:receiver) { create(:project, :repository, namespace: group) }
 
           before do
@@ -203,7 +203,7 @@
           it { is_expected.to be_nil }
         end
 
-        context 'with groups', :nested_groups do
+        context 'with groups' do
           let(:receiver) { create(:project, :repository, namespace: group) }
 
           context 'when auto devops is disabled on group level' do
diff --git a/spec/helpers/groups_helper_spec.rb b/spec/helpers/groups_helper_spec.rb
index 1763c46389a8..037b16c90ed6 100644
--- a/spec/helpers/groups_helper_spec.rb
+++ b/spec/helpers/groups_helper_spec.rb
@@ -86,7 +86,7 @@
     end
   end
 
-  describe 'group_title', :nested_groups do
+  describe 'group_title' do
     let(:group) { create(:group) }
     let(:nested_group) { create(:group, parent: group) }
     let(:deep_nested_group) { create(:group, parent: nested_group) }
@@ -99,7 +99,7 @@
   end
 
   # rubocop:disable Layout/SpaceBeforeComma
-  describe '#share_with_group_lock_help_text', :nested_groups do
+  describe '#share_with_group_lock_help_text' do
     let!(:root_group) { create(:group) }
     let!(:subgroup) { create(:group, parent: root_group) }
     let!(:sub_subgroup) { create(:group, parent: subgroup) }
@@ -230,7 +230,7 @@
     end
   end
 
-  describe 'parent_group_options', :nested_groups do
+  describe 'parent_group_options' do
     let(:current_user) { create(:user) }
     let(:group) { create(:group, name: 'group') }
     let(:group2) { create(:group, name: 'group2') }
diff --git a/spec/helpers/namespaces_helper_spec.rb b/spec/helpers/namespaces_helper_spec.rb
index 601f864ef36a..e38513f6d941 100644
--- a/spec/helpers/namespaces_helper_spec.rb
+++ b/spec/helpers/namespaces_helper_spec.rb
@@ -1,6 +1,6 @@
 require 'spec_helper'
 
-describe NamespacesHelper, :postgresql do
+describe NamespacesHelper do
   let!(:admin) { create(:admin) }
   let!(:admin_project_creation_level) { nil }
   let!(:admin_group) do
@@ -109,7 +109,7 @@
       expect(options).to include(user_group.name)
     end
 
-    context 'when nested groups are available', :nested_groups do
+    context 'when nested groups are available' do
       it 'includes groups nested in groups the user can administer' do
         allow(helper).to receive(:current_user).and_return(user)
         child_group = create(:group, :private, parent: user_group)
diff --git a/spec/lib/banzai/filter/milestone_reference_filter_spec.rb b/spec/lib/banzai/filter/milestone_reference_filter_spec.rb
index f0a5dc8d0d7e..91edadfa234b 100644
--- a/spec/lib/banzai/filter/milestone_reference_filter_spec.rb
+++ b/spec/lib/banzai/filter/milestone_reference_filter_spec.rb
@@ -363,7 +363,7 @@
       expect(doc.css('a')).to be_empty
     end
 
-    it 'supports parent group references', :nested_groups do
+    it 'supports parent group references' do
       milestone.update!(group: parent_group)
 
       doc = reference_filter("See #{reference}")
@@ -396,7 +396,7 @@
     context 'when group milestone' do
       let(:group_milestone) { create(:milestone, title: 'group_milestone', group: group) }
 
-      context 'for subgroups', :nested_groups do
+      context 'for subgroups' do
         let(:sub_group) { create(:group, parent: group) }
         let(:sub_group_milestone) { create(:milestone, title: 'sub_group_milestone', group: sub_group) }
 
diff --git a/spec/lib/gitlab/background_migration/fix_cross_project_label_links_spec.rb b/spec/lib/gitlab/background_migration/fix_cross_project_label_links_spec.rb
index 20af63bc6c82..84ccd57a50b9 100644
--- a/spec/lib/gitlab/background_migration/fix_cross_project_label_links_spec.rb
+++ b/spec/lib/gitlab/background_migration/fix_cross_project_label_links_spec.rb
@@ -75,7 +75,7 @@ def create_resource(target_type, id, project_id)
         create_resource(target_type, 1, 2)
       end
 
-      it 'ignores label links referencing ancestor group labels', :nested_groups do
+      it 'ignores label links referencing ancestor group labels' do
         labels_table.create(id: 4, title: 'bug', color: 'red', project_id: 2, type: 'ProjectLabel')
         label_links_table.create(label_id: 4, target_type: target_type, target_id: 1)
         link = label_links_table.create(label_id: 1, target_type: target_type, target_id: 1)
@@ -85,7 +85,7 @@ def create_resource(target_type, id, project_id)
         expect(link.reload.label_id).to eq(1)
       end
 
-      it 'checks also issues and MRs in subgroups', :nested_groups do
+      it 'checks also issues and MRs in subgroups' do
         link = label_links_table.create(label_id: 2, target_type: target_type, target_id: 1)
 
         subject.perform(1, 100)
diff --git a/spec/lib/gitlab/bare_repository_import/importer_spec.rb b/spec/lib/gitlab/bare_repository_import/importer_spec.rb
index f4759b695387..ebd3c28f130f 100644
--- a/spec/lib/gitlab/bare_repository_import/importer_spec.rb
+++ b/spec/lib/gitlab/bare_repository_import/importer_spec.rb
@@ -103,7 +103,7 @@
     end
   end
 
-  context 'with subgroups', :nested_groups do
+  context 'with subgroups' do
     let(:project_path) { 'a-group/a-sub-group/a-project' }
 
     let(:existing_group) do
@@ -188,20 +188,6 @@
     end
   end
 
-  context 'when subgroups are not available' do
-    let(:project_path) { 'a-group/a-sub-group/a-project' }
-
-    before do
-      expect(Group).to receive(:supports_nested_objects?) { false }
-    end
-
-    describe '#create_project_if_needed' do
-      it 'raises an error' do
-        expect { importer.create_project_if_needed }.to raise_error('Nested groups are not supported on MySQL')
-      end
-    end
-  end
-
   def prepare_repository(project_path, source_project)
     repo_path = File.join(base_dir, project_path)
 
diff --git a/spec/lib/gitlab/database/count/reltuples_count_strategy_spec.rb b/spec/lib/gitlab/database/count/reltuples_count_strategy_spec.rb
index a528707c9dc7..959f3fdc2893 100644
--- a/spec/lib/gitlab/database/count/reltuples_count_strategy_spec.rb
+++ b/spec/lib/gitlab/database/count/reltuples_count_strategy_spec.rb
@@ -8,7 +8,7 @@
 
   subject { described_class.new(models).count }
 
-  describe '#count', :postgresql do
+  describe '#count' do
     let(:models) { [Project, Identity] }
 
     context 'when reltuples is up to date' do
diff --git a/spec/lib/gitlab/database/count/tablesample_count_strategy_spec.rb b/spec/lib/gitlab/database/count/tablesample_count_strategy_spec.rb
index a57f033b5edd..cc9d778e5799 100644
--- a/spec/lib/gitlab/database/count/tablesample_count_strategy_spec.rb
+++ b/spec/lib/gitlab/database/count/tablesample_count_strategy_spec.rb
@@ -12,7 +12,7 @@
 
   subject { strategy.count }
 
-  describe '#count', :postgresql do
+  describe '#count' do
     let(:estimates) do
       {
         Project => threshold + 1,
diff --git a/spec/lib/gitlab/database/grant_spec.rb b/spec/lib/gitlab/database/grant_spec.rb
index 5ebf3f399b60..9e62dc14d77b 100644
--- a/spec/lib/gitlab/database/grant_spec.rb
+++ b/spec/lib/gitlab/database/grant_spec.rb
@@ -8,7 +8,7 @@
       expect(described_class.create_and_execute_trigger?('users')).to eq(true)
     end
 
-    it 'returns false when the user can not create and/or execute a trigger', :postgresql do
+    it 'returns false when the user can not create and/or execute a trigger' do
       # In case of MySQL the user may have SUPER permissions, making it
       # impossible to have `false` returned when running tests; hence we only
       # run these tests on PostgreSQL.
diff --git a/spec/lib/gitlab/group_search_results_spec.rb b/spec/lib/gitlab/group_search_results_spec.rb
index 2734fcef0a0e..53a91a35ec99 100644
--- a/spec/lib/gitlab/group_search_results_spec.rb
+++ b/spec/lib/gitlab/group_search_results_spec.rb
@@ -20,7 +20,7 @@
       expect(result).to eq [user1]
     end
 
-    it 'returns the user belonging to the subgroup matching the search query', :nested_groups do
+    it 'returns the user belonging to the subgroup matching the search query' do
       user1 = create(:user, username: 'gob_bluth')
       subgroup = create(:group, parent: group)
       create(:group_member, :developer, user: user1, group: subgroup)
@@ -32,7 +32,7 @@
       expect(result).to eq [user1]
     end
 
-    it 'returns the user belonging to the parent group matching the search query', :nested_groups do
+    it 'returns the user belonging to the parent group matching the search query' do
       user1 = create(:user, username: 'gob_bluth')
       parent_group = create(:group, children: [group])
       create(:group_member, :developer, user: user1, group: parent_group)
@@ -44,7 +44,7 @@
       expect(result).to eq [user1]
     end
 
-    it 'does not return the user belonging to the private subgroup', :nested_groups do
+    it 'does not return the user belonging to the private subgroup' do
       user1 = create(:user, username: 'gob_bluth')
       subgroup = create(:group, :private, parent: group)
       create(:group_member, :developer, user: user1, group: subgroup)
diff --git a/spec/lib/gitlab/manifest_import/manifest_spec.rb b/spec/lib/gitlab/manifest_import/manifest_spec.rb
index ab305fb23161..ded93e23c087 100644
--- a/spec/lib/gitlab/manifest_import/manifest_spec.rb
+++ b/spec/lib/gitlab/manifest_import/manifest_spec.rb
@@ -1,6 +1,6 @@
 require 'spec_helper'
 
-describe Gitlab::ManifestImport::Manifest, :postgresql do
+describe Gitlab::ManifestImport::Manifest do
   let(:file) { File.open(Rails.root.join('spec/fixtures/aosp_manifest.xml')) }
   let(:manifest) { described_class.new(file) }
 
diff --git a/spec/lib/gitlab/manifest_import/project_creator_spec.rb b/spec/lib/gitlab/manifest_import/project_creator_spec.rb
index 1d01d4375355..a7487972f512 100644
--- a/spec/lib/gitlab/manifest_import/project_creator_spec.rb
+++ b/spec/lib/gitlab/manifest_import/project_creator_spec.rb
@@ -1,6 +1,6 @@
 require 'spec_helper'
 
-describe Gitlab::ManifestImport::ProjectCreator, :postgresql do
+describe Gitlab::ManifestImport::ProjectCreator do
   let(:group) { create(:group) }
   let(:user) { create(:user) }
   let(:repository) do
diff --git a/spec/lib/gitlab/object_hierarchy_spec.rb b/spec/lib/gitlab/object_hierarchy_spec.rb
index 4154f9cbe800..737fd62a8553 100644
--- a/spec/lib/gitlab/object_hierarchy_spec.rb
+++ b/spec/lib/gitlab/object_hierarchy_spec.rb
@@ -1,6 +1,6 @@
 require 'spec_helper'
 
-describe Gitlab::ObjectHierarchy, :postgresql do
+describe Gitlab::ObjectHierarchy do
   let!(:parent) { create(:group) }
   let!(:child1) { create(:group, parent: parent) }
   let!(:child2) { create(:group, parent: child1) }
diff --git a/spec/lib/gitlab/performance_bar_spec.rb b/spec/lib/gitlab/performance_bar_spec.rb
index ee3c571c9c05..71c109db1f1d 100644
--- a/spec/lib/gitlab/performance_bar_spec.rb
+++ b/spec/lib/gitlab/performance_bar_spec.rb
@@ -96,7 +96,7 @@
       end
     end
 
-    context 'when allowed group is nested', :nested_groups do
+    context 'when allowed group is nested' do
       let!(:nested_my_group) { create(:group, parent: create(:group, path: 'my-org'), path: 'my-group') }
 
       before do
@@ -110,7 +110,7 @@
       end
     end
 
-    context 'when a nested group has the same path', :nested_groups do
+    context 'when a nested group has the same path' do
       before do
         create(:group, :nested, path: 'my-group').add_developer(user)
       end
diff --git a/spec/lib/gitlab/project_authorizations_spec.rb b/spec/lib/gitlab/project_authorizations_spec.rb
index bd0bc2c90443..75e2d5e1319b 100644
--- a/spec/lib/gitlab/project_authorizations_spec.rb
+++ b/spec/lib/gitlab/project_authorizations_spec.rb
@@ -20,13 +20,7 @@ def map_access_levels(rows)
   end
 
   let(:authorizations) do
-    klass = if Group.supports_nested_objects?
-              Gitlab::ProjectAuthorizations::WithNestedGroups
-            else
-              Gitlab::ProjectAuthorizations::WithoutNestedGroups
-            end
-
-    klass.new(user).calculate
+    described_class.new(user).calculate
   end
 
   it 'returns the correct number of authorizations' do
@@ -46,28 +40,26 @@ def map_access_levels(rows)
     expect(mapping[group_project.id]).to eq(Gitlab::Access::DEVELOPER)
   end
 
-  if Group.supports_nested_objects?
-    context 'with nested groups' do
-      let!(:nested_group) { create(:group, parent: group) }
-      let!(:nested_project) { create(:project, namespace: nested_group) }
+  context 'with nested groups' do
+    let!(:nested_group) { create(:group, parent: group) }
+    let!(:nested_project) { create(:project, namespace: nested_group) }
 
-      it 'includes nested groups' do
-        expect(authorizations.pluck(:project_id)).to include(nested_project.id)
-      end
+    it 'includes nested groups' do
+      expect(authorizations.pluck(:project_id)).to include(nested_project.id)
+    end
 
-      it 'inherits access levels when the user is not a member of a nested group' do
-        mapping = map_access_levels(authorizations)
+    it 'inherits access levels when the user is not a member of a nested group' do
+      mapping = map_access_levels(authorizations)
 
-        expect(mapping[nested_project.id]).to eq(Gitlab::Access::DEVELOPER)
-      end
+      expect(mapping[nested_project.id]).to eq(Gitlab::Access::DEVELOPER)
+    end
 
-      it 'uses the greatest access level when a user is a member of a nested group' do
-        nested_group.add_maintainer(user)
+    it 'uses the greatest access level when a user is a member of a nested group' do
+      nested_group.add_maintainer(user)
 
-        mapping = map_access_levels(authorizations)
+      mapping = map_access_levels(authorizations)
 
-        expect(mapping[nested_project.id]).to eq(Gitlab::Access::MAINTAINER)
-      end
+      expect(mapping[nested_project.id]).to eq(Gitlab::Access::MAINTAINER)
     end
   end
 end
diff --git a/spec/lib/gitlab/sql/cte_spec.rb b/spec/lib/gitlab/sql/cte_spec.rb
index d6763c7b2e1d..5d2164491b5d 100644
--- a/spec/lib/gitlab/sql/cte_spec.rb
+++ b/spec/lib/gitlab/sql/cte_spec.rb
@@ -1,6 +1,6 @@
 require 'spec_helper'
 
-describe Gitlab::SQL::CTE, :postgresql do
+describe Gitlab::SQL::CTE do
   describe '#to_arel' do
     it 'generates an Arel relation for the CTE body' do
       relation = User.where(id: 1)
diff --git a/spec/lib/gitlab/sql/recursive_cte_spec.rb b/spec/lib/gitlab/sql/recursive_cte_spec.rb
index 7fe39dd5a963..407a4d8a2474 100644
--- a/spec/lib/gitlab/sql/recursive_cte_spec.rb
+++ b/spec/lib/gitlab/sql/recursive_cte_spec.rb
@@ -1,6 +1,6 @@
 require 'spec_helper'
 
-describe Gitlab::SQL::RecursiveCTE, :postgresql do
+describe Gitlab::SQL::RecursiveCTE do
   let(:cte) { described_class.new(:cte_name) }
 
   describe '#to_arel' do
diff --git a/spec/models/ci/runner_spec.rb b/spec/models/ci/runner_spec.rb
index 24ea059e871e..78b151631c1d 100644
--- a/spec/models/ci/runner_spec.rb
+++ b/spec/models/ci/runner_spec.rb
@@ -146,7 +146,7 @@
       expect(described_class.belonging_to_parent_group_of_project(project.id)).to contain_exactly(runner)
     end
 
-    context 'with a parent group with a runner', :nested_groups do
+    context 'with a parent group with a runner' do
       let(:runner) { create(:ci_runner, :group, groups: [parent_group]) }
       let(:project) { create(:project, group: group) }
       let(:group) { create(:group, parent: parent_group) }
diff --git a/spec/models/clusters/cluster_spec.rb b/spec/models/clusters/cluster_spec.rb
index 52661178d769..8f2f1b200e49 100644
--- a/spec/models/clusters/cluster_spec.rb
+++ b/spec/models/clusters/cluster_spec.rb
@@ -342,7 +342,7 @@
       end
     end
 
-    context 'when sub-group has configured kubernetes cluster', :nested_groups do
+    context 'when sub-group has configured kubernetes cluster' do
       let(:sub_group_cluster) { create(:cluster, :provided_by_gcp, :group) }
       let(:sub_group) { sub_group_cluster.group }
       let(:project) { create(:project, group: sub_group) }
diff --git a/spec/models/concerns/deployment_platform_spec.rb b/spec/models/concerns/deployment_platform_spec.rb
index c4f9f62ece51..27f535487c8b 100644
--- a/spec/models/concerns/deployment_platform_spec.rb
+++ b/spec/models/concerns/deployment_platform_spec.rb
@@ -45,7 +45,7 @@
         is_expected.to eq(group_cluster.platform_kubernetes)
       end
 
-      context 'when child group has configured kubernetes cluster', :nested_groups do
+      context 'when child group has configured kubernetes cluster' do
         let(:child_group1) { create(:group, parent: group) }
         let!(:child_group1_cluster) { create(:cluster_for_group, groups: [child_group1]) }
 
diff --git a/spec/models/concerns/group_descendant_spec.rb b/spec/models/concerns/group_descendant_spec.rb
index 194caac3fce7..192e884f3e88 100644
--- a/spec/models/concerns/group_descendant_spec.rb
+++ b/spec/models/concerns/group_descendant_spec.rb
@@ -2,7 +2,7 @@
 
 require 'spec_helper'
 
-describe GroupDescendant, :nested_groups do
+describe GroupDescendant do
   let(:parent) { create(:group) }
   let(:subgroup) { create(:group, parent: parent) }
   let(:subsub_group) { create(:group, parent: subgroup) }
@@ -84,7 +84,7 @@ def all_preloaded_groups(*groups)
       it 'tracks the exception when a parent was not preloaded' do
         expect(Gitlab::Sentry).to receive(:track_exception).and_call_original
 
-        expect { GroupDescendant.build_hierarchy([subsub_group]) }.to raise_error(ArgumentError)
+        expect { described_class.build_hierarchy([subsub_group]) }.to raise_error(ArgumentError)
       end
 
       it 'recovers if a parent was not reloaded by querying for the parent' do
@@ -93,7 +93,7 @@ def all_preloaded_groups(*groups)
         # this does not raise in production, so stubbing it here.
         allow(Gitlab::Sentry).to receive(:track_exception)
 
-        expect(GroupDescendant.build_hierarchy([subsub_group])).to eq(expected_hierarchy)
+        expect(described_class.build_hierarchy([subsub_group])).to eq(expected_hierarchy)
       end
 
       it 'raises an error if not all elements were preloaded' do
diff --git a/spec/models/concerns/issuable_spec.rb b/spec/models/concerns/issuable_spec.rb
index e19da41c3feb..39680c0e51af 100644
--- a/spec/models/concerns/issuable_spec.rb
+++ b/spec/models/concerns/issuable_spec.rb
@@ -128,7 +128,7 @@ def build_issuable(milestone_id)
       expect(build_issuable(milestone.id).milestone_available?).to be_truthy
     end
 
-    it 'returns true with a milestone from the the parent of the issue project group', :nested_groups do
+    it 'returns true with a milestone from the the parent of the issue project group' do
       parent = create(:group)
       group.update(parent: parent)
       milestone = create(:milestone, group: parent)
diff --git a/spec/models/group_spec.rb b/spec/models/group_spec.rb
index 90e0900445e1..7e9bbf5a4079 100644
--- a/spec/models/group_spec.rb
+++ b/spec/models/group_spec.rb
@@ -71,7 +71,7 @@
       end
     end
 
-    describe '#notification_settings', :nested_groups do
+    describe '#notification_settings' do
       let(:user) { create(:user) }
       let(:group) { create(:group) }
       let(:sub_group) { create(:group, parent_id: group.id) }
@@ -237,7 +237,7 @@
         it { is_expected.to match_array([private_group, internal_group, group]) }
       end
 
-      context 'when user is a member of private subgroup', :postgresql do
+      context 'when user is a member of private subgroup' do
         let!(:private_subgroup) { create(:group, :private, parent: private_group) }
 
         before do
@@ -416,7 +416,7 @@
       it { expect(group.last_owner?(@members[:owner])).to be_falsy }
     end
 
-    context 'with owners from a parent', :postgresql do
+    context 'with owners from a parent' do
       before do
         parent_group = create(:group)
         create(:group_member, :owner, group: parent_group)
@@ -524,7 +524,7 @@ def setup_group_members(group)
     it { expect(subject.parent).to be_kind_of(described_class) }
   end
 
-  describe '#members_with_parents', :nested_groups do
+  describe '#members_with_parents' do
     let!(:group) { create(:group, :nested) }
     let!(:maintainer) { group.parent.add_user(create(:user), GroupMember::MAINTAINER) }
     let!(:developer) { group.add_user(create(:user), GroupMember::DEVELOPER) }
@@ -535,7 +535,7 @@ def setup_group_members(group)
     end
   end
 
-  describe '#direct_and_indirect_members', :nested_groups do
+  describe '#direct_and_indirect_members' do
     let!(:group) { create(:group, :nested) }
     let!(:sub_group) { create(:group, parent: group) }
     let!(:maintainer) { group.parent.add_user(create(:user), GroupMember::MAINTAINER) }
@@ -552,7 +552,7 @@ def setup_group_members(group)
     end
   end
 
-  describe '#users_with_descendants', :nested_groups do
+  describe '#users_with_descendants' do
     let(:user_a) { create(:user) }
     let(:user_b) { create(:user) }
 
@@ -571,7 +571,7 @@ def setup_group_members(group)
     end
   end
 
-  describe '#direct_and_indirect_users', :nested_groups do
+  describe '#direct_and_indirect_users' do
     let(:user_a) { create(:user) }
     let(:user_b) { create(:user) }
     let(:user_c) { create(:user) }
@@ -601,7 +601,7 @@ def setup_group_members(group)
     end
   end
 
-  describe '#project_users_with_descendants', :nested_groups do
+  describe '#project_users_with_descendants' do
     let(:user_a) { create(:user) }
     let(:user_b) { create(:user) }
     let(:user_c) { create(:user) }
@@ -678,7 +678,7 @@ def setup_group_members(group)
       end
     end
 
-    context 'sub groups and projects', :nested_groups do
+    context 'sub groups and projects' do
       it 'enables two_factor_requirement for group member' do
         group.add_user(user, GroupMember::OWNER)
 
@@ -687,7 +687,7 @@ def setup_group_members(group)
         expect(user.reload.require_two_factor_authentication_from_group).to be_truthy
       end
 
-      context 'expanded group members', :nested_groups do
+      context 'expanded group members' do
         let(:indirect_user) { create(:user) }
 
         it 'enables two_factor_requirement for subgroup member' do
@@ -720,7 +720,7 @@ def setup_group_members(group)
           expect(user.reload.require_two_factor_authentication_from_group).to be_falsey
         end
 
-        it 'does not enable two_factor_requirement for subgroup child project member', :nested_groups do
+        it 'does not enable two_factor_requirement for subgroup child project member' do
           subgroup = create(:group, :nested, parent: group)
           project = create(:project, group: subgroup)
           project.add_maintainer(user)
@@ -820,7 +820,7 @@ def setup_group_members(group)
       it_behaves_like 'ref is protected'
     end
 
-    context 'when group has children', :postgresql do
+    context 'when group has children' do
       let(:group_child)      { create(:group, parent: group) }
       let(:group_child_2)    { create(:group, parent: group_child) }
       let(:group_child_3)    { create(:group, parent: group_child_2) }
@@ -843,7 +843,7 @@ def setup_group_members(group)
     end
   end
 
-  describe '#highest_group_member', :nested_groups do
+  describe '#highest_group_member' do
     let(:nested_group) { create(:group, parent: group) }
     let(:nested_group_2) { create(:group, parent: nested_group) }
     let(:user) { create(:user) }
@@ -932,7 +932,7 @@ def setup_group_members(group)
       it { is_expected.to eq(config) }
     end
 
-    context 'with parent groups', :nested_groups do
+    context 'with parent groups' do
       where(:instance_value, :parent_value, :group_value, :config) do
         # Instance level enabled
         true | nil   | nil    | { status: true, scope: :instance }
diff --git a/spec/models/members/group_member_spec.rb b/spec/models/members/group_member_spec.rb
index f227abd3daea..ebb0bfca369b 100644
--- a/spec/models/members/group_member_spec.rb
+++ b/spec/models/members/group_member_spec.rb
@@ -69,7 +69,7 @@
     end
   end
 
-  context 'access levels', :nested_groups do
+  context 'access levels' do
     context 'with parent group' do
       it_behaves_like 'inherited access level as a member of entity' do
         let(:entity) { create(:group, parent: parent_entity) }
diff --git a/spec/models/members/project_member_spec.rb b/spec/models/members/project_member_spec.rb
index 497764b68254..79c39b81196d 100644
--- a/spec/models/members/project_member_spec.rb
+++ b/spec/models/members/project_member_spec.rb
@@ -130,7 +130,7 @@
       end
     end
 
-    context 'with parent group and a subgroup', :nested_groups do
+    context 'with parent group and a subgroup' do
       it_behaves_like 'inherited access level as a member of entity' do
         let(:subgroup) { create(:group, parent: parent_entity) }
         let(:entity) { create(:project, group: subgroup) }
diff --git a/spec/models/namespace/root_storage_statistics_spec.rb b/spec/models/namespace/root_storage_statistics_spec.rb
index 3229a32234e5..5341278db7c2 100644
--- a/spec/models/namespace/root_storage_statistics_spec.rb
+++ b/spec/models/namespace/root_storage_statistics_spec.rb
@@ -56,7 +56,7 @@
 
     it_behaves_like 'data refresh'
 
-    context 'with subgroups', :nested_groups do
+    context 'with subgroups' do
       let(:subgroup1) { create(:group, parent: namespace)}
       let(:subgroup2) { create(:group, parent: subgroup1)}
 
diff --git a/spec/models/namespace_spec.rb b/spec/models/namespace_spec.rb
index f908f3504e00..2b9c3c43af98 100644
--- a/spec/models/namespace_spec.rb
+++ b/spec/models/namespace_spec.rb
@@ -191,7 +191,7 @@
     end
   end
 
-  describe '#ancestors_upto', :nested_groups do
+  describe '#ancestors_upto' do
     let(:parent) { create(:group) }
     let(:child) { create(:group, parent: parent) }
     let(:child2) { create(:group, parent: child) }
@@ -271,7 +271,7 @@
         end
       end
 
-      context 'with subgroups', :nested_groups do
+      context 'with subgroups' do
         let(:parent) { create(:group, name: 'parent', path: 'parent') }
         let(:new_parent) { create(:group, name: 'new_parent', path: 'new_parent') }
         let(:child) { create(:group, name: 'child', path: 'child', parent: parent) }
@@ -475,7 +475,7 @@ def project_rugged(project)
     end
   end
 
-  describe '#self_and_hierarchy', :nested_groups do
+  describe '#self_and_hierarchy' do
     let!(:group) { create(:group, path: 'git_lab') }
     let!(:nested_group) { create(:group, parent: group) }
     let!(:deep_nested_group) { create(:group, parent: nested_group) }
@@ -490,7 +490,7 @@ def project_rugged(project)
     end
   end
 
-  describe '#ancestors', :nested_groups do
+  describe '#ancestors' do
     let(:group) { create(:group) }
     let(:nested_group) { create(:group, parent: group) }
     let(:deep_nested_group) { create(:group, parent: nested_group) }
@@ -504,7 +504,7 @@ def project_rugged(project)
     end
   end
 
-  describe '#self_and_ancestors', :nested_groups do
+  describe '#self_and_ancestors' do
     let(:group) { create(:group) }
     let(:nested_group) { create(:group, parent: group) }
     let(:deep_nested_group) { create(:group, parent: nested_group) }
@@ -518,7 +518,7 @@ def project_rugged(project)
     end
   end
 
-  describe '#descendants', :nested_groups do
+  describe '#descendants' do
     let!(:group) { create(:group, path: 'git_lab') }
     let!(:nested_group) { create(:group, parent: group) }
     let!(:deep_nested_group) { create(:group, parent: nested_group) }
@@ -534,7 +534,7 @@ def project_rugged(project)
     end
   end
 
-  describe '#self_and_descendants', :nested_groups do
+  describe '#self_and_descendants' do
     let!(:group) { create(:group, path: 'git_lab') }
     let!(:nested_group) { create(:group, parent: group) }
     let!(:deep_nested_group) { create(:group, parent: nested_group) }
@@ -550,7 +550,7 @@ def project_rugged(project)
     end
   end
 
-  describe '#users_with_descendants', :nested_groups do
+  describe '#users_with_descendants' do
     let(:user_a) { create(:user) }
     let(:user_b) { create(:user) }
 
@@ -597,7 +597,7 @@ def project_rugged(project)
     it { expect(group.all_pipelines.to_a).to match_array([pipeline1, pipeline2]) }
   end
 
-  describe '#share_with_group_lock with subgroups', :nested_groups do
+  describe '#share_with_group_lock with subgroups' do
     context 'when creating a subgroup' do
       let(:subgroup) { create(:group, parent: root_group )}
 
@@ -738,7 +738,7 @@ def project_rugged(project)
   end
 
   describe '#root_ancestor' do
-    it 'returns the top most ancestor', :nested_groups do
+    it 'returns the top most ancestor' do
       root_group = create(:group)
       nested_group = create(:group, parent: root_group)
       deep_nested_group = create(:group, parent: nested_group)
diff --git a/spec/models/notification_recipient_spec.rb b/spec/models/notification_recipient_spec.rb
index 20278d81f6d8..4122736c148c 100644
--- a/spec/models/notification_recipient_spec.rb
+++ b/spec/models/notification_recipient_spec.rb
@@ -49,7 +49,7 @@
   end
 
   context '#notification_setting' do
-    context 'for child groups', :nested_groups do
+    context 'for child groups' do
       let!(:moved_group) { create(:group) }
       let(:group) { create(:group) }
       let(:sub_group_1) { create(:group, parent: group) }
diff --git a/spec/models/postgresql/replication_slot_spec.rb b/spec/models/postgresql/replication_slot_spec.rb
index 95ae204a8a82..d435fccc09a6 100644
--- a/spec/models/postgresql/replication_slot_spec.rb
+++ b/spec/models/postgresql/replication_slot_spec.rb
@@ -2,7 +2,7 @@
 
 require 'spec_helper'
 
-describe Postgresql::ReplicationSlot, :postgresql do
+describe Postgresql::ReplicationSlot do
   describe '.in_use?' do
     it 'returns true when replication slots are present' do
       expect(described_class).to receive(:exists?).and_return(true)
diff --git a/spec/models/project_group_link_spec.rb b/spec/models/project_group_link_spec.rb
index dad5506900ba..cd997224122c 100644
--- a/spec/models/project_group_link_spec.rb
+++ b/spec/models/project_group_link_spec.rb
@@ -25,7 +25,7 @@
       expect(project_group_link).not_to be_valid
     end
 
-    it "doesn't allow a project to be shared with an ancestor of the group it is in", :nested_groups do
+    it "doesn't allow a project to be shared with an ancestor of the group it is in" do
       project_group_link.group = parent_group
 
       expect(project_group_link).not_to be_valid
diff --git a/spec/models/project_spec.rb b/spec/models/project_spec.rb
index 7d458324c200..15a7d943009c 100644
--- a/spec/models/project_spec.rb
+++ b/spec/models/project_spec.rb
@@ -2292,7 +2292,7 @@
     end
   end
 
-  describe '#ancestors_upto', :nested_groups do
+  describe '#ancestors_upto' do
     let(:parent) { create(:group) }
     let(:child) { create(:group, parent: parent) }
     let(:child2) { create(:group, parent: child) }
@@ -2331,7 +2331,7 @@
       it { is_expected.to eq(group) }
     end
 
-    context 'in a nested group', :nested_groups do
+    context 'in a nested group' do
       let(:root) { create(:group) }
       let(:child) { create(:group, parent: root) }
       let(:project) { create(:project, group: child) }
@@ -2479,7 +2479,7 @@
         expect(forked_project.in_fork_network_of?(project)).to be_truthy
       end
 
-      it 'is true for a fork of a fork', :postgresql do
+      it 'is true for a fork of a fork' do
         other_fork = fork_project(forked_project)
 
         expect(other_fork.in_fork_network_of?(project)).to be_truthy
@@ -3801,7 +3801,7 @@ def enable_lfs
         end
       end
 
-      context 'when enabled on root parent', :nested_groups do
+      context 'when enabled on root parent' do
         let(:parent_group) { create(:group, parent: create(:group, :auto_devops_enabled)) }
 
         context 'when auto devops instance enabled' do
@@ -3821,7 +3821,7 @@ def enable_lfs
         end
       end
 
-      context 'when disabled on root parent', :nested_groups do
+      context 'when disabled on root parent' do
         let(:parent_group) { create(:group, parent: create(:group, :auto_devops_disabled)) }
 
         context 'when auto devops instance enabled' do
@@ -4264,18 +4264,16 @@ def enable_lfs
       expect(project.badges.count).to eq 3
     end
 
-    if Group.supports_nested_objects?
-      context 'with nested_groups' do
-        let(:parent_group) { create(:group) }
+    context 'with nested_groups' do
+      let(:parent_group) { create(:group) }
 
-        before do
-          create_list(:group_badge, 2, group: project_group)
-          project_group.update(parent: parent_group)
-        end
+      before do
+        create_list(:group_badge, 2, group: project_group)
+        project_group.update(parent: parent_group)
+      end
 
-        it 'returns the project and the project nested groups badges' do
-          expect(project.badges.count).to eq 5
-        end
+      it 'returns the project and the project nested groups badges' do
+        expect(project.badges.count).to eq 5
       end
     end
   end
diff --git a/spec/models/todo_spec.rb b/spec/models/todo_spec.rb
index b5bf294790a2..9aeef7c3b4b5 100644
--- a/spec/models/todo_spec.rb
+++ b/spec/models/todo_spec.rb
@@ -262,11 +262,7 @@
       todo2 = create(:todo, group: child_group)
       todos = described_class.for_group_and_descendants(parent_group)
 
-      expect(todos).to include(todo1)
-
-      # Nested groups only work on PostgreSQL, so on MySQL todo2 won't be
-      # present.
-      expect(todos).to include(todo2) if Gitlab::Database.postgresql?
+      expect(todos).to contain_exactly(todo1, todo2)
     end
   end
 
diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb
index 2d20f8c78cce..35c335c5b5c4 100644
--- a/spec/models/user_spec.rb
+++ b/spec/models/user_spec.rb
@@ -985,7 +985,7 @@
     it { expect(user.namespaces).to contain_exactly(user.namespace, group) }
     it { expect(user.manageable_namespaces).to contain_exactly(user.namespace, group) }
 
-    context 'with child groups', :nested_groups do
+    context 'with child groups' do
       let!(:subgroup) { create(:group, parent: group) }
 
       describe '#manageable_namespaces' do
@@ -2082,11 +2082,7 @@
 
     subject { user.membership_groups }
 
-    if Group.supports_nested_objects?
-      it { is_expected.to contain_exactly parent_group, child_group }
-    else
-      it { is_expected.to contain_exactly parent_group }
-    end
+    it { is_expected.to contain_exactly parent_group, child_group }
   end
 
   describe '#authorizations_for_projects' do
@@ -2386,7 +2382,7 @@ def add_user(access)
       it_behaves_like :member
     end
 
-    context 'with subgroup with different owner for project runner', :nested_groups do
+    context 'with subgroup with different owner for project runner' do
       let(:group) { create(:group) }
       let(:another_user) { create(:user) }
       let(:subgroup) { create(:group, parent: group) }
@@ -2490,22 +2486,16 @@ def add_user(access)
         group.add_owner(user)
       end
 
-      if Group.supports_nested_objects?
-        it 'returns all groups' do
-          is_expected.to match_array [
-            group,
-            nested_group_1, nested_group_1_1,
-            nested_group_2, nested_group_2_1
-          ]
-        end
-      else
-        it 'returns the top-level groups' do
-          is_expected.to match_array [group]
-        end
+      it 'returns all groups' do
+        is_expected.to match_array [
+          group,
+          nested_group_1, nested_group_1_1,
+          nested_group_2, nested_group_2_1
+        ]
       end
     end
 
-    context 'user is member of the first child (internal node), branch 1', :nested_groups do
+    context 'user is member of the first child (internal node), branch 1' do
       before do
         nested_group_1.add_owner(user)
       end
@@ -2518,7 +2508,7 @@ def add_user(access)
       end
     end
 
-    context 'user is member of the first child (internal node), branch 2', :nested_groups do
+    context 'user is member of the first child (internal node), branch 2' do
       before do
         nested_group_2.add_owner(user)
       end
@@ -2531,7 +2521,7 @@ def add_user(access)
       end
     end
 
-    context 'user is member of the last child (leaf node)', :nested_groups do
+    context 'user is member of the last child (leaf node)' do
       before do
         nested_group_1_1.add_owner(user)
       end
@@ -2687,7 +2677,7 @@ def add_user(access)
       end
     end
 
-    context 'with 2FA requirement from expanded groups', :nested_groups do
+    context 'with 2FA requirement from expanded groups' do
       let!(:group1) { create :group, require_two_factor_authentication: true }
       let!(:group1a) { create :group, parent: group1 }
 
@@ -2702,7 +2692,7 @@ def add_user(access)
       end
     end
 
-    context 'with 2FA requirement on nested child group', :nested_groups do
+    context 'with 2FA requirement on nested child group' do
       let!(:group1) { create :group, require_two_factor_authentication: false }
       let!(:group1a) { create :group, require_two_factor_authentication: true, parent: group1 }
 
diff --git a/spec/policies/group_member_policy_spec.rb b/spec/policies/group_member_policy_spec.rb
index 7bd7184cffe5..a4f3301a0648 100644
--- a/spec/policies/group_member_policy_spec.rb
+++ b/spec/policies/group_member_policy_spec.rb
@@ -58,7 +58,7 @@ def expect_disallowed(*permissions)
     end
   end
 
-  context 'with the group parent', :postgresql do
+  context 'with the group parent' do
     let(:current_user) { create :user }
     let(:subgroup) { create(:group, :private, parent: group)}
 
diff --git a/spec/policies/group_policy_spec.rb b/spec/policies/group_policy_spec.rb
index dc3675a7b9ee..be55d94daec4 100644
--- a/spec/policies/group_policy_spec.rb
+++ b/spec/policies/group_policy_spec.rb
@@ -51,7 +51,7 @@
 
     it { expect_allowed(:read_label, :read_list) }
 
-    context 'in subgroups', :nested_groups do
+    context 'in subgroups' do
       let(:subgroup) { create(:group, :private, parent: group) }
       let(:project) { create(:project, namespace: subgroup) }
 
@@ -104,8 +104,6 @@
       end
 
       it 'allows every maintainer permission plus creating subgroups' do
-        allow(Group).to receive(:supports_nested_objects?).and_return(true)
-
         create_subgroup_permission = [:create_subgroup]
         updated_maintainer_permissions =
           maintainer_permissions + create_subgroup_permission
@@ -122,8 +120,6 @@
 
     context 'with subgroup_creation_level set to owner' do
       it 'allows every maintainer permission' do
-        allow(Group).to receive(:supports_nested_objects?).and_return(true)
-
         expect_allowed(*guest_permissions)
         expect_allowed(*reporter_permissions)
         expect_allowed(*developer_permissions)
@@ -137,8 +133,6 @@
     let(:current_user) { owner }
 
     it do
-      allow(Group).to receive(:supports_nested_objects?).and_return(true)
-
       expect_allowed(*guest_permissions)
       expect_allowed(*reporter_permissions)
       expect_allowed(*developer_permissions)
@@ -151,8 +145,6 @@
     let(:current_user) { admin }
 
     it do
-      allow(Group).to receive(:supports_nested_objects?).and_return(true)
-
       expect_allowed(*guest_permissions)
       expect_allowed(*reporter_permissions)
       expect_allowed(*developer_permissions)
@@ -161,52 +153,7 @@
     end
   end
 
-  describe 'when nested group support feature is disabled' do
-    before do
-      allow(Group).to receive(:supports_nested_objects?).and_return(false)
-    end
-
-    context 'admin' do
-      let(:current_user) { admin }
-
-      it 'allows every owner permission except creating subgroups' do
-        create_subgroup_permission = [:create_subgroup]
-        updated_owner_permissions =
-          owner_permissions - create_subgroup_permission
-
-        expect_disallowed(*create_subgroup_permission)
-        expect_allowed(*updated_owner_permissions)
-      end
-    end
-
-    context 'owner' do
-      let(:current_user) { owner }
-
-      it 'allows every owner permission except creating subgroups' do
-        create_subgroup_permission = [:create_subgroup]
-        updated_owner_permissions =
-          owner_permissions - create_subgroup_permission
-
-        expect_disallowed(*create_subgroup_permission)
-        expect_allowed(*updated_owner_permissions)
-      end
-    end
-
-    context 'maintainer' do
-      let(:current_user) { maintainer }
-
-      it 'allows every maintainer permission except creating subgroups' do
-        create_subgroup_permission = [:create_subgroup]
-        updated_maintainer_permissions =
-          maintainer_permissions - create_subgroup_permission
-
-        expect_disallowed(*create_subgroup_permission)
-        expect_allowed(*updated_maintainer_permissions)
-      end
-    end
-  end
-
-  describe 'private nested group use the highest access level from the group and inherited permissions', :nested_groups do
+  describe 'private nested group use the highest access level from the group and inherited permissions' do
     let(:nested_group) do
       create(:group, :private, :owner_subgroup_creation_only, parent: group)
     end
@@ -289,8 +236,6 @@
       let(:current_user) { owner }
 
       it do
-        allow(Group).to receive(:supports_nested_objects?).and_return(true)
-
         expect_allowed(*guest_permissions)
         expect_allowed(*reporter_permissions)
         expect_allowed(*developer_permissions)
diff --git a/spec/presenters/clusters/cluster_presenter_spec.rb b/spec/presenters/clusters/cluster_presenter_spec.rb
index 7054a70e2ed8..6b988e2645b6 100644
--- a/spec/presenters/clusters/cluster_presenter_spec.rb
+++ b/spec/presenters/clusters/cluster_presenter_spec.rb
@@ -43,7 +43,7 @@
       end
 
       shared_examples 'ancestor clusters' do
-        context 'ancestor clusters', :nested_groups do
+        context 'ancestor clusters' do
           let(:root_group) { create(:group, name: 'Root Group') }
           let(:parent) { create(:group, name: 'parent', parent: root_group) }
           let(:child) { create(:group, name: 'child', parent: parent) }
diff --git a/spec/requests/api/boards_spec.rb b/spec/requests/api/boards_spec.rb
index de79e8c4c5c5..0b9c0c2ebe93 100644
--- a/spec/requests/api/boards_spec.rb
+++ b/spec/requests/api/boards_spec.rb
@@ -63,7 +63,7 @@
     end
   end
 
-  describe "POST /groups/:id/boards/lists", :nested_groups do
+  describe "POST /groups/:id/boards/lists" do
     set(:group) { create(:group) }
     set(:board_parent) { create(:group, parent: group ) }
     let(:url) { "/groups/#{board_parent.id}/boards/#{board.id}/lists" }
diff --git a/spec/requests/api/graphql/namespace/projects_spec.rb b/spec/requests/api/graphql/namespace/projects_spec.rb
index 63fa16c79cac..815e9531ecf8 100644
--- a/spec/requests/api/graphql/namespace/projects_spec.rb
+++ b/spec/requests/api/graphql/namespace/projects_spec.rb
@@ -2,7 +2,7 @@
 
 require 'spec_helper'
 
-describe 'getting projects', :nested_groups do
+describe 'getting projects' do
   include GraphqlHelpers
 
   let(:group)             { create(:group) }
diff --git a/spec/requests/api/group_labels_spec.rb b/spec/requests/api/group_labels_spec.rb
index 3769f8b78e49..fcea57d9df73 100644
--- a/spec/requests/api/group_labels_spec.rb
+++ b/spec/requests/api/group_labels_spec.rb
@@ -94,7 +94,7 @@
       expect(response).to have_gitlab_http_status(400)
     end
 
-    it "does not delete parent's group labels", :nested_groups do
+    it "does not delete parent's group labels" do
       subgroup = create(:group, parent: group)
       subgroup_label = create(:group_label, title: 'feature', group: subgroup)
 
@@ -127,7 +127,7 @@
       expect(json_response['description']).to eq('test')
     end
 
-    it "does not update parent's group label", :nested_groups do
+    it "does not update parent's group label" do
       subgroup = create(:group, parent: group)
       subgroup_label = create(:group_label, title: 'feature', group: subgroup)
 
diff --git a/spec/requests/api/groups_spec.rb b/spec/requests/api/groups_spec.rb
index 52d926d5484b..50f36141aed2 100644
--- a/spec/requests/api/groups_spec.rb
+++ b/spec/requests/api/groups_spec.rb
@@ -530,7 +530,7 @@ def response_project_ids(json_response, key)
         expect(json_response.length).to eq(2)
       end
 
-      it "returns projects including those in subgroups", :nested_groups do
+      it "returns projects including those in subgroups" do
         subgroup = create(:group, parent: group1)
         create(:project, group: subgroup)
         create(:project, group: subgroup)
@@ -642,7 +642,7 @@ def response_project_ids(json_response, key)
     end
   end
 
-  describe 'GET /groups/:id/subgroups', :nested_groups do
+  describe 'GET /groups/:id/subgroups' do
     let!(:subgroup1) { create(:group, parent: group1) }
     let!(:subgroup2) { create(:group, :private, parent: group1) }
     let!(:subgroup3) { create(:group, :private, parent: group2) }
@@ -786,7 +786,7 @@ def response_project_ids(json_response, key)
         expect(response).to have_gitlab_http_status(403)
       end
 
-      context 'as owner', :nested_groups do
+      context 'as owner' do
         before do
           group2.add_owner(user1)
         end
@@ -798,7 +798,7 @@ def response_project_ids(json_response, key)
         end
       end
 
-      context 'as maintainer', :nested_groups do
+      context 'as maintainer' do
         before do
           group2.add_maintainer(user1)
         end
@@ -825,7 +825,7 @@ def response_project_ids(json_response, key)
         expect(json_response["visibility"]).to eq(Gitlab::VisibilityLevel.string_level(Gitlab::CurrentSettings.current_application_settings.default_group_visibility))
       end
 
-      it "creates a nested group", :nested_groups do
+      it "creates a nested group" do
         parent = create(:group)
         parent.add_owner(user3)
         group = attributes_for(:group, { parent_id: parent.id })
diff --git a/spec/requests/api/issues/get_group_issues_spec.rb b/spec/requests/api/issues/get_group_issues_spec.rb
index 9a41d790945b..5916bb115166 100644
--- a/spec/requests/api/issues/get_group_issues_spec.rb
+++ b/spec/requests/api/issues/get_group_issues_spec.rb
@@ -82,7 +82,7 @@
       end
     end
 
-    context 'when group has subgroups', :nested_groups do
+    context 'when group has subgroups' do
       let(:subgroup_1) { create(:group, parent: group) }
       let(:subgroup_2) { create(:group, parent: subgroup_1) }
 
diff --git a/spec/requests/api/members_spec.rb b/spec/requests/api/members_spec.rb
index 55f38079b1f7..26f6e7055287 100644
--- a/spec/requests/api/members_spec.rb
+++ b/spec/requests/api/members_spec.rb
@@ -99,7 +99,7 @@
     end
   end
 
-  describe 'GET /:source_type/:id/members/all', :nested_groups do
+  describe 'GET /:source_type/:id/members/all' do
     let(:nested_user) { create(:user) }
     let(:project_user) { create(:user) }
     let(:linked_group_user) { create(:user) }
@@ -238,7 +238,7 @@
       end
 
       context 'access levels' do
-        it 'does not create the member if group level is higher', :nested_groups do
+        it 'does not create the member if group level is higher' do
           parent = create(:group)
 
           group.update(parent: parent)
@@ -252,7 +252,7 @@
           expect(json_response['message']['access_level']).to eq(["should be greater than or equal to Developer inherited membership from group #{parent.name}"])
         end
 
-        it 'creates the member if group level is lower', :nested_groups do
+        it 'creates the member if group level is lower' do
           parent = create(:group)
 
           group.update(parent: parent)
diff --git a/spec/requests/api/merge_requests_spec.rb b/spec/requests/api/merge_requests_spec.rb
index ced853caab47..7a6f1cd548c7 100644
--- a/spec/requests/api/merge_requests_spec.rb
+++ b/spec/requests/api/merge_requests_spec.rb
@@ -723,7 +723,7 @@
 
     it_behaves_like 'merge requests list'
 
-    context 'when have subgroups', :nested_groups do
+    context 'when have subgroups' do
       let!(:group) { create(:group, :public) }
       let!(:subgroup) { create(:group, parent: group) }
       let!(:project) { create(:project, :public, :repository, creator: user, namespace: subgroup, only_allow_merge_if_pipeline_succeeds: false) }
diff --git a/spec/requests/api/projects_spec.rb b/spec/requests/api/projects_spec.rb
index fee300e9d7af..5b3a2412afff 100644
--- a/spec/requests/api/projects_spec.rb
+++ b/spec/requests/api/projects_spec.rb
@@ -1357,7 +1357,7 @@
           end
         end
 
-        context 'nested group project', :nested_groups do
+        context 'nested group project' do
           let(:group) { create(:group) }
           let(:nested_group) { create(:group, parent: group) }
           let(:project2) { create(:project, group: nested_group) }
diff --git a/spec/requests/openid_connect_spec.rb b/spec/requests/openid_connect_spec.rb
index 86e41cbdf004..025568d8bead 100644
--- a/spec/requests/openid_connect_spec.rb
+++ b/spec/requests/openid_connect_spec.rb
@@ -104,7 +104,7 @@ def request_user_info!
         expect(json_response).to match(id_token_claims.merge(user_info_claims))
 
         expected_groups = [group1.full_path, group3.full_path]
-        expected_groups << group4.full_path if Group.supports_nested_objects?
+        expected_groups << group4.full_path
         expect(json_response['groups']).to match_array(expected_groups)
       end
 
diff --git a/spec/serializers/group_child_entity_spec.rb b/spec/serializers/group_child_entity_spec.rb
index b58d95ccb439..00e2f9315493 100644
--- a/spec/serializers/group_child_entity_spec.rb
+++ b/spec/serializers/group_child_entity_spec.rb
@@ -62,7 +62,7 @@
     it_behaves_like 'group child json'
   end
 
-  describe 'for a group', :nested_groups do
+  describe 'for a group' do
     let(:description) { 'Awesomeness' }
     let(:object) do
       create(:group, :nested, :with_avatar,
diff --git a/spec/serializers/group_child_serializer_spec.rb b/spec/serializers/group_child_serializer_spec.rb
index 5541ada37509..c9e8535585b4 100644
--- a/spec/serializers/group_child_serializer_spec.rb
+++ b/spec/serializers/group_child_serializer_spec.rb
@@ -16,7 +16,7 @@
       end
     end
 
-    context 'with a hierarchy', :nested_groups do
+    context 'with a hierarchy' do
       let(:parent) { create(:group) }
 
       subject(:serializer) do
@@ -75,7 +75,7 @@
         expect(serializer.represent(build_list(:project, 2))).to be_kind_of(Array)
       end
 
-      context 'with a hierarchy', :nested_groups do
+      context 'with a hierarchy' do
         let(:parent) { create(:group) }
 
         subject(:serializer) do
diff --git a/spec/serializers/pipeline_serializer_spec.rb b/spec/serializers/pipeline_serializer_spec.rb
index 54e6abc2d3a4..7f9827329b3a 100644
--- a/spec/serializers/pipeline_serializer_spec.rb
+++ b/spec/serializers/pipeline_serializer_spec.rb
@@ -126,7 +126,7 @@
         expect(subject.all? { |entry| entry[:merge_request].present? }).to be_truthy
       end
 
-      it 'preloads related merge requests', :postgresql do
+      it 'preloads related merge requests' do
         recorded = ActiveRecord::QueryRecorder.new { subject }
 
         expect(recorded.log)
diff --git a/spec/services/boards/issues/list_service_spec.rb b/spec/services/boards/issues/list_service_spec.rb
index 40878e24cb42..931b67b2950f 100644
--- a/spec/services/boards/issues/list_service_spec.rb
+++ b/spec/services/boards/issues/list_service_spec.rb
@@ -112,7 +112,7 @@
         it_behaves_like 'issues list service'
       end
 
-      context 'and group is an ancestor', :nested_groups do
+      context 'and group is an ancestor' do
         let(:parent) { create(:group) }
         let(:group) { create(:group, parent: parent) }
         let!(:backlog) { create(:backlog_list, board: board) }
diff --git a/spec/services/groups/auto_devops_service_spec.rb b/spec/services/groups/auto_devops_service_spec.rb
index 7f8ab517cef9..7591b2f6f12d 100644
--- a/spec/services/groups/auto_devops_service_spec.rb
+++ b/spec/services/groups/auto_devops_service_spec.rb
@@ -47,7 +47,7 @@
         expect(subgroup_1.auto_devops_enabled?).to eq(false)
       end
 
-      context 'when subgroups have projects', :nested_groups do
+      context 'when subgroups have projects' do
         it 'reflects changes on projects' do
           subgroup_1 = create(:group, parent: group)
           project_1 = create(:project, namespace: subgroup_1)
diff --git a/spec/services/groups/create_service_spec.rb b/spec/services/groups/create_service_spec.rb
index a7c954284853..0f9f20de5865 100644
--- a/spec/services/groups/create_service_spec.rb
+++ b/spec/services/groups/create_service_spec.rb
@@ -44,7 +44,7 @@
     end
   end
 
-  describe 'creating subgroup', :nested_groups do
+  describe 'creating subgroup' do
     let!(:group) { create(:group) }
     let!(:service) { described_class.new(user, group_params.merge(parent_id: group.id)) }
 
@@ -54,47 +54,31 @@
       end
 
       it { is_expected.to be_persisted }
+    end
 
-      context 'when nested groups feature is disabled' do
-        it 'does not save group and returns an error' do
-          allow(Group).to receive(:supports_nested_objects?).and_return(false)
+    context 'as guest' do
+      it 'does not save group and returns an error' do
+        is_expected.not_to be_persisted
 
-          is_expected.not_to be_persisted
-          expect(subject.errors[:parent_id]).to include('You don’t have permission to create a subgroup in this group.')
-          expect(subject.parent_id).to be_nil
-        end
+        expect(subject.errors[:parent_id].first).to eq('You don’t have permission to create a subgroup in this group.')
+        expect(subject.parent_id).to be_nil
       end
     end
 
-    context 'when nested groups feature is enabled' do
+    context 'as owner' do
       before do
-        allow(Group).to receive(:supports_nested_objects?).and_return(true)
-      end
-
-      context 'as guest' do
-        it 'does not save group and returns an error' do
-          is_expected.not_to be_persisted
-
-          expect(subject.errors[:parent_id].first).to eq('You don’t have permission to create a subgroup in this group.')
-          expect(subject.parent_id).to be_nil
-        end
+        group.add_owner(user)
       end
 
-      context 'as owner' do
-        before do
-          group.add_owner(user)
-        end
+      it { is_expected.to be_persisted }
+    end
 
-        it { is_expected.to be_persisted }
+    context 'as maintainer' do
+      before do
+        group.add_maintainer(user)
       end
 
-      context 'as maintainer' do
-        before do
-          group.add_maintainer(user)
-        end
-
-        it { is_expected.to be_persisted }
-      end
+      it { is_expected.to be_persisted }
     end
   end
 
diff --git a/spec/services/groups/nested_create_service_spec.rb b/spec/services/groups/nested_create_service_spec.rb
index 13acf9e055bd..b30392c1b12f 100644
--- a/spec/services/groups/nested_create_service_spec.rb
+++ b/spec/services/groups/nested_create_service_spec.rb
@@ -28,35 +28,7 @@
     end
   end
 
-  describe 'without subgroups' do
-    let(:params) { { group_path: 'a-group' } }
-
-    before do
-      allow(Group).to receive(:supports_nested_objects?) { false }
-    end
-
-    it 'creates the group' do
-      group = service.execute
-
-      expect(group).to be_persisted
-    end
-
-    it 'returns the group if it already existed' do
-      existing_group = create(:group, path: 'a-group')
-
-      expect(service.execute).to eq(existing_group)
-    end
-
-    it 'raises an error when tring to create a subgroup' do
-      service = described_class.new(user, group_path: 'a-group/a-sub-group')
-
-      expect { service.execute }.to raise_error('Nested groups are not supported on MySQL')
-    end
-
-    it_behaves_like 'with a visibility level'
-  end
-
-  describe 'with subgroups', :nested_groups do
+  describe 'with subgroups' do
     let(:params) { { group_path: 'a-group/a-sub-group' } }
 
     describe "#execute" do
diff --git a/spec/services/groups/transfer_service_spec.rb b/spec/services/groups/transfer_service_spec.rb
index b5708ebba76a..f3af8cf5f3b3 100644
--- a/spec/services/groups/transfer_service_spec.rb
+++ b/spec/services/groups/transfer_service_spec.rb
@@ -2,28 +2,13 @@
 
 require 'rails_helper'
 
-describe Groups::TransferService, :postgresql do
+describe Groups::TransferService do
   let(:user) { create(:user) }
   let(:new_parent_group) { create(:group, :public) }
   let!(:group_member) { create(:group_member, :owner, group: group, user: user) }
   let(:transfer_service) { described_class.new(group, user) }
 
   shared_examples 'ensuring allowed transfer for a group' do
-    context 'with other database than PostgreSQL' do
-      before do
-        allow(Group).to receive(:supports_nested_objects?).and_return(false)
-      end
-
-      it 'returns false' do
-        expect(transfer_service.execute(new_parent_group)).to be_falsy
-      end
-
-      it 'adds an error on group' do
-        transfer_service.execute(new_parent_group)
-        expect(transfer_service.error).to eq('Transfer failed: Database is not supported.')
-      end
-    end
-
     context "when there's an exception on GitLab shell directories" do
       let(:new_parent_group) { create(:group, :public) }
 
diff --git a/spec/services/groups/update_service_spec.rb b/spec/services/groups/update_service_spec.rb
index d081c20f6696..5d4576139f7c 100644
--- a/spec/services/groups/update_service_spec.rb
+++ b/spec/services/groups/update_service_spec.rb
@@ -133,7 +133,7 @@
     end
   end
 
-  context 'for a subgroup', :nested_groups do
+  context 'for a subgroup' do
     let(:subgroup) { create(:group, :private, parent: private_group) }
 
     context 'when the parent group share_with_group_lock is enabled' do
diff --git a/spec/services/issues/update_service_spec.rb b/spec/services/issues/update_service_spec.rb
index 68b791320963..3ae7c7b1c1db 100644
--- a/spec/services/issues/update_service_spec.rb
+++ b/spec/services/issues/update_service_spec.rb
@@ -116,7 +116,7 @@ def update_issue(opts)
         expect(issue.relative_position).to be_between(issue1.relative_position, issue2.relative_position)
       end
 
-      context 'when moving issue between issues from different projects', :nested_groups do
+      context 'when moving issue between issues from different projects' do
         let(:group) { create(:group) }
         let(:subgroup) { create(:group, parent: group) }
 
@@ -703,7 +703,7 @@ def update_issue(opts)
       end
     end
 
-    context 'when moving an issue ', :nested_groups do
+    context 'when moving an issue ' do
       it 'raises an error for invalid move ids within a project' do
         opts = { move_between_ids: [9000, 9999] }
 
diff --git a/spec/services/members/destroy_service_spec.rb b/spec/services/members/destroy_service_spec.rb
index 52f9a305d8f5..7dce7f035d40 100644
--- a/spec/services/members/destroy_service_spec.rb
+++ b/spec/services/members/destroy_service_spec.rb
@@ -267,15 +267,15 @@
       expect(group.members.map(&:user)).not_to include(member_user)
     end
 
-    it 'removes the subgroup membership', :postgresql do
+    it 'removes the subgroup membership' do
       expect(subgroup.members.map(&:user)).not_to include(member_user)
     end
 
-    it 'removes the subsubgroup membership', :postgresql do
+    it 'removes the subsubgroup membership' do
       expect(subsubgroup.members.map(&:user)).not_to include(member_user)
     end
 
-    it 'removes the subsubproject membership', :postgresql do
+    it 'removes the subsubproject membership' do
       expect(subsubproject.members.map(&:user)).not_to include(member_user)
     end
 
diff --git a/spec/services/notification_service_spec.rb b/spec/services/notification_service_spec.rb
index c20de1fd0798..1dcade1de0d7 100644
--- a/spec/services/notification_service_spec.rb
+++ b/spec/services/notification_service_spec.rb
@@ -111,7 +111,7 @@
       should_email(participant)
     end
 
-    context 'for subgroups', :nested_groups do
+    context 'for subgroups' do
       before do
         build_group(project)
       end
@@ -337,7 +337,7 @@
 
         it_behaves_like 'new note notifications'
 
-        context 'which is a subgroup', :nested_groups do
+        context 'which is a subgroup' do
           let!(:parent) { create(:group) }
           let!(:group) { create(:group, parent: parent) }
 
@@ -388,7 +388,7 @@
         should_email(admin)
       end
 
-      context 'on project that belongs to subgroup', :nested_groups do
+      context 'on project that belongs to subgroup' do
         let(:group_reporter) { create(:user) }
         let(:group_guest) { create(:user) }
         let(:parent_group) { create(:group) }
@@ -458,7 +458,7 @@
           should_not_email_nested_group_user(@pg_disabled)
         end
 
-        it 'notifies parent group members with mention level', :nested_groups do
+        it 'notifies parent group members with mention level' do
           note = create(:note_on_issue, noteable: issue, project_id: issue.project_id, note: "@#{@pg_mention.username}")
 
           notification.new_note(note)
@@ -2410,52 +2410,40 @@ def build_group(project, visibility: :public)
     group
   end
 
-  # Creates a nested group only if supported
-  # to avoid errors on MySQL
   def create_nested_group(visibility)
-    if Group.supports_nested_objects?
-      parent_group = create(:group, visibility)
-      child_group = create(:group, visibility, parent: parent_group)
+    parent_group = create(:group, visibility)
+    child_group = create(:group, visibility, parent: parent_group)
 
-      # Parent group member: global=disabled, parent_group=watch, child_group=global
-      @pg_watcher ||= create_user_with_notification(:watch, 'parent_group_watcher', parent_group)
-      @pg_watcher.notification_settings_for(nil).disabled!
+    # Parent group member: global=disabled, parent_group=watch, child_group=global
+    @pg_watcher ||= create_user_with_notification(:watch, 'parent_group_watcher', parent_group)
+    @pg_watcher.notification_settings_for(nil).disabled!
 
-      # Parent group member: global=global, parent_group=disabled, child_group=global
-      @pg_disabled ||= create_user_with_notification(:disabled, 'parent_group_disabled', parent_group)
-      @pg_disabled.notification_settings_for(nil).global!
+    # Parent group member: global=global, parent_group=disabled, child_group=global
+    @pg_disabled ||= create_user_with_notification(:disabled, 'parent_group_disabled', parent_group)
+    @pg_disabled.notification_settings_for(nil).global!
 
-      # Parent group member: global=global, parent_group=mention, child_group=global
-      @pg_mention ||= create_user_with_notification(:mention, 'parent_group_mention', parent_group)
-      @pg_mention.notification_settings_for(nil).global!
+    # Parent group member: global=global, parent_group=mention, child_group=global
+    @pg_mention ||= create_user_with_notification(:mention, 'parent_group_mention', parent_group)
+    @pg_mention.notification_settings_for(nil).global!
 
-      # Parent group member: global=global, parent_group=participating, child_group=global
-      @pg_participant ||= create_user_with_notification(:participating, 'parent_group_participant', parent_group)
-      @pg_mention.notification_settings_for(nil).global!
+    # Parent group member: global=global, parent_group=participating, child_group=global
+    @pg_participant ||= create_user_with_notification(:participating, 'parent_group_participant', parent_group)
+    @pg_mention.notification_settings_for(nil).global!
 
-      child_group
-    else
-      create(:group, visibility)
-    end
+    child_group
   end
 
   def add_member_for_parent_group(user, project)
-    return unless Group.supports_nested_objects?
-
     project.reload
 
     project.group.parent.add_maintainer(user)
   end
 
   def should_email_nested_group_user(user, times: 1, recipients: email_recipients)
-    return unless Group.supports_nested_objects?
-
     should_email(user, times: 1, recipients: email_recipients)
   end
 
   def should_not_email_nested_group_user(user, recipients: email_recipients)
-    return unless Group.supports_nested_objects?
-
     should_not_email(user, recipients: email_recipients)
   end
 
diff --git a/spec/services/projects/autocomplete_service_spec.rb b/spec/services/projects/autocomplete_service_spec.rb
index 2f70c8ea94d7..b625653bc77e 100644
--- a/spec/services/projects/autocomplete_service_spec.rb
+++ b/spec/services/projects/autocomplete_service_spec.rb
@@ -118,7 +118,7 @@
       expect(milestone_titles).to eq([group_milestone2.title, group_milestone1.title])
     end
 
-    context 'with nested groups', :nested_groups do
+    context 'with nested groups' do
       let(:subgroup) { create(:group, :public, parent: group) }
       let!(:subgroup_milestone) { create(:milestone, group: subgroup) }
 
diff --git a/spec/services/todos/destroy/entity_leave_service_spec.rb b/spec/services/todos/destroy/entity_leave_service_spec.rb
index 2a553e188078..ce809bbf6c5e 100644
--- a/spec/services/todos/destroy/entity_leave_service_spec.rb
+++ b/spec/services/todos/destroy/entity_leave_service_spec.rb
@@ -176,7 +176,7 @@
           end
         end
 
-        context 'with nested groups', :nested_groups do
+        context 'with nested groups' do
           let(:subgroup) { create(:group, :private, parent: group) }
           let(:subgroup2) { create(:group, :private, parent: group) }
           let(:subproject) { create(:project, group: subgroup) }
diff --git a/spec/services/todos/destroy/group_private_service_spec.rb b/spec/services/todos/destroy/group_private_service_spec.rb
index a1798686d7c1..7dd495847b3a 100644
--- a/spec/services/todos/destroy/group_private_service_spec.rb
+++ b/spec/services/todos/destroy/group_private_service_spec.rb
@@ -35,7 +35,7 @@
         expect(project_member.todos).to match_array([todo_project_member])
       end
 
-      context 'with nested groups', :nested_groups do
+      context 'with nested groups' do
         let(:parent_group) { create(:group) }
         let(:subgroup)     { create(:group, :private, parent: group) }
         let(:subproject)   { create(:project, group: subgroup) }
diff --git a/spec/services/users/refresh_authorized_projects_service_spec.rb b/spec/services/users/refresh_authorized_projects_service_spec.rb
index 0287a24808d2..f5a914bb482b 100644
--- a/spec/services/users/refresh_authorized_projects_service_spec.rb
+++ b/spec/services/users/refresh_authorized_projects_service_spec.rb
@@ -135,7 +135,7 @@
       end
     end
 
-    context 'projects of subgroups of groups the user is a member of', :nested_groups do
+    context 'projects of subgroups of groups the user is a member of' do
       let(:group) { create(:group) }
       let(:nested_group) { create(:group, parent: group) }
       let!(:other_project) { create(:project, group: nested_group) }
@@ -163,7 +163,7 @@
       end
     end
 
-    context 'projects shared with subgroups of groups the user is a member of', :nested_groups do
+    context 'projects shared with subgroups of groups the user is a member of' do
       let(:group) { create(:group) }
       let(:nested_group) { create(:group, parent: group) }
       let(:other_project) { create(:project) }
diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb
index cfecdb06f330..0255e1505431 100644
--- a/spec/spec_helper.rb
+++ b/spec/spec_helper.rb
@@ -260,14 +260,6 @@
     Gitlab::CurrentSettings.clear_in_memory_application_settings!
   end
 
-  config.around(:each, :nested_groups) do |example|
-    example.run if Group.supports_nested_objects?
-  end
-
-  config.around(:each, :postgresql) do |example|
-    example.run if Gitlab::Database.postgresql?
-  end
-
   # This makes sure the `ApplicationController#can?` method is stubbed with the
   # original implementation for all view specs.
   config.before(:each, type: :view) do
diff --git a/spec/support/controllers/githubish_import_controller_shared_examples.rb b/spec/support/controllers/githubish_import_controller_shared_examples.rb
index 5bb1269a19df..5fd303e73364 100644
--- a/spec/support/controllers/githubish_import_controller_shared_examples.rb
+++ b/spec/support/controllers/githubish_import_controller_shared_examples.rb
@@ -321,7 +321,7 @@ def assign_session_token(provider)
       end
     end
 
-    context 'user has chosen an existing nested namespace and name for the project', :postgresql do
+    context 'user has chosen an existing nested namespace and name for the project' do
       let(:parent_namespace) { create(:group, name: 'foo') }
       let(:nested_namespace) { create(:group, name: 'bar', parent: parent_namespace) }
       let(:test_name) { 'test_name' }
@@ -340,7 +340,7 @@ def assign_session_token(provider)
       end
     end
 
-    context 'user has chosen a non-existent nested namespaces and name for the project', :postgresql do
+    context 'user has chosen a non-existent nested namespaces and name for the project' do
       let(:test_name) { 'test_name' }
 
       it 'takes the selected namespace and name' do
@@ -371,7 +371,7 @@ def assign_session_token(provider)
       end
     end
 
-    context 'user has chosen existent and non-existent nested namespaces and name for the project', :postgresql do
+    context 'user has chosen existent and non-existent nested namespaces and name for the project' do
       let(:test_name) { 'test_name' }
       let!(:parent_namespace) { create(:group, name: 'foo') }
 
diff --git a/spec/support/shared_contexts/policies/group_policy_shared_context.rb b/spec/support/shared_contexts/policies/group_policy_shared_context.rb
index 74389c4d82bc..c11725c63d23 100644
--- a/spec/support/shared_contexts/policies/group_policy_shared_context.rb
+++ b/spec/support/shared_contexts/policies/group_policy_shared_context.rb
@@ -31,7 +31,7 @@
       :admin_group_member,
       :change_visibility_level,
       :set_note_created_at,
-      (Gitlab::Database.postgresql? ? :create_subgroup : nil)
+      :create_subgroup
     ].compact
   end
 
diff --git a/spec/views/groups/edit.html.haml_spec.rb b/spec/views/groups/edit.html.haml_spec.rb
index 29e15960fb80..47804411b9d2 100644
--- a/spec/views/groups/edit.html.haml_spec.rb
+++ b/spec/views/groups/edit.html.haml_spec.rb
@@ -35,7 +35,7 @@
       it_behaves_like '"Share with group lock" setting', { disabled: false, checked: false }
     end
 
-    context 'for a subgroup', :nested_groups do
+    context 'for a subgroup' do
       let!(:subgroup) { create(:group, parent: root_group) }
       let(:sub_owner) { create(:user) }
       let(:test_group) { subgroup }
diff --git a/spec/views/layouts/header/_new_dropdown.haml_spec.rb b/spec/views/layouts/header/_new_dropdown.haml_spec.rb
index 2e19d0cec260..26e429ac5d03 100644
--- a/spec/views/layouts/header/_new_dropdown.haml_spec.rb
+++ b/spec/views/layouts/header/_new_dropdown.haml_spec.rb
@@ -28,7 +28,7 @@
         )
       end
 
-      it 'has a "New subgroup" link', :nested_groups do
+      it 'has a "New subgroup" link' do
         render
 
         expect(rendered).to have_link(
-- 
GitLab