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'dd"d#Z(d$d% Z)d&d' Z*dd)d*Z+d+d, Z,d-d. Z-d/d0 Z.dd1d2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^ ZFdd_d`ZGddadbZHdcdd ZIddedfZJdgdh ZKdidj ZLdkdl ZMdmdn ZNddpdqZOddrdsZPdtdu ZQdvdw ZRdddododd(dd(ddddxdydzZSdd{d|ZTd}d~ ZUdd ZVdd ZWdd ZXdddZYdd ZZdd Z[dd Z\dd Z]dd Z^dd Z_dd Z`dd ZadddZbdddZcdddZddddZedd Zfdd Zgdd Zhdd ZidddZjdddZkdd Zldd ZmdddZnddd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	rd| | }
| jjjr|
| |	 V  n|
V  ||	 |jr|js| jjjrd}|sdV  n| jjjsdV  |jrd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
        zsubclasses 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}qd}nbt| ddsTt| ddr|  }|dkrnt }qt	 }|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 qd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rt| j	 j j
|d	d
}	|	|kr|	g}t|dkrt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| qd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sd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?)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_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}|rt||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 rdd |jjD }| j||jgd|d}|rt	|dkrt
dt	||jj|jf |D ]}| | || q|j|jkr&| | |jj||| | j D ](}t!|t"r|#|jj|j|j qg }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|rt1t2| \}}$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  rd|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rqP|dk	r|d |krqP|dk	r|d |krqP|dk	r|d |krqP|dk	r|d	 sqP|dk	r|d
 |krqP|	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    
