
    ]j                    d    d dl mZ d dlZddlmZmZmZmZ d	dZ	 d
	 	 	 	 	 ddZ	 G d de      Z
y)    )annotationsN   )BaseAnalyserCheck	CheckMode	CheckTypec                    | r| d   j                  d      syt        |       D ]%  \  }}|j                  d      st        | d      c S  y)a-  Return if a migration opens a transaction, acquires EXCLUSIVE lock, then indexes.

    Any locks that are obtained after a transaction is opened will not be released
    until that transaction either commits or rolls back.

    Accordingly, it's extremely important that a migration avoid any long-running
    queries while exclusive locks are held.

    Building an index is generally a long-running operation. A standard index
    creation (that is, avoiding use of `CONCURRENTLY`) can be safe to run on
    tables which are small in size and/or read-heavy. (`CREATE INDEX` only
    prevents writes to a table; reads are allowed during index creation).

    This check is a stricter version of `CREATE_INDEX` -- if a team wishes
    to build indices nonconcurrently, it's imperative to be mindful of locks.
    r   BEGINFzALTER TABLE)ignore_concurrently)
startswith	enumeratehas_create_index)sql_statementskwargsisqls       Y/root/env/lib/python3.12/site-packages/django_migration_linter/sql_analyser/postgresql.pyhas_create_index_in_transactionr      sV    " ~a0;;GDN+ O3 >>-(#NNNO     c                    d }t        |       D ]9  \  }}t        j                  d|      }|rt        j                  d|      rd }|s9 n |sy| d  }|j                  d      t	        fd|D              }| S )Nz"CREATE (UNIQUE )?INDEX.*ON (.*) \(INDEX CONCURRENTLYF   c              3  F   K   | ]  }|j                  d          yw)zCREATE TABLE Nr   ).0r   concerned_tables     r   	<genexpr>z#has_create_index.<locals>.<genexpr>7   s*      ( 	&789(s   !)r   researchgroupany)	r   r   r   regex_resultr   r   preceding_sql_statementstable_is_added_in_transactionr   s	           @r   r   r   (   s     LN+ 3yy!FL299-A3#GL -bq1"((+O$' (+( %! -,,r   c            
          e Zd ZU  ededej                  ej                         ede	dej                  ej                         edd dej                  ej                         ed	d
 dej                  ej                        gZded<   y)PostgresqlAnalyserCREATE_INDEXzCREATE INDEX locks table)codefnmessagemodetypeCREATE_INDEX_EXCLUSIVEz8CREATE INDEX prolongs transaction, delaying lock release
DROP_INDEXc                `    t        j                  d|       xr t        j                  d|        S )Nz
DROP INDEXr   )r   r   r   kws     r   <lambda>zPostgresqlAnalyser.<lambda>P   s+    <!= "9II2C88 r   zDROP INDEX locks tableREINDEXc                $    | j                  d      S )Nr3   r   r0   s     r   r2   zPostgresqlAnalyser.<lambda>X   s    	!: r   zREINDEX locks tablezlist[Check]migration_checksN)__name__
__module____qualname__r   r   r   TRANSACTIONr   WARNINGr   	ONE_LINERr5   __annotations__ r   r   r&   r&   >   s    .&&""	
 	).N&&""	
 	9,$$""	
 	:)$$""	
/%k r   r&   )r   	list[str]returnbool)T)r   r>   r   r@   r?   r@   )
__future__r   r   baser   r   r   r   r   r   r&   r=   r   r   <module>rC      sF    " 	 ; ;B <@--48-	-, r   