U
    _¼|eð ã                   @   sÈ   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  d
¡Zdd„ Zdd„ Zdd„ ZG d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                 C   s2   | j }|jrdS |jr&|jdgkr&dS |j|jk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)ÚrelationZaltered_fieldr   © r   ú[/var/www/website-v5/atlas_env/lib/python3.8/site-packages/django/db/backends/base/schema.pyÚ_is_relevant_relation   s    r   c                 C   s"   t | jjddddd�t d¡d�S )NFT)ÚforwardÚreverseÚinclude_hiddenÚinclude_parentsr   )Úkey)ÚsortedÚ_metaÚ_get_fieldsÚoperatorÚ
attrgetter©Úmodelr   r   r   Ú_all_related_fields'   s    üùr(   c                 #   sb   t ‡fdd„tˆjƒD ƒ‡ fdd„tˆ jƒD ƒƒ}|D ]&\}}||fV  t|j|jƒE d H  q6d S )Nc                 3   s   | ]}t |ˆ ƒr|V  qd S ©N©r   ©Ú.0Úobj)Ú	old_fieldr   r   Ú	<genexpr>8   s   
þz+_related_non_m2m_objects.<locals>.<genexpr>c                 3   s   | ]}t |ˆ ƒr|V  qd S r)   r*   r+   )Ú	new_fieldr   r   r/   =   s   
þ)Úzipr(   r'   Ú_related_non_m2m_objectsÚremote_field)r.   r0   Úrelated_fieldsÚold_relÚnew_relr   )r0   r.   r   r2   4   s    
þ
þú
þr2   c                   @   s  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'd³d"d#„Z(d$d%„ Z)d&d'„ Z*d´d)d*„Z+d+d,„ Z,d-d.„ Z-d/d0„ Z.dµd1d2„Z/d3d4„ Z0d5d6„ Z1d7d8„ Z2d9d:„ Z3e4d;d<„ ƒZ5d=d>„ Z6d?d@„ Z7dAdB„ Z8dCdD„ Z9dEdF„ Z:dGdH„ Z;dIdJ„ Z<dKdL„ Z=dMdN„ Z>dOdP„ Z?dQdR„ Z@dSdT„ ZAdUdV„ ZBdWdX„ ZCdYdZ„ ZDd[d\„ ZEd]d^„ ZFd¶d_d`„ZGd·dadb„ZHdcdd„ ZId¸dedf„ZJdgdh„ ZKdidj„ ZLdkdl„ ZMdmdn„ ZNd¹dpdq„ZOdºdrds„ZPdtdu„ ZQdvdw„ ZRdddododd(dd(ddddxœdydz„ZSd»d{d|„ZTd}d~„ ZUdd€„ ZVd�d‚„ ZWdƒd„„ ZXd¼d…d†„ZYd‡dˆ„ ZZd‰dŠ„ Z[d‹dŒ„ Z\d�dŽ„ Z]d�d�„ Z^d‘d’„ Z_d“d”„ Z`d•d–„ Zad½d—d˜„Zbd¾d™dš„Zcd¿d›dœ„ZddÀd�dž„ZedŸd „ Zfd¡d¢„ Zgd£d¤„ Zhd¥d¦„ ZidÁd§d¨„ZjdÂd©dª„Zkd«d¬„ Zld­d®„ ZmdÃd¯d°„ZndÄd±d²„ZodS )ÅÚBaseDatabaseSchemaEditorzÈ
    This class and its subclasses are responsible for emitting schema-changing
    statements to the databases - model creation/removal/alteration, field
    renaming, index fiddling, and so on.
    z'CREATE TABLE %(table)s (%(definition)s)z1ALTER TABLE %(old_table)s RENAME TO %(new_table)sz7ALTER TABLE %(table)s SET TABLESPACE %(new_tablespace)szDROP TABLE %(table)s CASCADEz:ALTER TABLE %(table)s ADD COLUMN %(column)s %(definition)sz!ALTER TABLE %(table)s %(changes)sz2ALTER COLUMN %(column)s TYPE %(type)s%(collation)sz%ALTER COLUMN %(column)s DROP NOT NULLz$ALTER COLUMN %(column)s SET NOT NULLz/ALTER COLUMN %(column)s SET DEFAULT %(default)sz$ALTER COLUMN %(column)s DROP DEFAULTz4ALTER TABLE %(table)s DROP COLUMN %(column)s CASCADEzDALTER TABLE %(table)s RENAME COLUMN %(old_column)s TO %(new_column)szFUPDATE %(table)s SET %(column)s = %(default)s WHERE %(column)s IS NULLz"UNIQUE (%(columns)s)%(deferrable)szCHECK (%(check)s)z.ALTER TABLE %(table)s DROP CONSTRAINT %(name)sz"CONSTRAINT %(name)s %(constraint)sz?ALTER TABLE %(table)s ADD CONSTRAINT %(name)s CHECK (%(check)s)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                 C   s,   || _ || _| jrg | _| j jjo$|| _d S r)   )Ú
connectionÚcollect_sqlÚcollected_sqlÚfeaturesÚcan_rollback_ddlÚatomic_migration)Úselfr8   r9   r   r   r   r   Ú__init__“   s
    z!BaseDatabaseSchemaEditor.__init__c                 C   s(   g | _ | jr$t| jjƒ| _| j ¡  | S r)   )Údeferred_sqlr=   r   r8   ÚaliasÚ	__enter__©r>   r   r   r   rB   œ   s
    
z"BaseDatabaseSchemaEditor.__enter__c                 C   s8   |d kr| j D ]}|  |¡ q| jr4| j |||¡ d S r)   )r@   Úexecuter=   r   Ú__exit__)r>   Úexc_typeÚ	exc_valueÚ	tracebackÚsqlr   r   r   rE   £   s
    
z!BaseDatabaseSchemaEditor.__exit__r   c              	   C   s¾   | j s | jjr | jjjs tdƒ‚t|ƒ}tjd||||dœd� | j r˜| 	¡  
d¡rXdnd}|dk	r†| j |tt| j|ƒƒ | ¡ qº| j || ¡ n"| j ¡ �}| ||¡ W 5 Q R X 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))ÚparamsrI   )Úextraú;Ú N)r9   r8   Úin_atomic_blockr;   r<   r   ÚstrÚloggerÚdebugÚrstripÚendswithr:   ÚappendÚtupleÚmapÚquote_valueÚcursorrD   )r>   rI   rJ   ÚendingrX   r   r   r   rD   ¬   s2    ÿþýÿ   ÿÿz BaseDatabaseSchemaEditor.executec                 C   s   | j j |¡S r)   )r8   ÚopsÚ
quote_name)r>   r   r   r   r   r[   Ë   s    z#BaseDatabaseSchemaEditor.quote_namec                    s   ˆ j jD ]*}‡ fdd„|D ƒ}ˆj ˆ ˆ |¡¡ qg }g }ˆ j jD �]<}ˆ ˆ |¡\}}|dkrdqD|jˆjd�}	|	d rŒ|dˆj	|	  7 }|j
ˆjd�}
|
rª|d|
 7 }| |¡ |j�r6|j�r6|jjj j}|jjj  |jj¡j}ˆj�r|dˆjˆ |¡ˆ |¡dœ  7 }n"ˆjjj�r6ˆj ˆ ˆ |d	¡¡ | d
ˆ |j¡|f ¡ | ¡ dkrDˆjj ˆ j j|j¡}|rDˆj |¡ qD‡ ‡fdd„ˆ j jD ƒ}ˆjˆ ˆ j j¡d dd„ ||˜D ƒ¡dœ }ˆ j j�røˆjj ˆ j j¡}|�rø|d| 7 }||fS )z-Take a model and return its table definition.c                    s   g | ]}ˆ j  |¡‘qS r   ©r"   Ú	get_field©r,   r   r&   r   r   Ú
<listcomp>Ó   s     z6BaseDatabaseSchemaEditor.table_sql.<locals>.<listcomp>N©r8   Úcheckú z %s)Úto_tableÚ	to_columnú_fk_%(to_table)s_%(to_column)sz%s %s)Ú	AutoFieldÚBigAutoFieldÚSmallAutoFieldc                    s   g | ]}|  ˆ ˆ¡‘qS r   )Úconstraint_sql©r,   Ú
constraint©r'   r>   r   r   r_     s   ÿú, c                 s   s   | ]}|rt |ƒV  qd S r)   )rO   rj   r   r   r   r/     s   þz5BaseDatabaseSchemaEditor.table_sql.<locals>.<genexpr>)ÚtableÚ
definition) r"   Úunique_togetherr@   rT   Ú_create_unique_sqlÚlocal_fieldsÚ
column_sqlÚdb_parametersr8   Úsql_check_constraintÚdb_type_suffixÚextendr3   Údb_constraintr'   Údb_tabler]   Ú
field_nameÚcolumnÚsql_create_inline_fkr[   r;   Úsupports_foreign_keysÚ_create_fk_sqlÚget_internal_typerZ   Úautoinc_sqlÚconstraintsÚsql_create_tableÚjoinÚdb_tablespaceÚtablespace_sql)r>   r'   Úfield_namesÚfieldsZcolumn_sqlsrJ   r   ro   Úextra_paramsÚ	db_paramsÚcol_type_suffixrc   rd   r€   r�   rI   r…   r   rl   r   Ú	table_sqlÎ   s€    

ÿþ  ÿÿ
þÿÿ	 ÿþ
þþ
ÿz"BaseDatabaseSchemaEditor.table_sqlc                 c   sH  |V  |  d¡ }r |  |¡V  | jjjr>|jr>|  |j¡V  |j}|ob|  |¡ ob|o`|  	|¡ }|r´|  
|¡}	|	d k	r´d|  |¡ }
| jjjr¤|
|  |	¡ 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}|�rD| jjj�rD|j�rD| jjj|dd�V  d S )	NÚ	collationzDEFAULT TzNOT NULLÚNULLzPRIMARY KEYÚUNIQUE)Úinline)ÚgetÚ_collate_sqlr8   r;   Úsupports_comments_inlineÚ
db_commentÚ_comment_sqlÚnullÚskip_defaultÚskip_default_on_alterÚeffective_defaultÚ_column_default_sqlÚrequires_literal_defaultsÚprepare_defaultrT   Úempty_strings_allowedr   Ú!interprets_empty_strings_as_nullsÚimplied_column_nullÚuniquer„   r"   Úsupports_tablespacesrZ   r…   )r>   Úcolumn_db_typerJ   r'   r   Úfield_db_paramsÚinclude_defaultrŒ   r•   Údefault_valueZcolumn_defaultÚ
tablespacer   r   r   Ú_iter_column_sql!  sT    
ÿù	


ÿþý
ÿþýz)BaseDatabaseSchemaEditor._iter_column_sqlc              
   C   sD   |j | jd�}|d }|dkr"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.
        r`   ÚtypeN)NNrb   )rt   r8   rƒ   r¦   )r>   r'   r   r£   r¢   r¡   rJ   r   r   r   rs   Z  s"    úþôz#BaseDatabaseSchemaEditor.column_sqlc                 C   s   dS )z�
        Some backends don't accept default values for certain columns types
        (i.e. MySQL longtext and longblob).
        Fr   ©r>   r   r   r   r   r–   u  s    z%BaseDatabaseSchemaEditor.skip_defaultc                 C   s   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.
        Fr   r¨   r   r   r   r—   |  s    z.BaseDatabaseSchemaEditor.skip_default_on_alterc                 C   s   t dƒ‚dS )zU
        Only used for backends which have requires_literal_defaults feature
        z€subclasses of BaseDatabaseSchemaEditor for backends which have requires_literal_defaults must provide a prepare_default() methodN©ÚNotImplementedError©r>   Úvaluer   r   r   r›   ƒ  s    ÿz(BaseDatabaseSchemaEditor.prepare_defaultc                 C   s   dS )z�
        Return the SQL to use in a DEFAULT clause. The resulting string should
        contain a '%s' placeholder for a default value.
        ú%sr   r¨   r   r   r   r™   Œ  s    z,BaseDatabaseSchemaEditor._column_default_sqlc                 C   s¢   |   ¡ r|  ¡ }nŒ| js<| jr<| jr<|  ¡ dkr6d}qžd}nbt| ddƒsTt| ddƒrš|  ¡ }|dkrnt ¡ }qžt	 ¡ }|dkrˆ| 
¡ }qž|d	krž| ¡ }nd }|S )
NÚBinaryFieldó    rM   Úauto_nowFÚauto_now_addÚDateTimeFieldÚ	DateFieldÚ	TimeField)Úhas_defaultÚget_defaultr•   Úblankrœ   r   Úgetattrr   Únowr   ÚdateÚtime)r   ÚdefaultÚinternal_typer   r   r   Ú_effective_default“  s"    



z+BaseDatabaseSchemaEditor._effective_defaultc                 C   s   |  |  |¡| j¡S )z2Return a field's effective database default value.)Úget_db_prep_saver¾   r8   r¨   r   r   r   r˜   «  s    z*BaseDatabaseSchemaEditor.effective_defaultc                 C   s
   t ƒ ‚dS )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).
        Nr©   r«   r   r   r   rW   ¯  s    z$BaseDatabaseSchemaEditor.quote_valuec                 C   sÌ   |   |¡\}}|  ||pd¡ | jjjrŽ|jjrB|  |d|jj¡ | jjjsŽ|jj	D ]8}|j
rT|j| jd�}|d }| j|  ||||j
¡Ž  qT| j |  |¡¡ |jjD ]}|jjjjr¨|  |jj¡ q¨dS )zr
        Create a table and any accompanying indexes or unique constraints for
        the given `model`.
        Nr`   r§   )r‹   rD   r8   r;   Úsupports_commentsr"   Údb_table_commentÚalter_db_table_commentr’   rr   r“   rt   Ú_alter_column_comment_sqlr@   rw   Ú_model_indexes_sqlÚlocal_many_to_manyr3   ÚthroughÚauto_createdÚcreate_model)r>   r'   rI   rJ   r   r¢   Ú
field_typer   r   r   rÈ   »  s0    

ÿ   ÿÿz%BaseDatabaseSchemaEditor.create_modelc                 C   s~   |j jD ]}|jjj jr|  |jj¡ q|  | jd|  |j j	¡i ¡ t
| jƒD ](}t|tƒrP| |j j	¡rP| j |¡ qPdS )z!Delete a model from the database.rn   N)r"   rÅ   r3   rÆ   rÇ   Údelete_modelrD   Úsql_delete_tabler[   ry   Úlistr@   Ú
isinstancer   Úreferences_tableÚremove)r>   r'   r   rI   r   r   r   rÊ   ß  s     ÿÿÿÿz%BaseDatabaseSchemaEditor.delete_modelc                 C   s.   |j r| jjjsdS | j| || ¡dd� dS )zAdd an index on a model.N©rJ   )Úcontains_expressionsr8   r;   Úsupports_expression_indexesrD   Ú
create_sql©r>   r'   Úindexr   r   r   Ú	add_indexô  s    ÿþz"BaseDatabaseSchemaEditor.add_indexc                 C   s*   |j r| jjjsdS |  | || ¡¡ dS )zRemove an index from a model.N)rÑ   r8   r;   rÒ   rD   Ú
remove_sqlrÔ   r   r   r   Úremove_indexÿ  s    ÿþz%BaseDatabaseSchemaEditor.remove_indexc                 C   sD   | j jjr(| j|  ||j|j¡d d� n|  ||¡ |  ||¡ d S )NrÐ   )r8   r;   Úcan_rename_indexrD   Ú_rename_index_sqlr   rØ   rÖ   )r>   r'   Ú	old_indexÚ	new_indexr   r   r   Úrename_index  s    
þz%BaseDatabaseSchemaEditor.rename_indexc                 C   s"   |  || ¡}|r| j|dd� dS )zAdd a constraint to a model.NrÐ   )rÓ   rD   ©r>   r'   rk   rI   r   r   r   Úadd_constraint  s    z'BaseDatabaseSchemaEditor.add_constraintc                 C   s   |  || ¡}|r|  |¡ dS )z!Remove a constraint from a model.N)r×   rD   rÞ   r   r   r   Úremove_constraint  s    z*BaseDatabaseSchemaEditor.remove_constraintc                    s|   dd„ |D ƒ}dd„ |D ƒ}|  |¡D ]}|  ˆ |dddœ| j¡ q&|  |¡D ](}‡ fdd„|D ƒ}|  |  ˆ |¡¡ qNd	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                 S   s   h | ]}t |ƒ’qS r   ©rU   ©r,   r‡   r   r   r   Ú	<setcomp>&  s     zABaseDatabaseSchemaEditor.alter_unique_together.<locals>.<setcomp>c                 S   s   h | ]}t |ƒ’qS r   rá   râ   r   r   r   rã   '  s     TF)rŸ   r   c                    s   g | ]}ˆ j  |¡‘qS r   r\   r^   r&   r   r   r_   2  s     zBBaseDatabaseSchemaEditor.alter_unique_together.<locals>.<listcomp>N)Ú
differenceÚ_delete_composed_indexÚsql_delete_uniquerD   rq   )r>   r'   Zold_unique_togetherZnew_unique_togetherÚoldsÚnewsr‡   r†   r   r&   r   Úalter_unique_together   s    üz.BaseDatabaseSchemaEditor.alter_unique_togetherc                    s€   dd„ |D ƒ}dd„ |D ƒ}|  |¡D ]}|  ˆ |dddœ| j¡ q&|  |¡D ],}‡ fdd„|D ƒ}|  | jˆ |d	d
�¡ qNd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                 S   s   h | ]}t |ƒ’qS r   rá   râ   r   r   r   rã   ;  s     z@BaseDatabaseSchemaEditor.alter_index_together.<locals>.<setcomp>c                 S   s   h | ]}t |ƒ’qS r   rá   râ   r   r   r   rã   <  s     TF)rÕ   rŸ   c                    s   g | ]}ˆ j  |¡‘qS r   r\   r^   r&   r   r   r_   G  s     zABaseDatabaseSchemaEditor.alter_index_together.<locals>.<listcomp>Ú_idx©r‡   ÚsuffixN)rä   rå   Úsql_delete_indexrD   Ú_create_index_sql)r>   r'   Zold_index_togetherZnew_index_togetherrç   rè   r‡   r†   r   r&   r   Úalter_index_together5  s    üz-BaseDatabaseSchemaEditor.alter_index_togetherc           
         sÜ   dd„ ˆ j jD ƒ}dd„ ˆ j jD ƒ}‡ fdd„|D ƒ}| jˆ |fd||B i|—Ž}| d¡dkr”|r”| jjjr”t| j	ˆ j j
|d	d
�ƒ}	|	|kr”|	g}t|ƒdkrÀtdt|ƒˆ j j
d |¡f ƒ‚|  |  |ˆ |d ¡¡ d S )Nc                 S   s   h | ]
}|j ’qS r   ©r   rj   r   r   r   rã   K  s    zBBaseDatabaseSchemaEditor._delete_composed_index.<locals>.<setcomp>c                 S   s   h | ]
}|j ’qS r   rð   rj   r   r   r   rã   N  s     c                    s   g | ]}ˆ j  |¡j‘qS r   )r"   r]   r{   r^   r&   r   r   r_   O  s     zCBaseDatabaseSchemaEditor._delete_composed_index.<locals>.<listcomp>ÚexcluderŸ   TF©Úquoteé   z1Found wrong number (%s) of constraints for %s(%s)rm   r   )r"   r�   ÚindexesÚ_constraint_namesr�   r8   r;   Ú*allows_multiple_constraints_on_same_fieldsrO   Ú_unique_constraint_namery   ÚlenÚ
ValueErrorrƒ   rD   Ú_delete_constraint_sql)
r>   r'   r‡   Zconstraint_kwargsrI   Úmeta_constraint_namesÚmeta_index_namesÚcolumnsÚconstraint_namesÚdefault_namer   r&   r   rå   J  sD    ÿþýüÿþýÿýÿÿz/BaseDatabaseSchemaEditor._delete_composed_indexc                 C   sn   ||ks"| j jjr&| ¡ | ¡ kr&dS |  | j|  |¡|  |¡dœ ¡ | jD ]}t|t	ƒrN| 
||¡ qNdS )z#Rename the table a model points to.N)Z	old_tableZ	new_table)r8   r;   Úignores_table_name_caseÚlowerrD   Úsql_rename_tabler[   r@   rÍ   r   Zrename_table_references)r>   r'   Úold_db_tableÚnew_db_tablerI   r   r   r   Úalter_db_tablel  s     ÿþþÿÿ

z'BaseDatabaseSchemaEditor.alter_db_tablec                 C   s.   |   | j|  |jj¡|  |pd¡dœ ¡ d S )NrM   )rn   Úcomment)rD   Úsql_alter_table_commentr[   r"   ry   rW   )r>   r'   Zold_db_table_commentZnew_db_table_commentr   r   r   rÂ     s    þÿÿz/BaseDatabaseSchemaEditor.alter_db_table_commentc                 C   s2   |   | j|  |jj¡|  |¡|  |¡dœ ¡ dS )z)Move a model's table between tablespaces.)rn   Zold_tablespaceZnew_tablespaceN)rD   Úsql_retablespace_tabler[   r"   ry   )r>   r'   Zold_db_tablespaceZnew_db_tablespacer   r   r   Úalter_db_tablespaceˆ  s    ýÿÿz,BaseDatabaseSchemaEditor.alter_db_tablespacec              
   C   sJ  |j r |jjjjr |  |jj¡S | j||dd�\}}|dkr@dS |j| jd� }r`|d|› �7 }|j	| jd�}|d rˆ|d| j
|  7 }|j�rT| jjj�rT|j�rTd}| j�r>|jjjj}|jjj |jj¡j}	t|jjƒ\}
}|d| j|  |||¡|
�r
d|  |
¡ nd	|  |j¡|  |¡|  |	¡| jj ¡ d
œ  7 }n| j |  |||¡¡ | j|  |jj¡|  |j¡|dœ }|  ||¡ |  |¡�sÜ|  |¡dk	�rÜ| j |d|dd�\}}| j!|  |jj¡|dœ }|  ||¡ |j"�r| jjj#�r| jjj$�s|d }| j|  %||||j"¡Ž  | j &|  '||¡¡ | jjj(�rF| j )¡  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£   Nr`   rb   ra   re   z%s.rM   )r   Ú	namespacer{   rc   rd   Ú
deferrable)rn   r{   ro   ©Údrop©rn   Úchangesr§   )*r   r3   rÆ   r"   rÇ   rÈ   rs   rv   r8   rt   ru   r;   r}   rx   Úsql_create_column_inline_fkr'   ry   r]   rz   r{   r   Ú_fk_constraint_namer[   rZ   Údeferrable_sqlr@   rT   r~   Úsql_create_columnrD   r—   r˜   Ú_alter_column_default_sqlÚsql_alter_columnr“   rÀ   r’   rÃ   rw   Ú_field_indexes_sqlÚconnection_persists_old_columnsÚclose)r>   r'   r   ro   rJ   rŠ   r‰   Zconstraint_suffixrc   rd   r  Ú_rI   Úchanges_sqlrÉ   r   r   r   Ú	add_field“  s–    ÿþý
ÿÿ

øÿ
ýÿþ   ÿ
þÿþý   ÿÿz"BaseDatabaseSchemaEditor.add_fieldc                 C   sì   |j r |jjjjr |  |jj¡S |j| jd�d dkr:dS |jrp| j||j	gdd�}|D ]}|  
|  ||¡¡ qX| j|  |jj¡|  |j	¡dœ }|  
|¡ | jjjr°| j ¡  t| jƒD ],}t|tƒrº| |jj|j	¡rº| j |¡ qºdS )z…
        Remove a field from a model. Usually involves deleting a column,
        but for M2Ms may involve deleting a table.
        r`   r§   NT©Úforeign_key)rn   r{   )r   r3   rÆ   r"   rÇ   rÊ   rt   r8   rö   r{   rD   Ú_delete_fk_sqlÚsql_delete_columnr[   ry   r;   r  r  rÌ   r@   rÍ   r   Zreferences_columnrÏ   )r>   r'   r   Úfk_namesÚfk_namerI   r   r   r   Úremove_fieldé  s*    
þ


 ÿz%BaseDatabaseSchemaEditor.remove_fieldc           	   
   C   s6  |   ||¡sdS |j| jd�}|d }|j| jd�}|d }|dkrN|jdks`|dkrr|jdkrrtd||f ƒ‚n¨|dkrº|dkrº|jjrº|jjrº|jjjjrº|jjjjrº|  ||||¡S |dkrö|dkrö|jjrö|jjrö|jjjjsö|jjjjsödS |dk�s
|dk�rtd||f ƒ‚|  	||||||||¡ 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.
        Nr`   r§   zqCannot alter field %s into %s - they do not properly define db_type (are you using a badly-written custom field?)z�Cannot alter field %s into %s - they are not compatible types (you cannot alter to or from M2M fields, or add or remove through= on M2M fields))
Ú_field_should_be_alteredrt   r8   r3   rú   rÆ   r"   rÇ   Ú_alter_many_to_manyÚ_alter_field)	r>   r'   r.   r0   ÚstrictÚold_db_paramsÚold_typeÚnew_db_paramsÚnew_typer   r   r   Úalter_field	  st    ÿÿþÿÿþüû
ú
ù
ÿþüû
ú
ùþÿøz$BaseDatabaseSchemaEditor.alter_fieldc	           /   	   C   sú  t ƒ }	| jjjr˜|jr˜|jr˜| j||dhd�r˜| j||jgdd�}
|rnt	|
ƒdkrnt
dt	|
ƒ|jj|jf ƒ‚|
D ]$}|	 |jf¡ |  |  ||¡¡ qr|j�r,|jr´|  ||¡�r,dd„ |jjD ƒ}| j||jgdd	|d
�}|�rt	|ƒdk�rt
dt	|ƒ|jj|jf ƒ‚|D ]}|  |  ||¡¡ �q| d¡}| d¡}| jjj�o||j�r\|j�sl|j�o||j�o|||k�p|||k}|�rÒt||ƒD ]B\}}| j|j|jjgdd�}|D ]}|  |  |j|¡¡ �q²�qŽ|j�r<|j�s<|j�rò|j�r<dd„ |jjD ƒ}| j||jgdtj|d�}|D ]}|  |  ||¡¡ �q"|d |d k�rÎ|d �rÎdd„ |jjD ƒ}| j||jgd|d�}|�r°t	|ƒdk�r°t
dt	|ƒ|jj|jf ƒ‚|D ]}|  |  ||¡¡ �q´|j|jk�r&|  |  |jj|||¡¡ | j D ](}t!|t"ƒ�rü| #|jj|j|j¡ �qüg }g }g }|j$| jd�}|j$| jd�}||k�s†||k�s†||k�s†| jjj%�r²|j&|j&k�r²|  '||||||¡\}}| (|¡ | )|¡ d	} |j*�r|j*�s|  +|¡}!|  +|¡}"|  ,|¡�s|!|"k�r|"dk	�rd} | (|  -|||¡¡ |j*|j*k�r>|  .|||¡}|�r>| (|¡ | /¡ �oV|j*�oV|j* }#|�sd|�rB|#�sr||7 }| jjj0�rª|�rªt1t2|Ž ƒ\}}$d 3|¡t4|$g ƒfg}|D ],\}}$|  | j5|  6|jj¡|dœ |$¡ �q®|#�rB|  | j7|  6|jj¡|  6|j¡ddœ |"g¡ |D ],\}}$|  | j5|  6|jj¡|dœ |$¡ �q|�rd|D ]\}}$|  ||$¡ �qL|j�r€|j�s€|  8||¡ |  9||¡�r¢|  |  :||g¡¡ |j�r²|j�rØ|j�rØ|j�sØ|  | j;||gd�¡ g }%|�rò|% )t||ƒ¡ |  ||¡�r"|  |  <||¡¡ |% )t||ƒ¡ |%D ]¬\}&}|jj=| jd�}'|'d }(|' d¡})|&jj=| jd�}*|* d¡}+|  '|j|&j|j|(|+|)¡\}}|  | j5|  6|jjj¡|d dœ |d ¡ |D ]\}}$|  ||$¡ �q¸�q&| jjj�r|j�r|	�sþ|j�rþ|j�s|j�r|  |  >||d¡¡ |�rR|%D ],\},}-|-jj�r$|  |  >|-j|-jd¡¡ �q$|d |d k�rž|d �rž| j?|jj|jgdd�}|  |  @|||d ¡¡ | �rà| j-|||dd �\}.}$| j5|  6|jj¡|.dœ }|  ||$¡ | jjjA�rö| j B¡  dS )!z3Perform a "physical" (non-ManyToMany) field update.r“   )ÚignoreTr  rô   z<Found wrong number (%s) of foreign key constraints for %s.%sc                 S   s   h | ]
}|j ’qS r   rð   rj   r   r   r   rã   u  s    z8BaseDatabaseSchemaEditor._alter_field.<locals>.<setcomp>F)rŸ   r   rñ   z7Found wrong number (%s) of unique constraints for %s.%srŒ   c                 S   s   h | ]
}|j ’qS r   rð   )r,   rÕ   r   r   r   rã   ¯  s     )rÕ   Útype_rñ   ra   c                 S   s   h | ]
}|j ’qS r   rð   rj   r   r   r   rã   À  s    )ra   rñ   z6Found wrong number (%s) of check constraints for %s.%sr`   Nrm   r  r­   )rn   r{   r¼   ©r‡   r§   r   re   Z_fkÚ_check©rì   r  )CÚsetr8   r;   r}   r3   rx   r$  rö   r{   rù   rú   r"   ry   ÚaddrD   r  rŸ   Ú_field_became_primary_keyr�   Ú_delete_unique_sqlr�   r   r2   Úrelated_modelr   Údb_indexrõ   r   rì   Ú_delete_index_sqlÚ_delete_check_sqlÚ_rename_field_sqlr@   rÍ   r   Zrename_column_referencesrv   rÀ   r“   Ú_alter_column_type_sqlrT   rw   r•   r˜   r—   r  Ú_alter_column_null_sqlrµ   Úsupports_combined_altersrU   r1   rƒ   Úsumr  r[   Úsql_update_with_defaultÚ_delete_primary_keyÚ_unique_should_be_addedrq   rî   Ú_create_primary_key_sqlrt   r~   Ú_create_index_nameÚ_create_check_sqlr  r  )/r>   r'   r.   r0   r)  r+  r(  r*  r'  Zfks_droppedr!  r"  rü   rÿ   Úconstraint_nameÚold_collationÚnew_collationZdrop_foreign_keysZ_old_relr6   Zrel_fk_namesrý   Zindex_namesÚ
index_namerI   ÚactionsZnull_actionsZpost_actionsZold_type_suffixZnew_type_suffixÚfragmentÚother_actionsZneeds_database_defaultZold_defaultÚnew_defaultZfour_way_default_alterationrJ   Zrels_to_updater5   Zrel_db_paramsZrel_typeZrel_collationZold_rel_db_paramsZold_rel_collationr  Úrelr  r   r   r   r&  I  sT   ÿþýýü
  ÿýÿÿÿ
ÿÿûýÿÿ

ýú  ÿÿþýýûÿüýÿÿ   ÿÿ
  ÿÿþýû
ú	     ÿ



ÿþýÿ

ÿþÿú
ýÿùþÿúÿÿþý

úþÿúÿþüüüúÿ
ÿ  ÿÿ   ÿ
þz%BaseDatabaseSchemaEditor._alter_fieldc                 C   sV   | j jjr|jrdS |j| j d�}|jr.| jn| j}||  |j	¡|d dœ g fS d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.
        Nr`   r§   )r{   r§   )
r8   r;   r�   rœ   rt   r•   Úsql_alter_column_nullÚsql_alter_column_not_nullr[   r{   )r>   r'   r.   r0   r*  rI   r   r   r   r<  £  s"    ÿþÿý
þÿúz/BaseDatabaseSchemaEditor._alter_column_null_sqlc           
      C   sŠ   |   |¡}|  |¡}|g}|r$g }n| jjjr<|  |¡}g }|j| jd�}|rd|jr\| j}	qj| j	}	n| j
}	|	|  |j¡|d |dœ |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.
        r`   r§   )r{   r§   r¼   )r˜   r™   r8   r;   rš   r›   rt   r•   Ú sql_alter_column_no_default_nullÚsql_alter_column_no_defaultÚsql_alter_column_defaultr[   r{   )
r>   r'   r.   r0   r  rL  r¼   rJ   r*  rI   r   r   r   r  À  s,    




ýÿùz2BaseDatabaseSchemaEditor._alter_column_default_sqlc                 C   s¨   g }|   |||jj¡ }r&d|› �}nd}d}	| jjjr„|js„|j|jkrr|  ||||j¡\}
}|
rr| 	|
|f¡ |jr„|  
|j¡}	| j|  |j¡|||	dœ 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.
        rb   rM   )r{   r§   rŒ   r  )r‘   r"   ry   r8   r;   rÀ   r   r“   rÃ   rT   r”   Úsql_alter_column_typer[   r{   )r>   r'   r.   r0   r+  rF  rG  rK  Zcollate_sqlZcomment_sqlrI   rJ   r   r   r   r;  æ  s@      ÿ   ÿ
üÿø
õz/BaseDatabaseSchemaEditor._alter_column_type_sqlc                 C   s.   | j |  |jj¡|  |j¡|  |¡dœ g fS )N)rn   r{   r  )Úsql_alter_column_commentr[   r"   ry   r{   r”   )r>   r'   r0   r+  Znew_db_commentr   r   r   rÃ     s    
ýÿùz2BaseDatabaseSchemaEditor._alter_column_comment_sqlc                 C   s   |   |p
d¡S )NrM   )rW   )r>   r  r   r   r   r”     s    z%BaseDatabaseSchemaEditor._comment_sqlc                 C   s¢   |j jjj|j jjjkr:|  |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)	r3   rÆ   r"   ry   r  r,  r]   Úm2m_reverse_field_nameÚm2m_field_name)r>   r'   r.   r0   r'  r   r   r   r%  "  s.    

ÿÿ

ý
ÿ
ÿøüz,BaseDatabaseSchemaEditor._alter_many_to_manyrM   c           	      C   sà   t |ƒ\}}dt|f|žddiŽ|f }| jj ¡ p6d}d|d |¡|f }t|ƒ|kr\|S t|ƒ|d kr||d|d … }|t|ƒ d	 d
 }d|d|… d |¡d|… |f }|d dksÌ|d  ¡ rÜd|dd…  }|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.
        z%s%sÚlengthé   éÈ   z%s_%s_%sr  é   Né   rô   r   zD%séÿÿÿÿ)r   r
   r8   rZ   Úmax_name_lengthrƒ   rù   Úisdigit)	r>   Ú
table_nameÚcolumn_namesrì   r  Zhash_suffix_partÚ
max_lengthrH  Zother_lengthr   r   r   rC  B  s(    þ
ýz+BaseDatabaseSchemaEditor._create_index_namec                 C   sf   |d krHt |ƒdkr*|d jr*|d j}ntjr8tj}n|jjrH|jj}|d k	rbd| jj |¡ S dS )Nrô   r   rb   rM   )rù   r„   r   ÚDEFAULT_INDEX_TABLESPACEr"   r8   rZ   r…   )r>   r'   r‡   r„   r   r   r   Ú_get_index_tablespace_sqlb  s    z2BaseDatabaseSchemaEditor._get_index_tablespace_sqlc                 C   s   |rd| S dS )Nz WHERE rM   r   )r>   Ú	conditionr   r   r   Ú_index_condition_sqln  s    z-BaseDatabaseSchemaEditor._index_condition_sqlc                 C   s,   |r| j jjsdS tdt|jj|| jƒd�S )NrM   z INCLUDE (%(columns)s))rþ   )r8   r;   Úsupports_covering_indexesr   r   r"   ry   r[   )r>   r'   rþ   r   r   r   Ú_index_include_sqls  s    þz+BaseDatabaseSchemaEditor._index_include_sql)r‡   r   rì   Úusingr„   Úcol_suffixesrI   Ú	opclassesrd  ÚincludeÚexpressionsc                   s¼   |pg }|pg }t |dd�jˆjd�}ˆj|||d�}dd„ |D ƒ}|pLˆj}|jj}‡ ‡fdd„}t|t|ˆj	ƒt
||||ƒ||r”ˆ ||||	¡nt|||ˆjƒ|ˆ |
¡ˆ ||¡d	�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_colsr`   )r„   c                 S   s   g | ]
}|j ‘qS r   ©r{   r^   r   r   r   r_   ˜  s     z>BaseDatabaseSchemaEditor._create_index_sql.<locals>.<listcomp>c                     s   ˆ d krˆj | |Ž‰ ˆ ˆ ¡S r)   )rC  r[   ©ÚargsÚkwargs©r   r>   r   r   Úcreate_index_nameœ  s    zEBaseDatabaseSchemaEditor._create_index_sql.<locals>.create_index_name)rn   r   rh  rþ   rK   rd  rk  )r   Úget_compilerr8   rc  Úsql_create_indexr"   ry   r   r	   r[   r   Ú_index_columnsr   rW   re  rg  )r>   r'   r‡   r   rì   rh  r„   ri  rI   rj  rd  rk  rl  Úcompilerr…   rþ   rv  rn   rt  r   rs  r   rî   {  s4    ÿ  ÿ

ÿ
ôz*BaseDatabaseSchemaEditor._create_index_sqlc                 C   s&   t |p
| jt|jj| jƒ|  |¡d�S ©N)rn   r   )r   rí   r	   r"   ry   r[   )r>   r'   r   rI   r   r   r   r8  ±  s
    ýz*BaseDatabaseSchemaEditor._delete_index_sqlc                 C   s*   t | jt|jj| jƒ|  |¡|  |¡d�S )N)rn   Úold_nameÚnew_name)r   Úsql_rename_indexr	   r"   ry   r[   )r>   r'   rz  r{  r   r   r   rÚ   ¸  s    üz*BaseDatabaseSchemaEditor._rename_index_sqlc                 C   s   t ||| j|d�S )N)ri  )r   r[   )r>   rn   rþ   ri  rj  r   r   r   rw  À  s    z'BaseDatabaseSchemaEditor._index_columnsc                    sª   ˆ j jrˆ j jsˆ j jrg S g }ˆ j jD ]}| |  ˆ |¡¡ q(ˆ j jD ],}‡ fdd„|D ƒ}| | j	ˆ |dd�¡ qHˆ j j
D ]&}|jr’| jjjr~| | ˆ | ¡¡ q~|S )zŠ
        Return a list of all index SQL statements (field indexes,
        index_together, Meta.indexes) for the specified model.
        c                    s   g | ]}ˆ j  |¡‘qS r   r\   r^   r&   r   r   r_   Ï  s     z?BaseDatabaseSchemaEditor._model_indexes_sql.<locals>.<listcomp>rê   rë   )r"   ÚmanagedÚproxyÚswappedrr   rw   r  Úindex_togetherrT   rî   rõ   rÑ   r8   r;   rÒ   rÓ   )r>   r'   Úoutputr   r†   r‡   rÕ   r   r&   r   rÄ   Ã  s    ÿþz+BaseDatabaseSchemaEditor._model_indexes_sqlc                 C   s*   g }|   ||¡r&| | j||gd�¡ |S )zT
        Return a list of all index SQL statements for the specified field.
        r/  )Ú_field_should_be_indexedrT   rî   )r>   r'   r   r�  r   r   r   r  Ú  s    z+BaseDatabaseSchemaEditor._field_indexes_sqlc                 C   s’   |pt ƒ }| ¡ \}}}}| ¡ \}}}	}
| |j¡D ]}| |d ¡ q6| |j¡D ]}|
 |d ¡ qT|  |j¡|  |j¡kp�|||f||	|
fkS r)   )r2  ÚdeconstructÚunionÚnon_db_attrsÚpopr[   r{   )r>   r.   r0   r-  r  Zold_pathZold_argsZ
old_kwargsÚnew_pathÚnew_argsZ
new_kwargsÚattrr   r   r   r$  ã  s    
ÿþz1BaseDatabaseSchemaEditor._field_should_be_alteredc                 C   s   |j o|j S r)   )r7  rŸ   ©r>   r'   r   r   r   r   r‚  ô  s    z1BaseDatabaseSchemaEditor._field_should_be_indexedc                 C   s   |j  o|j S r)   ©r   ©r>   r.   r0   r   r   r   r4  ÷  s    z2BaseDatabaseSchemaEditor._field_became_primary_keyc                 C   s   |j  o|jo|j p|j S r)   )r   rŸ   rŒ  r   r   r   rA  ú  s
    ÿýz0BaseDatabaseSchemaEditor._unique_should_be_addedc                 C   s*   | j |  |¡|  |j¡|  |j¡|dœ S )N)rn   Z
old_columnZ
new_columnr§   )Úsql_rename_columnr[   r{   )r>   rn   r.   r0   r+  r   r   r   r:    s    

üz*BaseDatabaseSchemaEditor._rename_field_sqlc           
   	   C   sˆ   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||||||	d�S )N)rn   r   r{   rc   rd   r  )r	   r"   ry   r[   r  r   r{   Útarget_fieldr'   r8   rZ   r  r   Úsql_create_fk)
r>   r'   r   rì   rn   r   r{   rc   rd   r  r   r   r   r~   	  s&    
ýùz'BaseDatabaseSchemaEditor._create_fk_sqlc                    s<   ‡ fdd„}t |jj|jgt|jjjjƒd |jjg||ƒS )Nc                     s   ˆ   ˆ j| |Ž¡S r)   ©r[   rC  rp  rC   r   r   Úcreate_fk_name  s    zDBaseDatabaseSchemaEditor._fk_constraint_name.<locals>.create_fk_namerô   )r   r"   ry   r{   r   rŽ  r'   )r>   r'   r   rì   r‘  r   rC   r   r    s    úz,BaseDatabaseSchemaEditor._fk_constraint_namec                 C   s   |   | j||¡S r)   )rû   Úsql_delete_fk©r>   r'   r   r   r   r   r  +  s    z'BaseDatabaseSchemaEditor._delete_fk_sqlc                 C   s,   |d krdS |t jkrdS |t jkr(dS d S )NrM   z DEFERRABLE INITIALLY DEFERREDz DEFERRABLE INITIALLY IMMEDIATE)r   ÚDEFERREDÚ	IMMEDIATE)r>   r  r   r   r   Ú_deferrable_constraint_sql.  s    

z3BaseDatabaseSchemaEditor._deferrable_constraint_sqlc	              	      sŽ   |rˆ j jjsd S |s"|s"|s"|rNˆ j|||||||d�}	|	rJˆ j |	¡ d S ˆ jd ‡ fdd„|D ƒ¡ˆ  |¡dœ }
ˆ j	ˆ  
|¡|
dœ S )N)r   rd  rk  rj  rl  rm   c                    s   g | ]}ˆ   |j¡‘qS r   )r[   r{   r^   rC   r   r   r_   V  s     z8BaseDatabaseSchemaEditor._unique_sql.<locals>.<listcomp>)rþ   r  ©r   rk   )r8   r;   Ú&supports_deferrable_unique_constraintsrq   r@   rT   Úsql_unique_constraintrƒ   r–  Úsql_constraintr[   )r>   r'   r‡   r   rd  r  rk  rj  rl  rI   rk   r   rC   r   Ú_unique_sql6  s4    ÿþù	þþz$BaseDatabaseSchemaEditor._unique_sqlc	                 C   s  |r| j jjr8|r| j jjr8|r*| j jjr8|r<| j jjs<d S t|dd�j| j d�}	|jj	}
dd„ |D ƒ}|d kr‚| j
|
|dd�}n
|  |¡}|sœ|sœ|sœ|r¤| j}n| j}|rÂ| j|
|d|d	�}nt|
||	| jƒ}t|t|
| jƒ|||  |¡|  |¡|  ||¡d
�S )NFrm  r`   c                 S   s   g | ]
}|j ‘qS r   ro  r^   r   r   r   r_   z  s     z?BaseDatabaseSchemaEditor._create_unique_sql.<locals>.<listcomp>Trò   r   )ri  rj  )rn   r   rþ   rd  r  rk  )r8   r;   r˜  Úsupports_partial_indexesrf  rÒ   r   ru  r"   ry   rø   r[   Úsql_create_unique_indexÚsql_create_uniquerw  r   rW   r   r	   re  r–  rg  )r>   r'   r‡   r   rd  r  rk  rj  rl  rx  rn   rþ   rI   r   r   r   rq   ^  sZ    þýûûúúøøÿ
   ÿ

ùz+BaseDatabaseSchemaEditor._create_unique_sqlc                    s&   |r‡ fdd„}nˆ j }t||d|ƒS )Nc                     s   ˆ   ˆ j| |Ž¡S r)   r�  rp  rC   r   r   Úcreate_unique_name–  s    zLBaseDatabaseSchemaEditor._unique_constraint_name.<locals>.create_unique_nameÚ_uniq)rC  r   )r>   rn   rþ   ró   rŸ  r   rC   r   rø   “  s    z0BaseDatabaseSchemaEditor._unique_constraint_namec           	      C   sh   |r| j jjr8|r| j jjr8|r*| j jjr8|r<| j jjs<d S |sL|sL|sL|rT| j}n| j}|  |||¡S r)   )	r8   r;   r˜  rœ  rf  rÒ   rí   ræ   rû   )	r>   r'   r   rd  r  rk  rj  rl  rI   r   r   r   r5  ž  s*    þýûûúúøøz+BaseDatabaseSchemaEditor._delete_unique_sqlc                 C   s    | j |  |¡| jd|i dœ S )Nra   r—  )rš  r[   ru   )r>   r   ra   r   r   r   Ú
_check_sqlº  s    þz#BaseDatabaseSchemaEditor._check_sqlc                 C   s$   t | jt|jj| jƒ|  |¡|d�S )N)rn   r   ra   )r   Úsql_create_checkr	   r"   ry   r[   )r>   r'   r   ra   r   r   r   rD  À  s    üz*BaseDatabaseSchemaEditor._create_check_sqlc                 C   s   | j jjsd S |  | j||¡S r)   )r8   r;   Ú supports_table_check_constraintsrû   Úsql_delete_checkr“  r   r   r   r9  È  s    
z*BaseDatabaseSchemaEditor._delete_check_sqlc                 C   s    t |t|jj| jƒ|  |¡d�S ry  )r   r	   r"   ry   r[   )r>   Útemplater'   r   r   r   r   rû   Í  s
    ýz/BaseDatabaseSchemaEditor._delete_constraint_sqlc
              	      s  |dk	r‡ fdd„|D ƒ}ˆ j  ¡ �}
ˆ j j |
|jj¡}W 5 Q R X g }| ¡ D ]²\}}|dksl||d krP|dk	r‚|d |kr‚qP|dk	r˜|d |kr˜qP|dk	r®|d |kr®qP|dk	rÄ|d |krÄqP|dk	rÖ|d	 sÖqP|dk	rì|d
 |krìqP|	rø||	krP| |¡ qP|S )z@Return all constraint names matching the columns and conditions.Nc                    s@   g | ]8}ˆ j jjr.ˆ j j t|ˆ j j ¡ ƒ¡nˆ j j |¡‘qS r   )r8   r;   Útruncates_namesÚintrospectionÚidentifier_converterr   rZ   r]  )r,   r   rC   r   r   r_   â  s   þý
ÿz>BaseDatabaseSchemaEditor._constraint_names.<locals>.<listcomp>rþ   rŸ   r   rÕ   ra   r  r§   )r8   rX   r§  Úget_constraintsr"   ry   ÚitemsrT   )r>   r'   r`  rŸ   r   rÕ   r  ra   r.  rñ   rX   r�   Úresultr   Zinfodictr   rC   r   rö   Ô  s6    
ú ÿz*BaseDatabaseSchemaEditor._constraint_namesc                 C   sV   | j |dd�}|r6t|ƒdkr6tdt|ƒ|jjf ƒ‚|D ]}|  |  ||¡¡ q:d S )NTr‹  rô   z0Found wrong number (%s) of PK constraints for %s)rö   rù   rú   r"   ry   rD   Ú_delete_primary_key_sql)r>   r'   r'  rÿ   rE  r   r   r   r@    s    þÿÿz,BaseDatabaseSchemaEditor._delete_primary_keyc              
   C   sJ   t | jt|jj| jƒ|  | j|jj|jgdd�¡t|jj|jg| jƒd�S )NZ_pkr1  )rn   r   rþ   )	r   Úsql_create_pkr	   r"   ry   r[   rC  r{   r   rŠ  r   r   r   rB    s      ÿÿøz0BaseDatabaseSchemaEditor._create_primary_key_sqlc                 C   s   |   | j||¡S r)   )rû   Úsql_delete_pkr“  r   r   r   r¬    s    z0BaseDatabaseSchemaEditor._delete_primary_key_sqlc                 C   s   |rd|   |¡ S dS )NzCOLLATE rM   )r[   )r>   rŒ   rF  r_  r   r   r   r‘     s    z%BaseDatabaseSchemaEditor._collate_sqlc                 C   s*   | j |  |¡d |¡dœ }|  |¡ d S )Nú,)Z	procedureÚparam_types)Úsql_delete_procedurer[   rƒ   rD   )r>   Zprocedure_namer°  rI   r   r   r   Úremove_procedure   s
    þz)BaseDatabaseSchemaEditor.remove_procedure)FT)r   )F)F)F)F)rM   )N)N)N)NNNNN)NNNNNN)T)NNNNN)NNNNNNNN)F)NN)r   )pÚ__name__Ú
__module__Ú__qualname__Ú__doc__r‚   r  r	  rË   r  r  rS  rN  rO  rR  rQ  rP  r   r�  r?  r™  ru   Zsql_delete_constraintrš  r¢  r¤  rž  ræ   r�  r|   r  r’  rv  r�  r|  rí   r­  r®  r±  r  rT  r?   rB   rE   rD   r[   r‹   r¦   rs   r–   r—   r›   r™   Ústaticmethodr¾   r˜   rW   rÈ   rÊ   rÖ   rØ   rÝ   rß   rà   ré   rï   rå   r  rÂ   r
  r  r#  r,  r&  r<  r  r;  rÃ   r”   r%  rC  rc  re  rg  rî   r8  rÚ   rw  rÄ   r  r$  r‚  r4  rA  r:  r~   r  r  r–  r›  rq   rø   r5  r¡  rD  r9  rû   rö   r@  rB  r¬  r‘   r²  r   r   r   r   r7   K   s4  ÿÿÿÿÿÿÿ
		
S9
	
$	
"	V 
I ÷
  \
&. 
 
ò6
	
     ÷
,      ÷
5
     ø

        ö
-

r7   ) Ú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   Ú	getLoggerrP   r   r(   r2   r7   r   r   r   r   Ú<module>   s    
