3
g                 @   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 j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   \/var/www/tester-filtro-web/env/lib/python3.6/site-packages/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%dd d!Z&d"d# Z'd$d% Z(f fd&d'Z)d(d) Z*d*d+ Z+dd,d-Z,d.d/ Z-d0d1 Z.d2d3 Z/d4d5 Z0e1d6d7 Z2d8d9 Z3d:d; Z4d<d= Z5d>d? Z6d@dA Z7dBdC Z8dDdE Z9dFdG Z:dHdI Z;dJdK Z<dLdM Z=dNdO Z>dPdQ Z?dRdS Z@dTdU ZAddVdWZBddXdYZCdZd[ ZDdd\d]ZEd^d_ ZFd`da ZGdbdc ZHddedfZIddgdhZJdidj ZKdkdl ZLdddddddf df ddddmdndoZMddpdqZNdrds ZOdtdu ZPdvdw ZQdxdy ZRdzd{ ZSd|d} ZTd~d ZUdd ZVdd ZWdd ZXdd ZYdd ZZdddZ[dddZ\dddZ]dd Z^dd Z_dd Z`dd ZadddZbdddZcdd Zddd Zedd Zff fdd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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 ]}| j| qW | jr8| jj||| d S )N)r,   executer)   r   __exit__)r*   exc_type	exc_value	tracebacksqlr   r   r   r0   s   s
    z!BaseDatabaseSchemaEditor.__exit__c          
   C   s   | j  r$| jjr$| jjj r$tdt|}tjd||||dd | j r|j	drXdnd}|dk	r| j
j|tt| j| |  q| j
j||  n"| jj }|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   endingrA   r   r   r   r/   |   s    "z BaseDatabaseSchemaEditor.executec             C   s   | j jj|S )N)r$   ops
quote_name)r*   r   r   r   r   rD      s    z#BaseDatabaseSchemaEditor.quote_namec                s  x6 j jD ]*} fdd|D }jjj | q
W g }g }xH j jD ]:}j |\}}|dkrlqL|jjd}	|	d r|dj	|	  7 }|j
jd}
|
r|d|
 7 }|j| |jo|jr<|jjj j}|jjj j|jjj}jr|djj|j|d  7 }n"jjjr<jjj |d	 |jd
j|j|f  |j dkrLjjj j j|j}|rLjj| qLW  fdd j jD }jj j jdjdd ||D d } j jr jjj j j}|r |d| 7 }||fS )z-Take a model and return its table definition.c                s   g | ]} j 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	AutoFieldBigAutoFieldSmallAutoFieldc                s   g | ]}|j  qS r   )Zconstraint_sql)r   
constraint)r   r*   r   r   rG      s    z, c             s   s   | ]}|r|V  qd S )Nr   )r   rO   r   r   r   r      s    z5BaseDatabaseSchemaEditor.table_sql.<locals>.<genexpr>)table
definition)rL   rM   rN   ) 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_tablerE   
field_namerF   sql_create_inline_fkrD   r'   supports_foreign_keys_create_fk_sqlget_internal_typerC   autoinc_sqlconstraintssql_create_tablejoindb_tablespacetablespace_sql)r*   r   fieldscolumnsZcolumn_sqlsr5   r   rQ   Zextra_params	db_paramsZcol_type_suffixrJ   rK   r`   ra   r4   re   r   )r   r*   r   	table_sql   sR    



z"BaseDatabaseSchemaEditor.table_sqlc             C   sp  |j | jd}|d }g }|dkr&dS t|dd}|rD|| j|7 }|j}|oh| j| oh|of| j| }|r| j|}	d| j| }
|	dk	r| jj	j
r||
| j|	 7 }n||
7 }||	g7 }|jr|j r| jj	jrd}|r| jj	j r|d7 }n|s|d7 }|jr|d	7 }n|jr$|d
7 }|jp2|jj}|rh| jj	jrh|jrh|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db_collationz	 DEFAULT Tz NULLz	 NOT NULLz PRIMARY KEYz UNIQUEz %s)inline)NN)rU   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uniquerd   r   Zsupports_tablespacesrC   re   )r*   r   r   include_defaultrh   r4   r5   	collationro   default_valueZcolumn_defaultZ
tablespacer   r   r   rT      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   rp     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   rq     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   ru     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   rs   $  s    z,BaseDatabaseSchemaEditor._column_default_sqlc             C   s   | j  r| j }n| j r>| jr>| jr>| j dkr8d}qd}nbt| ddsVt| ddrtj }| j }|dkrx|j	 }q|dkr|j
 }q|d	krtj }nd }|S )
NZBinaryField    r8   Zauto_nowFZauto_now_addZ	DateFieldZ	TimeFieldZDateTimeField)has_defaultget_defaultro   blankrv   r_   rm   r   nowdatetimer   )r   defaultZinternal_typer   r   r   _effective_default+  s"    



z+BaseDatabaseSchemaEditor._effective_defaultc             C   s   |j | j|| jS )z2Return a field's effective database default value.)Zget_db_prep_saver   r$   )r*   r   r   r   r   rr   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)r|   )r*   r}   r   r   r   r@   F  s    z$BaseDatabaseSchemaEditor.quote_valuec             C   s`   | j |\}}| j||pd | jj| j| x*|jjD ]}|jjjj	r:| j
|jj q:W dS )zr
        Create a table and any accompanying indexes or unique constraints for
        the given `model`.
        N)ri   r/   r,   rW   _model_indexes_sqlr   local_many_to_manyrX   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j q
W | j| jd| j|j j	i  x6t
| jD ](}t|trV|j|j j	rV| jj| qVW dS )z!Delete a model from the database.rP   N)r   r   rX   r   r   delete_modelr/   sql_delete_tablerD   rZ   listr,   
isinstancer   Zreferences_tableremove)r*   r   r   r4   r   r   r   r   c  s    z%BaseDatabaseSchemaEditor.delete_modelc             C   s0   |j r| jjj rdS | j|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 rdS | j|j||  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"   |j || }|r| j|dd dS )zAdd a constraint to a model.N)r5   )r   r/   )r*   r   rO   r4   r   r   r   add_constraint  s    z'BaseDatabaseSchemaEditor.add_constraintc             C   s   |j || }|r| j| dS )z!Remove a constraint from a model.N)r   r/   )r*   r   rO   r4   r   r   r   remove_constraint  s    z*BaseDatabaseSchemaEditor.remove_constraintc                s   dd |D }dd |D }x(|j |D ]}| j |ddi| j q(W x6|j |D ](} fdd|D }| j| j | 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   rf   r   r   r   	<setcomp>  s    zABaseDatabaseSchemaEditor.alter_unique_together.<locals>.<setcomp>c             S   s   h | ]}t |qS r   )r>   )r   rf   r   r   r   r     s    rx   Tc                s   g | ]} j j|jqS r   )r   rE   rF   )r   r   )r   r   r   rG     s    zBBaseDatabaseSchemaEditor.alter_unique_together.<locals>.<listcomp>N)
difference_delete_composed_indexsql_delete_uniquer/   rR   )r*   r   Zold_unique_togetherZnew_unique_togetheroldsnewsrf   rg   r   )r   r   alter_unique_together  s    z.BaseDatabaseSchemaEditor.alter_unique_togetherc                s   dd |D }dd |D }x*|j |D ]}| j |ddd| j q(W x:|j |D ],} fdd|D }| j| 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   rf   r   r   r   r     s    z@BaseDatabaseSchemaEditor.alter_index_together.<locals>.<setcomp>c             S   s   h | ]}t |qS r   )r>   )r   rf   r   r   r   r     s    TF)r   rx   c                s   g | ]} j j|qS r   )r   rE   )r   r   )r   r   r   rG     s    zABaseDatabaseSchemaEditor.alter_index_together.<locals>.<listcomp>_idx)rf   suffixN)r   r   sql_delete_indexr/   _create_index_sql)r*   r   Zold_index_togetherZnew_index_togetherr   r   rf   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	j|f | j| j	| |d
  d S )Nc             S   s   h | ]
}|j qS r   )r   )r   rO   r   r   r   r     s    zBBaseDatabaseSchemaEditor._delete_composed_index.<locals>.<setcomp>c             S   s   h | ]
}|j qS r   )r   )r   rO   r   r   r   r     s    c                s   g | ]} j j|jqS r   )r   rE   rF   )r   r   )r   r   r   rG     s    zCBaseDatabaseSchemaEditor._delete_composed_index.<locals>.<listcomp>exclude   z1Found wrong number (%s) of constraints for %s(%s)z, r   )
r   ra   indexes_constraint_nameslen
ValueErrorrZ   rc   r/   _delete_constraint_sql)	r*   r   rf   Zconstraint_kwargsr4   meta_constraint_namesmeta_index_namesrg   constraint_namesr   )r   r   r     s    z/BaseDatabaseSchemaEditor._delete_composed_indexc             C   sr   ||ks"| j jjr&|j |j kr&dS | j| j| j|| j|d  x$| jD ]}t|t	rP|j
|| 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_tablerD   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|jj| j|| j|d  dS )z)Move a model's table between tablespaces.)rP   Zold_tablespaceZnew_tablespaceN)r/   sql_retablespace_tablerD   r   rZ   )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jS | j||dd\}}|dkr@dS |j| jd}|d rh|d| j	|  7 }|jo|| jj
jo||jr.d}| jr|jjjj}|jjjj|jjj}t|jj\}	}
|d| j| j||||	rd| j|	 nd	| j|j| j|| j|| jjj d
  7 }n| jj| j||| | j| j|jj| j|j|d }| j|| | j| r| j|dk	r| j|d|dd\}}| j | j|jj|d }| j|| | jj!| j"|| | jj
j#r| j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)ry   N)r$   rH   rI   z_fk_%(to_table)s_%(to_column)sz%s.r8   )r   	namespacerF   rJ   rK   
deferrable)rP   rF   rQ   )drop)rP   changes)%r   rX   r   r   r   r   rT   rU   r$   rV   r'   r]   rY   sql_create_column_inline_fkr   rZ   rE   r[   rF   r
   _fk_constraint_namerD   rC   deferrable_sqlr,   r=   r^   sql_create_columnr/   rq   rr   _alter_column_default_sqlsql_alter_columnrW   _field_indexes_sqlconnection_persists_old_columnsclose)r*   r   r   rQ   r5   rh   Zconstraint_suffixrJ   rK   r   _r4   changes_sqlr   r   r   	add_field  sH    



z"BaseDatabaseSchemaEditor.add_fieldc             C   s   |j r |jjjjr | j|jjS |j| jdd dkr:dS |jrt| j||j	gdd}x|D ]}| j
| j|| qZW | j| j|jj| j|j	d }| j
| | jjjr| jj  x:t| jD ],}t|tr|j|jj|j	r| jj| qW dS )z
        Remove a field from a model. Usually involves deleting a column,
        but for M2Ms may involve deleting a table.
        )r$   rj   NT)foreign_key)rP   rF   )r   rX   r   r   r   r   rU   r$   r   rF   r/   _delete_fk_sqlsql_delete_columnrD   rZ   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   s<  | j ||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| j||||S |dko|dko|jjo|jjo|jjjj o|jjjj  rdS |dks|dkr td||f | j	|||||||| 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$   rj   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_alteredrU   r$   rX   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|jf | j| j|| qbW |jo|j s| j||rdd |j
jD }| j||jgdd|d}|rt|dkrt	d	t||j
j|jf x |D ]}| j| j|| qW | jjjoP|jr:|jsJ|joP|joP||k}|rxTt||D ]F\}}| j|j|jjgdd}x"|D ]}| j| j|j| qW qdW |jr |j r |j s|jr d
d |j
jD }| j||jgdtj|d}x |D ]}| j| j|| qW |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 x |D ]}| j| j|| qW |j|jkr| j| j|j
j||| x2| jD ](}t|t r|j!|j
j|j|j qW g }g }g }t"|dd}t"|dd}||kr\| j#||||}|j$| n2||kr| j%||||\}}|j$| |j&| d}|j'r|j' r| j(|}| j(|} | j)| r|| kr| dk	rd}|j$| j*||| |j'|j'kr| j+|||}|r|j$| |j, o6|j'o6|j' }!|sD|r*|!sR|| }| jjj-r|rt.t/| \}}"dj0|t1|"g fg}x4|D ],\}}"| j| j2| j3|j
j|d |" qW |!r*| j| j4| j3|j
j| j3|jdd | g x4|D ],\}}"| j| j2| j3|j
j|d |" qW |rPx|D ]\}}"| j||" q6W |jrn|j rn| j5|| | j6||r| j| j7||jg |j s|jr|jr|j r| j| j8||gd g }#|r|#j&t|| | j||r| j| j9|| |#j&t|| x|#D ]\}$}|jj:| jd}%|%d }&| j%|j|$j|j|&\}}| j| j2| j3|jj
j|d d |d  x|D ]\}}"| j||" qW qW | jjjr|jr|	s|j s|j r|jr| j| j;||d |r<xB|j<j
j=D ]4}'t>|'|r|'jjr| j| j;|'j|'jd qW |d |d kr|d r| j?|j
j|jgdd}| j| j@|||d  |r| j*|||dd\}(}"| j2| j3|j
j|(d }| j||" | jjjAr| jjB  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   rO   r   r   r   r   z  s    z8BaseDatabaseSchemaEditor._alter_field.<locals>.<setcomp>F)rx   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   rH   c             S   s   h | ]
}|j qS r   )r   )r   rO   r   r   r   r     s    )rH   r   z6Found wrong number (%s) of check constraints for %s.%srk   Nz, )rP   r   z%s)rP   rF   r   )rf   )r$   rj   r   z_fk_%(to_table)s_%(to_column)sZ_fk_check)r   )r   )Csetr$   r'   r]   rX   rY   r   rF   r   r   r   rZ   addr/   r   rx   _field_became_primary_keyra   _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_referencesrm   _alter_column_collation_sqlr=   _alter_column_type_sqlrW   ro   rr   rq   r   _alter_column_null_sqlr   Zsupports_combined_altersr>   r!   rc   sumr   rD   sql_update_with_default_delete_primary_key_unique_should_be_addedrR   r   _create_primary_key_sqlrU   r^   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|j dkrdS |j| j d}|jr4| jn| j}|| 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.
        	CharField	TextFieldN)r$   rj   )rF   rj   )r   r   )
r$   r'   rw   r_   rU   ro   sql_alter_column_nullsql_alter_column_not_nullrD   rF   )r*   r   r   r    r   r4   r   r   r   r   b  s    

z/BaseDatabaseSchemaEditor._alter_column_null_sqlc       
      C   s   | j |}| j|}|g}|r$g }n| jjjr<| j|}g }|j| jd}|rd|jr\| j}	qj| j	}	n| j
}	|	| 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$   rj   )rF   rj   r   )rr   rs   r$   r'   rt   ru   rU   ro    sql_alter_column_no_default_nullsql_alter_column_no_defaultsql_alter_column_defaultrD   rF   )
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|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.
        )rF   rj   )sql_alter_column_typerD   rF   )r*   r   r   r    r   r   r   r   r     s
    
z/BaseDatabaseSchemaEditor._alter_column_type_sqlc             C   s,   | j | j|j||r| j|ndd g fS )Nr8   )rF   rj   rz   )sql_alter_column_collaterD   rF   rn   )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 j|j jjj|j |j jjj|j  dS )z*Alter M2Ms to repoint their to= endpoints.N)	rX   r   r   rZ   r   r   rE   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j p6d}d|dj||f }t||kr\|S t||d kr||d|d  }|t| d	 d
 }d|d| dj|d| |f }|d dks|d j 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	   r$   rC   Zmax_name_lengthrc   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j| S dS )Nr   r   rI   r8   )r   rd   r   r$   rC   re   )r*   r   rf   rd   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   s0   | s| j jj rdS tdt|jj|| jdS )Nr8   z INCLUDE (%(columns)s))rg   )r$   r'   supports_covering_indexesr   r   r   rZ   rD   )r*   r   rg   r   r   r   _index_include_sql  s
    z+BaseDatabaseSchemaEditor._index_include_sql)rf   r   r   usingrd   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j||||	nt|||j|j|
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$   )rd   c             S   s   g | ]
}|j qS r   )rF   )r   r   r   r   r   rG     s    z>BaseDatabaseSchemaEditor._create_index_sql.<locals>.<listcomp>c                 s    d krj | | j S )N)r   rD   )argskwargs)r   r*   r   r   create_index_name  s    zEBaseDatabaseSchemaEditor._create_index_sql.<locals>.create_index_name)rP   r   r  rg   r6   r  r
  )r   Zget_compilerr$   r  sql_create_indexr   rZ   r   r   rD   r   _index_columnsr   r@   r  r  )r*   r   rf   r   r   r  rd   r  r4   r	  r  r
  r  compilerre   rg   r  rP   r  r   )r   r*   r   r     s&    


z*BaseDatabaseSchemaEditor._create_index_sqlc             C   s&   t |p
| jt|jj| j| j|dS )N)rP   r   )r   r   r   r   rZ   rD   )r*   r   r   r4   r   r   r   r   ,  s    z*BaseDatabaseSchemaEditor._delete_index_sqlc             C   s   t ||| j|dS )N)r  )r   rD   )r*   rP   rg   r  r	  r   r   r   r  3  s    z'BaseDatabaseSchemaEditor._index_columnsc                s    j j s j js j jrg S g }x" j jD ]}|j| j | q,W x8 j jD ],} fdd|D }|j| j	 |dd qPW x4 j j
D ](}|j s| jjjr|j|j |  qW |S )z
        Return a list of all index SQL statements (field indexes,
        index_together, Meta.indexes) for the specified model.
        c                s   g | ]} j j|qS r   )r   rE   )r   r   )r   r   r   rG   B  s    z?BaseDatabaseSchemaEditor._model_indexes_sql.<locals>.<listcomp>r   )rf   r   )r   ZmanagedproxyZswappedrS   rW   r   Zindex_togetherr=   r   r   r   r$   r'   r   r   )r*   r   outputr   r   rf   r   r   )r   r   r   6  s    
z+BaseDatabaseSchemaEditor._model_indexes_sqlc             C   s*   g }| j ||r&|j| j||gd |S )zT
        Return a list of all index SQL statements for the specified field.
        )rf   )_field_should_be_indexedr=   r   )r*   r   r   r  r   r   r   r   M  s    z+BaseDatabaseSchemaEditor._field_indexes_sqlc             C   s   |j  \}}}}|j  \}}}}	ddddddddd	d
dg}
x$|
D ]}|j|d  |	j|d  q@W | j|j| 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poprD   rF   )r*   r   r    r   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   rx   )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)rx   r   )r*   r   r    r   r   r   r   y  s    z0BaseDatabaseSchemaEditor._unique_should_be_addedc             C   s*   | j | j|| j|j| j|j|d S )N)rP   Z
old_columnZ
new_columnrj   )sql_rename_columnrD   rF   )r*   rP   r   r    r   r   r   r   r   ~  s
    

z*BaseDatabaseSchemaEditor._rename_field_sqlc       
   	   C   s   t |j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
j }	t| j||||||	dS )N)rP   r   rF   rJ   rK   r   )r   r   rZ   rD   r   r   rF   target_fieldr   r$   rC   r   r   sql_create_fk)
r*   r   r   r   rP   r   rF   rJ   rK   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  j| |S )N)rD   r   )r  r  )r*   r   r   create_fk_name  s    zDBaseDatabaseSchemaEditor._fk_constraint_name.<locals>.create_fk_namer   )r   r   rZ   rF   r
   r  r   )r*   r   r   r   r  r   )r*   r   r     s    z,BaseDatabaseSchemaEditor._fk_constraint_namec             C   s   | j | 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 rd S |s |s |rJ| j||||||d}|rF| jj| d S | jdjt| j	|| j
|d }	| j| j	||	d S )N)r   r  r
  r	  z, )rg   r   )r   rO   )r$   r'   &supports_deferrable_unique_constraintsrR   r,   r=   sql_unique_constraintrc   r?   rD   r   sql_constraint)
r*   r   rf   r   r  r   r
  r	  r4   rO   r   r   r   _unique_sql  s(    z$BaseDatabaseSchemaEditor._unique_sqlc          
      s   |r j jj s0|r  j jj s0|r4 j jj r4d S  fdd}t|jj j}	|d krlt	|jj|d|}n
 j|} j
|	|f |d}|s|s|r j}
n j}
t|
|	|| j| j| j||dS )Nc                 s    j  j| |S )N)rD   r   )r  r  )r*   r   r   create_unique_name  s    zGBaseDatabaseSchemaEditor._create_unique_sql.<locals>.create_unique_nameZ_uniq)r  r	  )rP   r   rg   r  r   r
  )r$   r'   r!  supports_partial_indexesr  r   r   rZ   rD   r   r  sql_create_unique_indexsql_create_uniquer   r  r   r  )r*   r   rg   r   r  r   r
  r	  r%  rP   r4   r   )r*   r   rR     s,    
z+BaseDatabaseSchemaEditor._create_unique_sqlc             C   s\   |r| j jj s0|r | j jj s0|r4| j jj r4d S |s@|s@|rH| j}n| j}| 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|| jd|i d S )NrH   )r   rO   )r#  rD   rV   )r*   r   rH   r   r   r   
_check_sql  s    z#BaseDatabaseSchemaEditor._check_sqlc             C   s$   t | jt|jj| j| j||dS )N)rP   r   rH   )r   sql_create_checkr   r   rZ   rD   )r*   r   r   rH   r   r   r   r     s
    z*BaseDatabaseSchemaEditor._create_check_sqlc             C   s   | j | 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| j|dS )N)rP   r   )r   r   r   rZ   rD   )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|
|jj}W dQ R X g }x|j D ]\}}|dksn||d krR|dk	r|d |krqR|dk	r|d |krqR|dk	r|d |krqR|dk	r|d |krqR|dk	r|d	  rqR|dk	r|d
 |krqR|	 p||	krR|j| qRW |S )z@Return all constraint names matching the columns and conditions.Nc                s   g | ]} j jj|qS r   )r$   introspectionZidentifier_converter)r   r   )r*   r   r   rG   %  s   z>BaseDatabaseSchemaEditor._constraint_names.<locals>.<listcomp>rg   rx   r   r   rH   r   rj   )r$   rA   r-  Zget_constraintsr   rZ   itemsr=   )r*   r   r   rx   r   r   r   rH   r   r   rA   ra   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 ]}| j| j|| q<W d S )NT)r   r   z0Found wrong number (%s) of PK constraints for %s)r   r   r   r   rZ   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|jgddt|jj|jg| jdS )NZ_pk)r   )rP   r   rg   )	r   sql_create_pkr   r   rZ   rD   r   rF   r   )r*   r   r   r   r   r   r   G  s    z0BaseDatabaseSchemaEditor._create_primary_key_sqlc             C   s   | j | j||S )N)r   sql_delete_pk)r*   r   r   r   r   r   r0  Q  s    z0BaseDatabaseSchemaEditor._delete_primary_key_sqlc             C   s   d| j | S )Nz	 COLLATE )rD   )r*   rz   r   r   r   rn   T  s    z%BaseDatabaseSchemaEditor._collate_sqlc             C   s*   | j | j|dj|d }| j| d S )N,)Z	procedureparam_types)sql_delete_procedurerD   rc   r/   )r*   Zprocedure_namer4  r4   r   r   r   remove_procedureW  s    z)BaseDatabaseSchemaEditor.remove_procedure)FT)F)F)F)F)r8   )N)N)NNNN)NNNNN)NNNN)NNNNNNNN)F)h__name__
__module____qualname____doc__rb   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r   r"  rV   Zsql_delete_constraintr#  r*  r+  r(  r   r  r\   r   r  r  r'  r   r1  r2  r5  r+   r.   r0   r/   rD   ri   rT   rp   rq   ru   rs   staticmethodr   rr   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   r^   r   r   r   r$  rR   r   r)  r   r   r   r   r   r   r0  rn   r6  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    
	