
     h                        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 d dl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)
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      Z/var/www/html/Sam_Eipo/venv/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 r-   r.   )r/   r0   	new_fields     r   r2   z+_related_non_m2m_objects.<locals>.<genexpr>=   r3   r   )zipr*   r)   _related_non_m2m_objectsremote_field)r1   r5   related_fieldsold_relnew_rels   ``   r   r7   r7   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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&did!Z'd" Z(d# Z)djd%Z*d& Z+d' Z,d( Z-dkd)Z.d* Z/d+ Z0d, Z1d- Z2e3d.             Z4d/ Z5d0 Z6d1 Z7d2 Z8d3 Z9d4 Z:d5 Z;d6 Z<d7 Z=d8 Z>d9 Z?d: Z@d; ZAd< ZBd= ZCd> ZDdkd?ZE	 dkd@ZFdA ZGdkdBZHdC ZIdD ZJdE ZKdldGZLdmdHZMdI ZNdJ ZOdddFdFdd$dd$ddddKdLZPdmdMZQdN ZRdO ZSdP ZTdQ ZUdR ZVdS ZWdT ZXdU ZYdV ZZdW Z[dX Z\dY Z]dZ Z^	 	 	 	 	 dnd[Z_	 	 	 	 	 	 dod\Z`dpd]Za	 	 	 	 	 dnd^Zbd_ Zcd` Zdda Zedb Zf	 	 	 	 	 	 	 	 dqdcZgdkddZhde Zidf Zjdg ZkdjdhZldS )r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)sz%ALTER COLUMN %(column)s TYPE %(type)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 DEFAULTz2ALTER COLUMN %(column)s TYPE %(type)s%(collation)sz4ALTER 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)zPALTER TABLE %(table)s ADD CONSTRAINT %(name)s UNIQUE (%(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)szOCREATE UNIQUE INDEX %(name)s ON %(table)s (%(columns)s)%(include)s%(condition)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)sFTc                 n    || _         || _        | j        rg | _        | j         j        j        o|| _        d S r-   )
connectioncollect_sqlcollected_sqlfeaturescan_rollback_ddlatomic_migration)selfr?   r@   r   s       r   __init__z!BaseDatabaseSchemaEditor.__init__   s?    $& 	$!#D $ 8 I Tfr   c                     g | _         | j        r7t          | j        j                  | _        | j                                         | S r-   )deferred_sqlrD   r   r?   alias	__enter__)rE   s    r   rJ   z"BaseDatabaseSchemaEditor.__enter__   sB      	$ !677DKK!!###r   c                     || j         D ]}|                     |           | j        r| j                            |||           d S d S r-   )rH   executerD   r   __exit__)rE   exc_type	exc_value	tracebacksqls        r   rM   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))paramsrQ   )extra; N)r@   r?   in_atomic_blockrB   rC   r   strloggerdebugrstripendswithrA   appendtuplemapquote_valuecursorrL   )rE   rQ   rT   endingrb   s        r   rL   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 r-   )r?   ops
quote_name)rE   r   s     r   rf   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 rR   r%   	get_fieldr/   r   r)   s     r   
<listcomp>z6BaseDatabaseSchemaEditor.table_sql.<locals>.<listcomp>   )    LLLuek++E22LLLr   Nr?   check z %s)to_table	to_column_fk_%(to_table)s_%(to_column)s)	AutoFieldBigAutoFieldSmallAutoFieldc                 <    g | ]}|                               S rR   )constraint_sql)r/   
constraintr)   rE   s     r   rl   z6BaseDatabaseSchemaEditor.table_sql.<locals>.<listcomp>	  s9     
 
 
 %%eT22
 
 
r   , c              3   8   K   | ]}|t          |          V  d S r-   )rY   r/   ry   s     r   r2   z5BaseDatabaseSchemaEditor.table_sql.<locals>.<genexpr>  sB       $ $$J$ $ $ $ $ $r   )table
definition) r%   unique_togetherrH   r^   _create_unique_sqllocal_fields
column_sqldb_parametersr?   sql_check_constraintdb_type_suffixextendr8   db_constraintr)   db_tablerj   
field_namecolumnsql_create_inline_fkrf   rB   supports_foreign_keys_create_fk_sqlget_internal_typere   autoinc_sqlconstraintssql_create_tablejoindb_tablespacetablespace_sql)rE   r)   field_namesfieldscolumn_sqlsrT   r   r~   extra_params	db_paramscol_type_suffixrq   rr   r   r   rQ   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              #     K   |V  |                     d          x}r|                     |          V  |j        }|o-|                     |           o|o|                     |           }|rt|                     |          }	|	]d|                     |          z   }
| j        j        j	        r|
| 
                    |	          z  V  n|
V  |                    |	           |j        r|j        s| j        j        j        rd}|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 TzNOT NULLNULLzPRIMARY KEYUNIQUE)inline)get_collate_sqlnullskip_defaultskip_default_on_altereffective_default_column_default_sqlr?   rB   requires_literal_defaultsprepare_defaultr^   empty_strings_allowedr   !interprets_empty_strings_as_nullsimplied_column_nulluniquer   r%   supports_tablespacesre   r   )rE   column_db_typerT   r)   r   field_db_paramsinclude_defaultr   r   default_valuecolumn_default
tablespaces               r   _iter_column_sqlz)BaseDatabaseSchemaEditor._iter_column_sql  s7      '++K8889 	/##I.....z  =%%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 	)= 	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.
        rn   typeN)NNrp   )r   r?   r   r   )rE   r)   r   r   r   r   rT   s          r   r   z#BaseDatabaseSchemaEditor.column_sqlV  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).
        FrR   rE   r   s     r   r   z%BaseDatabaseSchemaEditor.skip_defaultq  	    
 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.
        FrR   r   s     r   r   z.BaseDatabaseSchemaEditor.skip_default_on_alterx  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rE   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.
        %srR   r   s     r   r   z,BaseDatabaseSchemaEditor._column_default_sql  s	    
 tr   c                    |                                  r|                                 }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   rW   auto_nowFauto_now_addDateTimeField	DateField	TimeField)has_defaultget_defaultr   blankr   r   getattrr   nowr   datetime)r   defaultinternal_types      r   _effective_defaultz+BaseDatabaseSchemaEditor._effective_default  s     	''))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   r?   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   ra   z$BaseDatabaseSchemaEditor.quote_value  s     "###r   c                 H   |                      |          \  }}|                     ||pd           | 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`.
        N)r   rL   rH   r   _model_indexes_sqlr%   local_many_to_manyr8   throughauto_createdcreate_model)rE   r)   rQ   rT   r   s        r   r   z%BaseDatabaseSchemaEditor.create_model  s    
 nnU++V 	S&.D))) 	  !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   r8   r   r   delete_modelrL   sql_delete_tablerf   r   listrH   
isinstancer	   references_tableremove)rE   r)   r   rQ   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rT   )contains_expressionsr?   rB   supports_expression_indexesrL   
create_sqlrE   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   r?   rB   r   rL   
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   )r?   rB   can_rename_indexrL   _rename_index_sqlr   r   r   )rE   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   rL   rE   r)   ry   rQ   s       r   add_constraintz'BaseDatabaseSchemaEditor.add_constraint  sG    ##E400 	+ LLTL*****	+ 	+r   c                 d    |                     ||           }|r|                     |           dS dS )z!Remove a constraint from a model.N)r   rL   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 rR   r_   r/   r   s     r   	<setcomp>zABaseDatabaseSchemaEditor.alter_unique_together.<locals>.<setcomp>      @@@&f@@@r   c                 ,    h | ]}t          |          S rR   r   r   s     r   r   zABaseDatabaseSchemaEditor.alter_unique_together.<locals>.<setcomp>  r   r   TF)r   r   c                 D    g | ]}j                             |          S rR   ri   rk   s     r   rl   zBBaseDatabaseSchemaEditor.alter_unique_together.<locals>.<listcomp>  rm   r   N)
difference_delete_composed_indexsql_delete_uniquerL   r   )rE   r)   old_unique_togethernew_unique_togetheroldsnewsr   r   s    `      r   alter_unique_togetherz.BaseDatabaseSchemaEditor.alter_unique_together  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 rR   r   r   s     r   r   z@BaseDatabaseSchemaEditor.alter_index_together.<locals>.<setcomp>&      ???&f???r   c                 ,    h | ]}t          |          S rR   r   r   s     r   r   z@BaseDatabaseSchemaEditor.alter_index_together.<locals>.<setcomp>'  r  r   TF)r   r   c                 D    g | ]}j                             |          S rR   ri   rk   s     r   rl   zABaseDatabaseSchemaEditor.alter_index_together.<locals>.<listcomp>2  rm   r   _idxr   suffixN)r  r  sql_delete_indexrL   _create_index_sql)rE   r)   old_index_togethernew_index_togetherr  r  r   r   s    `      r   alter_index_togetherz-BaseDatabaseSchemaEditor.alter_index_together   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 rR   r   r|   s     r   r   zBBaseDatabaseSchemaEditor._delete_composed_index.<locals>.<setcomp>6  s'     !
 !
 !
 *JO!
 !
 !
r   c                     h | ]	}|j         
S rR   r  r|   s     r   r   zBBaseDatabaseSchemaEditor._delete_composed_index.<locals>.<setcomp>9  s    RRR
JORRRr   c                 N    g | ]!}j                             |          j        "S rR   )r%   rj   r   rk   s     r   rl   zCBaseDatabaseSchemaEditor._delete_composed_index.<locals>.<listcomp>:  s,    KKK55;((//6KKKr   excluder   TFquote   Found wrong number (z) of constraints for (rz   )r   )r%   r   indexes_constraint_namesr   r?   rB   *allows_multiple_constraints_on_same_fieldsrY   _unique_constraint_namer   len
ValueErrorr   rL   _delete_constraint_sql)
rE   r)   r   constraint_kwargsrQ   meta_constraint_namesmeta_index_namescolumnsconstraint_namesdefault_names
    `        r   r  z/BaseDatabaseSchemaEditor._delete_composed_index5  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)r?   rB   ignores_table_name_caselowerrL   sql_rename_tablerf   rH   r   r	   rename_table_references)rE   r)   old_db_tablenew_db_tablerQ   s        r   alter_db_tablez'BaseDatabaseSchemaEditor.alter_db_tableW  s    <''O$< (""$$(:(:(<(<<<F!!__\::!__\:: 	
 	
 	
 $ 	H 	HC#y)) H++L,GGG	H 	Hr   c                     |                      | j        |                     |j        j                  |                     |          |                     |          dz             dS )z)Move a model's table between tablespaces.)r}   old_tablespacenew_tablespaceN)rL   sql_retablespace_tablerf   r%   r   )rE   r)   old_db_tablespacenew_db_tablespaces       r   alter_db_tablespacez,BaseDatabaseSchemaEditor.alter_db_tablespacej  sk    ')=>>"&//2C"D"D"&//2C"D"D 	
 	
 	
 	
 	
r   c           
         |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  }|                     ||           |                     |          sq|                     |          \|                      |d|d          \  }}| j!        |                     |j        j                  |dz  }|                     ||           | 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   Nrn   rp   ro   rs   z%s.rW   )r   	namespacer   rq   rr   
deferrable)r}   r   r~   dropr}   changes)&r   r8   r   r%   r   r   r   r   r?   r   r   rB   r   r   sql_create_column_inline_fkr)   r   rj   r   r   r   _fk_constraint_namerf   re   deferrable_sqlrH   r^   r   sql_create_columnrL   r   r   _alter_column_default_sqlsql_alter_columnr   _field_indexes_sqlconnection_persists_old_columnsclose)rE   r)   r   r~   rT   r   r   constraint_suffixrq   rr   rB  _rQ   changes_sqls                 r   	add_fieldz"BaseDatabaseSchemaEditor.add_fieldu  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&!!! **511	&&&u--9"&"@"@tU #A # #K ')=>>&+ + C LLf%%%  !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.
        rn   r   NTforeign_key)r}   r   )r   r8   r   r%   r   r   r   r?   r$  r   rL   _delete_fk_sqlsql_delete_columnrf   r   rB   rO  rP  r   rH   r   r	   references_columnr   )rE   r)   r   fk_namesfk_namerQ   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          | 	                    ||||||||           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.
        Nrn   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))
_field_should_be_alteredr   r?   r8   r(  r   r%   r   _alter_many_to_many_alter_field)	rE   r)   r1   r5   strictold_db_paramsold_typenew_db_paramsnew_types	            r   alter_fieldz$BaseDatabaseSchemaEditor.alter_field  s    ,,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   			
 		
 		
 		
 		
r   c	                    t                      }	| j        j        j        r|j        r|j        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t4          j        |          }|D ]+}|                     |                     ||                     ,|d         |d         k    r|d         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}tA          |tB                    r+|"                    |j
        j        |j        |j                   Cg }g }g }|#                    | j                  }|#                    | j                  }||k    r.| $                    ||||          }|%                    |           nO||f||fk    rE| &                    ||||          \  }}|%                    |           |'                    |           d} |j(        rz|j(        ss| )                    |          }!| )                    |          }"| *                    |          s4|!|"k    r.|",d} |%                    | +                    |||                     |j(        |j(        k    r.| ,                    |||          }|r|%                    |           |-                                o|j(        o|j(         }#|s|r?|#s||z   }| j        j        j.        rA|r?t_          ta          |           \  }}$d1                    |          te          |$g           fg}|D ]C\  }}$|                     | j3        | 4                    |j
        j                  |dz  |$           D|#r|                     | j5        | 4                    |j
        j                  | 4                    |j                  ddz  |"g           |D ]C\  }}$|                     | j3        | 4                    |j
        j                  |dz  |$           D|r|D ]\  }}$|                     ||$           |j        r|j        s| 6                    ||           | 7                    ||          r*|                     | 8                    ||g                     |j        r|j        r9|j        r2|j        s+|                     | 9                    ||g                     g }%|r#|%'                    t+          ||                     |                     ||          rL|                     | :                    ||                     |%'                    t+          ||                     |%D ]:\  }&}|j        ;                    | j                  }'|'d         }(|'                    d          })|&j        ;                    | j                  }*|*                    d          }+|+|)k    r%| $                    |j        |j        |(|)          }g }n*| &                    |j        |&j        |j        |(          \  }}|                     | j3        | 4                    |j        j
        j                  |d         dz  |d                    |D ]\  }}$|                     ||$           <| j        j        j        rH|j        rA|	s|j        r|j        s1|j        r*|                     | <                    ||d                     |rH|%D ]E\  },}-|-j        j        r4|                     | <                    |-j        |-j        d                     F|d         |d         k    r`|d         rX| =                    |j
        j        |j        gd          }|                     | >                    |||d                              | r\| +                    |||d          \  }.}$| j3        | 4                    |j
        j                  |.dz  }|                     ||$           | j        j        j?        r| j        @                                 dS dS ) z3Perform a "physical" (non-ManyToMany) field update.TrV  r  r   z!) of foreign key constraints for .c                     h | ]	}|j         
S rR   r  r|   s     r   r   z8BaseDatabaseSchemaEditor._alter_field.<locals>.<setcomp>F  '     % % %$.
% % %r   F)r   r   r  z) of unique constraints for r   c                     h | ]	}|j         
S rR   r  )r/   r   s     r   r   z8BaseDatabaseSchemaEditor._alter_field.<locals>.<setcomp>  s    LLLu
LLLr   )r   type_r  ro   c                     h | ]	}|j         
S rR   r  r|   s     r   r   z8BaseDatabaseSchemaEditor._alter_field.<locals>.<setcomp>  rk  r   )ro   r  z) of check constraints for rn   Nrz   rF  r   )r}   r   r   r   r   r   rs   _fk_checkr  rD  )Asetr?   rB   r   r8   r   r$  r   r'  r(  r%   r   addrL   rX  r   _field_became_primary_keyr   _delete_unique_sqlr   r   r7   related_modelr   db_indexr#  r   r  _delete_index_sql_delete_check_sql_rename_field_sqlrH   r   r	   rename_column_referencesr   _alter_column_collation_sqlr^   _alter_column_type_sqlr   r   r   r   rL  _alter_column_null_sqlr   supports_combined_altersr_   r6   r   sumrM  rf   sql_update_with_default_delete_primary_key_unique_should_be_addedr   r  _create_primary_key_sqlr   r   _create_index_name_create_check_sqlrO  rP  )/rE   r)   r1   r5   rd  rf  rc  re  rb  fks_droppedr[  r\  r+  r.  constraint_nameold_collationnew_collationdrop_foreign_keys_old_relr;   rel_fk_namesr,  index_names
index_namerQ   actionsnull_actionspost_actionsold_type_suffixnew_type_suffixfragmentother_actionsneeds_database_defaultold_defaultnew_defaultfour_way_default_alterationrT   rels_to_updater:   rel_db_paramsrel_typerel_collationold_rel_db_paramsold_rel_collationrR  relrS  s/                                                  r   ra  z%BaseDatabaseSchemaEditor._alter_field  s    eeO$:	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!]7%;;;g@V;% %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M))77y(M H NN8$$$$(X,GGG&*&A&Ay)X' '#Hm NN8$$$... "'> 	). 	00;;K00;;K..y99;..+)-&225)YOO   >Y^++225)YOOH .##H---&/&;&;&=&= '
N19>1 	$  (	l (	. 1 "L0'@ >W >#CM22V IIcNNCOO<=&  V)!%1E!F!F#& 
     + 0!%1E!F!F"&//)2B"C"C#'  !M   $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 M11;;)M!	  !#*.*E*E)7='-+ +'- 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   !]7%;;;g@V;"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.
        Nrn   r   r   r   )
r?   rB   r   r   r   r   sql_alter_column_nullsql_alter_column_not_nullrf   r   )rE   r)   r1   r5   re  rQ   s         r   r  z/BaseDatabaseSchemaEditor._alter_column_null_sqlx  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.
        rn   r   )r   r   r   )r   r   r?   rB   r   r   r   r    sql_alter_column_no_default_nullsql_alter_column_no_defaultsql_alter_column_defaultrf   r   )
rE   r)   r1   r5   rE  r  r   rT   re  rQ   s
             r   rL  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                 T    | j         |                     |j                  |dz  g fg 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 two-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.
        r  )sql_alter_column_typerf   r   )rE   r)   r1   r5   rf  s        r   r~  z/BaseDatabaseSchemaEditor._alter_column_type_sql  sG     *"ooi.>??$ 
  

 
	
r   c                     | j         |                     |j                  ||rd|                     |          z   nddz  g fS )Nrp   rW   )r   r   r   )sql_alter_column_collaterf   r   r   )rE   r)   r5   rf  r  s        r   r}  z4BaseDatabaseSchemaEditor._alter_column_collation_sql  s^    )//)*:;;  S4#4#4]#C#CCC  

 
	
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)	r8   r   r%   r   r9  rg  rj   m2m_reverse_field_namem2m_field_name)rE   r)   r1   r5   rb  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   rW   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      rR     N   r  r   zD%s)r   r   r?   re   max_name_lengthr   r'  isdigit)	rE   
table_namecolumn_namesr  rR  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 )Nr  r   rp   rW   )r'  r   r   DEFAULT_INDEX_TABLESPACEr%   r?   re   r   )rE   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 rW   rR   )rE   	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 )NrW   z INCLUDE (%(columns)s))r-  )r?   rB   supports_covering_indexesr	   r   r%   r   rf   )rE   r)   r-  s      r   _index_include_sqlz+BaseDatabaseSchemaEditor._index_include_sql/  sN     	do6P 	2$EK0'4?KK
 
 
 	
r   )r   r   r  usingr   col_suffixesrQ   	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_colsrn   )r   c                     g | ]	}|j         
S rR   r   r/   r   s     r   rl   z>BaseDatabaseSchemaEditor._create_index_sql.<locals>.<listcomp>T      444E5<444r   c                  L     j         | i |                              S r-   )r  rf   )argskwargsr   rE   s     r   create_index_namezEBaseDatabaseSchemaEditor._create_index_sql.<locals>.create_index_nameX  s1    |.t.?????4(((r   )r}   r   r  r-  rU   r  r  )r   get_compilerr?   r  sql_create_indexr%   r   r	   r
   rf   r   _index_columnsr   ra   r  r  )rE   r)   r   r   r  r  r   r  rQ   r  r  r  r  compilerr   r-  r  r}   r  s   `  `               r   r  z*BaseDatabaseSchemaEditor._create_index_sql7  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	   r  r
   r%   r   rf   )rE   r)   r   rQ   s       r   ry  z*BaseDatabaseSchemaEditor._delete_index_sqlm  sG    (4(,do>>&&
 
 
 	
r   c                     t          | j        t          |j        j        | j                  |                     |          |                     |                    S )N)r}   old_namenew_name)r	   sql_rename_indexr
   r%   r   rf   )rE   r)   r  r  s       r   r   z*BaseDatabaseSchemaEditor._rename_index_sqlt  sQ    !,do>>__X..__X..	
 
 
 	
r   c                 2    t          ||| j        |          S )N)r  )r   rf   )rE   r}   r-  r  r  s        r   r  z'BaseDatabaseSchemaEditor._index_columns|  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 rR   ri   rk   s     r   rl   z?BaseDatabaseSchemaEditor._model_indexes_sql.<locals>.<listcomp>  rm   r   r  r  )r%   managedproxyswappedr   r   rN  index_togetherr^   r  r#  r   r?   rB   r   r   )rE   r)   outputr   r   r   r   s    `     r   r   z+BaseDatabaseSchemaEditor._model_indexes_sql  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.
        ro  )_field_should_be_indexedr^   r  )rE   r)   r   r  s       r   rN  z+BaseDatabaseSchemaEditor._field_indexes_sql  sN     ((66 	IMM$00w0GGHHHr   c                 j   |                                 \  }}}}|                                 \  }}}}	|j        D ]}
|                    |
d            |j        D ]}
|	                    |
d            |                     |j                  |                     |j                  k    p|||f|||	fk    S r-   )deconstructnon_db_attrspoprf   r   )rE   r1   r5   rR  old_pathold_args
old_kwargsnew_pathnew_args
new_kwargsattrs              r   r_  z1BaseDatabaseSchemaEditor._field_should_be_altered  s    ,5,A,A,C,C)8Xz,5,A,A,C,C)8Xz
 * 	' 	'DNN4&&&&* 	' 	'DNN4&&&&y/00DOO5
 5
 
 R*-(Hj1QQ	Rr   c                      |j         o|j         S r-   )rx  r   rE   r)   r   s      r   r  z1BaseDatabaseSchemaEditor._field_should_be_indexed  s    ~2el"22r   c                      |j          o|j         S r-   r   rE   r1   r5   s      r   ru  z2BaseDatabaseSchemaEditor._field_became_primary_key  s    ((BY-BBr   c                 >    |j          o|j        o|j         p|j         S r-   )r   r   r  s      r   r  z0BaseDatabaseSchemaEditor._unique_should_be_added  s3    %% @ @%%>)>	
r   c                     | j         |                     |          |                     |j                  |                     |j                  |dz  S )N)r}   
old_column
new_columnr   )sql_rename_columnrf   r   )rE   r}   r1   r5   rf  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   rq   rr   rC  )r
   r%   r   rf   rI  r   r   target_fieldr)   r?   re   rJ  r	   sql_create_fk)
rE   r)   r   r  r}   r   r   rq   rr   rC  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 r-   rf   r  r  r  rE   s     r   create_fk_namezDBaseDatabaseSchemaEditor._fk_constraint_name.<locals>.create_fk_name  s(    ??#:4#:D#KF#K#KLLLr   r  )r   r%   r   r   r   r  r)   )rE   r)   r   r  r	  s   `    r   rI  z,BaseDatabaseSchemaEditor._fk_constraint_name  sr    	M 	M 	M 	M 	M K \NU/5;DEEaH&'
 
 	
r   c                 :    |                      | j        ||          S r-   )r)  sql_delete_fkrE   r)   r   s      r   rX  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 )NrW   z DEFERRABLE INITIALLY DEFERREDz DEFERRABLE INITIALLY IMMEDIATE)r   DEFERRED	IMMEDIATE)rE   rC  s     r   _deferrable_constraint_sqlz3BaseDatabaseSchemaEditor._deferrable_constraint_sql  s=    2,,,33---44 .-r   c	           	      p    |r j         j        j        sd S |s|s|s|r:                     |||||||          }	|	r j                            |	           d S  j        d                     fd|D                                            |          dz  }
 j	         
                    |          |
dz  S )N)r   r  r  r  r  rz   c                 D    g | ]}                     |j                  S rR   )rf   r   )r/   r   rE   s     r   rl   z8BaseDatabaseSchemaEditor._unique_sql.<locals>.<listcomp>  s'    !T!T!TE$//%,"?"?!T!T!Tr   )r-  rC  r   ry   )r?   rB   &supports_deferrable_unique_constraintsr   rH   r^   sql_unique_constraintr   r  sql_constraintrf   )rE   r)   r   r   r  rC  r  r  r  rQ   ry   s   `          r   _unique_sqlz$BaseDatabaseSchemaEditor._unique_sql  s    	O,S	 4 	 	9 	 	 ))##' *  C  .!((---4/yy!T!T!T!TV!T!T!TUU99*EE3
 3
 

 "OOD))$&
 &
 
 	
r   c	                    |r| j         j        j        r9|r| j         j        j        r&|r| j         j        j        r|r| j         j        j        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 )
NFr  rn   c                     g | ]	}|j         
S rR   r  r  s     r   rl   z?BaseDatabaseSchemaEditor._create_unique_sql.<locals>.<listcomp>4  r  r   Tr  rR   )r  r  )r}   r   r-  r  rC  r  )r?   rB   r  supports_partial_indexesr  r   r   r  r%   r   r&  rf   sql_create_unique_indexsql_create_uniquer  r   ra   r	   r
   r  r  r  )rE   r)   r   r   r  rC  r  r  r  r  r}   r-  rQ   s                r   r   z+BaseDatabaseSchemaEditor._create_unique_sql  s    	 0W	
 	
 #'/":"S	 	 !% 8 R	 	 %)O$<$X	 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;;
 
 
 	
r   c                 F     |r fd}n j         }t          ||d|          S )Nc                  D                          j        | i |          S r-   r  r  s     r   create_unique_namezLBaseDatabaseSchemaEditor._unique_constraint_name.<locals>.create_unique_nameP  s(    '>t'>'O'O'OPPPr   _uniq)r  r   )rE   r}   r-  r  r   s   `    r   r&  z0BaseDatabaseSchemaEditor._unique_constraint_nameM  sO     	9Q Q Q Q Q Q "&!82DEEEr   c                     |r| j         j        j        r9|r| j         j        j        r&|r| j         j        j        r|r| j         j        j        sd S |s|s|s|r| j        }n| j        }|                     |||          S r-   )	r?   rB   r  r  r  r   r  r  r)  )	rE   r)   r   r  rC  r  r  r  rQ   s	            r   rv  z+BaseDatabaseSchemaEditor._delete_unique_sqlX  s     	 0W	
 	
 #'/":"S	 	 !% 8 R	 	 %)O$<$X	 4 	) 	)9 	) 	)'CC(C**3t<<<r   c                 V    | j         |                     |          | j        d|iz  dz  S )Nro   r  )r  rf   r   )rE   r   ro   s      r   
_check_sqlz#BaseDatabaseSchemaEditor._check_sqlt  s;    "OOD))3w6FF&
 &
 
 	
r   c                     t          | j        t          |j        j        | j                  |                     |          |          S )N)r}   r   ro   )r	   sql_create_checkr
   r%   r   rf   )rE   r)   r   ro   s       r   r  z*BaseDatabaseSchemaEditor._create_check_sqlz  sE    !,do>>&&	
 
 
 	
r   c                 :    |                      | j        ||          S r-   )r)  sql_delete_checkr  s      r   rz  z*BaseDatabaseSchemaEditor._delete_check_sql  s    **4+@%NNNr   c                     t          |t          |j        j        | j                  |                     |                    S r  )r	   r
   r%   r   rf   )rE   templater)   r   s       r   r)  z/BaseDatabaseSchemaEditor._delete_constraint_sql  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                 N    g | ]!}j         j                            |          "S rR   )r?   introspectionidentifier_converter)r/   r   rE   s     r   rl   z>BaseDatabaseSchemaEditor._constraint_names.<locals>.<listcomp>  s<        -BB4HH  r   r-  r   r   r   ro   rW  r   )r?   rb   r-  get_constraintsr%   r   itemsr^   )rE   r)   r  r   r   r   rW  ro   rm  r  rb   r   resultr   infodicts   `              r   r$  z*BaseDatabaseSchemaEditor._constraint_names  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 )NTr  r  r   z) of PK constraints for )r$  r'  r(  r%   r   rL   _delete_primary_key_sql)rE   r)   rb  r.  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_pkrr  )r}   r   r-  )	r	   sql_create_pkr
   r%   r   rf   r  r   r   r  s      r   r  z0BaseDatabaseSchemaEditor._create_primary_key_sql  s    ,do>>''K(5<. (   
 EK05<.$/RR	
 	
 	
 		
r   c                 :    |                      | j        ||          S r-   )r)  sql_delete_pkr  s      r   r4  z0BaseDatabaseSchemaEditor._delete_primary_key_sql  r  r   c                 2    d|                      |          z   S )NzCOLLATE )rf   )rE   r   s     r   r   z%BaseDatabaseSchemaEditor._collate_sql  s    DOOI6666r   c                     | j         |                     |          d                    |          dz  }|                     |           d S )N,)	procedureparam_types)sql_delete_procedurerf   r   rL   )rE   procedure_namer>  rQ   s       r   remove_procedurez)BaseDatabaseSchemaEditor.remove_procedure  sQ    '8888K00+
 +
 
 	Sr   )FT)rR   )F)rW   r-   )NNNNN)NNNNNN)T)NNNNNNNN)m__name__
__module____qualname____doc__r   r5  r=  r   rK  rM  r  r  r  r  r  r  r  rY  r  r  r  r   sql_delete_constraintr  r&  r(  r  r  r  r   rH  r  r  r  r  r  r7  r9  r?  rF   rJ   rM   rL   rf   r   r   r   r   r   r   r   staticmethodr   r   ra   r   r   r   r   r   r   r   r	  r  r  r9  r@  rT  r]  rg  ra  r  rL  r~  r}  r`  r  r  r  r  r  ry  r   r  r   rN  r_  r  ru  r  r{  r   rI  rX  r  r  r   r&  rv  r$  r  rz  r)  r$  r  r  r4  r   rA  rR   r   r   r=   r=   K   sP         AJV5T:CC FP"H'B$SNN  	Q  A.L9NX,	-  .	@   "&)M	9 
	0  I, 	R  *M9U U U U  A A A, , , ,>4 4 4O O Of5N 5N 5Nn
 
 
 
6    
 
 
     \.W W W$ $ $> > >&. . .*	A 	A 	A4 4 4- - -+ + +  A A A*V V V* S  S  SDH H H&	
 	
 	
H$ H$ H$T. . .@>
 >
 >
 >
R W$ W$ W$ W$r
  :$
 $
 $
 $
L
 
 
,
 
 

 
 
@   @
 
 
 
  

 
 
 4
 4
 4
 4
 4
l
 
 
 

 
 
S S S  .  R R R3 3 3C C C
 
 

 
 

 
 
*
 
 
L L L5 5 5 &
 &
 &
 &
X 3
 3
 3
 3
j	F 	F 	F 	F = = = =8
 
 

 
 
O O O
 
 
 ' ' ' 'RO O O O

 

 

L L L7 7 7     r   r=   )loggingr'   r   django.confr   !django.db.backends.ddl_referencesr   r   r   r   r	   r
   django.db.backends.utilsr   r   django.db.modelsr   r   django.db.models.sqlr   django.db.transactionr   r   django.utilsr   	getLoggerrZ   r   r*   r7   r=   rR   r   r   <module>rQ     sv                                      D C C C C C C C . . . . . . . . & & & & & & D D D D D D D D ! ! ! ! ! !		6	7	71 1 1 
 
 

 
 
.N N N N N N N N N Nr   