
    af7                        d dl Z d dlZd dlmZ d dlmZ d dlmZmZmZm	Z	m
Z
mZ d dlmZmZmZ d dlmZmZmZ d dlmZ d dlmZmZ d d	lmZ  e j        d
          Zd Zd Zd Z G d d          Z dS )    N)datetime)settings)ColumnsExpressionsForeignKeyName	IndexName	StatementTable)names_digestsplit_identifiertruncate_name)NOT_PROVIDED
DeferrableIndex)Query)TransactionManagementErroratomic)timezonezdjango.db.backends.schemac                 h    | j         }|j        rdS |j        r|j        dgk    rdS |j        |j        v S )zz
    When altering the given field, must constraints on its model from the given
    relation be temporarily dropped?
    FNT)fieldmany_to_manyprimary_key	to_fieldsname)relationaltered_fieldr   s      P/var/www/html/env/lib/python3.11/site-packages/django/db/backends/base/schema.py_is_relevant_relationr      sI    
 NE u  U_%>%>t00    c                     t          | j                            dddd          t          j        d                    S )NFT)forwardreverseinclude_hiddeninclude_parentsr   )key)sorted_meta_get_fieldsoperator
attrgettermodels    r   _all_related_fieldsr-   '   sO    !	 	  	
 	
 ''   r   c              #      K   t           fdt           j                  D             fdt          j                  D                       }|D ]+\  }}||fV  t          |j        |j                  E d {V  ,d S )Nc              3   <   K   | ]}t          |          |V  d S Nr   ).0obj	old_fields     r   	<genexpr>z+_related_non_m2m_objects.<locals>.<genexpr>8   G       	
 	
$S)44	
	
 	
 	
 	
 	
 	
r   c              3   <   K   | ]}t          |          |V  d S r0   r1   )r2   r3   	new_fields     r   r5   z+_related_non_m2m_objects.<locals>.<genexpr>=   r6   r   )zipr-   r,   _related_non_m2m_objectsremote_field)r4   r8   related_fieldsold_relnew_rels   ``   r   r:   r:   4   s       	
 	
 	
 	
*9?;;	
 	
 	

	
 	
 	
 	
*9?;;	
 	
 	
 N + 
 
w+  
 
 	
 	
 	
 	
 	
 	
 	
 	

 
r   c                      e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZeZdZdZdZdZdZdZdZdZeZdZeZdZdZdZeZdZdZ dZ!dZ"dZ#eZ$dZ%dZ&dZ'drd"Z(d# Z)d$ Z*dsd&Z+d' Z,d( Z-d) Z.dtd*Z/d+ Z0d, Z1d- Z2d. Z3d/ Z4d0 Z5e6d1             Z7d2 Z8d3 Z9d4 Z:d5 Z;d6 Z<d7 Z=d8 Z>d9 Z?d: Z@d; ZAd< ZBd= ZCd> ZDd? ZEd@ ZFdA ZGdB ZHdtdCZIdD ZJ	 dtdEZKdF ZLdtdGZM	 dtdHZNdI ZOdJ ZPdK ZQdL ZRdudNZSdvdOZTdP ZUdQ ZVdddMdMdd%dd%ddddRdSZWdvdTZXdU ZYdV ZZdW Z[dX Z\dvdYZ]dZ Z^d[ Z_d\ Z`d] Zad^ Zbd_ Zcd` Zdda Zedb Zf	 	 	 	 	 dwdcZg	 	 	 	 	 	 dxddZh	 	 	 	 	 	 	 dydeZidzdfZj	 	 	 	 	 	 dxdgZkdh Zldi Zmdj Zndk Zo	 	 	 	 	 	 	 	 d{dlZpdtdmZqdn Zrdo Zsd|dpZtdsdqZudS )}BaseDatabaseSchemaEditorz
    This class and its subclasses are responsible for emitting schema-changing
    statements to the databases - model creation/removal/alteration, field
    renaming, index fiddling, and so on.
    z'CREATE TABLE %(table)s (%(definition)s)z1ALTER TABLE %(old_table)s RENAME TO %(new_table)sz7ALTER TABLE %(table)s SET TABLESPACE %(new_tablespace)szDROP TABLE %(table)s CASCADEz:ALTER TABLE %(table)s ADD COLUMN %(column)s %(definition)sz!ALTER TABLE %(table)s %(changes)sz2ALTER COLUMN %(column)s TYPE %(type)s%(collation)sz%ALTER COLUMN %(column)s DROP NOT NULLz$ALTER COLUMN %(column)s SET NOT NULLz/ALTER COLUMN %(column)s SET DEFAULT %(default)sz$ALTER COLUMN %(column)s DROP DEFAULTz4ALTER TABLE %(table)s DROP COLUMN %(column)s CASCADEzDALTER TABLE %(table)s RENAME COLUMN %(old_column)s TO %(new_column)szFUPDATE %(table)s SET %(column)s = %(default)s WHERE %(column)s IS NULLz"UNIQUE (%(columns)s)%(deferrable)szCHECK (%(check)s)z.ALTER TABLE %(table)s DROP CONSTRAINT %(name)sz"CONSTRAINT %(name)s %(constraint)sz?ALTER TABLE %(table)s ADD CONSTRAINT %(name)s CHECK (%(check)s)zbALTER TABLE %(table)s ADD CONSTRAINT %(name)s UNIQUE%(nulls_distinct)s (%(columns)s)%(deferrable)sz|ALTER TABLE %(table)s ADD CONSTRAINT %(name)s FOREIGN KEY (%(column)s) REFERENCES %(to_table)s (%(to_column)s)%(deferrable)sNzQCREATE INDEX %(name)s ON %(table)s (%(columns)s)%(include)s%(extra)s%(condition)szaCREATE UNIQUE INDEX %(name)s ON %(table)s (%(columns)s)%(include)s%(condition)s%(nulls_distinct)sz/ALTER INDEX %(old_name)s RENAME TO %(new_name)szDROP INDEX %(name)szGALTER TABLE %(table)s ADD CONSTRAINT %(name)s PRIMARY KEY (%(columns)s)zDROP PROCEDURE %(procedure)sz)COMMENT ON TABLE %(table)s IS %(comment)sz5COMMENT ON COLUMN %(table)s.%(column)s IS %(comment)sFTc                 n    || _         || _        | j        rg | _        | j         j        j        o|| _        d S r0   )
connectioncollect_sqlcollected_sqlfeaturescan_rollback_ddlatomic_migration)selfrB   rC   r   s       r   __init__z!BaseDatabaseSchemaEditor.__init__   s?    $& 	$!#D $ 8 I Tfr   c                     g | _         | j        r7t          | j        j                  | _        | j                                         | S r0   )deferred_sqlrG   r   rB   alias	__enter__)rH   s    r   rM   z"BaseDatabaseSchemaEditor.__enter__   sB      	$ !677DKK!!###r   c                     || j         D ]}|                     |           | j        r| j                            |||           d S d S r0   )rK   executerG   r   __exit__)rH   exc_type	exc_value	tracebacksqls        r   rP   z!BaseDatabaseSchemaEditor.__exit__   sg    ( " "S!!!!  	AK  9i@@@@@	A 	Ar    c           	         | j         s,| j        j        r | j        j        j        st          d          t          |          }t                              d||||d           | j         r|	                                
                    d          rdnd}|B| j                            |t          t          | j        |                    z  |z              dS | j                            ||z              dS | j                                        5 }|                    ||           ddd           dS # 1 swxY w Y   dS )z:Execute the given SQL statement, with optional parameters.ziExecuting DDL statements while in a transaction on databases that can't perform a rollback is prohibited.z%s; (params %r))paramsrT   )extra; N)rC   rB   in_atomic_blockrE   rF   r   strloggerdebugrstripendswithrD   appendtuplemapquote_valuecursorrO   )rH   rT   rW   endingre   s        r   rO   z BaseDatabaseSchemaEditor.execute   s   
  	/	 O,=	
 -?  
 #hhsFVC2P2P 	 	
 	
 	
  
	,::<<0055>RR3F!"))5T%5v!>!>???6I     "))#,77777'')) ,VsF+++, , , , , , , , , , , , , , , , , ,s   D66D:=D:c                 @    | j         j                            |          S r0   )rB   ops
quote_name)rH   r   s     r   ri   z#BaseDatabaseSchemaEditor.quote_name   s    "--d333r   c                     j         j        D ]>}fd|D             } j                                                 |                     ?g }g }j         j        D ]}                     |          \  }}||                     j                  }	|	d         r|d j	        |	z  z   z  }|
                     j                  }
|
r|d|
z  z  }|                    |           |j        r|j        r|j        j        j         j        }|j        j        j                             |j        j                  j        } j        r:|d j                             |                               |          dz  z   z  }n@ j        j        j        r/ j                                                 |d                     |                                         |j                  d|           |                                d	v rK j        j                            j         j        |j                  }|r j                            |            fd
j         j        D             } j                             j         j                  d                    d g ||R D                       dz  }j         j        r3 j        j                            j         j                  }|r|d|z   z  }||fS )z-Take a model and return its table definition.c                 D    g | ]}j                             |          S rU   r'   	get_fieldr2   r   r,   s     r   
<listcomp>z6BaseDatabaseSchemaEditor.table_sql.<locals>.<listcomp>   )    LLLuek++E22LLLr   NrB   check z %s)to_table	to_column_fk_%(to_table)s_%(to_column)s)	AutoFieldBigAutoFieldSmallAutoFieldc                 <    g | ]}|                               S rU   )constraint_sql)r2   
constraintr,   rH   s     r   ro   z6BaseDatabaseSchemaEditor.table_sql.<locals>.<listcomp>  s9     
 
 
 %%eT22
 
 
r   , c              3   8   K   | ]}|t          |          V  d S r0   )r\   r2   r|   s     r   r5   z5BaseDatabaseSchemaEditor.table_sql.<locals>.<genexpr>  sB       $ $$J$ $ $ $ $ $r   )table
definition) r'   unique_togetherrK   ra   _create_unique_sqllocal_fields
column_sqldb_parametersrB   sql_check_constraintdb_type_suffixextendr;   db_constraintr,   db_tablerm   
field_namecolumnsql_create_inline_fkri   rE   supports_foreign_keys_create_fk_sqlget_internal_typerh   autoinc_sqlconstraintssql_create_tablejoindb_tablespacetablespace_sql)rH   r,   field_namesfieldscolumn_sqlsrW   r   r   extra_params	db_paramscol_type_suffixrt   ru   r   r   rT   r   s   ``               r   	table_sqlz"BaseDatabaseSchemaEditor.table_sql   s    !;6 	M 	MKLLLLLLLF$$T%<%<UF%K%KLLLL[- 2	: 2	:E'+ue'D'D$J!++t+GGI! JcD$=	$III
#22do2NNO 6eo55
MM,'''! e&9  -39B!.4:DD&1   , 
#(A$(OOH$=$=%)__Y%?%?E E ) # JJ _-C %,,++!5*J     OOEL1111J   &&(( -  
 #o1==K(%,   :%,,[999
 
 
 
 
#k5
 
 
 #__U[%9::)) $ $">K">+">">$ $ $  '
 '
 
 ;$ 	,!_0??) N  ,s^++F{r   c              #   J  K   |V  |                     d          x}r|                     |          V  | j        j        j        r#|j        r|                     |j                  V  |j        }|j        t          ur6| 
                    |          \  }	}
d|	 V  |                    |
           d}|o-|                     |           o|o|                     |           }|rt|                     |          }|]d|                     |          z   }| j        j        j        r||                     |          z  V  n|V  |                    |           |j        r|j        s| j        j        j        rd}|j        r|                     |          V  n|sdV  n| j        j        j        sdV  |j        rdV  n|j        rdV  |j        p|j        j        }|r=| j        j        j        r.|j        r)| j        j                            |d	          V  d S d S d S d S )
N	collationzDEFAULT FTzNOT NULLNULLzPRIMARY KEYUNIQUE)inline)get_collate_sqlrB   rE   supports_comments_inline
db_comment_comment_sqlnull
db_defaultr   db_default_sqlr   skip_defaultskip_default_on_altereffective_default_column_default_sqlrequires_literal_defaultsprepare_defaultra   empty_strings_allowedr   !interprets_empty_strings_as_nulls	generated_column_generated_sqlimplied_column_nulluniquer   r'   supports_tablespacesrh   r   )rH   column_db_typerW   r,   r   field_db_paramsinclude_defaultr   r   default_sqldefault_paramsdefault_valuecolumn_default
tablespaces                 r   _iter_column_sqlz)BaseDatabaseSchemaEditor._iter_column_sql!  s      '++K8889 	/##I.....?#< 	6AQ 	6##E$455555z<//*.*=*=e*D*D'K*[*****MM.)))#O  =%%e,,,= ;$44U;;< 	  	1 22599M(!+d.F.Fu.M.M!M?+E 1 )4+?+?+N+NNNNNN((((MM-000 '	%	 (J	
 D? 	,,U333333 	)= 	LLL 	\ 	NNN(EEK,E
	N(=	N 	N
 /%44Z4MMMMMMM	N 	N 	N 	N 	N 	Nr   c           
          |                     | j                  }|d         }|dS g }d                    |                     ||||||                    |fS )z
        Return the column definition for a field. The field must already have
        had set_attributes_from_name() called.
        rq   typeNNNrs   )r   rB   r   r   )rH   r,   r   r   r   r   rW   s          r   r   z#BaseDatabaseSchemaEditor.column_sqlb  s{      ---II(0!:HH%%"## 
 
 
 	
r   c                     dS )z
        Some backends don't accept default values for certain columns types
        (i.e. MySQL longtext and longblob).
        FrU   rH   r   s     r   r   z%BaseDatabaseSchemaEditor.skip_default}  	    
 ur   c                     dS )z
        Some backends don't accept default values for certain columns types
        (i.e. MySQL longtext and longblob) in the ALTER COLUMN statement.
        FrU   r   s     r   r   z.BaseDatabaseSchemaEditor.skip_default_on_alter  r   r   c                      t          d          )zU
        Only used for backends which have requires_literal_defaults feature
        zsubclasses of BaseDatabaseSchemaEditor for backends which have requires_literal_defaults must provide a prepare_default() methodNotImplementedErrorrH   values     r   r   z(BaseDatabaseSchemaEditor.prepare_default  s     "P
 
 	
r   c                     dS )z
        Return the SQL to use in a DEFAULT clause. The resulting string should
        contain a '%s' placeholder for a default value.
        %srU   r   s     r   r   z,BaseDatabaseSchemaEditor._column_default_sql  s	    
 tr   c                 L    ddl m} t          |j        |          rdnd}t	          |j                  }|                     j                  }|                    |j                  \  }} j        j	        j
        r |t           fd|D                       z  }g }||z  |fS )z;Return the sql and params for the field's database default.r   )Valuer   z(%s)r+   rq   c              3   B   K   | ]}                     |          V  d S r0   )r   r2   prH   s     r   r5   z:BaseDatabaseSchemaEditor.db_default_sql.<locals>.<genexpr>  s1       I IQ!5!5a!8!8 I I I I I Ir   )django.db.models.expressionsr   
isinstancer   r   r,   get_compilerrB   compilerE   r   rb   )rH   r   r   rT   querycompilerr   rW   s   `       r   r   z'BaseDatabaseSchemaEditor.db_default_sql  s    666666 !1599EddvEK(((%%%AA&..u/?@@V?#= 	 5 I I I I& I I IIIIKF[ &((r   c                      |                      j                  \  }}|j        rdnd}|r|t           fd|D                       z  }d| d| S )z3Return the SQL to use in a GENERATED ALWAYS clause.STOREDVIRTUALc              3   B   K   | ]}                     |          V  d S r0   rd   r   s     r   r5   zABaseDatabaseSchemaEditor._column_generated_sql.<locals>.<genexpr>  s1      3X3XAD4D4DQ4G4G3X3X3X3X3X3Xr   zGENERATED ALWAYS AS (z) )generated_sqlrB   
db_persistrb   )rH   r   expression_sqlrW   persistency_sqls   `    r   r   z.BaseDatabaseSchemaEditor._column_generated_sql  su    !&!4!4T_!E!E&+&6E((I 	Y+e3X3X3X3XQW3X3X3X.X.XXNJ~JJJJJr   c                    |                                  r|                                 }n| j        rd }n| j        s,| j        r%| j        r|                                 dk    rd}nd}nt          | dd          st          | dd          rw|                                 }|dk    rt          j	                    }nKt          j	                    }|dk    r|                                }n|d	k    r|                                }nd }|S )
NBinaryFieldr   rZ   auto_nowFauto_now_addDateTimeField	DateField	TimeField)has_defaultget_defaultr   r   blankr   r   getattrr   nowr   datetime)r   defaultinternal_types      r   _effective_defaultz+BaseDatabaseSchemaEditor._effective_default  s     	''))GG_ 	GG 	 	0K 	&&((M99UJ.. 	'%QV2W2W 	!3355M//",..",.. K//%llnnGG"k11%llnnGGr   c                 ^    |                     |                     |          | j                  S )z2Return a field's effective database default value.)get_db_prep_saver   rB   r   s     r   r   z*BaseDatabaseSchemaEditor.effective_default  s(    %%d&=&=e&D&DdoVVVr   c                     t                      )aX  
        Return a quoted version of the value so it's safe to use in an SQL
        string. This is not safe against injection from user code; it is
        intended only for use in making SQL scripts or preparing default values
        for particularly tricky backends (defaults are not user-defined, though,
        so this is safe).
        r   r   s     r   rd   z$BaseDatabaseSchemaEditor.quote_value  s     "###r   c           	         |                      |          \  }}|                     ||pd           | j        j        j        r|j        j        r!|                     |d|j        j                   | j        j        j        s^|j        j	        D ]Q}|j
        rH|                    | j                  }|d         } | j        |                     ||||j
                    R| j                            |                     |                     |j        j        D ]7}|j        j        j        j        r|                     |j        j                   8dS )zr
        Create a table and any accompanying indexes or unique constraints for
        the given `model`.
        Nrq   r   )r   rO   rB   rE   supports_commentsr'   db_table_commentalter_db_table_commentr   r   r   r   _alter_column_comment_sqlrK   r   _model_indexes_sqllocal_many_to_manyr;   throughauto_createdcreate_model)rH   r,   rT   rW   r   r   
field_types          r   r  z%BaseDatabaseSchemaEditor.create_model  so   
 nnU++V 	S&.D)))?#5 	{+ W++E49UVVV?+D "[5 
 
E' 	*/*=*='+ +> + + &5V%<
$!;; %uj%:J   	  !8!8!?!?@@@ [3 	> 	>E!)/< >!!%"4"<===	> 	>r   c                    |j         j        D ]7}|j        j        j         j        r|                     |j        j                   8|                     | j        d|                     |j         j	                  iz             t          | j                  D ]P}t          |t                    r9|                    |j         j	                  r| j                            |           QdS )z!Delete a model from the database.r   N)r'   r   r;   r   r   delete_modelrO   sql_delete_tableri   r   listrK   r   r	   references_tableremove)rH   r,   r   rT   s       r   r  z%BaseDatabaseSchemaEditor.delete_model  s     [3 	> 	>E!)/< >!!%"4"<=== 	!)=>>	
 	
 	
 )** 	. 	.C#y)) .c.B.B$/ / . !((---		. 	.r   c                     |j         r| j        j        j        sdS |                     |                    ||           d           dS )zAdd an index on a model.NrW   )contains_expressionsrB   rE   supports_expression_indexesrO   
create_sqlrH   r,   indexs      r   	add_indexz"BaseDatabaseSchemaEditor.add_index  sT     &	O,H	 4 	U%%eT224@@@@@r   c                     |j         r| j        j        j        sdS |                     |                    ||                      dS )zRemove an index from a model.N)r  rB   rE   r  rO   
remove_sqlr  s      r   remove_indexz%BaseDatabaseSchemaEditor.remove_index!  sN     &	O,H	 4U%%eT2233333r   c                     | j         j        j        r8|                     |                     ||j        |j                  d            d S |                     ||           |                     ||           d S )Nr
  )rB   rE   can_rename_indexrO   _rename_index_sqlr   r  r  )rH   r,   	old_index	new_indexs       r   rename_indexz%BaseDatabaseSchemaEditor.rename_index*  s    ?#4 	-LL&&uininMM      
 eY///NN5),,,,,r   c                 h    |                     ||           }|r|                     |d           dS dS )zAdd a constraint to a model.Nr
  )r  rO   rH   r,   r|   rT   s       r   add_constraintz'BaseDatabaseSchemaEditor.add_constraint4  sG    ##E400 	+ LLTL*****	+ 	+r   c                 d    |                     ||           }|r|                     |           dS dS )z!Remove a constraint from a model.N)r  rO   r  s       r   remove_constraintz*BaseDatabaseSchemaEditor.remove_constraint<  sA    ##E400 	LL	 	r   c                 F   d |D             }d |D             }|                     |          D ]"}|                     |ddd| j                   #|                     |          D ]9}fd|D             }|                     |                     |                     :dS )z
        Deal with a model changing its unique_together. The input
        unique_togethers must be doubly-nested, not the single-nested
        ["foo", "bar"] format.
        c                 ,    h | ]}t          |          S rU   rb   r2   r   s     r   	<setcomp>zABaseDatabaseSchemaEditor.alter_unique_together.<locals>.<setcomp>H      @@@&f@@@r   c                 ,    h | ]}t          |          S rU   r!  r"  s     r   r#  zABaseDatabaseSchemaEditor.alter_unique_together.<locals>.<setcomp>I  r$  r   TF)r   r   c                 D    g | ]}j                             |          S rU   rl   rn   s     r   ro   zBBaseDatabaseSchemaEditor.alter_unique_together.<locals>.<listcomp>T  rp   r   N)
difference_delete_composed_indexsql_delete_uniquerO   r   )rH   r,   old_unique_togethernew_unique_togetheroldsnewsr   r   s    `      r   alter_unique_togetherz.BaseDatabaseSchemaEditor.alter_unique_togetherB  s     A@,?@@@@@,?@@@ood++ 	 	F''66&	     ??400 	A 	AKLLLLLLLFLL00??@@@@	A 	Ar   c                 J   d |D             }d |D             }|                     |          D ]"}|                     |ddd| j                   #|                     |          D ];}fd|D             }|                     |                     |d                     <d	S )
z
        Deal with a model changing its index_together. The input
        index_togethers must be doubly-nested, not the single-nested
        ["foo", "bar"] format.
        c                 ,    h | ]}t          |          S rU   r!  r"  s     r   r#  z@BaseDatabaseSchemaEditor.alter_index_together.<locals>.<setcomp>]      ???&f???r   c                 ,    h | ]}t          |          S rU   r!  r"  s     r   r#  z@BaseDatabaseSchemaEditor.alter_index_together.<locals>.<setcomp>^  r1  r   TF)r  r   c                 D    g | ]}j                             |          S rU   rl   rn   s     r   ro   zABaseDatabaseSchemaEditor.alter_index_together.<locals>.<listcomp>i  rp   r   _idxr   suffixN)r'  r(  sql_delete_indexrO   _create_index_sql)rH   r,   old_index_togethernew_index_togetherr,  r-  r   r   s    `      r   alter_index_togetherz-BaseDatabaseSchemaEditor.alter_index_togetherW  s     @?,>?????,>???ood++ 	 	F''%00%	     ??400 	V 	VKLLLLLLLFLL//fV/TTUUUU	V 	Vr   c           
      p   d j         j        D             }d j         j        D             }fd|D             } | j        |fd||z  i|}|                    d          du rI|rG| j        j        j        r6t          | 	                    j         j
        |d                    }	|	|v r|	g}t          |          d	k    rCt          d
t          |          dj         j
        dd                    |          d          |                     |                     ||d                              d S )Nc                     h | ]	}|j         
S rU   r   r   s     r   r#  zBBaseDatabaseSchemaEditor._delete_composed_index.<locals>.<setcomp>m  s'     !
 !
 !
 *JO!
 !
 !
r   c                     h | ]	}|j         
S rU   r>  r   s     r   r#  zBBaseDatabaseSchemaEditor._delete_composed_index.<locals>.<setcomp>p  s    RRR
JORRRr   c                 N    g | ]!}j                             |          j        "S rU   )r'   rm   r   rn   s     r   ro   zCBaseDatabaseSchemaEditor._delete_composed_index.<locals>.<listcomp>q  s,    KKK55;((//6KKKr   excluder   TFquote   Found wrong number (z) of constraints for (r}   )r   )r'   r   indexes_constraint_namesr   rB   rE   *allows_multiple_constraints_on_same_fieldsr\   _unique_constraint_namer   len
ValueErrorr   rO   _delete_constraint_sql)
rH   r,   r   constraint_kwargsrT   meta_constraint_namesmeta_index_namescolumnsconstraint_namesdefault_names
    `        r   r(  z/BaseDatabaseSchemaEditor._delete_composed_indexl  s   !
 !
.3k.E!
 !
 !
 SRek>QRRRKKKKFKKK141
 
 *,<<
  	
 
 !!(++t33  4(S 4
 ,,U[-A7RW,XX L ///$0>   A%%* ())))K(((IIg&&&&	   	T00e=Ma=PQQRRRRRr   c                    ||k    s;| j         j        j        r,|                                |                                k    rdS |                     | j        |                     |          |                     |          dz             | j        D ]-}t          |t                    r|
                    ||           .dS )z#Rename the table a model points to.N)	old_table	new_table)rB   rE   ignores_table_name_caselowerrO   sql_rename_tableri   rK   r   r	   rename_table_references)rH   r,   old_db_tablenew_db_tablerT   s        r   alter_db_tablez'BaseDatabaseSchemaEditor.alter_db_table  s    <''O$< (""$$(:(:(<(<<<F!!__\::!__\:: 	
 	
 	
 $ 	H 	HC#y)) H++L,GGG	H 	Hr   c                     | j         re| j        j        j        rV|                     | j         |                     |j        j                  |                     |pd          dz             d S d S d S )NrZ   )r   comment)	sql_alter_table_commentrB   rE   r   rO   ri   r'   r   rd   )rH   r,   old_db_table_commentnew_db_table_comments       r   r   z/BaseDatabaseSchemaEditor.alter_db_table_comment  s    ' 	DO,D,V 	LL,!__U[-ABB#//0D0JKK     	 	 	 	r   c                     |                      | j        |                     |j        j                  |                     |          |                     |          dz             dS )z)Move a model's table between tablespaces.)r   old_tablespacenew_tablespaceN)rO   sql_retablespace_tableri   r'   r   )rH   r,   old_db_tablespacenew_db_tablespaces       r   alter_db_tablespacez,BaseDatabaseSchemaEditor.alter_db_tablespace  sk    ')=>>"&//2C"D"D"&//2C"D"D 	
 	
 	
 	
 	
r   c           
      h   |j         r5|j        j        j        j        r|                     |j        j                  S |                     ||d          \  }}|dS |                    | j                  x}r|d| z  }|	                    | j                  }|d         r|d| j
        |z  z   z  }|j        rY| j        j        j        rG|j        r?d}| j        r|j        j        j        j        }|j        j        j                            |j        j                  j        }	t)          |j        j                  \  }
}|d| j        |                     |||          |
rd|                     |
          z  nd	|                     |j                  |                     |          |                     |	          | j        j                                        d
z  z   z  }n/| j                            |                     |||                     | j        |                     |j        j                  |                     |j                  |dz  }|                     ||           |j        t>          u r|                      |          sq| !                    |          \| "                    |d|d          \  }}| j#        |                     |j        j                  |dz  }|                     ||           |j$        rO| j        j        j%        r>| j        j        j&        s-|d         } | j        | '                    ||||j$                    | j        (                    | )                    ||                     | j        j        j*        r| j        +                                 dS dS )z
        Create a field on a model. Usually involves adding a column, but may
        involve adding a table instead (for M2M fields).
        T)r   Nrq   rs   rr   rv   z%s.rZ   )r   	namespacer   rt   ru   
deferrable)r   r   r   dropr   changesr   ),r   r;   r   r'   r   r  r   r   rB   r   r   rE   r   r   sql_create_column_inline_fkr,   r   rm   r   r   r   _fk_constraint_nameri   rh   deferrable_sqlrK   ra   r   sql_create_columnrO   r   r   r   r   _alter_column_default_sqlsql_alter_columnr   r   r   r   r   _field_indexes_sqlconnection_persists_old_columnsclose)rH   r,   r   r   rW   r   r   constraint_suffixrt   ru   rl  _rT   changes_sqlr  s                  r   	add_fieldz"BaseDatabaseSchemaEditor.add_field  s     	A%"4"<"B"O 	A$$U%7%?@@@!__UE4_PP
FF#22do2NNN? 	0/o///J''4?'CC	W 	F# 9I EEEJ	(>	 #	
 !A/  -39B!.4:DD&1    00DEE	1cD$D 44UECTUU ")C)C!C!C"ooel;; $ 9 9!%!;!;"&/"5"D"D"F"F	H 	H 	% 	 	

 !((''u6GHH   $__U[%9::ooel33$(
 (
 

 	S&!!! ,,..u55 -&&u--9"&"@"@tU #A # #K ')=>>&+ + C LLf%%% 
	(:
	 O,E
	
 #6*JDL//5*e.>   	  !8!8!F!FGGG?#C 	$O!!#####	$ 	$r   c                 B   |j         r5|j        j        j        j        r|                     |j        j                  S |                    | j                  d         dS |j        rL|                     ||j	        gd          }|D ]+}| 
                    |                     ||                     ,| j        |                     |j        j                  |                     |j	                  dz  }| 
                    |           | j        j        j        r| j                                         t%          | j                  D ]V}t)          |t*                    r?|                    |j        j        |j	                  r| j                            |           WdS )z
        Remove a field from a model. Usually involves deleting a column,
        but for M2Ms may involve deleting a table.
        rq   r   NTforeign_key)r   r   )r   r;   r   r'   r   r  r   rB   rI  r   rO   _delete_fk_sqlsql_delete_columnri   r   rE   ry  rz  r  rK   r   r	   references_columnr  )rH   r,   r   fk_namesfk_namerT   s         r   remove_fieldz%BaseDatabaseSchemaEditor.remove_field  s     	A%"4"<"B"O 	A$$U%7%?@@@$/::6BJF 	B--eel^QU-VVH# B BT00@@AAAA$__U[%9::ooel33(
 (
 
 	S?#C 	$O!!###)** 	. 	.C#y)) .c.C.C$el/ / . !((---		. 	.r   c           
         |                      ||          sdS |                    | j                  }|d         }|                    | j                  }|d         }||j        	||j        t	          d|d|d          |^|\|j        j        rP|j        j        rD|j        j        j        j        r.|j        j        j        j        r|                     ||||          S |H|F|j        j        r:|j        j        r.|j        j        j        j        s|j        j        j        j        sdS ||t	          d|d|d          |j	        |j	        k    sM|j	        rY|j
        |j
        k    s6|                    | j                  |                    | j                  k    rt	          d| d	          |                     ||||||||           dS )
a'  
        Allow a field's type, uniqueness, nullability, default, column,
        constraints, etc. to be modified.
        `old_field` is required to compute the necessary changes.
        If `strict` is True, raise errors if the old column does not match
        `old_field` precisely.
        Nrq   r   zCannot alter field z into zT - they do not properly define db_type (are you using a badly-written custom field?)zr - they are not compatible types (you cannot alter to or from M2M fields, or add or remove through= on M2M fields)z7Modifying GeneratedFields is not supported - the field z6 must be removed and re-added with the new definition.)_field_should_be_alteredr   rB   r;   rM  r   r'   r   _alter_many_to_manyr   r   r   _alter_field)	rH   r,   r4   r8   strictold_db_paramsold_typenew_db_paramsnew_types	            r   alter_fieldz$BaseDatabaseSchemaEditor.alter_field,  sy    ,,Y	BB 	F!//4?/KK (!//4?/KK (!7!?!7!?* 99iii)    &. ! *2 ! *28E	 !
 *28E ! ++E9iPPP &. ! *2 ! ".6<I	 !
 ".6<I ! F!1* .7YY			C  
  I$777 8 $	(<<<**4?;;**4?;;< < H) H H H  
 			
 		
 		
 		
 		
r   c                     | j         j        }|                    | j                   }d|d<   	 ||                                         |z  S # t          $ r Y d S w xY w)N__column_name__r   )rB   data_type_check_constraintsdb_type_parametersr   KeyError)rH   r   r   check_constraintsdatas        r   _field_db_checkz(BaseDatabaseSchemaEditor._field_db_checkx  sp     !OG''88*X	$U%<%<%>%>?$FF 	 	 	44	s   A
 

AAc	           	         t                      }	| j        j        j        r|j        r|j        r|                     ||dh          r|                     ||j        gd          }
|rGt          |
          dk    r4t          dt          |
          d|j        j        d|j                  |
D ]F}|	                    |j        f           |                     |                     ||                     G|j        r|j        r|                     ||          rd	 |j        j        D             }|                     ||j        gdd
|          }|rGt          |          dk    r4t          dt          |          d|j        j        d|j                  |D ]+}|                     |                     ||                     ,|                    d          }|                    d          }| j        j        j        o'|j        r|j        p|j        o|j        o||k    p||k    }|rqt-          ||          D ]`\  }}|                     |j        |j        j        gd          }|D ]0}|                     |                     |j        |                     1a|j        r|j        s||j        r|j        rnd |j        j        D             }|                     ||j        gdt6          j        |          }|D ]+}|                     |                     ||                     ,|                     ||          }|                     ||          }||k    r|rd |j        j        D             }|                     ||j        gd|          }|rGt          |          dk    r4t          dt          |          d|j        j        d|j                  |D ]+}|                     |                     ||                     ,|j        |j        k    r|                     |                      |j        j        |||                     | j!        D ]B}tE          |tF                    r+|$                    |j        j        |j        |j                   Cg }g }g }|%                    | j                  }|%                    | j                  }||k    s-||k    s'||k    s!| j        j        j&        rW|j'        |j'        k    rG| (                    ||||||          \  } }!|)                    |            |*                    |!           |j+        tX          urI|j+        tX          u s|j+        |j+        k    r*|)                    | -                    |||                     n:|j+        tX          ur,|)                    | -                    |||d                     d
}"|j.        r|j.        s|j+        tX          u rs| /                    |          }#| /                    |          }$| 0                    |          s4|#|$k    r.|$,d}"|)                    | 1                    |||                     |j.        |j.        k    r.| 2                    |||          } | r|)                    |            |3                                p|j+        tX          uo|j.        o|j.         }%|s|rj|%s||z  }| j        j        j4        rA|r?tk          tm          |           \  }}&d7                    |          tq          |&g           fg}|D ]C\  }}&|                     | j9        | :                    |j        j                  |dz  |&           D|%r|j+        tX          u rd}'|$g}&n| ;                    |          \  }'}&|                     | j<        | :                    |j        j                  | :                    |j                  |'dz  |&           |D ]C\  }}&|                     | j9        | :                    |j        j                  |dz  |&           D|r|D ]\  }}&|                     ||&           |j        r|j        s| =                    ||           | >                    ||          r*|                     | ?                    ||g                     |j        r|j        r9|j        r2|j        s+|                     | @                    ||g                     g }(|r#|(*                    t-          ||                     |                     ||          rL|                     | A                    ||                     |(*                    t-          ||                     |(D ]\  })}|j        B                    | j                  }*|*d         }+|*                    d          },|)j        B                    | j                  }-|-                    d          }.| (                    |j        |)j        |j        |+|.|,          \  } }!|                     | j9        | :                    |j        j        j                  | d         dz  | d                    |!D ]\  }}&|                     ||&           | j        j        j        rH|j        rA|	s|j        r|j        s1|j        r*|                     | C                    ||d                     |rH|(D ]E\  }/}0|0j        j        r4|                     | C                    |0j        |0j        d                     F||k    rZ|rX| D                    |j        j        |j        gd           }|                     | E                    |||d!                              |"r\| 1                    |||d          \  }1}&| j9        | :                    |j        j                  |1dz  }|                     ||&           | j        j        jF        r| j        G                                 dS dS )"z3Perform a "physical" (non-ManyToMany) field update.r   )ignoreTr  rD  rE  z!) of foreign key constraints for .c                     h | ]	}|j         
S rU   r>  r   s     r   r#  z8BaseDatabaseSchemaEditor._alter_field.<locals>.<setcomp>  '     % % %$.
% % %r   F)r   r   rA  z) of unique constraints for r   c                     h | ]	}|j         
S rU   r>  )r2   r  s     r   r#  z8BaseDatabaseSchemaEditor._alter_field.<locals>.<setcomp>  s    LLLu
LLLr   )r  type_rA  c                     h | ]	}|j         
S rU   r>  r   s     r   r#  z8BaseDatabaseSchemaEditor._alter_field.<locals>.<setcomp>  r  r   )rr   rA  z) of check constraints for rq   rn  Nr}   rp  r   )r   r   r   r   r   r   rv   _fk_checkr6  rr   )HsetrB   rE   r   r;   r   r  rI  r   rL  rM  r'   r   addrO   r  r   _field_became_primary_keyr   _delete_unique_sqlr   r   r:   related_modelr   db_indexrH  r   r6  _delete_index_sqlr  _delete_check_sql_rename_field_sqlrK   r   r	   rename_column_referencesr   r   r   _alter_column_type_sqlra   r   r   r   "_alter_column_database_default_sqlr   r   r   rv  _alter_column_null_sqlr   supports_combined_altersrb   r9   r   sumrw  ri   r   sql_update_with_default_delete_primary_key_unique_should_be_addedr   r8  _create_primary_key_sqlr   r   _create_index_name_create_check_sqlry  rz  )2rH   r,   r4   r8   r  r  r  r  r  fks_droppedr  r  rP  rS  constraint_nameold_collationnew_collationdrop_foreign_keys_old_relr>   rel_fk_namesrQ  index_names
index_nameold_db_checknew_db_checkrT   actionsnull_actionspost_actionsold_type_suffixnew_type_suffixfragmentother_actionsneeds_database_defaultold_defaultnew_defaultfour_way_default_alterationrW   r   rels_to_updater=   rel_db_paramsrel_typerel_collationold_rel_db_paramsold_rel_collationr|  relr}  s2                                                     r   r  z%BaseDatabaseSchemaEditor._alter_field  s    eeO$:	B&	B '	B --$~ .  		B --	()t .  H  #h--1,, j H,,,!((	   $ B B!1 3444T00@@AAAA 	N 	N$($B$B9i$X$X	N% %27+2I% % %!  $55!"!-  6      #.//144 j ,----,,,!((	   $4 N NT44UOLLMMMM &))+66%))+66O$: M&@9+@ ;$9)9M
 h&KM],J 	  	V &>i%S%S V V!'#55)GM,@+At  6      , V VGLL!4!4W5JG!T!TUUUUV 	H$	H '	H ,5+;	H  ML8KLLL 00!"l( 1  K * H H
 T33E:FFGGGG++I}EE++I}EE<''L'% %27+2I% % %!  $55!"-	  6      #.//144 j ,----,,,!((	   $4 M MT33E?KKLLLLy///LL&&K()Y    (  c9-- 00,i.>	@P   #22do2NN#22do2NN   /11--(: . (I,@@@ '+&A&Ay)X}m' '#Hm NN8$$$...|33$44'9+???;;E9iXX   !55NN779id 8     "'N	N	 $4400;;K00;;K..y99;..+)-&225)YOO   >Y^++225)YOOH .##H--- !!##Oy';<'O'6~4in"4 	$  -	l -	. ( <''@ >W >#CM22V IIcNNCOO<=&  V)!%1E!F!F#& 
     + '<77"&K)]FF*.*=*=i*H*H'K0!%1E!F!F"&//)2B"C"C#.     $0  KCLL-%)__U[5I%J%J'* 
      	*+ * *VS&))))  	4)> 	4$$UF333''	9== 	FLL00DDEEE #	L'0'7	L"	L $	L
 LL//yk/JJKKK  	R!!":9i"P"PQQQ)))Y?? 	RLL55eYGGHHH!!":9i"P"PQQQ . 	* 	*GW#M774?7SSM$V,H)--k::M ' ; ;t ; W W 1 5 5k B B&*&A&A%!' '#Hm LL%!__W-B-H-QRR'{ 
     - * *VS&))))* O$:
	&
	 	
	 $-#9	
	 BKAX	
	 '
	 LL##E96VWW    	(  39* LL++C,=sy%PP   <''L'"55$y'7&8 6  O LL&&uo}W?UVV  
 " 	&"&"@"@y)$ #A # #K ')=>>&+ + C LLf%%%?#C 	$O!!#####	$ 	$r   c                     | j         j        j        r	|j        rdS |                    | j                   }|j        r| j        n| j        }||                     |j	                  |d         dz  g fS )z
        Hook to specialize column null alteration.

        Return a (sql, params) fragment to set a column to null or non-null
        as required by new_field, or None if no changes are required.
        Nrq   r   )r   r   )
rB   rE   r   r   r   r   sql_alter_column_nullsql_alter_column_not_nullri   r   )rH   r,   r4   r8   r  rT   s         r   r  z/BaseDatabaseSchemaEditor._alter_column_null_sql  s     O$F	/	
 F%33t3OOM >4**3  "ooi.>??)&1 
  r   c                 ~   |                      |          }|                     |          }|g}|rg }n(| j        j        j        r|                     |          }g }|                    | j                  }|r|j        r| j        }	n| j	        }	n| j
        }	|	|                     |j                  |d         |dz  |fS )z
        Hook to specialize column default alteration.

        Return a (sql, params) fragment to add or drop (depending on the drop
        argument) a default to new_field's column.
        rq   r   r   r   r   )r   r   rB   rE   r   r   r   r    sql_alter_column_no_default_nullsql_alter_column_no_defaultsql_alter_column_defaultri   r   )
rH   r,   r4   r8   ro  r  r   rW   r  rT   s
             r   rv  z2BaseDatabaseSchemaEditor._alter_column_default_sql  s     ,,Y77**955 	FF_%? 	 **;77GF!//4?/KK 	0~ 7;6/C//)*:;;%f-"  
 	
r   c                     |r| j         }d}g }n| j        }|                     |          \  }}|                    | j                  }||                     |j                  |d         |dz  |fS )z
        Hook to specialize column database default alteration.

        Return a (sql, params) fragment to add or drop (depending on the drop
        argument) a default to new_field's column.
        rZ   rq   r   r  )r  r  r   r   rB   ri   r   )	rH   r,   r4   r8   ro  rT   r   rW   r  s	            r   r  z;BaseDatabaseSchemaEditor._alter_column_database_default_sql:  s      	A2CKFF/C"&"5"5i"@"@K!//4?/KK//)*:;;%f-&  
 	
r   c                    g }|                      |||j        j                  x}rd| }nd}d}	| j        j        j        rq|j        sj|j        |j        k    r9|                     ||||j                  \  }
}|
r|	                    |
|f           |j        r| 
                    |j                  }	| j        |                     |j                  |||	dz  g f|fS )a  
        Hook to specialize column type alteration for different backends,
        for cases when a creation type is different to an alteration type
        (e.g. SERIAL in PostgreSQL, PostGIS fields).

        Return a 2-tuple of: an SQL fragment of (sql, params) to insert into
        an ALTER TABLE statement and a list of extra (sql, params) tuples to
        run once the field is altered.
        rs   rZ   )r   r   r   r`  )r   r'   r   rB   rE   r   r   r   r   ra   r   sql_alter_column_typeri   r   )rH   r,   r4   r8   r  r  r  r  collate_sqlcomment_sqlrT   rW   s               r   r  z/BaseDatabaseSchemaEditor._alter_column_type_sqlV  s2    ++=%+*>
 
 
; 	 ,k++KKK?#5 
	Fi>T 
	F#y';;; #<<9h	0D V  8!((#v777# F"//	0DEE *"ooi.>??$!,*	  	 
 	
r   c                     | j         |                     |j        j                  |                     |j                  |                     |          dz  g fS )N)r   r   r`  )sql_alter_column_commentri   r'   r   r   r   )rH   r,   r8   r  new_db_comments        r   r   z2BaseDatabaseSchemaEditor._alter_column_comment_sql  s]    ))=>>//)*:;;,,^<<  
 	
r   c                 0    |                      |pd          S )NrZ   r   )rH   r`  s     r   r   z%BaseDatabaseSchemaEditor._comment_sql  s    2...r   c                    |j         j        j        j        |j         j        j        j        k    rI|                     |j         j        |j         j        j        j        |j         j        j        j                   |                     |j         j        |j         j        j                            |                                          |j         j        j                            |                                                     |                     |j         j        |j         j        j                            |                                          |j         j        j                            |                                                     dS )z*Alter M2Ms to repoint their to= endpoints.N)	r;   r   r'   r   r^  r  rm   m2m_reverse_field_namem2m_field_name)rH   r,   r4   r8   r  s        r   r  z,BaseDatabaseSchemaEditor._alter_many_to_many  sc    "*09%-3<= = &.&.4=&.4=   	"* "*0::0022  "*0::0022 	
 	
 	
 	"*"*0::9;S;S;U;UVV"*0::9;S;S;U;UVV		
 	
 	
 	
 	
r   rZ   c                 ,   t          |          \  }}t          |g|R ddi|}| j        j                                        pd}|dd                    |          d|}t          |          |k    r|S t          |          |dz  k    r|d|dz           }|t          |          z
  dz  dz
  }|d|         dd                    |          d|         d|}|d	         dk    s|d	                                         rd
|dd         z  }|S )z
        Generate a unique name for an index/unique constraint.

        The name is divided into 3 parts: the table name, the column names,
        and a unique digest and suffix.
        length      r|     N   rD  r   zD%s)r   r   rB   rh   max_name_lengthr   rL  isdigit)	rH   
table_namecolumn_namesr6  r|  hash_suffix_part
max_lengthr  other_lengths	            r   r  z+BaseDatabaseSchemaEditor._create_index_name  s_    )44:=l===1===F
 _(88::Ac
#-::sxx/E/E/E/EGWGWX
z??j((  :>11/0A*/0AB"S)9%:%::q@1D}}%%%HH\""=L=111

 a=C:a=#8#8#:#:CRC0Jr   c                    |_t          |          dk    r|d         j        r|d         j        }n1t          j        rt          j        }n|j        j        r|j        j        }|"d| j        j                            |          z   S dS )NrD  r   rs   rZ   )rL  r   r   DEFAULT_INDEX_TABLESPACEr'   rB   rh   r   )rH   r,   r   r   s       r   _get_index_tablespace_sqlz2BaseDatabaseSchemaEditor._get_index_tablespace_sql  s     6{{aF1I$; &q	 72 : ( A* : % 9$,;;MJJJJrr   c                     |rd|z   S dS )Nz WHERE rZ   rU   )rH   	conditions     r   _index_condition_sqlz-BaseDatabaseSchemaEditor._index_condition_sql  s     	)y((rr   c                     |r| j         j        j        sdS t          dt	          |j        j        || j                            S )NrZ   z INCLUDE (%(columns)s))rR  )rB   rE   supports_covering_indexesr	   r   r'   r   ri   )rH   r,   rR  s      r   _index_include_sqlz+BaseDatabaseSchemaEditor._index_include_sql  sN     	do6P 	2$EK0'4?KK
 
 
 	
r   )r   r   r6  usingr   col_suffixesrT   	opclassesr  includeexpressionsc                    |pg }|pg }t          |d                               j                  }                     |||          }d |D             }|p j        }|j        j        } fd}t          |t          | j	                  t          ||||          ||r                     ||||	          nt          ||| j                  |                     |
                               ||                    S )z
        Return the SQL statement to create the index for one or several fields
        or expressions. `sql` can be specified if the syntax differs from the
        standard (GIS indexes, ...).
        F
alias_colsrq   )r   c                     g | ]	}|j         
S rU   r   r2   r   s     r   ro   z>BaseDatabaseSchemaEditor._create_index_sql.<locals>.<listcomp>      444E5<444r   c                  L     j         | i |                              S r0   )r  ri   )argskwargsr   rH   s     r   create_index_namezEBaseDatabaseSchemaEditor._create_index_sql.<locals>.create_index_name  s1    |.t.?????4(((r   )r   r   r  rR  rX   r  r  )r   r   rB   r  sql_create_indexr'   r   r	   r
   ri   r   _index_columnsr   rd   r  r  )rH   r,   r   r   r6  r  r   r  rT   r  r  r  r  r   r   rR  r  r   r  s   `  `               r   r8  z*BaseDatabaseSchemaEditor._create_index_sql  sR   * 2!'R5111>> ? 
 
 776 8 
 
 54V4447$"7$	) 	) 	) 	) 	) 	) t//5'63DEE Q##E7L)LLL Xt?OPP //	::++E7;;
 
 
 	
r   c                     t          |p| j        t          |j        j        | j                  |                     |                    S N)r   r   )r	   r7  r
   r'   r   ri   )rH   r,   r   rT   s       r   r  z*BaseDatabaseSchemaEditor._delete_index_sql!  sG    (4(,do>>&&
 
 
 	
r   c                     t          | j        t          |j        j        | j                  |                     |          |                     |                    S )N)r   old_namenew_name)r	   sql_rename_indexr
   r'   r   ri   )rH   r,   r  r  s       r   r  z*BaseDatabaseSchemaEditor._rename_index_sql(  sQ    !,do>>__X..__X..	
 
 
 	
r   c                 2    t          ||| j        |          S )N)r  )r   ri   )rH   r   rR  r  r  s        r   r  z'BaseDatabaseSchemaEditor._index_columns0  s    ugt\RRRRr   c                    j         j        rj         j        sj         j        rg S g }j         j        D ]+}|                    |                     |                     ,j         j        D ];}fd|D             }|                    | 	                    |d                     <j         j
        D ]C}|j        r| j        j        j        r)|                    |                    |                      D|S )z
        Return a list of all index SQL statements (field indexes,
        index_together, Meta.indexes) for the specified model.
        c                 D    g | ]}j                             |          S rU   rl   rn   s     r   ro   z?BaseDatabaseSchemaEditor._model_indexes_sql.<locals>.<listcomp>@  rp   r   r4  r5  )r'   managedproxyswappedr   r   rx  index_togetherra   r8  rH  r  rB   rE   r  r  )rH   r,   outputr   r   r   r  s    `     r   r   z+BaseDatabaseSchemaEditor._model_indexes_sql3  s#   
 {" 	ek&7 	5;;N 	I[- 	A 	AEMM$11%??@@@@ !;5 	W 	WKLLLLLLLFMM$00vf0UUVVVV[( 	= 	=E.=?+G= e..ud;;<<<r   c                     g }|                      ||          r+|                    |                     ||g                     |S )zT
        Return a list of all index SQL statements for the specified field.
        r  )_field_should_be_indexedra   r8  )rH   r,   r   r"  s       r   rx  z+BaseDatabaseSchemaEditor._field_indexes_sqlK  sN     ((66 	IMM$00w0GGHHHr   c                    |j         s	|j         sdS |pt                      }|                                \  }}}}|                                \  }}}	}
|                    |j                  D ]}|                    |d            |                    |j                  D ]}|
                    |d            |j        sh|j        ra|j        rZ|j        j        j	        j
        |j        j        j	        j
        k    r,|                    dd            |
                    dd            |                     |j                  |                     |j                  k    p|||f||	|
fk    S )NFto)concreter  deconstructunionnon_db_attrspopr   r;   r,   r'   r   ri   r   )rH   r4   r8   r  r|  old_pathold_args
old_kwargsnew_pathnew_args
new_kwargsattrs               r   r  z1BaseDatabaseSchemaEditor._field_should_be_alteredT  s   ! 	)*< 	5355,5,A,A,C,C)8Xz,5,A,A,C,C)8Xz LL!788 	' 	'DNN4&&&&LL!788 	' 	'DNN4&&&&&	'&	' &	' &,2;%+1:; ; NN4&&&NN4&&&y/00DOO5
 5
 
 R*-(Hj1QQ	Rr   c                      |j         o|j         S r0   )r  r   rH   r,   r   s      r   r$  z1BaseDatabaseSchemaEditor._field_should_be_indexedq  s    ~2el"22r   c                      |j          o|j         S r0   r   rH   r4   r8   s      r   r  z2BaseDatabaseSchemaEditor._field_became_primary_keyt  s    ((BY-BBr   c                 >    |j          o|j        o|j         p|j         S r0   )r   r   r7  s      r   r  z0BaseDatabaseSchemaEditor._unique_should_be_addedw  s3    %% @ @%%>)>	
r   c                     | j         |                     |          |                     |j                  |                     |j                  |dz  S )N)r   
old_column
new_columnr   )sql_rename_columnri   r   )rH   r   r4   r8   r  s        r   r  z*BaseDatabaseSchemaEditor._rename_field_sql~  sR    %__U++//)*:;;//)*:;;	)
 )
 
 	
r   c           	         t          |j        j        | j                  }|                     |||          }t          |j        j        |j        g| j                  }t          |j        j        j        j        | j                  }t          |j        j        j        j        |j        j        g| j                  }| j	        j
                                        }	t          | j        ||||||	          S )N)r   r   r   rt   ru   rm  )r
   r'   r   ri   rs  r   r   target_fieldr,   rB   rh   rt  r	   sql_create_fk)
rH   r,   r   r6  r   r   r   rt   ru   rm  s
             r   r   z'BaseDatabaseSchemaEditor._create_fk_sql  s    ek*DO<<''uf==-~tOO+17@$/RR$*3&'O
 
	
 _(7799
!
 
 
 	
r   c                       fd}t          |j        j        |j        gt	          |j        j        j        j                  d         |j        j        g||          S )Nc                  D                          j        | i |          S r0   ri   r  r  r  rH   s     r   create_fk_namezDBaseDatabaseSchemaEditor._fk_constraint_name.<locals>.create_fk_name  s(    ??#:4#:D#KF#K#KLLLr   rD  )r   r'   r   r   r   r>  r,   )rH   r,   r   r6  rD  s   `    r   rs  z,BaseDatabaseSchemaEditor._fk_constraint_name  sr    	M 	M 	M 	M 	M K \NU/5;DEEaH&'
 
 	
r   c                 :    |                      | j        ||          S r0   )rN  sql_delete_fkrH   r,   r   s      r   r  z'BaseDatabaseSchemaEditor._delete_fk_sql      **4+=udKKKr   c                 V    |dS |t           j        k    rdS |t           j        k    rdS d S )NrZ   z DEFERRABLE INITIALLY DEFERREDz DEFERRABLE INITIALLY IMMEDIATE)r   DEFERRED	IMMEDIATE)rH   rm  s     r   _deferrable_constraint_sqlz3BaseDatabaseSchemaEditor._deferrable_constraint_sql  s=    2,,,33---44 .-r   c                     |du rdS |du rdS dS )NFz NULLS NOT DISTINCTTz NULLS DISTINCTrZ   rU   )rH   nulls_distincts     r    _unique_index_nulls_distinct_sqlz9BaseDatabaseSchemaEditor._unique_index_nulls_distinct_sql  s)    U""((t##$$rr   c                     | s| j         j        j        oP| p| j         j        j        o<| p| j         j        j        o(| p| j         j        j        o|d u p| j         j        j        S r0   )rB   rE   supports_partial_indexes&supports_deferrable_unique_constraintsr  r  *supports_nulls_distinct_unique_constraints)rH   r  rm  r  r  rN  s         r   _unique_supportedz*BaseDatabaseSchemaEditor._unique_supported  s     ]Odo6O  S?+R
 R 8 R  W4?#;#W $& W?+V	
r   c
           
                                |||||	          sd S |s|s|s|s|	;                     ||||||||	          }
|
r j                            |
           d S  j        d                     fd|D                                            |          dz  } j                             |          |dz  S )Nr  rm  r  r  rN  )r   r  r  r  r  rN  r}   c                 D    g | ]}                     |j                  S rU   )ri   r   )r2   r   rH   s     r   ro   z8BaseDatabaseSchemaEditor._unique_sql.<locals>.<listcomp>  s'    !T!T!TE$//%,"?"?!T!T!Tr   )rR  rm  r   r|   )	rT  r   rK   ra   sql_unique_constraintr   rL  sql_constraintri   )rH   r,   r   r   r  rm  r  r  r  rN  rT   r|   s   `           r   _unique_sqlz$BaseDatabaseSchemaEditor._unique_sql  s:    %%!#) & 
 
 	 4 		 	 		
 ) ))##'- * 	 	C  .!((---4/yy!T!T!T!TV!T!T!TUU99*EE3
 3
 

 "OOD))$&
 &
 
 	
r   c
                    |                      |||||	          sd S t          |d                              | j                  }
|j        j        }d |D             }||                     ||d          }n|                     |          }|s|s|s|r| j        }n| j	        }|r| 
                    ||d|	          }nt          |||
| j                  }t          |t          || j                  |||                     |          |                     |          |                     ||          |                     |	          
          S )NrV  Fr	  rq   c                     g | ]	}|j         
S rU   r  r  s     r   ro   z?BaseDatabaseSchemaEditor._create_unique_sql.<locals>.<listcomp>  r  r   TrB  rU   )r  r  )r   r   rR  r  rm  r  rN  )rT  r   r   rB   r'   r   rK  ri   sql_create_unique_indexsql_create_uniquer  r   rd   r	   r
   r  rL  r  rO  )rH   r,   r   r   r  rm  r  r  r  rN  r   r   rR  rT   s                 r   r   z+BaseDatabaseSchemaEditor._create_unique_sql  s    %%!#) & 
 
 	 45111>> ? 
 
 $44V444<//wd/KKDD??4((D 	) 	)9 	) 	).CC(C 	R))wR9 *  GG "%h@PQQGt////	::66zBB++E7;;@@PP	
 	
 	
 		
r   c                 F     |r fd}n j         }t          ||d|          S )Nc                  D                          j        | i |          S r0   rB  rC  s     r   create_unique_namezLBaseDatabaseSchemaEditor._unique_constraint_name.<locals>.create_unique_name<  s(    '>t'>'O'O'OPPPr   _uniq)r  r   )rH   r   rR  rC  rb  s   `    r   rK  z0BaseDatabaseSchemaEditor._unique_constraint_name9  sO     	9Q Q Q Q Q Q "&!82DEEEr   c	                     |                      |||||          sd S |s|s|s|r| j        }	n| j        }	|                     |	||          S )NrV  )rT  r7  r)  rN  )
rH   r,   r   r  rm  r  r  r  rN  rT   s
             r   r  z+BaseDatabaseSchemaEditor._delete_unique_sqlD  s~     %%!#) & 
 
 	 4 	) 	)9 	) 	)'CC(C**3t<<<r   c                 V    | j         |                     |          | j        d|iz  dz  S )Nrr   rX  )rZ  ri   r   )rH   r   rr   s      r   
_check_sqlz#BaseDatabaseSchemaEditor._check_sql]  s;    "OOD))3w6FF&
 &
 
 	
r   c                     | j         j        j        sd S t          | j        t          |j        j        | j                  |                     |          |          S )N)r   r   rr   )	rB   rE    supports_table_check_constraintsr	   sql_create_checkr
   r'   r   ri   )rH   r,   r   rr   s       r   r  z*BaseDatabaseSchemaEditor._create_check_sqlc  sZ    'H 	4!,do>>&&	
 
 
 	
r   c                 `    | j         j        j        sd S |                     | j        ||          S r0   )rB   rE   rh  rN  sql_delete_checkrG  s      r   r  z*BaseDatabaseSchemaEditor._delete_check_sqlm  s2    'H 	4**4+@%NNNr   c                     t          |t          |j        j        | j                  |                     |                    S r  )r	   r
   r'   r   ri   )rH   templater,   r   s       r   rN  z/BaseDatabaseSchemaEditor._delete_constraint_sqlr  s?    ,do>>&&
 
 
 	
r   c
                     | fd|D             } j                                         5 }
 j         j                            |
|j        j                  }ddd           n# 1 swxY w Y   g }|                                D ]\  }}|||d         k    rq||d         |k    r"||d         |k    r1||d         |k    r@||d         |k    rO|	|d         sZ||d	         |k    ri|	r||	vr|                    |           |S )
z@Return all constraint names matching the columns and conditions.Nc           	         g | ]{}j         j        j        rIj         j                            t          |j         j                                                            nj         j                            |          |S rU   )rB   rE   truncates_namesintrospectionidentifier_converterr   rh   r  )r2   r   rH   s     r   ro   z>BaseDatabaseSchemaEditor._constraint_names.<locals>.<listcomp>  s         ?+;N-BB!$(;(K(K(M(MNN   _2GGMM  r   rR  r   r   r  rr   r  r   )rB   re   rq  get_constraintsr'   r   itemsra   )rH   r,   r  r   r   r  r  rr   r  rA  re   r   resultr   infodicts   `              r   rI  z*BaseDatabaseSchemaEditor._constraint_namesy  s    #    )  L _##%% 	/7GG, K	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 )//11 	( 	(ND(#|x	7J'J'J%(8*<*F*F*x/F+/U/U$'):e)C)C$'):e)C)C*8M3J*$&)9U)B)B ($g"5"5MM$'''s   +A""A&)A&c                    |                      |d          }|r?t          |          dk    r,t          dt          |          d|j        j                  |D ]+}|                     |                     ||                     ,d S )NTr6  rD  rE  z) of PK constraints for )rI  rL  rM  r'   r   rO   _delete_primary_key_sql)rH   r,   r  rS  r  s        r   r  z,BaseDatabaseSchemaEditor._delete_primary_key  s    11%T1JJ 	c*++q00* ())))K((    0 	O 	OOLL55e_MMNNNN	O 	Or   c                 &   t          | j        t          |j        j        | j                  |                     |                     |j        j        |j        gd                    t          |j        j        |j        g| j                            S )N_pkr  )r   r   rR  )	r	   sql_create_pkr
   r'   r   ri   r  r   r   r4  s      r   r  z0BaseDatabaseSchemaEditor._create_primary_key_sql  s    ,do>>''K(5<. (   
 EK05<.$/RR	
 	
 	
 		
r   c                 :    |                      | j        ||          S r0   )rN  sql_delete_pkrG  s      r   rx  z0BaseDatabaseSchemaEditor._delete_primary_key_sql  rH  r   c                 :    |rd|                      |          z   ndS )NzCOLLATE rZ   )ri   )rH   r   r  r  s       r   r   z%BaseDatabaseSchemaEditor._collate_sql  s#    :CKzDOOI6666Kr   c                     | j         |                     |          d                    |          dz  }|                     |           d S )N,)	procedureparam_types)sql_delete_procedureri   r   rO   )rH   procedure_namer  rT   s       r   remove_procedurez)BaseDatabaseSchemaEditor.remove_procedure  sQ    '8888K00+
 +
 
 	Sr   )FT)rU   )F)rZ   r0   )NNNNN)NNNNNN)NNNNNNN)T)NNNNNNNNr   )v__name__
__module____qualname____doc__r   rZ  rg  r  ru  rw  r  r  r  r  r  r  r  r<  r  rY  r   sql_delete_constraintrZ  ri  rk  r_  r)  r?  r   rr  rF  r  r^  r  r7  r{  r}  r  ra  r  rI   rM   rP   rO   ri   r   r   r   r   r   r   r   r   r   staticmethodr   r   rd   r  r  r  r  r  r  r  r.  r;  r(  r^  r   rj  r~  r  r  r  r  r  rv  r  r  r   r   r  r  r  r  r  r8  r  r  r  r   rx  r  r$  r  r  r  r   rs  r  rL  rO  rT  r[  r   rK  r  rf  r  r  rN  rI  r  r  rx  r   r  rU   r   r   r@   r@   K   s         AJV5T:PC FP"H'B$NN  	Q  A.L9NX,	?  .	@   "&)M	9 
	B  I, 	R  *M9IVU U U U  A A A, , , ,>4 4 4O O Of?N ?N ?NB
 
 
 
6    
 
 
  ) ) ) K K K   \2W W W$ $ $"> "> ">H. . .*	A 	A 	A4 4 4- - -+ + +  A A A*V V V* S  S  SDH H H&  	
 	
 	
T$ T$ T$l. . .@J
 J
 J
 J
X	 	 	( r$ r$ r$ r$h  :$
 $
 $
 $
N 16
 
 
 
8,
 ,
 ,
\	
 	
 	
/ / /
 
 
@   @
 
 
 
  

 
 
 4
 4
 4
 4
 4
l
 
 
 

 
 
S S S  0  R R R R:3 3 3C C C
 
 

 
 

 
 
*
 
 
L L L5 5 5   
 
 
 
: 2
 2
 2
 2
p 1
 1
 1
 1
f	F 	F 	F 	F = = = =2
 
 

 
 
O O O

 
 
 + + + +ZO O O O

 

 

L L LL L L L     r   r@   )!loggingr)   r   django.confr   !django.db.backends.ddl_referencesr   r   r   r   r	   r
   django.db.backends.utilsr   r   r   django.db.modelsr   r   r   django.db.models.sqlr   django.db.transactionr   r   django.utilsr   	getLoggerr]   r   r-   r:   r@   rU   r   r   <module>r     s                                      S R R R R R R R R R < < < < < < < < < < & & & & & & D D D D D D D D ! ! ! ! ! !		6	7	71 1 1 
 
 

 
 
.         r   