
     hd                        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 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)
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      ]/var/www/surfInsights/venv3-11/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/   )r0   r1   	new_fields     r   r3   z+_related_non_m2m_objects.<locals>.<genexpr>=   r4   r   )zipr+   r*   _related_non_m2m_objectsremote_field)r2   r6   related_fieldsold_relnew_rels   ``   r   r8   r8   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'dld"Z(d# Z)d$ Z*dmd&Z+d' Z,d( Z-d) Z.dnd*Z/d+ Z0d, Z1d- Z2d. Z3e4d/             Z5d0 Z6d1 Z7d2 Z8d3 Z9d4 Z:d5 Z;d6 Z<d7 Z=d8 Z>d9 Z?d: Z@d; ZAd< ZBd= ZCd> ZDd? ZEd@ ZFdndAZG	 dndBZHdC ZIdndDZJdE ZKdF ZLdG ZMdH ZNdodJZOdpdKZPdL ZQdM ZRdddIdIdd%dd%ddddNdOZSdpdPZTdQ ZUdR ZVdS ZWdT ZXdpdUZYdV ZZdW Z[dX Z\dY Z]dZ Z^d[ Z_d\ Z`d] Za	 	 	 	 	 dqd^Zb	 	 	 	 	 	 drd_Zcdsd`Zd	 	 	 	 	 dqdaZedb Zfdc Zgdd Zhde Zi	 	 	 	 	 	 	 	 dtdfZjdndgZkdh Zldi ZmdudjZndmdkZodS )v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)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)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 r.   )
connectioncollect_sqlcollected_sqlfeaturescan_rollback_ddlatomic_migration)selfr@   rA   r   s       r   __init__z!BaseDatabaseSchemaEditor.__init__   s?    $& 	$!#D $ 8 I Tfr   c                     g | _         | j        r7t          | j        j                  | _        | j                                         | S r.   )deferred_sqlrE   r   r@   alias	__enter__)rF   s    r   rK   z"BaseDatabaseSchemaEditor.__enter__   sB      	$ !677DKK!!###r   c                     || j         D ]}|                     |           | j        r| j                            |||           d S d S r.   )rI   executerE   r   __exit__)rF   exc_type	exc_value	tracebacksqls        r   rN   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))paramsrR   )extra; N)rA   r@   in_atomic_blockrC   rD   r   strloggerdebugrstripendswithrB   appendtuplemapquote_valuecursorrM   )rF   rR   rU   endingrc   s        r   rM   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)rF   r   s     r   rg   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 rS   r&   	get_fieldr0   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 rS   )constraint_sql)r0   
constraintr*   rF   s     r   rm   z6BaseDatabaseSchemaEditor.table_sql.<locals>.<listcomp>  s9     
 
 
 %%eT22
 
 
r   , c              3   8   K   | ]}|t          |          V  d S r.   )rZ   r0   rz   s     r   r3   z5BaseDatabaseSchemaEditor.table_sql.<locals>.<genexpr>  sB       $ $$J$ $ $ $ $ $r   )table
definition) r&   unique_togetherrI   r_   _create_unique_sqllocal_fields
column_sqldb_parametersr@   sql_check_constraintdb_type_suffixextendr9   db_constraintr*   db_tablerk   
field_namecolumnsql_create_inline_fkrg   rC   supports_foreign_keys_create_fk_sqlget_internal_typerf   autoinc_sqlconstraintssql_create_tablejoindb_tablespacetablespace_sql)rF   r*   field_namesfieldscolumn_sqlsrU   r   r   extra_params	db_paramscol_type_suffixrr   rs   r   r   rR   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        j        j        r#|j        r|                     |j                  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_sqlr@   rC   supports_comments_inline
db_comment_comment_sqlnullskip_defaultskip_default_on_altereffective_default_column_default_sqlrequires_literal_defaultsprepare_defaultr_   empty_strings_allowedr   !interprets_empty_strings_as_nullsimplied_column_nulluniquer   r&   supports_tablespacesrf   r   )rF   column_db_typerU   r*   r   field_db_paramsinclude_defaultr   r   default_valuecolumn_default
tablespaces               r   _iter_column_sqlz)BaseDatabaseSchemaEditor._iter_column_sql!  sn      '++K8889 	/##I.....?#< 	6AQ 	6##E$455555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.
        ro   typeNNNrq   )r   r@   r   r   )rF   r*   r   r   r   r   rU   s          r   r   z#BaseDatabaseSchemaEditor.column_sqlZ  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).
        FrS   rF   r   s     r   r   z%BaseDatabaseSchemaEditor.skip_defaultu  	    
 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.
        FrS   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rF   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.
        %srS   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   rX   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   rb   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`.
        Nro   r   )r   rM   r@   rC   supports_commentsr&   db_table_commentalter_db_table_commentr   r   r   r   _alter_column_comment_sqlrI   r   _model_indexes_sqllocal_many_to_manyr9   throughauto_createdcreate_model)rF   r*   rR   rU   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   r9   r   r   delete_modelrM   sql_delete_tablerg   r   listrI   
isinstancer	   references_tableremove)rF   r*   r   rR   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rU   )contains_expressionsr@   rC   supports_expression_indexesrM   
create_sqlrF   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@   rC   r   rM   
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@   rC   can_rename_indexrM   _rename_index_sqlr   r   r   )rF   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   rM   rF   r*   rz   rR   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   rM   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 rS   r`   r0   r   s     r   	<setcomp>zABaseDatabaseSchemaEditor.alter_unique_together.<locals>.<setcomp>&      @@@&f@@@r   c                 ,    h | ]}t          |          S rS   r  r  s     r   r  zABaseDatabaseSchemaEditor.alter_unique_together.<locals>.<setcomp>'  r	  r   TF)r   r   c                 D    g | ]}j                             |          S rS   rj   rl   s     r   rm   zBBaseDatabaseSchemaEditor.alter_unique_together.<locals>.<listcomp>2  rn   r   N)
difference_delete_composed_indexsql_delete_uniquerM   r   )rF   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 rS   r  r  s     r   r  z@BaseDatabaseSchemaEditor.alter_index_together.<locals>.<setcomp>;      ???&f???r   c                 ,    h | ]}t          |          S rS   r  r  s     r   r  z@BaseDatabaseSchemaEditor.alter_index_together.<locals>.<setcomp><  r  r   TF)r   r   c                 D    g | ]}j                             |          S rS   rj   rl   s     r   rm   zABaseDatabaseSchemaEditor.alter_index_together.<locals>.<listcomp>G  rn   r   _idxr   suffixN)r  r  sql_delete_indexrM   _create_index_sql)rF   r*   old_index_togethernew_index_togetherr  r  r   r   s    `      r   alter_index_togetherz-BaseDatabaseSchemaEditor.alter_index_together5  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 rS   r   r}   s     r   r  zBBaseDatabaseSchemaEditor._delete_composed_index.<locals>.<setcomp>K  s'     !
 !
 !
 *JO!
 !
 !
r   c                     h | ]	}|j         
S rS   r#  r}   s     r   r  zBBaseDatabaseSchemaEditor._delete_composed_index.<locals>.<setcomp>N  s    RRR
JORRRr   c                 N    g | ]!}j                             |          j        "S rS   )r&   rk   r   rl   s     r   rm   zCBaseDatabaseSchemaEditor._delete_composed_index.<locals>.<listcomp>O  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   r@   rC   *allows_multiple_constraints_on_same_fieldsrZ   _unique_constraint_namer   len
ValueErrorr   rM   _delete_constraint_sql)
rF   r*   r   constraint_kwargsrR   meta_constraint_namesmeta_index_namescolumnsconstraint_namesdefault_names
    `        r   r  z/BaseDatabaseSchemaEditor._delete_composed_indexJ  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@   rC   ignores_table_name_caselowerrM   sql_rename_tablerg   rI   r   r	   rename_table_references)rF   r*   old_db_tablenew_db_tablerR   s        r   alter_db_tablez'BaseDatabaseSchemaEditor.alter_db_tablel  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 )NrX   )r~   comment)	sql_alter_table_commentr@   rC   r   rM   rg   r&   r   rb   )rF   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)rM   sql_retablespace_tablerg   r&   r   )rF   r*   old_db_tablespacenew_db_tablespaces       r   alter_db_tablespacez,BaseDatabaseSchemaEditor.alter_db_tablespace  sk    ')=>>"&//2C"D"D"&//2C"D"D 	
 	
 	
 	
 	
r   c           
      L   |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"        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   Nro   rq   rp   rt   z%s.rX   )r   	namespacer   rr   rs   
deferrable)r~   r   r   dropr~   changesr   )*r   r9   r   r&   r   r   r   r   r@   r   r   rC   r   r   sql_create_column_inline_fkr*   r   rk   r   r   r   _fk_constraint_namerg   rf   deferrable_sqlrI   r_   r   sql_create_columnrM   r   r   _alter_column_default_sqlsql_alter_columnr   r   r   r   r   _field_indexes_sqlconnection_persists_old_columnsclose)rF   r*   r   r   rU   r   r   constraint_suffixrr   rs   rQ  _rR   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&!!! **511	&&&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.
        ro   r   NTforeign_key)r~   r   )r   r9   r   r&   r   r   r   r@   r.  r   rM   _delete_fk_sqlsql_delete_columnrg   r   rC   r^  r_  r   rI   r   r	   references_columnr   )rF   r*   r   fk_namesfk_namerR   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.
        Nro   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@   r9   r2  r   r&   r   _alter_many_to_many_alter_field)	rF   r*   r2   r6   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|                     ||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 ]+}|                     |                     ||                     ,|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}tC          |tD                    r+|#                    |j        j        |j        |j                   Cg }g }g }|$                    | j                  }|$                    | j                  }||k    s-||k    s'||k    s!| j        j        j%        rW|j&        |j&        k    rG| '                    ||||||          \  }}|(                    |           |)                    |           d
} |j*        rz|j*        ss| +                    |          }!| +                    |          }"| ,                    |          s4|!|"k    r.|",d} |(                    | -                    |||                     |j*        |j*        k    r.| .                    |||          }|r|(                    |           |/                                o|j*        o|j*         }#|s|r?|#s||z  }| j        j        j0        rA|r?tc          te          |           \  }}$d3                    |          ti          |$g           fg}|D ]C\  }}$|                     | j5        | 6                    |j        j                  |dz  |$           D|#r|                     | j7        | 6                    |j        j                  | 6                    |j                  ddz  |"g           |D ]C\  }}$|                     | j5        | 6                    |j        j                  |dz  |$           D|r|D ]\  }}$|                     ||$           |j        r|j        s| 8                    ||           | 9                    ||          r*|                     | :                    ||g                     |j        r|j        r9|j        r2|j        s+|                     | ;                    ||g                     g }%|r#|%)                    t-          ||                     |                     ||          rL|                     | <                    ||                     |%)                    t-          ||                     |%D ]\  }&}|j        =                    | j                  }'|'d         }(|'                    d          })|&j        =                    | j                  }*|*                    d          }+| '                    |j        |&j        |j        |(|+|)          \  }}|                     | j5        | 6                    |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!          \  }.}$| j5        | 6                    |j        j                  |.dz  }|                     ||$           | j        j        jA        r| j        B                                 dS dS )"z3Perform a "physical" (non-ManyToMany) field update.r   )ignoreTre  r)  r*  z!) of foreign key constraints for .c                     h | ]	}|j         
S rS   r#  r}   s     r   r  z8BaseDatabaseSchemaEditor._alter_field.<locals>.<setcomp>v  '     % % %$.
% % %r   F)r   r   r&  z) of unique constraints for r   c                     h | ]	}|j         
S rS   r#  )r0   r   s     r   r  z8BaseDatabaseSchemaEditor._alter_field.<locals>.<setcomp>  s    LLLu
LLLr   )r   type_r&  rp   c                     h | ]	}|j         
S rS   r#  r}   s     r   r  z8BaseDatabaseSchemaEditor._alter_field.<locals>.<setcomp>  r{  r   )rp   r&  z) of check constraints for ro   Nr{   rU  r   )r~   r   r   r   r   r   rt   _fk_checkr  rS  )Csetr@   rC   r   r9   r   rn  r.  r   r1  r2  r&   r   addrM   rg  r   _field_became_primary_keyr   _delete_unique_sqlr   r   r8   related_modelr   db_indexr-  r   r  _delete_index_sql_delete_check_sql_rename_field_sqlrI   r   r	   rename_column_referencesr   r   r   _alter_column_type_sqlr_   r   r   r   r   r[  _alter_column_null_sqlr   supports_combined_altersr`   r7   r   sumr\  rg   sql_update_with_default_delete_primary_key_unique_should_be_addedr   r  _create_primary_key_sqlr   r   _create_index_name_create_check_sqlr^  r_  )/rF   r*   r2   r6   rs  ru  rr  rt  rq  fks_droppedrj  rk  r5  r8  constraint_nameold_collationnew_collationdrop_foreign_keys_old_relr<   rel_fk_namesr6  index_names
index_namerR   actionsnull_actionspost_actionsold_type_suffixnew_type_suffixfragmentother_actionsneeds_database_defaultold_defaultnew_defaultfour_way_default_alterationrU   rels_to_updater;   rel_db_paramsrel_typerel_collationold_rel_db_paramsold_rel_collationra  relrb  s/                                                  r   rp  z%BaseDatabaseSchemaEditor._alter_fieldJ  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!]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   /11--(: . (I,@@@ '+&A&Ay)X}m' '#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 (	. ( <''@ >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&*&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   !]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.
        Nro   r   )r   r   )
r@   rC   r   r   r   r   sql_alter_column_nullsql_alter_column_not_nullrg   r   )rF   r*   r2   r6   rt  rR   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.
        ro   r   )r   r   r   )r   r   r@   rC   r   r   r   r    sql_alter_column_no_default_nullsql_alter_column_no_defaultsql_alter_column_defaultrg   r   )
rF   r*   r2   r6   rT  r  r   rU   rt  rR   s
             r   r[  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                    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 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.
        rq   rX   )r   r   r   rE  )r   r&   r   r@   rC   r   r   r   r   r_   r   sql_alter_column_typerg   r   )rF   r*   r2   r6   ru  r  r  r  collate_sqlcomment_sqlrR   rU   s               r   r  z/BaseDatabaseSchemaEditor._alter_column_type_sql  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   rE  )sql_alter_column_commentrg   r&   r   r   r   )rF   r*   r6   ru  new_db_comments        r   r   z2BaseDatabaseSchemaEditor._alter_column_comment_sql  s]    ))=>>//)*:;;,,^<<  
 	
r   c                 0    |                      |pd          S )NrX   )rb   )rF   rE  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)	r9   r   r&   r   rC  rv  rk   m2m_reverse_field_namem2m_field_name)rF   r*   r2   r6   rq  s        r   ro  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   rX   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      ra     N   r)  r   zD%s)r   r   r@   rf   max_name_lengthr   r1  isdigit)	rF   
table_namecolumn_namesr  ra  hash_suffix_part
max_lengthr  other_lengths	            r   r  z+BaseDatabaseSchemaEditor._create_index_nameC  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   rq   rX   )r1  r   r   DEFAULT_INDEX_TABLESPACEr&   r@   rf   r   )rF   r*   r   r   s       r   _get_index_tablespace_sqlz2BaseDatabaseSchemaEditor._get_index_tablespace_sqlc  s     6{{aF1I$; &q	 72 : ( A* : % 9$,;;MJJJJrr   c                     |rd|z   S dS )Nz WHERE rX   rS   )rF   	conditions     r   _index_condition_sqlz-BaseDatabaseSchemaEditor._index_condition_sqlo  s     	)y((rr   c                     |r| j         j        j        sdS t          dt	          |j        j        || j                            S )NrX   z INCLUDE (%(columns)s))r7  )r@   rC   supports_covering_indexesr	   r   r&   r   rg   )rF   r*   r7  s      r   _index_include_sqlz+BaseDatabaseSchemaEditor._index_include_sqlt  sN     	do6P 	2$EK0'4?KK
 
 
 	
r   )r   r   r  usingr   col_suffixesrR   	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_colsro   )r   c                     g | ]	}|j         
S rS   r   r0   r   s     r   rm   z>BaseDatabaseSchemaEditor._create_index_sql.<locals>.<listcomp>      444E5<444r   c                  L     j         | i |                              S r.   )r  rg   )argskwargsr   rF   s     r   create_index_namezEBaseDatabaseSchemaEditor._create_index_sql.<locals>.create_index_name  s1    |.t.?????4(((r   )r~   r   r  r7  rV   r  r  )r   get_compilerr@   r  sql_create_indexr&   r   r	   r
   rg   r   _index_columnsr   rb   r  r  )rF   r*   r   r   r  r  r   r  rR   r  r  r  r  compilerr   r7  r  r~   r  s   `  `               r   r  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	   r  r
   r&   r   rg   )rF   r*   r   rR   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   rg   )rF   r*   r  r  s       r   r   z*BaseDatabaseSchemaEditor._rename_index_sql  sQ    !,do>>__X..__X..	
 
 
 	
r   c                 2    t          ||| j        |          S )N)r  )r   rg   )rF   r~   r7  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 rS   rj   rl   s     r   rm   z?BaseDatabaseSchemaEditor._model_indexes_sql.<locals>.<listcomp>  rn   r   r  r  )r&   managedproxyswappedr   r   r]  index_togetherr_   r  r-  r   r@   rC   r   r   )rF   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.
        r  )_field_should_be_indexedr_   r  )rF   r*   r   r  s       r   r]  z+BaseDatabaseSchemaEditor._field_indexes_sql  sN     ((66 	IMM$00w0GGHHHr   c                    |pt                      }|                                \  }}}}|                                \  }}}	}
|                    |j                  D ]}|                    |d            |                    |j                  D ]}|
                    |d            |                     |j                  |                     |j                  k    p|||f||	|
fk    S r.   )r  deconstructunionnon_db_attrspoprg   r   )rF   r2   r6   rx  ra  old_pathold_args
old_kwargsnew_pathnew_args
new_kwargsattrs               r   rn  z1BaseDatabaseSchemaEditor._field_should_be_altered  s    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&&&&y/00DOO5
 5
 
 R*-(Hj1QQ	Rr   c                      |j         o|j         S r.   )r  r   rF   r*   r   s      r   r  z1BaseDatabaseSchemaEditor._field_should_be_indexed  s    ~2el"22r   c                      |j          o|j         S r.   r   rF   r2   r6   s      r   r  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_columnrg   r   )rF   r~   r2   r6   ru  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   rr   rs   rR  )r
   r&   r   rg   rX  r   r   target_fieldr*   r@   rf   rY  r	   sql_create_fk)
rF   r*   r   r  r~   r   r   rr   rs   rR  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.   rg   r  r  r  rF   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*   )rF   r*   r   r  r  s   `    r   rX  z,BaseDatabaseSchemaEditor._fk_constraint_name  sr    	M 	M 	M 	M 	M K \NU/5;DEEaH&'
 
 	
r   c                 :    |                      | j        ||          S r.   )r3  sql_delete_fkrF   r*   r   s      r   rg  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 )NrX   z DEFERRABLE INITIALLY DEFERREDz DEFERRABLE INITIALLY IMMEDIATE)r   DEFERRED	IMMEDIATE)rF   rR  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  r{   c                 D    g | ]}                     |j                  S rS   )rg   r   )r0   r   rF   s     r   rm   z8BaseDatabaseSchemaEditor._unique_sql.<locals>.<listcomp>W  s'    !T!T!TE$//%,"?"?!T!T!Tr   )r7  rR  r   rz   )r@   rC   &supports_deferrable_unique_constraintsr   rI   r_   sql_unique_constraintr   r$  sql_constraintrg   )rF   r*   r   r   r  rR  r  r  r  rR   rz   s   `          r   _unique_sqlz$BaseDatabaseSchemaEditor._unique_sql7  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  ro   c                     g | ]	}|j         
S rS   r  r  s     r   rm   z?BaseDatabaseSchemaEditor._create_unique_sql.<locals>.<listcomp>{  r  r   Tr'  rS   )r  r  )r~   r   r7  r  rR  r  )r@   rC   r(  supports_partial_indexesr  r   r   r  r&   r   r0  rg   sql_create_unique_indexsql_create_uniquer  r   rb   r	   r
   r  r$  r  )rF   r*   r   r   r  rR  r  r  r  r  r~   r7  rR   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_name  s(    '>t'>'O'O'OPPPr   _uniq)r  r   )rF   r~   r7  r(  r3  s   `    r   r0  z0BaseDatabaseSchemaEditor._unique_constraint_name  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@   rC   r(  r.  r  r   r  r  r3  )	rF   r*   r   r  rR  r  r  r  rR   s	            r   r  z+BaseDatabaseSchemaEditor._delete_unique_sql  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 )Nrp   r'  )r*  rg   r   )rF   r   rp   s      r   
_check_sqlz#BaseDatabaseSchemaEditor._check_sql  s;    "OOD))3w6FF&
 &
 
 	
r   c                     t          | j        t          |j        j        | j                  |                     |          |          S )N)r~   r   rp   )r	   sql_create_checkr
   r&   r   rg   )rF   r*   r   rp   s       r   r  z*BaseDatabaseSchemaEditor._create_check_sql  sE    !,do>>&&	
 
 
 	
r   c                 `    | j         j        j        sd S |                     | j        ||          S r.   )r@   rC    supports_table_check_constraintsr3  sql_delete_checkr  s      r   r  z*BaseDatabaseSchemaEditor._delete_check_sql  s2    'H 	4**4+@%NNNr   c                     t          |t          |j        j        | j                  |                     |                    S r  )r	   r
   r&   r   rg   )rF   templater*   r   s       r   r3  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           	         g | ]{}j         j        j        rIj         j                            t          |j         j                                                            nj         j                            |          |S rS   )r@   rC   truncates_namesintrospectionidentifier_converterr   rf   r  )r0   r   rF   s     r   rm   z>BaseDatabaseSchemaEditor._constraint_names.<locals>.<listcomp>  s         ?+;N-BB!$(;(K(K(M(MNN   _2GGMM  r   r7  r   r   r   rp   rf  r   )r@   rc   rB  get_constraintsr&   r   itemsr_   )rF   r*   r  r   r   r   rf  rp   r}  r&  rc   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.  r1  r2  r&   r   rM   _delete_primary_key_sql)rF   r*   rq  r8  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   r7  )	r	   sql_create_pkr
   r&   r   rg   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.   )r3  sql_delete_pkr  s      r   rI  z0BaseDatabaseSchemaEditor._delete_primary_key_sql  r   r   c                 :    |rd|                      |          z   ndS )NzCOLLATE rX   )rg   )rF   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_procedurerg   r   rM   )rF   procedure_namerS  rR   s       r   remove_procedurez)BaseDatabaseSchemaEditor.remove_procedure!  sQ    '8888K00+
 +
 
 	Sr   )FT)rS   )F)rX   r.   )NNNNN)NNNNNN)T)NNNNNNNNr   )p__name__
__module____qualname____doc__r   r?  rL  r   rZ  r\  r  r  r  r  r  r  rh  r  r  r)  r   sql_delete_constraintr*  r9  r<  r0  r  r  r   rW  r  r  r/  r  r  rL  rN  rT  rF  r  rG   rK   rN   rM   rg   r   r   r   r   r   r   r   staticmethodr   r   rb   r   r   r   r   r   r  r  r  r   r  rC  r   rO  rc  rl  rv  rp  r  r[  r  r   r   ro  r  r  r  r  r  r  r   r  r   r]  rn  r  r  r  r  r   rX  rg  r$  r+  r   r0  r  r7  r  r  r3  r.  r  r  rI  r   rV  rS   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 
	0  I, 	R  *M9IVU U U U  A A A, , , ,>4 4 4O O Of7N 7N 7Nr
 
 
 
6    
 
 
     \.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. . .@>
 >
 >
 >
R X$ X$ X$ X$t
  :$
 $
 $
 $
L,
 ,
 ,
\	
 	
 	
/ / /
 
 
@   @
 
 
 
  

 
 
 4
 4
 4
 4
 4
l
 
 
 

 
 
S S S  .  R 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

 
 
 + + + +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   django.db.models.sqlr   django.db.transactionr   r   django.utilsr   	getLoggerr[   r   r+   r8   r>   rS   r   r   <module>rf     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   