Merge branch 'missing-fks' into 'develop'
Add missing foreign key indexes See merge request pleroma/pleroma!4134
This commit is contained in:
commit
6feb536e79
1
changelog.d/missing-fks.add
Normal file
1
changelog.d/missing-fks.add
Normal file
@ -0,0 +1 @@
|
|||||||
|
Add missing indexes on foreign key relationships
|
@ -0,0 +1,20 @@
|
|||||||
|
defmodule Pleroma.Repo.Migrations.AddMissingForeignKeys do
|
||||||
|
use Ecto.Migration
|
||||||
|
|
||||||
|
def change do
|
||||||
|
create_if_not_exists(index(:announcement_read_relationships, :announcement_id))
|
||||||
|
create_if_not_exists(index(:bookmarks, :activity_id))
|
||||||
|
create_if_not_exists(index(:bookmarks, :folder_id))
|
||||||
|
create_if_not_exists(index(:chats, :recipient))
|
||||||
|
create_if_not_exists(index(:mfa_tokens, :authorization_id))
|
||||||
|
create_if_not_exists(index(:mfa_tokens, :user_id))
|
||||||
|
create_if_not_exists(index(:notifications, :activity_id))
|
||||||
|
create_if_not_exists(index(:oauth_authorizations, :app_id))
|
||||||
|
create_if_not_exists(index(:oauth_authorizations, :user_id))
|
||||||
|
create_if_not_exists(index(:password_reset_tokens, :user_id))
|
||||||
|
create_if_not_exists(index(:push_subscriptions, :token_id))
|
||||||
|
create_if_not_exists(index(:report_notes, :activity_id))
|
||||||
|
create_if_not_exists(index(:report_notes, :user_id))
|
||||||
|
create_if_not_exists(index(:user_notes, :target_id))
|
||||||
|
end
|
||||||
|
end
|
27
test/fixtures/unindexed_fk.sql
vendored
Normal file
27
test/fixtures/unindexed_fk.sql
vendored
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
-- Unindexed FK -- Missing indexes - For CI
|
||||||
|
|
||||||
|
WITH y AS (
|
||||||
|
SELECT
|
||||||
|
pg_catalog.format('%I', c1.relname) AS referencing_tbl,
|
||||||
|
pg_catalog.quote_ident(a1.attname) AS referencing_column,
|
||||||
|
(SELECT pg_get_expr(indpred, indrelid) FROM pg_catalog.pg_index WHERE indrelid = t.conrelid AND indkey[0] = t.conkey[1] AND indpred IS NOT NULL LIMIT 1) partial_statement
|
||||||
|
FROM pg_catalog.pg_constraint t
|
||||||
|
JOIN pg_catalog.pg_attribute a1 ON a1.attrelid = t.conrelid AND a1.attnum = t.conkey[1]
|
||||||
|
JOIN pg_catalog.pg_class c1 ON c1.oid = t.conrelid
|
||||||
|
JOIN pg_catalog.pg_namespace n1 ON n1.oid = c1.relnamespace
|
||||||
|
JOIN pg_catalog.pg_class c2 ON c2.oid = t.confrelid
|
||||||
|
JOIN pg_catalog.pg_namespace n2 ON n2.oid = c2.relnamespace
|
||||||
|
JOIN pg_catalog.pg_attribute a2 ON a2.attrelid = t.confrelid AND a2.attnum = t.confkey[1]
|
||||||
|
WHERE t.contype = 'f'
|
||||||
|
AND NOT EXISTS (
|
||||||
|
SELECT 1
|
||||||
|
FROM pg_catalog.pg_index i
|
||||||
|
WHERE i.indrelid = t.conrelid
|
||||||
|
AND i.indkey[0] = t.conkey[1]
|
||||||
|
AND indpred IS NULL
|
||||||
|
)
|
||||||
|
)
|
||||||
|
SELECT referencing_tbl || '.' || referencing_column as "column"
|
||||||
|
FROM y
|
||||||
|
WHERE (partial_statement IS NULL OR partial_statement <> ('(' || referencing_column || ' IS NOT NULL)'))
|
||||||
|
ORDER BY 1;
|
17
test/pleroma/schema_test.exs
Normal file
17
test/pleroma/schema_test.exs
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
# Pleroma: A lightweight social networking server
|
||||||
|
# Copyright © 2017-2022 Pleroma Authors <https://pleroma.social/>
|
||||||
|
# SPDX-License-Identifier: AGPL-3.0-only
|
||||||
|
|
||||||
|
defmodule Pleroma.SchemaTest do
|
||||||
|
use Pleroma.DataCase, async: true
|
||||||
|
|
||||||
|
alias Pleroma.Repo
|
||||||
|
|
||||||
|
test "No unindexed foreign keys" do
|
||||||
|
query = File.read!("test/fixtures/unindexed_fk.sql")
|
||||||
|
|
||||||
|
{:ok, result} = Repo.query(query)
|
||||||
|
|
||||||
|
assert Enum.empty?(result.rows)
|
||||||
|
end
|
||||||
|
end
|
Loading…
Reference in New Issue
Block a user