From ae3fbd5fd7d8975255e52f0f103d2bf56b427169 Mon Sep 17 00:00:00 2001 From: Chris Conn Date: Wed, 15 Jan 2025 09:40:18 +0000 Subject: [PATCH] Fix #264 -- Don't detect an index creation when the table is being created and altered in a transaction --- .../sql_analyser/postgresql.py | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/django_migration_linter/sql_analyser/postgresql.py b/src/django_migration_linter/sql_analyser/postgresql.py index 28e0624..902276d 100644 --- a/src/django_migration_linter/sql_analyser/postgresql.py +++ b/src/django_migration_linter/sql_analyser/postgresql.py @@ -33,12 +33,19 @@ def has_create_index_in_transaction(sql_statements: list[str], **kwargs) -> bool # (Most common example is `ALTER TABLE... ADD COLUMN`, then later # `CREATE INDEX`) if sql.startswith("ALTER TABLE"): - return has_create_index(sql_statements[i + 1 :], ignore_concurrently=False) + return has_create_index( + sql_statements[i + 1 :], + sql_statements[:i], + ignore_concurrently=False + ) return False def has_create_index( - sql_statements: list[str], ignore_concurrently: bool = True, **kwargs + sql_statements: list[str], + preceding_sql_statements: list[str] = None, + ignore_concurrently: bool = True, + **kwargs ) -> bool: regex_result = None for sql in sql_statements: @@ -50,9 +57,11 @@ def has_create_index( if not regex_result: return False + all_sql_statements = (preceding_sql_statements or []) + sql_statements concerned_table = regex_result.group(2) table_is_added_in_transaction = any( - sql.startswith(f"CREATE TABLE {concerned_table}") for sql in sql_statements + sql.startswith(f"CREATE TABLE {concerned_table}") + for sql in all_sql_statements ) return not table_is_added_in_transaction