From 2bf87c0659ebcbcac8f3c5db429886e3a943176c Mon Sep 17 00:00:00 2001 From: David Wobrock Date: Fri, 11 Jun 2021 22:52:06 +0200 Subject: [PATCH] Add Postgresql warning when using DROP INDEX without CONCURRENTLY keyword --- .../sql_analyser/postgresql.py | 7 +++++++ tests/unit/test_sql_analyser.py | 16 +++++++++++++--- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/django_migration_linter/sql_analyser/postgresql.py b/django_migration_linter/sql_analyser/postgresql.py index 4ff31fe..2f8608c 100644 --- a/django_migration_linter/sql_analyser/postgresql.py +++ b/django_migration_linter/sql_analyser/postgresql.py @@ -13,4 +13,11 @@ class PostgresqlAnalyser(BaseAnalyser): "mode": "one_liner", "type": "warning", }, + { + "code": "DROP_INDEX", + "fn": lambda sql, **kw: re.search("DROP INDEX", sql) and not re.search("INDEX CONCURRENTLY", sql), + "msg": "DROP INDEX locks table", + "mode": "one_liner", + "type": "warning", + }, ] diff --git a/tests/unit/test_sql_analyser.py b/tests/unit/test_sql_analyser.py index 07a6246..a810aef 100644 --- a/tests/unit/test_sql_analyser.py +++ b/tests/unit/test_sql_analyser.py @@ -13,9 +13,11 @@ class SqlAnalyserTestCase(unittest.TestCase): sql_statements=sql, database_vendor=self.database_vendor ) - def assertValidSql(self, sql): - errors, _, _ = self.analyse_sql(sql) + def assertValidSql(self, sql, allow_warnings=False): + errors, _, warnings = self.analyse_sql(sql) self.assertEqual(0, len(errors), "Found errors in sql: {}".format(errors)) + if not allow_warnings: + self.assertEqual(0, len(warnings), "Found warnings in sql: {}".format(errors)) def assertBackwardIncompatibleSql(self, sql): errors, _, _ = self.analyse_sql(sql) @@ -187,7 +189,7 @@ class PostgresqlAnalyserTestCase(SqlAnalyserTestCase): 'CREATE INDEX "app_add_manytomany_field_b_many_to_many_b_id_953b185b" ON "app_add_manytomany_field_b_many_to_many"("b_id");', 'CREATE INDEX "app_add_manytomany_field_b_many_to_many_a_id_4b44832a" ON "app_add_manytomany_field_b_many_to_many"("a_id");', ] - self.assertValidSql(sql) + self.assertValidSql(sql, allow_warnings=True) def test_make_column_not_null_with_django_default(self): sql = [ @@ -219,3 +221,11 @@ class PostgresqlAnalyserTestCase(SqlAnalyserTestCase): self.assertValidSql(sql) sql = "CREATE UNIQUE INDEX CONCURRENTLY title_idx ON films (title);" self.assertValidSql(sql) + + def test_drop_index_non_concurrently(self): + sql = "DROP INDEX ON films" + self.assertWarningSql(sql) + + def test_drop_index_concurrently(self): + sql = "DROP INDEX CONCURRENTLY ON films;" + self.assertValidSql(sql)