U
    }®crò  ã                   @   s°   d dl Z d dlmZ d dlmZmZmZmZmZmZ d dl	m
Z
mZ d dlmZmZ d dlmZ d dlmZmZ d dlmZ e  d	¡Zd
d„ Zdd„ Zdd„ ZG dd„ dƒZdS )é    N)Údatetime)ÚColumnsÚExpressionsÚForeignKeyNameÚ	IndexNameÚ	StatementÚTable)Únames_digestÚsplit_identifier)Ú
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_keyZ	to_fieldsÚname)ZrelationZaltered_fieldr   © r   úB/tmp/pip-unpacked-wheel-7m9rsep5/django/db/backends/base/schema.pyÚ_is_relevant_relation   s    r   c                 C   s   | j jdddd�S )NFT)ZforwardÚreverseZinclude_hidden)Ú_metaZ_get_fields©Úmodelr   r   r   Ú_all_related_fields    s    r   c                    s2   t ‡fdd„tˆjƒD ƒ‡ fdd„tˆ jƒD ƒƒS )Nc                 3   s   | ]}t |ˆ ƒr|V  qd S ©N©r   ©Ú.0Úobj)Ú	old_fieldr   r   Ú	<genexpr>(   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   )r"   r$   r   )r$   r"   r   Ú_related_non_m2m_objects$   s    þr&   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dZeZdZeZdZdZdZeZdZ dZ!dZ"dZ#eZ$dZ%d£d d!„Z&d"d#„ Z'd$d%„ Z(d¤d'd(„Z)d)d*„ Z*d+d,„ Z+d¥d-d.„Z,d/d0„ Z-d1d2„ Z.d3d4„ Z/e0d5d6„ ƒZ1d7d8„ Z2d9d:„ Z3d;d<„ Z4d=d>„ Z5d?d@„ Z6dAdB„ Z7dCdD„ Z8dEdF„ Z9dGdH„ Z:dIdJ„ Z;dKdL„ Z<dMdN„ Z=dOdP„ Z>dQdR„ Z?dSdT„ Z@d¦dUdV„ZAd§dWdX„ZBdYdZ„ ZCd¨d[d\„ZDd]d^„ ZEd_d`„ ZFdadb„ ZGd©ddde„ZHdªdfdg„ZIdhdi„ ZJdjdk„ ZKdddcdcdd&dd&ddddlœdmdn„ZLd«dodp„ZMdqdr„ ZNdsdt„ ZOdudv„ ZPdwdx„ ZQdydz„ ZRd{d|„ ZSd}d~„ ZTdd€„ ZUd�d‚„ ZVdƒd„„ ZWd…d†„ ZXd‡dˆ„ ZYd¬d‰dŠ„ZZd­d‹dŒ„Z[d®d�dŽ„Z\d�d�„ Z]d‘d’„ Z^d“d”„ Z_d•d–„ Z`d¯d—d˜„Zad°d™dš„Zbd›dœ„ Zcd�dž„ ZddŸd „ Zed±d¡d¢„Zfd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)sz%ALTER COLUMN %(column)s TYPE %(type)sz%ALTER COLUMN %(column)s DROP NOT NULLz$ALTER COLUMN %(column)s SET NOT NULLz/ALTER COLUMN %(column)s SET DEFAULT %(default)sz$ALTER COLUMN %(column)s DROP DEFAULTz2ALTER COLUMN %(column)s TYPE %(type)s%(collation)sz4ALTER TABLE %(table)s DROP COLUMN %(column)s CASCADEzDALTER TABLE %(table)s RENAME COLUMN %(old_column)s TO %(new_column)szFUPDATE %(table)s SET %(column)s = %(default)s WHERE %(column)s IS NULLz"UNIQUE (%(columns)s)%(deferrable)szCHECK (%(check)s)z.ALTER TABLE %(table)s DROP CONSTRAINT %(name)sz"CONSTRAINT %(name)s %(constraint)sz?ALTER TABLE %(table)s ADD CONSTRAINT %(name)s CHECK (%(check)s)zPALTER TABLE %(table)s ADD CONSTRAINT %(name)s UNIQUE (%(columns)s)%(deferrable)sz|ALTER TABLE %(table)s ADD CONSTRAINT %(name)s FOREIGN KEY (%(column)s) REFERENCES %(to_table)s (%(to_column)s)%(deferrable)sNzQCREATE INDEX %(name)s ON %(table)s (%(columns)s)%(include)s%(extra)s%(condition)szOCREATE UNIQUE INDEX %(name)s ON %(table)s (%(columns)s)%(include)s%(condition)szDROP INDEX %(name)szGALTER TABLE %(table)s ADD CONSTRAINT %(name)s PRIMARY KEY (%(columns)s)zDROP PROCEDURE %(procedure)sFTc                 C   s,   || _ || _| jrg | _| j jjo$|| _d S r   )Ú
connectionÚcollect_sqlÚcollected_sqlÚfeaturesÚcan_rollback_ddlÚatomic_migration)Úselfr(   r)   r   r   r   r   Ú__init__c   s
    z!BaseDatabaseSchemaEditor.__init__c                 C   s(   g | _ | jr$t| jjƒ| _| j ¡  | S r   )Údeferred_sqlr-   r   r(   ÚaliasÚ	__enter__©r.   r   r   r   r2   l   s
    
z"BaseDatabaseSchemaEditor.__enter__c                 C   s8   |d kr| j D ]}|  |¡ q| jr4| j |||¡ d S r   )r0   Úexecuter-   r   Ú__exit__)r.   Úexc_typeÚ	exc_valueÚ	tracebackÚsqlr   r   r   r5   s   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¡rTd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))Úparamsr9   )Úextraú;Ú N)r)   r(   Zin_atomic_blockr+   r,   r   ÚstrÚloggerÚdebugÚendswithr*   ÚappendÚtupleÚmapÚquote_valueÚcursorr4   )r.   r9   r:   ZendingrF   r   r   r   r4   |   s    ÿ"z BaseDatabaseSchemaEditor.executec                 C   s   | j j |¡S r   )r(   ÚopsÚ
quote_name)r.   r   r   r   r   rH   “   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  |¡j‘qS r   ©r   Ú	get_fieldÚcolumn©r    r   r   r   r   Ú
<listcomp>›   s     z6BaseDatabaseSchemaEditor.table_sql.<locals>.<listcomp>N©r(   Úcheckú ú %s)Úto_tableÚ	to_columnú_fk_%(to_table)s_%(to_column)sz%s %s)Z	AutoFieldZBigAutoFieldZSmallAutoFieldc                    s   g | ]}|  ˆ ˆ¡‘qS r   )Zconstraint_sql©r    Ú
constraint©r   r.   r   r   rM   Ä   s     ú, c                 s   s   | ]}|r|V  qd S r   r   rU   r   r   r   r#   Ç   s      z5BaseDatabaseSchemaEditor.table_sql.<locals>.<genexpr>)ÚtableÚ
definition) r   Zunique_togetherr0   rB   Ú_create_unique_sqlÚlocal_fieldsÚ
column_sqlÚdb_parametersr(   Úsql_check_constraintZdb_type_suffixÚextendÚremote_fieldÚdb_constraintr   Údb_tablerJ   Ú
field_namerK   Úsql_create_inline_fkrH   r+   Úsupports_foreign_keysÚ_create_fk_sqlÚget_internal_typerG   Úautoinc_sqlÚconstraintsÚsql_create_tableÚjoinÚdb_tablespaceÚtablespace_sql)r.   r   ÚfieldsÚcolumnsZcolumn_sqlsr:   r   rZ   Zextra_paramsÚ	db_paramsZcol_type_suffixrR   rS   ri   rj   r9   rn   r   rW   r   Ú	table_sql–   sX    
þ
þþ
z"BaseDatabaseSchemaEditor.table_sqlc                 C   sX  |j | jd�}|d }g }|dkr&dS t|ddƒ}|rD||  |¡7 }|j}|oX|  |¡ }|r®|  |¡}	d|  |¡ }
|	dk	r®| jjj	rœ||
|  
|	¡ 7 }n||
7 }||	g7 }|jrÈ|jsÈ| jjjrÈd}|rà| jjjsà|d7 }n|sì|d	7 }|jrü|d
7 }n|j�r|d7 }|j�p|jj}|�rP| jjj�rP|j�rP|d| jjj|dd� 7 }||fS )z‹
        Take a field and return its column definition.
        The field must already have had set_attributes_from_name() called.
        rN   ÚtypeN)NNÚdb_collationz	 DEFAULT Tz NULLz	 NOT NULLz PRIMARY KEYz UNIQUErQ   )Úinline)r^   r(   ÚgetattrÚ_collate_sqlÚnullÚskip_defaultÚeffective_defaultÚ_column_default_sqlr+   Úrequires_literal_defaultsÚprepare_defaultÚempty_strings_allowedr   Ú!interprets_empty_strings_as_nullsZimplied_column_nullÚuniquerm   r   Zsupports_tablespacesrG   rn   )r.   r   r   Úinclude_defaultrq   r9   r:   Ú	collationrx   Údefault_valueZcolumn_defaultZ
tablespacer   r   r   r]   Ñ   sD    


ÿ

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   ry     s    z%BaseDatabaseSchemaEditor.skip_defaultc                 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št ¡ }|  ¡ }|dkrv| 	¡ }qž|dkrˆ| 
¡ }qž|d	kržt ¡ }nd }|S )
NZBinaryFieldó    r=   Zauto_nowFZauto_now_addZ	DateFieldZ	TimeFieldZDateTimeField)Úhas_defaultÚget_defaultrx   Úblankr~   rh   rv   r   ÚnowÚdateÚtimer   )r   ÚdefaultZinternal_typer   r   r   Ú_effective_default  s"    



z+BaseDatabaseSchemaEditor._effective_defaultc                 C   s   |  |  |¡| j¡S )z2Return a field's effective database default value.)Zget_db_prep_saver’   r(   r„   r   r   r   rz   4  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   rE   8  s    z$BaseDatabaseSchemaEditor.quote_valuec                 C   s\   |   |¡\}}|  ||pd¡ | j |  |¡¡ |jjD ]}|jjjj	r8|  
|jj¡ q8dS )zr
        Create a table and any accompanying indexes or unique constraints for
        the given `model`.
        N)rr   r4   r0   r`   Ú_model_indexes_sqlr   Úlocal_many_to_manyra   ÚthroughÚauto_createdÚcreate_model)r.   r   r9   r:   r   r   r   r   r—   D  s    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.rY   N)r   r”   ra   r•   r–   Údelete_modelr4   Úsql_delete_tablerH   rc   Úlistr0   Ú
isinstancer   Zreferences_tableÚremove)r.   r   r   r9   r   r   r   r˜   U  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©r:   )Úcontains_expressionsr(   r+   Úsupports_expression_indexesr4   Ú
create_sql©r.   r   Úindexr   r   r   Ú	add_indexe  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ž   r(   r+   rŸ   r4   Ú
remove_sqlr¡   r   r   r   Úremove_indexp  s    ÿþz%BaseDatabaseSchemaEditor.remove_indexc                 C   s"   |  || ¡}|r| j|dd� dS )zAdd a constraint to a model.Nr�   )r    r4   ©r.   r   rV   r9   r   r   r   Úadd_constrainty  s    z'BaseDatabaseSchemaEditor.add_constraintc                 C   s   |  || ¡}|r|  |¡ dS )z!Remove a constraint from a model.N)r¤   r4   r¦   r   r   r   Úremove_constraint�  s    z*BaseDatabaseSchemaEditor.remove_constraintc                    sz   dd„ |D ƒ}dd„ |D ƒ}|  |¡D ]}|  ˆ |ddi| j¡ q&|  |¡D ](}‡ fdd„|D ƒ}|  |  ˆ |¡¡ qLd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   ©rC   ©r    ro   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     r€   Tc                    s   g | ]}ˆ j  |¡j‘qS r   rI   rL   r   r   r   rM   ”  s     zBBaseDatabaseSchemaEditor.alter_unique_together.<locals>.<listcomp>N)Ú
differenceÚ_delete_composed_indexÚsql_delete_uniquer4   r[   )r.   r   Zold_unique_togetherZnew_unique_togetherÚoldsÚnewsro   rp   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   rJ   rL   r   r   r   rM   ©  s     zABaseDatabaseSchemaEditor.alter_index_together.<locals>.<listcomp>Ú_idx©ro   ÚsuffixN)r¬   r­   Úsql_delete_indexr4   Ú_create_index_sql)r.   r   Zold_index_togetherZnew_index_togetherr¯   r°   ro   Úfield_namesr   r   r   Úalter_index_together—  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|—Ž}t|ƒdkr~tdt|ƒˆ j jd	 |¡f ƒ‚|  |  	|ˆ |d
 ¡¡ d S )Nc                 S   s   h | ]
}|j ’qS r   ©r   rU   r   r   r   r«   ­  s     zBBaseDatabaseSchemaEditor._delete_composed_index.<locals>.<setcomp>c                 S   s   h | ]
}|j ’qS r   rº   rU   r   r   r   r«   ®  s     c                    s   g | ]}ˆ j  |¡j‘qS r   rI   rL   r   r   r   rM   ¯  s     zCBaseDatabaseSchemaEditor._delete_composed_index.<locals>.<listcomp>Úexcludeé   z1Found wrong number (%s) of constraints for %s(%s)rX   r   )
r   rj   ÚindexesÚ_constraint_namesÚlenÚ
ValueErrorrc   rl   r4   Ú_delete_constraint_sql)	r.   r   ro   Zconstraint_kwargsr9   Úmeta_constraint_namesÚmeta_index_namesrp   Úconstraint_namesr   r   r   r­   ¬  s$     ÿÿþý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)r(   r+   Zignores_table_name_caseÚlowerr4   Úsql_rename_tablerH   r0   r›   r   Zrename_table_references)r.   r   Zold_db_tableZnew_db_tabler9   r   r   r   Úalter_db_table¼  s    ÿþþ


z'BaseDatabaseSchemaEditor.alter_db_tablec                 C   s2   |   | j|  |jj¡|  |¡|  |¡dœ ¡ dS )z)Move a model's table between tablespaces.)rY   Zold_tablespaceZnew_tablespaceN)r4   Úsql_retablespace_tablerH   r   rc   )r.   r   Zold_db_tablespaceZnew_db_tablespacer   r   r   Úalter_db_tablespaceË  s
    ýz,BaseDatabaseSchemaEditor.alter_db_tablespacec              
   C   sè  |j r |jjjjr |  |jj¡S | j||dd�\}}|dkr@dS |j| jd�}|d rh|d| j	|  7 }|j�r2| jj
j�r2|j�r2d}| 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 !|  "||¡¡ | jj
j#�rä| 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�   NrN   rO   rP   rT   z%s.r=   )r   Ú	namespacerK   rR   rS   Ú
deferrable)rY   rK   rZ   ©Údrop©rY   Úchanges)%r   ra   r•   r   r–   r—   r]   r^   r(   r_   r+   rf   rb   Úsql_create_column_inline_fkr   rc   rJ   rd   rK   r
   Ú_fk_constraint_namerH   rG   Údeferrable_sqlr0   rB   rg   Úsql_create_columnr4   ry   rz   Ú_alter_column_default_sqlÚsql_alter_columnr`   Ú_field_indexes_sqlÚconnection_persists_old_columnsÚclose)r.   r   r   rZ   r:   rq   Zconstraint_suffixrR   rS   rÊ   Ú_r9   Úchanges_sqlr   r   r   Ú	add_fieldÓ  sN    

ú

ýþ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.
        rN   rs   NT©Úforeign_key)rY   rK   )r   ra   r•   r   r–   r˜   r^   r(   r¾   rK   r4   Ú_delete_fk_sqlÚsql_delete_columnrH   rc   r+   r×   rØ   rš   r0   r›   r   Zreferences_columnrœ   )r.   r   r   Úfk_namesÚfk_namer9   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.
        NrN   rs   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_alteredr^   r(   ra   rÀ   r•   r   r–   Ú_alter_many_to_manyÚ_alter_field)	r.   r   r"   r$   ÚstrictÚold_db_paramsÚold_typeÚnew_db_paramsÚnew_typer   r   r   Úalter_field*  s^    ÿÿþÿÿÿ
þ
ýÿÿ
þ
ýþÿ  ÿz$BaseDatabaseSchemaEditor.alter_fieldc	           )      C   sœ  t ƒ }	| jjjr†|jr†|jr†| j||jgdd�}
|r\t|
ƒdkr\t	dt|
ƒ|j
j|jf ƒ‚|
D ]$}|	 |jf¡ |  |  ||¡¡ q`|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ü| jjj�oF|j�r0|j�s@|j�oF|j�oF||k}|�rœt||ƒD ]B\}}| j|j|jjgdd�}|D ]}|  |  |j|¡¡ �q|�qX|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�}|�rzt|ƒdk�rzt	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 }t"|ddƒ}t"|ddƒ}||k�r:|  #||||¡}| $|¡ n2||k�rl|  %||||¡\}}| $|¡ | &|¡ d}|j'�rÌ|j'�sÌ|  (|¡}|  (|¡} |  )|¡�sÌ|| k�rÌ| dk	�rÌd}| $|  *|||¡¡ |j'|j'k�rø|  +|||¡}|�rø| $|¡ | ,¡ �o|j'�o|j' }!|�s|�rü|!�s,|| }| jjj-�rd|�rdt.t/|Ž ƒ\}}"d 0|¡t1|"g ƒfg}|D ],\}}"|  | j2|  3|j
j¡|dœ |"¡ �qh|!�rü|  | j4|  3|j
j¡|  3|j¡ddœ | g¡ |D ],\}}"|  | j2|  3|j
j¡|dœ |"¡ �qÎ|�r|D ]\}}"|  ||"¡ �q|j�r:|j�s:|  5||¡ |  6||¡�r^|  |  7||jg¡¡ |j�rn|j�r”|j�r”|j�s”|  | j8||gd�¡ g }#|�r®|# &t||ƒ¡ |  ||¡�rÞ|  |  9||¡¡ |# &t||ƒ¡ |#D ]„\}$}|jj:| jd�}%|%d }&|  %|j|$j|j|&¡\}}|  | j2|  3|jj
j¡|d dœ |d ¡ |D ]\}}"|  ||"¡ �qL�qâ| jjj�r®|j�r®|	�s’|j�r’|j�s®|j�r®|  |  ;||d¡¡ |�rô|j<j
j=D ]4}'t>|'|ƒ�r¾|'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�\}(}"| j2|  3|j
j¡|(dœ }|  ||"¡ | jjjA�r˜| j B¡  dS )z3Perform a "physical" (non-ManyToMany) field update.TrÜ   r¼   z<Found wrong number (%s) of foreign key constraints for %s.%sc                 S   s   h | ]
}|j ’qS r   rº   rU   r   r   r   r«   l  s     z8BaseDatabaseSchemaEditor._alter_field.<locals>.<setcomp>F)r€   r   r»   z7Found wrong number (%s) of unique constraints for %s.%sc                 S   s   h | ]
}|j ’qS r   rº   )r    r¢   r   r   r   r«   –  s     )r¢   Útype_r»   rO   c                 S   s   h | ]
}|j ’qS r   rº   rU   r   r   r   r«   ¤  s     )rO   r»   z6Found wrong number (%s) of check constraints for %s.%srt   NrX   rÎ   r‰   )rY   rK   r‘   ©ro   rN   rs   r   rT   Z_fkÚ_check©rµ   rÌ   )CÚsetr(   r+   rf   ra   rb   r¾   rK   r¿   rÀ   r   rc   Úaddr4   rÞ   r€   Ú_field_became_primary_keyrj   Ú_delete_unique_sqlr   r&   Zrelated_modelr   Údb_indexr½   r   rµ   Ú_delete_index_sqlÚ_delete_check_sqlÚ_rename_field_sqlr0   r›   r   Zrename_column_referencesrv   Ú_alter_column_collation_sqlrB   Ú_alter_column_type_sqlr`   rx   rz   ry   rÔ   Ú_alter_column_null_sqlr‹   Zsupports_combined_altersrC   r%   rl   ÚsumrÕ   rH   Úsql_update_with_defaultÚ_delete_primary_keyÚ_unique_should_be_addedr[   r·   Ú_create_primary_key_sqlr^   rg   r   Zrelated_objectsr   Ú_create_index_nameÚ_create_check_sqlr×   rØ   ))r.   r   r"   r$   rè   rê   rç   ré   ræ   Zfks_droppedrà   rá   rÂ   rÄ   Úconstraint_nameZdrop_foreign_keysZ_old_relZnew_relZrel_fk_namesrÃ   Zindex_namesÚ
index_namer9   ÚactionsZnull_actionsZpost_actionsZold_collationÚnew_collationÚfragmentZother_actionsZneeds_database_defaultZold_defaultÚnew_defaultZfour_way_default_alterationr:   Zrels_to_updateZold_relZrel_db_paramsZrel_typeÚrelrÚ   r   r   r   rå   U  s”   ÿþýý   þýþü  ÿ    þ  þý






ÿþý

þþû
ýú
þû
    ÿþûÿÿÿþþz%BaseDatabaseSchemaEditor._alter_fieldc                 C   s\   | j jjr| ¡ dkrdS |j| j d�}|jr4| 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.
        )Z	CharFieldZ	TextFieldNrN   rs   ©rK   rs   )
r(   r+   r   rh   r^   rx   Úsql_alter_column_nullÚsql_alter_column_not_nullrH   rK   )r.   r   r"   r$   ré   r9   r   r   r   rú   T  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.
        rN   rs   )rK   rs   r‘   )rz   r{   r(   r+   r|   r}   r^   rx   Ú sql_alter_column_no_default_nullÚsql_alter_column_no_defaultÚsql_alter_column_defaultrH   rK   )
r.   r   r"   r$   rÍ   r  r‘   r:   ré   r9   r   r   r   rÔ   j  s*    




ýúz2BaseDatabaseSchemaEditor._alter_column_default_sqlc                 C   s    | j |  |j¡|dœ g fg fS )a–  
        Hook to specialize column type alteration for different backends,
        for cases when a creation type is different to an alteration type
        (e.g. SERIAL in PostgreSQL, PostGIS fields).

        Return a two-tuple of: an SQL fragment of (sql, params) to insert into
        an ALTER TABLE statement and a list of extra (sql, params) tuples to
        run once the field is altered.
        r	  )Úsql_alter_column_typerH   rK   )r.   r   r"   r$   rê   r   r   r   rù   �  s    
þûøz/BaseDatabaseSchemaEditor._alter_column_type_sqlc                 C   s,   | j |  |j¡||r|  |¡nddœ g fS )Nr=   )rK   rs   r‚   )Úsql_alter_column_collaterH   rK   rw   )r.   r   r$   rê   r  r   r   r   rø   ¤  s    
ýúz4BaseDatabaseSchemaEditor._alter_column_collation_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)	ra   r•   r   rc   rÇ   rë   rJ   Zm2m_reverse_field_nameZm2m_field_name)r.   r   r"   r$   ræ   r   r   r   rä   ®  s    
ÿûüz,BaseDatabaseSchemaEditor._alter_many_to_manyr=   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	   r(   rG   Zmax_name_lengthrl   r¿   Úisdigit)	r.   Z
table_nameÚcolumn_namesrµ   rÙ   Zhash_suffix_partÚ
max_lengthr  Zother_lengthr   r   r   r   Ã  s"    
ýz+BaseDatabaseSchemaEditor._create_index_namec                 C   sX   |d kr:t |ƒdkr*|d jr*|d j}n|jjr:|jj}|d k	rTd| jj |¡ S dS )Nr¼   r   rP   r=   )r¿   rm   r   r(   rG   rn   )r.   r   ro   rm   r   r   r   Ú_get_index_tablespace_sqlà  s    z2BaseDatabaseSchemaEditor._get_index_tablespace_sqlc                 C   s   |rd| S dS )Nz WHERE r=   r   )r.   Ú	conditionr   r   r   Ú_index_condition_sqlê  s    z-BaseDatabaseSchemaEditor._index_condition_sqlc                 C   s,   |r| j jjsdS tdt|jj|| jƒd�S )Nr=   z INCLUDE (%(columns)s))rp   )r(   r+   Úsupports_covering_indexesr   r   r   rc   rH   )r.   r   rp   r   r   r   Ú_index_include_sqlï  s    þz+BaseDatabaseSchemaEditor._index_include_sql)ro   r   rµ   Úusingrm   Úcol_suffixesr9   Ú	opclassesr  Ú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)Z
alias_colsrN   )rm   c                 S   s   g | ]
}|j ‘qS r   )rK   rL   r   r   r   rM     s     z>BaseDatabaseSchemaEditor._create_index_sql.<locals>.<listcomp>c                     s   ˆ d krˆj | |Ž‰ ˆ ˆ ¡S r   )r   rH   ©ÚargsÚkwargs©r   r.   r   r   Úcreate_index_name	  s    zEBaseDatabaseSchemaEditor._create_index_sql.<locals>.create_index_name)rY   r   r  rp   r;   r  r"  )r   Zget_compilerr(   r  Úsql_create_indexr   rc   r   r   rH   r   Ú_index_columnsr   rE   r  r  )r.   r   ro   r   rµ   r  rm   r   r9   r!  r  r"  r#  Úcompilerrn   rp   r)  rY   r(  r   r'  r   r·   ÷  s,    ÿ

ÿ
ôz*BaseDatabaseSchemaEditor._create_index_sqlc                 C   s&   t |p
| jt|jj| jƒ|  |¡d�S ©N)rY   r   )r   r¶   r   r   rc   rH   )r.   r   r   r9   r   r   r   rõ     s
    ýz*BaseDatabaseSchemaEditor._delete_index_sqlc                 C   s   t ||| j|d�S )N)r   )r   rH   )r.   rY   rp   r   r!  r   r   r   r*  %  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²   rL   r   r   r   rM   4  s     z?BaseDatabaseSchemaEditor._model_indexes_sql.<locals>.<listcomp>r³   r´   )r   ZmanagedÚproxyZswappedr\   r`   rÖ   Zindex_togetherrB   r·   r½   rž   r(   r+   rŸ   r    )r.   r   Úoutputr   r¸   ro   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_indexedrB   r·   )r.   r   r   r.  r   r   r   rÖ   ?  s    z+BaseDatabaseSchemaEditor._field_indexes_sqlc                 C   sˆ   |  ¡ \}}}}|  ¡ \}}}}	ddddddddd	d
dg}
|
D ]}| |d ¡ |	 |d ¡ q>|  |j¡|  |j¡kp†|||f|||	fkS )Nr�   Z	db_columnÚeditableZerror_messagesÚ	help_textZlimit_choices_toZ	on_deleteZrelated_nameZrelated_query_nameZ
validatorsZverbose_name)ZdeconstructÚpoprH   rK   )r.   r"   r$   rÙ   Úold_pathZold_argsZ
old_kwargsÚnew_pathÚnew_argsZ
new_kwargsZnon_database_attrsÚattrr   r   r   rã   H  s(    ôþz1BaseDatabaseSchemaEditor._field_should_be_alteredc                 C   s   |j o|j S r   )rô   r€   ©r.   r   r   r   r   r   r/  e  s    z1BaseDatabaseSchemaEditor._field_should_be_indexedc                 C   s   |j  o|j S r   ©r   ©r.   r"   r$   r   r   r   rò   h  s    z2BaseDatabaseSchemaEditor._field_became_primary_keyc                 C   s"   |j  r|j p |jo |j o |j S r   )r€   r   r9  r   r   r   rþ   k  s    ÿz0BaseDatabaseSchemaEditor._unique_should_be_addedc                 C   s*   | j |  |¡|  |j¡|  |j¡|dœ S )N)rY   Z
old_columnZ
new_columnrs   )Úsql_rename_columnrH   rK   )r.   rY   r"   r$   rê   r   r   r   r÷   p  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)rY   r   rK   rR   rS   rË   )r   r   rc   rH   rÑ   r   rK   Útarget_fieldr   r(   rG   rÒ   r   Úsql_create_fk)
r.   r   r   rµ   rY   r   rK   rR   rS   rË   r   r   r   rg   x  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   ©rH   r   r$  r3   r   r   Úcreate_fk_nameŠ  s    zDBaseDatabaseSchemaEditor._fk_constraint_name.<locals>.create_fk_namer¼   )r   r   rc   rK   r
   r;  r   )r.   r   r   rµ   r>  r   r3   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 )Nr=   z DEFERRABLE INITIALLY DEFERREDz DEFERRABLE INITIALLY IMMEDIATE)r   ZDEFERREDZ	IMMEDIATE)r.   rË   r   r   r   Ú_deferrable_constraint_sql™  s    

z3BaseDatabaseSchemaEditor._deferrable_constraint_sqlc           
      C   s‚   |r| j jjsd S |s|s|rH| j||||||d�}|rD| j |¡ d S | jd t| j	|ƒ¡|  
|¡dœ }	| j|  	|¡|	dœ S )N)r   r  r"  r!  rX   )rp   rË   ©r   rV   )r(   r+   Ú&supports_deferrable_unique_constraintsr[   r0   rB   Úsql_unique_constraintrl   rD   rH   rA  Úsql_constraint)
r.   r   ro   r   r  rË   r"  r!  r9   rV   r   r   r   Ú_unique_sql¡  s2    ÿþúþþz$BaseDatabaseSchemaEditor._unique_sqlc                    sÆ   |rˆ j jjr*|rˆ j jjr*|r.ˆ j jjs.d S ‡ fdd„}t|jjˆ jƒ}	|d krft	|jj|d|ƒ}n
ˆ  |¡}ˆ j
|	|d|d�}|sŽ|sŽ|r–ˆ j}
nˆ j}
t|
|	||ˆ  |¡ˆ  |¡ˆ  ||¡d�S )Nc                     s   ˆ   ˆ j| |Ž¡S r   r=  r$  r3   r   r   Úcreate_unique_nameÏ  s    zGBaseDatabaseSchemaEditor._create_unique_sql.<locals>.create_unique_nameÚ_uniqr   )r   r!  )rY   r   rp   r  rË   r"  )r(   r+   rC  Úsupports_partial_indexesr  r   r   rc   rH   r   r*  Úsql_create_unique_indexÚsql_create_uniquer   r  rA  r  )r.   r   rp   r   r  rË   r"  r!  rG  rY   r9   r   r3   r   r[   Á  s>    þýûûúú

ùz+BaseDatabaseSchemaEditor._create_unique_sqlc                 C   sV   |r| j jjr*|r| j jjr*|r.| j jjs.d S |s:|s:|rB| j}n| j}|  |||¡S r   )r(   r+   rC  rI  r  r¶   r®   rÁ   )r.   r   r   r  rË   r"  r!  r9   r   r   r   ró   æ  s"    þýûûúúz+BaseDatabaseSchemaEditor._delete_unique_sqlc                 C   s    | j |  |¡| jd|i dœ S )NrO   rB  )rE  rH   r_   )r.   r   rO   r   r   r   Ú
_check_sqlù  s    þz#BaseDatabaseSchemaEditor._check_sqlc                 C   s$   t | jt|jj| jƒ|  |¡|d�S )N)rY   r   rO   )r   Úsql_create_checkr   r   rc   rH   )r.   r   r   rO   r   r   r   r  ÿ  s    üz*BaseDatabaseSchemaEditor._create_check_sqlc                 C   s   |   | j||¡S r   )rÁ   Úsql_delete_checkr@  r   r   r   rö     s    z*BaseDatabaseSchemaEditor._delete_check_sqlc                 C   s    t |t|jj| jƒ|  |¡d�S r,  )r   r   r   rc   rH   )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 | ]}ˆ j j |¡‘qS r   )r(   ÚintrospectionZidentifier_converter)r    r   r3   r   r   rM     s   ÿz>BaseDatabaseSchemaEditor._constraint_names.<locals>.<listcomp>rp   r€   r   r¢   rO   rÝ   rs   )r(   rF   rP  Zget_constraintsr   rc   ÚitemsrB   )r.   r   r  r€   r   r¢   rÝ   rO   rì   r»   rF   rj   Úresultr   Zinfodictr   r3   r   r¾     s0    
þz*BaseDatabaseSchemaEditor._constraint_namesc                 C   sV   | j |dd�}|r6t|ƒdkr6tdt|ƒ|jjf ƒ‚|D ]}|  |  ||¡¡ q:d S )NTr8  r¼   z0Found wrong number (%s) of PK constraints for %s)r¾   r¿   rÀ   r   rc   r4   Ú_delete_primary_key_sql)r.   r   ræ   rÄ   r  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_pkrï   )rY   r   rp   )	r   Úsql_create_pkr   r   rc   rH   r   rK   r   r7  r   r   r   rÿ   9  s    ÿúz0BaseDatabaseSchemaEditor._create_primary_key_sqlc                 C   s   |   | j||¡S r   )rÁ   Úsql_delete_pkr@  r   r   r   rS  C  s    z0BaseDatabaseSchemaEditor._delete_primary_key_sqlc                 C   s   d|   |¡ S )Nz	 COLLATE )rH   )r.   r‚   r   r   r   rw   F  s    z%BaseDatabaseSchemaEditor._collate_sqlc                 C   s*   | j |  |¡d |¡dœ }|  |¡ d S )Nú,)Z	procedureÚparam_types)Úsql_delete_procedurerH   rl   r4   )r.   Zprocedure_namerW  r9   r   r   r   Úremove_procedureI  s
    þz)BaseDatabaseSchemaEditor.remove_procedure)FT)r   )F)F)F)F)r=   )N)N)NNNN)NNNNN)NNNN)NNNNNNNN)F)r   )gÚ__name__Ú
__module__Ú__qualname__Ú__doc__rk   rÆ   rÈ   r™   rÓ   rÕ   r  r
  r  r  r  r  r  rß   r:  rü   rD  r_   Zsql_delete_constraintrE  rM  rN  rK  r®   r<  re   rÐ   r?  r)  rJ  r¶   rT  rU  rX  r/   r2   r5   r4   rH   rr   r]   ry   r}   r{   Ústaticmethodr’   rz   rE   r—   r˜   r£   r¥   r§   r¨   r±   r¹   r­   rÇ   rÉ   rÛ   râ   rë   rå   rú   rÔ   rù   rø   rä   r   r  r  r  r·   rõ   r*  r“   rÖ   rã   r/  rò   rþ   r÷   rg   rÑ   rÞ   rA  rF  r[   ró   rL  r  rö   rÁ   r¾   rý   rÿ   rS  rw   rY  r   r   r   r   r'   -   s  ÿ
		
;
5	
	9
, ÿ
  
%



     þ'
		      þ
!        þ
&      þ
           þ



r'   )Úloggingr   Z!django.db.backends.ddl_referencesr   r   r   r   r   r   Zdjango.db.backends.utilsr	   r
   Zdjango.db.modelsr   r   Zdjango.db.models.sqlr   Zdjango.db.transactionr   r   Zdjango.utilsr   Ú	getLoggerr?   r   r   r&   r'   r   r   r   r   Ú<module>   s    
	