B
    CVvgžô  ã               @   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-install-o3oxmrkh/Django/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 )N)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/d5d6„ Z0e1d7d8„ ƒZ2d9d:„ Z3d;d<„ Z4d=d>„ Z5d?d@„ Z6dAdB„ Z7dCdD„ Z8dEdF„ Z9dGdH„ Z:dIdJ„ Z;dKdL„ Z<dMdN„ Z=dOdP„ Z>dQdR„ Z?dSdT„ Z@dUdV„ ZAd¨dWdX„ZBd©dYdZ„ZCd[d\„ ZDdªd]d^„ZEd_d`„ ZFdadb„ ZGdcdd„ ZHd«dfdg„ZId¬dhdi„ZJdjdk„ ZKdldm„ ZLdddededd&dd&ddddnœdodp„ZMd­dqdr„ZNdsdt„ ZOdudv„ ZPdwdx„ ZQdydz„ ZRd{d|„ ZSd}d~„ ZTdd€„ ZUdd‚„ ZVdƒd„„ ZWd…d†„ ZXd‡dˆ„ ZYd‰dŠ„ ZZd®d‹dŒ„Z[d¯ddŽ„Z\d°dd„Z]d‘d’„ Z^d“d”„ Z_d•d–„ Z`d—d˜„ Zad±d™dš„Zbd²d›dœ„Zcddž„ ZddŸd „ Zed¡d¢„ Zfd³d£d¤„Zgd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 )N)Ú
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 )N)Údeferred_sqlr)   r   r$   ÚaliasÚ	__enter__)r*   r   r   r   r.   l   s
    
z"BaseDatabaseSchemaEditor.__enter__c             C   s<   |d kr"x| j D ]}|  |¡ qW | jr8| j |||¡ d S )N)r,   Úexecuter)   r   Ú__exit__)r*   Úexc_typeÚ	exc_valueÚ	tracebackÚsqlr   r   r   r0   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 d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))Úparamsr4   )Úextraú;Ú N)r%   r$   Zin_atomic_blockr'   r(   r   ÚstrÚloggerÚdebugÚendswithr&   ÚappendÚtupleÚmapÚquote_valueÚcursorr/   )r*   r4   r5   ZendingrA   r   r   r   r/   |   s    "z BaseDatabaseSchemaEditor.executec             C   s   | j j |¡S )N)r$   ÚopsÚ
quote_name)r*   r   r   r   r   rC   “   s    z#BaseDatabaseSchemaEditor.quote_namec                s
  x6ˆ j jD ]*}‡ fdd„|D ƒ}ˆj ˆ ˆ |¡¡ q
W g }g }xJˆ j jD ]<}ˆ ˆ |¡\}}|dkrlqL|jˆjd}	|	d r”|dˆj	|	  7 }|j
ˆjd}
|
r²|d|
 7 }| |¡ |jr>|jr>|jjj j}|jjj  |jj¡j}ˆjr|dˆjˆ |¡ˆ |¡dœ  7 }n"ˆjjjr>ˆj ˆ ˆ |d	¡¡ | d
ˆ |j¡|f ¡ | ¡ dkrLˆjj ˆ j j|j¡}|rLˆj |¡ qLW ‡ ‡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ú z %s)Úto_tableÚ	to_columnz_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   rF   Ä   s    z, c             s   s   | ]}|r|V  qd S )Nr   )r   rK   r   r   r   r   Ç   s    z5BaseDatabaseSchemaEditor.table_sql.<locals>.<genexpr>)ÚtableÚ
definition) r   Zunique_togetherr,   r=   Ú_create_unique_sqlÚlocal_fieldsÚ
column_sqlÚdb_parametersr$   Úsql_check_constraintZdb_type_suffixÚextendÚremote_fieldÚdb_constraintr   Údb_tablerD   Ú
field_namerE   Úsql_create_inline_fkrC   r'   Úsupports_foreign_keysÚ_create_fk_sqlÚget_internal_typerB   Úautoinc_sqlÚconstraintsÚsql_create_tableÚjoinÚdb_tablespaceÚtablespace_sql)r*   r   ÚfieldsÚcolumnsZcolumn_sqlsr5   r   rM   Zextra_paramsÚ	db_paramsZcol_type_suffixrI   rJ   r\   r]   r4   ra   r   )r   r*   r   Ú	table_sql–   sR    



z"BaseDatabaseSchemaEditor.table_sqlc             C   sj  |j | jd}|d }g }|dkr&dS t|ddƒ}|rD||  |¡7 }|j}|oh|  |¡ oh|of|  |¡ }|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}|rb| jj	jrb|jrb|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.
        )r$   ÚtypeN)NNÚdb_collationz	 DEFAULT Tz NULLz	 NOT NULLz PRIMARY KEYz UNIQUEz %s)Úinline)rQ   r$   ÚgetattrÚ_collate_sqlÚnullÚskip_defaultÚskip_default_on_alterÚeffective_defaultÚ_column_default_sqlr'   Úrequires_literal_defaultsÚprepare_defaultÚempty_strings_allowedr   Ú!interprets_empty_strings_as_nullsZimplied_column_nullÚuniquer`   r   Zsupports_tablespacesrB   ra   )r*   r   r   Úinclude_defaultrd   r4   r5   Ú	collationrk   Údefault_valueZcolumn_defaultZ
tablespacer   r   r   rP   Ñ   sF    





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   rl     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   rm     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   rq     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.
        z%sr   )r*   r   r   r   r   ro   $  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ó    r8   Zauto_nowFZauto_now_addZ	DateFieldZ	TimeFieldZDateTimeField)Úhas_defaultÚget_defaultrk   Úblankrr   r[   ri   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   r   rn   B  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).
        N)rx   )r*   ry   r   r   r   r@   F  s    z$BaseDatabaseSchemaEditor.quote_valuec             C   s`   |   |¡\}}|  ||pd¡ | j |  |¡¡ x*|jjD ]}|jjjj	r:|  
|jj¡ q:W dS )zr
        Create a table and any accompanying indexes or unique constraints for
        the given `model`.
        N)re   r/   r,   rS   Ú_model_indexes_sqlr   Úlocal_many_to_manyrT   ÚthroughÚauto_createdÚcreate_model)r*   r   r4   r5   r   r   r   r   r‡   R  s    z%BaseDatabaseSchemaEditor.create_modelc             C   s†   x*|j jD ]}|jjj jr
|  |jj¡ q
W |  | jd|  |j j	¡i ¡ x6t
| jƒD ](}t|tƒrV| |j j	¡rV| j |¡ qVW dS )z!Delete a model from the database.rL   N)r   r„   rT   r…   r†   Údelete_modelr/   Úsql_delete_tablerC   rV   Úlistr,   Ú
isinstancer   Zreferences_tableÚremove)r*   r   r   r4   r   r   r   rˆ   c  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)r5   )Úcontains_expressionsr$   r'   Úsupports_expression_indexesr/   Ú
create_sql)r*   r   Úindexr   r   r   Ú	add_indexs  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Ž   r/   Ú
remove_sql)r*   r   r   r   r   r   Úremove_index~  s    
z%BaseDatabaseSchemaEditor.remove_indexc             C   s"   |  || ¡}|r| j|dd dS )zAdd a constraint to a model.N)r5   )r   r/   )r*   r   rK   r4   r   r   r   Úadd_constraint‡  s    z'BaseDatabaseSchemaEditor.add_constraintc             C   s   |  || ¡}|r|  |¡ dS )z!Remove a constraint from a model.N)r’   r/   )r*   r   rK   r4   r   r   r   Úremove_constraint  s    z*BaseDatabaseSchemaEditor.remove_constraintc                s‚   dd„ |D ƒ}dd„ |D ƒ}x(|  |¡D ]}|  ˆ |ddi| j¡ q(W x6|  |¡D ](}‡ fdd„|D ƒ}|  |  ˆ |¡¡ qRW 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             S   s   h | ]}t |ƒ’qS r   )r>   )r   rb   r   r   r   ú	<setcomp>›  s    zABaseDatabaseSchemaEditor.alter_unique_together.<locals>.<setcomp>c             S   s   h | ]}t |ƒ’qS r   )r>   )r   rb   r   r   r   r–   œ  s    rt   Tc                s   g | ]}ˆ j  |¡j‘qS r   )r   rD   rE   )r   r   )r   r   r   rF   ¢  s    zBBaseDatabaseSchemaEditor.alter_unique_together.<locals>.<listcomp>N)Ú
differenceÚ_delete_composed_indexÚsql_delete_uniquer/   rN   )r*   r   Zold_unique_togetherZnew_unique_togetherÚoldsÚnewsrb   rc   r   )r   r   Úalter_unique_together•  s    z.BaseDatabaseSchemaEditor.alter_unique_togetherc                sˆ   dd„ |D ƒ}dd„ |D ƒ}x*|  |¡D ]}|  ˆ |dddœ| j¡ q(W x:|  |¡D ],}‡ fdd„|D ƒ}|  | jˆ |d	d
¡ qTW 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             S   s   h | ]}t |ƒ’qS r   )r>   )r   rb   r   r   r   r–   «  s    z@BaseDatabaseSchemaEditor.alter_index_together.<locals>.<setcomp>c             S   s   h | ]}t |ƒ’qS r   )r>   )r   rb   r   r   r   r–   ¬  s    TF)r   rt   c                s   g | ]}ˆ j  |¡‘qS r   )r   rD   )r   r   )r   r   r   rF   ·  s    zABaseDatabaseSchemaEditor.alter_index_together.<locals>.<listcomp>Ú_idx)rb   ÚsuffixN)r—   r˜   Úsql_delete_indexr/   Ú_create_index_sql)r*   r   Zold_index_togetherZnew_index_togetherrš   r›   rb   Ú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   )r   rK   r   r   r   r–   »  s    zBBaseDatabaseSchemaEditor._delete_composed_index.<locals>.<setcomp>c             S   s   h | ]
}|j ’qS r   )r   )r   rK   r   r   r   r–   ¼  s    c                s   g | ]}ˆ j  |¡j‘qS r   )r   rD   rE   )r   r   )r   r   r   rF   ½  s    zCBaseDatabaseSchemaEditor._delete_composed_index.<locals>.<listcomp>Úexcludeé   z1Found wrong number (%s) of constraints for %s(%s)z, r   )
r   r]   ÚindexesÚ_constraint_namesÚlenÚ
ValueErrorrV   r_   r/   Ú_delete_constraint_sql)	r*   r   rb   Zconstraint_kwargsr4   Úmeta_constraint_namesÚmeta_index_namesrc   Úconstraint_namesr   )r   r   r˜   º  s    z/BaseDatabaseSchemaEditor._delete_composed_indexc             C   sr   ||ks"| j jjr&| ¡ | ¡ kr&dS |  | j|  |¡|  |¡dœ ¡ x$| jD ]}t|t	ƒrP| 
||¡ qPW dS )z#Rename the table a model points to.N)Z	old_tableZ	new_table)r$   r'   Zignores_table_name_caseÚlowerr/   Úsql_rename_tablerC   r,   r‹   r   Zrename_table_references)r*   r   Zold_db_tableZnew_db_tabler4   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.)rL   Zold_tablespaceZnew_tablespaceN)r/   Úsql_retablespace_tablerC   r   rV   )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)ru   N)r$   rG   rH   z_fk_%(to_table)s_%(to_column)sz%s.r8   )r   Ú	namespacerE   rI   rJ   Ú
deferrable)rL   rE   rM   )Údrop)rL   Úchanges)%r   rT   r…   r   r†   r‡   rP   rQ   r$   rR   r'   rY   rU   Úsql_create_column_inline_fkr   rV   rD   rW   rE   r
   Ú_fk_constraint_namerC   rB   Údeferrable_sqlr,   r=   rZ   Úsql_create_columnr/   rm   rn   Ú_alter_column_default_sqlÚsql_alter_columnrS   Ú_field_indexes_sqlÚconnection_persists_old_columnsÚclose)r*   r   r   rM   r5   rd   Zconstraint_suffixrI   rJ   r²   Ú_r4   Úchanges_sqlr   r   r   Ú	add_fieldá  sH    



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rt| j||j	gdd}x|D ]}|  
|  ||¡¡ qZW | j|  |jj¡|  |j	¡dœ }|  
|¡ | jjjr´| j ¡  x:t| jƒD ],}t|tƒrÀ| |jj|j	¡rÀ| j |¡ qÀW dS )z…
        Remove a field from a model. Usually involves deleting a column,
        but for M2Ms may involve deleting a table.
        )r$   rf   NT)Úforeign_key)rL   rE   )r   rT   r…   r   r†   rˆ   rQ   r$   r¦   rE   r/   Ú_delete_fk_sqlÚsql_delete_columnrC   rV   r'   r½   r¾   rŠ   r,   r‹   r   Zreferences_columnrŒ   )r*   r   r   Úfk_namesÚfk_namer4   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.
        N)r$   rf   zqCannot alter field %s into %s - they do not properly define db_type (are you using a badly-written custom field?)zCannot 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_alteredrQ   r$   rT   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_field8  s6    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 ƒ‚x,|
D ]$}|	 |jf¡ |  |  ||¡¡ qbW |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 ƒ‚x |D ]}|  |  ||¡¡ qW | jjjoP|jr:|jsJ|joP|joP||k}|r®xTt||ƒD ]F\}}| j|j|jjgdd}x"|D ]}|  |  |j|¡¡ qŠW qdW |jr|js|jrÎ|jrd
d„ |j
jD ƒ}| j||jgdtj|d}x |D ]}|  |  ||¡¡ q W |d |d kr²|d r²dd„ |j
jD ƒ}| j||jgd|d}|rt|ƒdkrt	dt|ƒ|j
j|jf ƒ‚x |D ]}|  |  ||¡¡ q–W |j|jkr|  |  |j
j|||¡¡ x2| jD ](}t|t ƒrâ| !|j
j|j|j¡ qâW g }g }g }t"|ddƒ}t"|ddƒ}||krX|  #||||¡}| $|¡ n2||krŠ|  %||||¡\}}| $|¡ | &|¡ d}|j'rê|j'sê|  (|¡}|  (|¡} |  )|¡sê|| krê| dk	rêd}| $|  *|||¡¡ |j'|j'kr|  +|||¡}|r| $|¡ | ,¡ o.|j'o.|j' }!|s<|r"|!sJ|| }| jjj-r‚|r‚t.t/|Ž ƒ\}}"d 0|¡t1|"g ƒfg}x4|D ],\}}"|  | j2|  3|j
j¡|dœ |"¡ qˆW |!r"|  | j4|  3|j
j¡|  3|j¡ddœ | g¡ x4|D ],\}}"|  | j2|  3|j
j¡|dœ |"¡ qòW |rHx|D ]\}}"|  ||"¡ q.W |jrd|jsd|  5||¡ |  6||¡rˆ|  |  7||jg¡¡ |jr˜|jr¾|jr¾|js¾|  | j8||gd¡ g }#|rØ|# &t||ƒ¡ |  ||¡r|  |  9||¡¡ |# &t||ƒ¡ x|#D ]ˆ\}$}|jj:| jd}%|%d }&|  %|j|$j|j|&¡\}}|  | j2|  3|jj
j¡|d dœ |d ¡ x|D ]\}}"|  ||"¡ qzW qW | jjjrà|jrà|	sÄ|jrÄ|jsà|jrà|  |  ;||d¡¡ |r*xB|j<j
j=D ]4}'t>|'|ƒrò|'jjrò|  |  ;|'j|'jd¡¡ qòW |d |d krv|d rv| 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.T)rÂ   r¤   z<Found wrong number (%s) of foreign key constraints for %s.%sc             S   s   h | ]
}|j ’qS r   )r   )r   rK   r   r   r   r–   z  s    z8BaseDatabaseSchemaEditor._alter_field.<locals>.<setcomp>F)rt   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£   rG   c             S   s   h | ]
}|j ’qS r   )r   )r   rK   r   r   r   r–   ²  s    )rG   r£   z6Found wrong number (%s) of check constraints for %s.%srg   Nz, )rL   rµ   z%s)rL   rE   r   )rb   )r$   rf   r   z_fk_%(to_table)s_%(to_column)sZ_fkÚ_check)rž   )r´   )CÚsetr$   r'   rY   rT   rU   r¦   rE   r§   r¨   r   rV   Úaddr/   rÃ   rt   Ú_field_became_primary_keyr]   Ú_delete_unique_sqlr   r"   Zrelated_modelr   Údb_indexr¥   r   rž   Ú_delete_index_sqlÚ_delete_check_sqlÚ_rename_field_sqlr,   r‹   r   Zrename_column_referencesri   Ú_alter_column_collation_sqlr=   Ú_alter_column_type_sqlrS   rk   rn   rm   rº   Ú_alter_column_null_sqlr{   Zsupports_combined_altersr>   r!   r_   Úsumr»   rC   Úsql_update_with_defaultÚ_delete_primary_keyÚ_unique_should_be_addedrN   r    Ú_create_primary_key_sqlrQ   rZ   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_namer4   ÚactionsZnull_actionsZpost_actionsZold_collationÚnew_collationÚfragmentZother_actionsZneeds_database_defaultZold_defaultÚnew_defaultZfour_way_default_alterationr5   Zrels_to_updateZold_relZrel_db_paramsZrel_typeÚrelrÀ   r   r   r   rÊ   c  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	TextFieldN)r$   rf   )rE   rf   )
r$   r'   rs   r[   rQ   rk   Úsql_alter_column_nullÚsql_alter_column_not_nullrC   rE   )r*   r   r   r    rÎ   r4   r   r   r   rÝ   b  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$   rf   )rE   rf   r   )rn   ro   r$   r'   rp   rq   rQ   rk   Ú sql_alter_column_no_default_nullÚsql_alter_column_no_defaultÚsql_alter_column_defaultrC   rE   )
r*   r   r   r    r´   rê   r   r5   rÎ   r4   r   r   r   rº   x  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.
        )rE   rf   )Úsql_alter_column_typerC   rE   )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 )Nr8   )rE   rf   rv   )Úsql_alter_column_collaterC   rE   rj   )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)	rT   r…   r   rV   r¯   rÐ   rD   Zm2m_reverse_field_nameZm2m_field_name)r*   r   r   r    rË   r   r   r   rÉ   ¼  s    z,BaseDatabaseSchemaEditor._alter_many_to_manyr8   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$   rB   Zmax_name_lengthr_   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   rH   r8   )r§   r`   r   r$   rB   ra   )r*   r   rb   r`   r   r   r   Ú_get_index_tablespace_sqlî  s    z2BaseDatabaseSchemaEditor._get_index_tablespace_sqlc             C   s   |rd| S dS )Nz WHERE r8   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 )Nr8   z INCLUDE (%(columns)s))rc   )r$   r'   Úsupports_covering_indexesr   r   r   rV   rC   )r*   r   rc   r   r   r   Ú_index_include_sqlý  s
    z+BaseDatabaseSchemaEditor._index_include_sql)rb   r   rž   Úusingr`   Úcol_suffixesr4   Ú	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_cols)r$   )r`   c             S   s   g | ]
}|j ‘qS r   )rE   )r   r   r   r   r   rF     s    z>BaseDatabaseSchemaEditor._create_index_sql.<locals>.<listcomp>c                 s   ˆ d krˆj | |Ž‰ ˆ ˆ ¡S )N)rã   rC   )ÚargsÚkwargs)r   r*   r   r   Úcreate_index_name  s    zEBaseDatabaseSchemaEditor._create_index_sql.<locals>.create_index_name)rL   r   r  rc   r6   rý   r  )r   Zget_compilerr$   rü   Úsql_create_indexr   rV   r   r   rC   r   Ú_index_columnsr   r@   rþ   r   )r*   r   rb   r   rž   r  r`   r  r4   r  rý   r  r  Úcompilerra   rc   r	  rL   r  r   )r   r*   r   r      s&    


z*BaseDatabaseSchemaEditor._create_index_sqlc             C   s&   t |p
| jt|jj| jƒ|  |¡dS )N)rL   r   )r   rŸ   r   r   rV   rC   )r*   r   r   r4   r   r   r   rØ   ,  s    z*BaseDatabaseSchemaEditor._delete_index_sqlc             C   s   t ||| j|dS )N)r  )r   rC   )r*   rL   rc   r  r  r   r   r   r
  3  s    z'BaseDatabaseSchemaEditor._index_columnsc                s¶   ˆ j jrˆ j jsˆ j jrg S g }x"ˆ j jD ]}| |  ˆ |¡¡ q*W x8ˆ j jD ],}‡ fdd„|D ƒ}| | j	ˆ |dd¡ qNW x2ˆ j j
D ]&}|jrœ| jjjrˆ| | ˆ | ¡¡ qˆW |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   rD   )r   r   )r   r   r   rF   B  s    z?BaseDatabaseSchemaEditor._model_indexes_sql.<locals>.<listcomp>r   )rb   rž   )r   ZmanagedÚproxyZswappedrO   rS   r¼   Zindex_togetherr=   r    r¥   r   r$   r'   rŽ   r   )r*   r   Úoutputr   r¡   rb   r   r   )r   r   rƒ   6  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.
        )rb   )Ú_field_should_be_indexedr=   r    )r*   r   r   r  r   r   r   r¼   M  s    z+BaseDatabaseSchemaEditor._field_indexes_sqlc             C   sŒ   |  ¡ \}}}}|  ¡ \}}}}	ddddddddd	d
dg}
x$|
D ]}| |d ¡ |	 |d ¡ q@W |  |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ÚpoprC   rE   )r*   r   r    r¿   Zold_pathZold_argsZ
old_kwargsÚnew_pathZnew_argsZ
new_kwargsZnon_database_attrsÚattrr   r   r   rÈ   V  s$    
z1BaseDatabaseSchemaEditor._field_should_be_alteredc             C   s   |j o|j S )N)r×   rt   )r*   r   r   r   r   r   r  s  s    z1BaseDatabaseSchemaEditor._field_should_be_indexedc             C   s   |j  o|j S )N)r   )r*   r   r    r   r   r   rÕ   v  s    z2BaseDatabaseSchemaEditor._field_became_primary_keyc             C   s"   |j  r|j p |jo |j o |j S )N)rt   r   )r*   r   r    r   r   r   rá   y  s    z0BaseDatabaseSchemaEditor._unique_should_be_addedc             C   s*   | j |  |¡|  |j¡|  |j¡|dœ S )N)rL   Z
old_columnZ
new_columnrf   )Úsql_rename_columnrC   rE   )r*   rL   r   r    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)rL   r   rE   rI   rJ   r³   )r   r   rV   rC   r·   r   rE   Útarget_fieldr   r$   rB   r¸   r   Úsql_create_fk)
r*   r   r   rž   rL   r   rE   rI   rJ   r³   r   r   r   rZ   †  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 )N)rC   rã   )r  r  )r*   r   r   Úcreate_fk_name˜  s    zDBaseDatabaseSchemaEditor._fk_constraint_name.<locals>.create_fk_namer¤   )r   r   rV   rE   r
   r  r   )r*   r   r   rž   r  r   )r*   r   r·   —  s    z,BaseDatabaseSchemaEditor._fk_constraint_namec             C   s   |   | j||¡S )N)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 )Nr8   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  z, )rc   r³   )r   rK   )r$   r'   Ú&supports_deferrable_unique_constraintsrN   r,   r=   Úsql_unique_constraintr_   r?   rC   r  Úsql_constraint)
r*   r   rb   r   rý   r³   r  r  r4   rK   r   r   r   Ú_unique_sql¯  s(    
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 )N)rC   rã   )r  r  )r*   r   r   Úcreate_unique_nameÝ  s    zGBaseDatabaseSchemaEditor._create_unique_sql.<locals>.create_unique_nameÚ_uniqr   )r  r  )rL   r   rc   rý   r³   r  )r$   r'   r  Úsupports_partial_indexesrÿ   r   r   rV   rC   r   r
  Úsql_create_unique_indexÚsql_create_uniquer   rþ   r  r   )r*   r   rc   r   rý   r³   r  r  r  rL   r4   r   )r*   r   rN   Ï  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 )N)r$   r'   r  r   rÿ   rŸ   r™   r©   )r*   r   r   rý   r³   r  r  r4   r   r   r   rÖ   ô  s    
z+BaseDatabaseSchemaEditor._delete_unique_sqlc             C   s    | j |  |¡| jd|i dœ S )NrG   )r   rK   )r  rC   rR   )r*   r   rG   r   r   r   Ú
_check_sql  s    z#BaseDatabaseSchemaEditor._check_sqlc             C   s$   t | jt|jj| jƒ|  |¡|dS )N)rL   r   rG   )r   Úsql_create_checkr   r   rV   rC   )r*   r   r   rG   r   r   r   rä     s
    z*BaseDatabaseSchemaEditor._create_check_sqlc             C   s   |   | j||¡S )N)r©   Úsql_delete_check)r*   r   r   r   r   r   rÙ     s    z*BaseDatabaseSchemaEditor._delete_check_sqlc             C   s    t |t|jj| jƒ|  |¡dS )N)rL   r   )r   r   r   rV   rC   )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 dQ R X g }x¾| ¡ D ]²\}}|dksn||d krR|dk	r„|d |kr„qR|dk	rš|d |kršqR|dk	r°|d |kr°qR|dk	rÆ|d |krÆqR|dk	rØ|d	 sØqR|dk	rî|d
 |krîqR|	rú||	krR| |¡ qRW |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   )r*   r   r   rF   %  s   z>BaseDatabaseSchemaEditor._constraint_names.<locals>.<listcomp>rc   rt   r   r   rG   rÂ   rf   )r$   rA   r'  Zget_constraintsr   rV   Úitemsr=   )r*   r   rú   rt   r   r   rÂ   rG   rÑ   r£   rA   r]   Úresultr   Zinfodictr   )r*   r   r¦     s.    
z*BaseDatabaseSchemaEditor._constraint_namesc             C   sZ   | j |dd}|r6t|ƒdkr6tdt|ƒ|jjf ƒ‚x|D ]}|  |  ||¡¡ q<W d S )NT)r   r¤   z0Found wrong number (%s) of PK constraints for %s)r¦   r§   r¨   r   rV   r/   Ú_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_pk)rž   )rL   r   rc   )	r   Úsql_create_pkr   r   rV   rC   rã   rE   r   )r*   r   r   r   r   r   râ   G  s    z0BaseDatabaseSchemaEditor._create_primary_key_sqlc             C   s   |   | j||¡S )N)r©   Úsql_delete_pk)r*   r   r   r   r   r   r*  Q  s    z0BaseDatabaseSchemaEditor._delete_primary_key_sqlc             C   s   d|   |¡ S )Nz	 COLLATE )rC   )r*   rv   r   r   r   rj   T  s    z%BaseDatabaseSchemaEditor._collate_sqlc             C   s*   | j |  |¡d |¡dœ }|  |¡ d S )Nú,)Z	procedureÚparam_types)Úsql_delete_procedurerC   r_   r/   )r*   Zprocedure_namer.  r4   r   r   r   Úremove_procedureW  s    z)BaseDatabaseSchemaEditor.remove_procedure)FT)r   )F)F)F)F)r8   )N)N)NNNN)NNNNN)NNNN)NNNNNNNN)F)r   )hÚ__name__Ú
__module__Ú__qualname__Ú__doc__r^   r®   r°   r‰   r¹   r»   rñ   rì   rí   rð   rï   rî   rò   rÄ   r  rß   r  rR   Zsql_delete_constraintr  r$  r%  r"  r™   r  rX   r¶   r  r	  r!  rŸ   r+  r,  r/  r+   r.   r0   r/   rC   re   rP   rl   rm   rq   ro   Ústaticmethodr‚   rn   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á   rÚ   rZ   r·   rÃ   r  r  rN   rÖ   r#  rä   rÙ   r©   r¦   rà   râ   r*  rj   r0  r   r   r   r   r#   -   sÚ   
		
;
<		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    
	