a
    xd                     @   s   d dl Z d dlmZ d dl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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ForeignKeyName	IndexName	StatementTable)names_digestsplit_identifier)
DeferrableIndex)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v 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   V/var/www/html/Ranjet/env/lib/python3.9/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>'       z+_related_non_m2m_objects.<locals>.<genexpr>c                 3   s   | ]}t | r|V  qd S r   r   r   )	new_fieldr   r   r!   (   r"   )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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&dd&d'Z'd(d) Z(d*d+ Z)dd,d-Z*d.d/ Z+d0d1 Z,d2d3 Z-e.d4d5 Z/d6d7 Z0d8d9 Z1d:d; Z2d<d= Z3d>d? Z4d@dA Z5dBdC Z6dDdE Z7dFdG Z8dHdI Z9dJdK Z:dLdM Z;dNdO Z<dPdQ Z=dRdS Z>ddTdUZ?ddVdWZ@dXdY ZAddZd[ZBd\d] ZCd^d_ ZDddadbZEddcddZFdedf ZGdd`d`dd%dd%ddgdhdiZHddjdkZIdldm ZJdndo ZKdpdq ZLdrds ZMdtdu ZNdvdw ZOdxdy ZPdzd{ ZQd|d} ZRd~d ZSdd ZTdddZUdddZVdddZWdd ZXdd ZYdd ZZdd Z[dddZ\dddZ]dd Z^dd Z_dddZ`d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 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)sNzFCREATE INDEX %(name)s ON %(table)s (%(columns)s)%(extra)s%(condition)szDCREATE UNIQUE INDEX %(name)s ON %(table)s (%(columns)s)%(condition)szDROP INDEX %(name)szGALTER TABLE %(table)s ADD CONSTRAINT %(name)s PRIMARY KEY (%(columns)s)zDROP PROCEDURE %(procedure)sFTc                 C   s,   || _ || _| jrg | _| j jjo$|| _d S r   )
connectioncollect_sqlcollected_sqlfeaturescan_rollback_ddlatomic_migration)selfr'   r(   r   r   r   r   __init__`   s
    z!BaseDatabaseSchemaEditor.__init__c                 C   s(   g | _ | jr$t| jj| _| j  | S r   )deferred_sqlr,   r   r'   alias	__enter__r-   r   r   r   r1   i   s
    
z"BaseDatabaseSchemaEditor.__enter__c                 C   s8   |d u r| j D ]}| | q| jr4| j||| d S r   )r/   executer,   r   __exit__)r-   exc_type	exc_value	tracebacksqlr   r   r   r4   p   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ur| j
|tt| j| |  q| j
||  n6| j }||| W d   n1 s0    Y  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))paramsr8   )extra; N)r(   r'   Zin_atomic_blockr*   r+   r   strloggerdebugendswithr)   appendtuplemapquote_valuecursorr3   )r-   r8   r9   ZendingrE   r   r   r   r3   y   s    "z BaseDatabaseSchemaEditor.executec                 C   s   | j j|S r   )r'   ops
quote_name)r-   r   r   r   r   rG      s    z#BaseDatabaseSchemaEditor.quote_namec                    s   j jD ]*} fdd|D }j | qg }g } j jD ]<} |\}}|du 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v rDjj j j|j}|rDj| qD fdd j jD }j j jddd g ||R 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>   r"   z6BaseDatabaseSchemaEditor.table_sql.<locals>.<listcomp>Nr'   check  %s)to_table	to_column_fk_%(to_table)s_%(to_column)sz%s %s)Z	AutoFieldZBigAutoFieldZSmallAutoFieldc                    s   g | ]}|  qS r   )Zconstraint_sqlr   
constraintr   r-   r   r   rL      r"   , c                 s   s   | ]}|r|V  qd S r   r   rT   r   r   r   r!      r"   z5BaseDatabaseSchemaEditor.table_sql.<locals>.<genexpr>)table
definition) r   Zunique_togetherr/   rA   _create_unique_sqllocal_fields
column_sqldb_parametersr'   sql_check_constraintZdb_type_suffixextendremote_fielddb_constraintr   db_tablerI   
field_namerJ   sql_create_inline_fkrG   r*   supports_foreign_keys_create_fk_sqlget_internal_typerF   autoinc_sqlconstraintssql_create_tablejoindb_tablespacetablespace_sql)r-   r   fieldscolumnsZcolumn_sqlsr9   r   rY   Zextra_params	db_paramsZcol_type_suffixrQ   rR   rh   ri   r8   rm   r   rV   r   	table_sql   sX    


z"BaseDatabaseSchemaEditor.table_sqlc                 C   s6  |j | jd}|d }g }|du r&dS |j}|o:| | }|r| |}d| | }	|dur| jjjr~||	| | 7 }n||	7 }||g7 }|j	r|j
s| jjjrd}|r| jjjs|d7 }n|s|d7 }|j
r|d	7 }n|jr|d
7 }|jp|jj}
|
r.| jjjr.|jr.|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.
        rM   typeN)NNz	 DEFAULT Tz NULLz	 NOT NULLz PRIMARY KEYz UNIQUErP   )inline)r]   r'   nullskip_defaulteffective_default_column_default_sqlr*   requires_literal_defaultsprepare_defaultempty_strings_allowedr   !interprets_empty_strings_as_nullsZimplied_column_nulluniquerl   r   Zsupports_tablespacesrF   rm   )r-   r   r   include_defaultrp   r8   r9   rt   default_valueZcolumn_defaultZ
tablespacer   r   r   r\      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   ru      s    z%BaseDatabaseSchemaEditor.skip_defaultc                 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   ry     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   rw     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rt }|  }|dkrv|	 }q|dkr|
 }q|d	krt }nd }|S )
NZBinaryFieldr"   r<   Zauto_nowFZauto_now_addZ	DateFieldZ	TimeFieldZDateTimeField)has_defaultget_defaultrt   Zblankrz   rg   getattrr   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   rv   -  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   rD   1  s    z$BaseDatabaseSchemaEditor.quote_valuec                 C   s\   |  |\}}| ||pd | j| | |jjD ]}|jjjj	r8| 
|jj q8dS )zr
        Create a table and any accompanying indexes or unique constraints for
        the given `model`.
        N)rq   r3   r/   r_   _model_indexes_sqlr   local_many_to_manyr`   throughauto_createdcreate_model)r-   r   r8   r9   r   r   r   r   r   =  s    z%BaseDatabaseSchemaEditor.create_modelc                 C   s~   |j jD ]}|jjj jr| |jj q| | jd| |j j	i  t
| jD ](}t|trP||j j	rP| j| qPdS )z!Delete a model from the database.rX   N)r   r   r`   r   r   delete_modelr3   sql_delete_tablerG   rb   listr/   
isinstancer   Zreferences_tableremove)r-   r   r   r8   r   r   r   r   N  s    z%BaseDatabaseSchemaEditor.delete_modelc                 C   s   | j ||| dd dS )zAdd an index on a model.N)r9   )r3   
create_sqlr-   r   indexr   r   r   	add_index^  s    z"BaseDatabaseSchemaEditor.add_indexc                 C   s   |  |||  dS )zRemove an index from a model.N)r3   
remove_sqlr   r   r   r   remove_indexb  s    z%BaseDatabaseSchemaEditor.remove_indexc                 C   s   | || }|r| | dS )zAdd a constraint to a model.N)r   r3   r-   r   rU   r8   r   r   r   add_constraintf  s    z'BaseDatabaseSchemaEditor.add_constraintc                 C   s   | || }|r| | dS )z!Remove a constraint from a model.N)r   r3   r   r   r   r   remove_constraintl  s    z*BaseDatabaseSchemaEditor.remove_constraintc                    sz   dd |D }dd |D }| |D ]}|  |ddi| j q&| |D ](} fdd|D }| |  | qLdS )	z
        Deal with a model changing its unique_together. The input
        unique_togethers must be doubly-nested, not the single-nested
        ["foo", "bar"] format.
        c                 S   s   h | ]}t |qS r   rB   r   rn   r   r   r   	<setcomp>x  r"   zABaseDatabaseSchemaEditor.alter_unique_together.<locals>.<setcomp>c                 S   s   h | ]}t |qS r   r   r   r   r   r   r   y  r"   r|   Tc                    s   g | ]} j |jqS r   rH   rK   r   r   r   rL     r"   zBBaseDatabaseSchemaEditor.alter_unique_together.<locals>.<listcomp>N)
difference_delete_composed_indexsql_delete_uniquer3   rZ   )r-   r   Zold_unique_togetherZnew_unique_togetheroldsnewsrn   ro   r   r   r   alter_unique_togetherr  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     r"   z@BaseDatabaseSchemaEditor.alter_index_together.<locals>.<setcomp>c                 S   s   h | ]}t |qS r   r   r   r   r   r   r     r"   TF)r   r|   c                    s   g | ]} j |qS r   r   rI   rK   r   r   r   rL     r"   zABaseDatabaseSchemaEditor.alter_index_together.<locals>.<listcomp>_idxsuffixN)r   r   sql_delete_indexr3   _create_index_sql)r-   r   Zold_index_togetherZnew_index_togetherr   r   rn   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   rT   r   r   r   r     r"   zBBaseDatabaseSchemaEditor._delete_composed_index.<locals>.<setcomp>c                 S   s   h | ]
}|j qS r   r   rT   r   r   r   r     r"   c                    s   g | ]} j |jqS r   rH   rK   r   r   r   rL     r"   zCBaseDatabaseSchemaEditor._delete_composed_index.<locals>.<listcomp>exclude   z1Found wrong number (%s) of constraints for %s(%s)rW   r   )
r   ri   indexes_constraint_nameslen
ValueErrorrb   rk   r3   _delete_constraint_sql)	r-   r   rn   Zconstraint_kwargsr8   meta_constraint_namesmeta_index_namesro   constraint_namesr   r   r   r     s"    z/BaseDatabaseSchemaEditor._delete_composed_indexc                 C   sn   ||ks"| j jjr&| | kr&dS | | j| || |d  | jD ]}t|t	rN|
|| qNdS )z#Rename the table a model points to.N)Z	old_tableZ	new_table)r'   r*   Zignores_table_name_caselowerr3   sql_rename_tablerG   r/   r   r   Zrename_table_references)r-   r   Zold_db_tableZnew_db_tabler8   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.)rX   Zold_tablespaceZnew_tablespaceN)r3   sql_retablespace_tablerG   r   rb   )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u 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| ||||	rd| |	 nd	| |j| || || jj d
  7 }n| j| ||| | j| |jj| |j|d }| || | |s| |dur| j|d|dd\}}| j | |jj|d }| || | j!| "|| | jj
j#r| j$  dS )z
        Create a field on a model. Usually involves adding a column, but may
        involve adding a table instead (for M2M fields).
        T)r}   NrM   rN   rO   rS   z%s.r<   )r   	namespacerJ   rQ   rR   
deferrable)rX   rJ   rY   droprX   changes)%r   r`   r   r   r   r   r\   r]   r'   r^   r*   re   ra   sql_create_column_inline_fkr   rb   rI   rc   rJ   r	   _fk_constraint_namerG   rF   deferrable_sqlr/   rA   rf   sql_create_columnr3   ru   rv   _alter_column_default_sqlsql_alter_columnr_   _field_indexes_sqlconnection_persists_old_columnsclose)r-   r   r   rY   r9   rp   Zconstraint_suffixrQ   rR   r   _r8   changes_sqlr   r   r   	add_field  sN    



z"BaseDatabaseSchemaEditor.add_fieldc                 C   s   |j r |jjjjr | |jjS |j| jdd du 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.
        rM   rr   NTforeign_key)rX   rJ   )r   r`   r   r   r   r   r]   r'   r   rJ   r3   _delete_fk_sqlsql_delete_columnrG   rb   r*   r   r   r   r/   r   r   Zreferences_columnr   )r-   r   r   fk_namesfk_namer8   r   r   r   remove_field  s$    



z%BaseDatabaseSchemaEditor.remove_fieldc           	   
   C   s$  |j | jd}|d }|j | jd}|d }|du r>|jdu sP|du rb|jdu rbtd||f n|du r|du r|jjr|jjr|jjjjr|jjjjr| ||||S |du r|du r|jjr|jjr|jjjjs|jjjjsdS |du s|du 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.
        rM   rr   NzqCannot 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))	r]   r'   r`   r   r   r   r   _alter_many_to_many_alter_field)	r-   r   r    r#   strictold_db_paramsold_typenew_db_paramsnew_typer   r   r   alter_field  sV    	



z$BaseDatabaseSchemaEditor.alter_fieldc	           '      C   s\  t  }	| jjjr|jr|jr| j||jgdd}
|r\t|
dkr\t	dt|
|j
j|jf |
D ]$}|	|jf | | || q`|jr|jr| ||rdd |j
jD }| j||jgdd|d}|rt|dkrt	d	t||j
j|jf |D ]}| | || q| jjjoF|jr0|js@|joF|joF||k}|rt||D ]B\}}| j|j|jjgdd}|D ]}| | |j| q|qX|jr|js|jr|jrd
d |j
jD }| j||jgdtj|d}|D ]}| | || q|d |d kr|d rdd |j
jD }| j||jgd|d}|rzt|dkrzt	dt||j
j|jf |D ]}| | || q~|j|jkr| | |j
j||| | jD ](}t|t r|!|j
j|j|j qg }g }g }||kr.| "||||\}}|#| |$| d}|j%r|j%s| &|}| &|}| '|s||kr|durd}|#| (||| |j%|j%kr| )|||}|r|#| |* o|j%o|j% }|s|r|s|| }| jjj+r&|r&t,t-| \}} d.|t/| g fg}|D ],\}} | | j0| 1|j
j|d |  q*|r| | j2| 1|j
j| 1|jdd |g |D ],\}} | | j0| 1|j
j|d |  q|r|D ]\}} | ||  q|jr|js| 3|| | 4||r | | 5||jg |jr0|jrT|jrT|jsT| | 6||g g }!|rn|!$t|| | ||r| | 7|| |!$t|| |!D ]\}"}|jj8| jd}#|#d }$| "|j|"j|j|$\}}| | j0| 1|jj
j|d d |d  |D ]\}} | ||  qq| jjjrn|jrn|	sR|jrR|jsn|jrn| | 9||d |r|j:j
j;D ]4}%t<|%|r~|%jjr~| | 9|%j|%jd q~|d |d kr |d r | j=|j
j|jgdd}| | >|||d  |rB| j(|||dd\}&} | j0| 1|j
j|&d }| ||  | jjj?rX| j@  dS )z3Perform a "physical" (non-ManyToMany) field update.Tr   r   z<Found wrong number (%s) of foreign key constraints for %s.%sc                 S   s   h | ]
}|j qS r   r   rT   r   r   r   r   U  r"   z8BaseDatabaseSchemaEditor._alter_field.<locals>.<setcomp>F)r|   r   r   z7Found wrong number (%s) of unique constraints for %s.%sc                 S   s   h | ]
}|j qS r   r   )r   r   r   r   r   r     r"   )r   type_r   rN   c                 S   s   h | ]
}|j qS r   r   rT   r   r   r   r     r"   )rN   r   z6Found wrong number (%s) of check constraints for %s.%sNrW   r   r   )rX   rJ   r   rM   rr   r   rS   Z_fk_checkr   r   )Asetr'   r*   re   r`   ra   r   rJ   r   r   r   rb   addr3   r   r|   _field_became_primary_keyri   _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_references_alter_column_type_sqlrA   r_   rt   rv   ru   r   _alter_column_null_sqlr   Zsupports_combined_altersrB   r$   rk   sumr   rG   sql_update_with_default_delete_primary_key_unique_should_be_addedrZ   r   _create_primary_key_sqlr]   rf   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_namer8   actionsZnull_actionsZpost_actionsfragmentZother_actionsZneeds_database_defaultZold_defaultnew_defaultZfour_way_default_alterationr9   Zrels_to_updateZold_relZrel_db_paramsZrel_typerelr   r   r   r   r   >  sp    











 z%BaseDatabaseSchemaEditor._alter_fieldc                 C   s\   | j jjr| dv 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	TextFieldNrM   rr   rJ   rr   )
r'   r*   r{   rg   r]   rt   sql_alter_column_nullsql_alter_column_not_nullrG   rJ   )r-   r   r    r#   r   r8   r   r   r   r   6  s    


z/BaseDatabaseSchemaEditor._alter_column_null_sqlc           
      C   sz   |  |}| |}|g}|r$g }n| jjjr<| |}g }|j| jd}|rT| 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.
        rM   rr   )rJ   rr   r   )rv   rw   r'   r*   rx   ry   r]   sql_alter_column_no_defaultsql_alter_column_defaultrG   rJ   )
r-   r   r    r#   r   r   r   r9   r   r8   r   r   r   r   L  s"    




z2BaseDatabaseSchemaEditor._alter_column_default_sqlc                 C   s    | j | |j|d g fg fS )a  
        Hook to specialize column type alteration for different backends,
        for cases when a creation type is different to an alteration type
        (e.g. SERIAL in PostgreSQL, PostGIS fields).

        Return a two-tuple of: an SQL fragment of (sql, params) to insert into
        an ALTER TABLE statement and a list of extra (sql, params) tuples to
        run once the field is altered.
        r   )sql_alter_column_typerG   rJ   )r-   r   r    r#   r   r   r   r   r   k  s    
z/BaseDatabaseSchemaEditor._alter_column_type_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)	r`   r   r   rb   r   r   rI   Zm2m_reverse_field_nameZm2m_field_name)r-   r   r    r#   r   r   r   r   r     s    
z,BaseDatabaseSchemaEditor._alter_many_to_manyr<   c           	      C   s   t |\}}dt|g|R ddi|f }| jj p8d}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   r'   rF   Zmax_name_lengthrk   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 u r:t |dkr*|d jr*|d j}n|jjr:|jj}|d urTd| jj| S dS )Nr   r   rO   r<   )r   rl   r   r'   rF   rm   )r-   r   rn   rl   r   r   r   _get_index_tablespace_sql  s    z2BaseDatabaseSchemaEditor._get_index_tablespace_sqlc                 C   s   |rd| S dS )Nz WHERE r<   r   )r-   	conditionr   r   r   _index_condition_sql  s    z-BaseDatabaseSchemaEditor._index_condition_sql)r   r   usingrl   col_suffixesr8   	opclassesr  c                   sx   j |||d}dd |D }|p&j}|jj} fdd}t|t|jt|||||||||	|	|
dS )z
        Return the SQL statement to create the index for one or several fields.
        `sql` can be specified if the syntax differs from the standard (GIS
        indexes, ...).
        )rl   c                 S   s   g | ]
}|j qS r   )rJ   rK   r   r   r   rL     r"   z>BaseDatabaseSchemaEditor._create_index_sql.<locals>.<listcomp>c                     s"    d u rj | i |  S r   )r   rG   argskwargsr   r-   r   r   create_index_name  s    zEBaseDatabaseSchemaEditor._create_index_sql.<locals>.create_index_name)rX   r   r  ro   r:   r  )
r
  sql_create_indexr   rb   r   r   rG   r   _index_columnsr  )r-   r   rn   r   r   r  rl   r  r8   r  r  rm   ro   r  rX   r  r   r  r   r     s    

z*BaseDatabaseSchemaEditor._create_index_sqlc                 C   s&   t |p
| jt|jj| j| |dS N)rX   r   )r   r   r   r   rb   rG   )r-   r   r   r8   r   r   r   r     s
    z*BaseDatabaseSchemaEditor._delete_index_sqlc                 C   s   t ||| j|dS )N)r  )r   rG   )r-   rX   ro   r  r  r   r   r   r    s    z'BaseDatabaseSchemaEditor._index_columnsc                    s    j jr j js j jrg S g } j jD ]}||  | q( j jD ],} fdd|D }|| j	 |dd qH j j
D ]}|| |  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   rK   r   r   r   rL     r"   z?BaseDatabaseSchemaEditor._model_indexes_sql.<locals>.<listcomp>r   r   )r   ZmanagedproxyZswappedr[   r_   r   Zindex_togetherrA   r   r   r   )r-   r   outputr   r   rn   r   r   r   r   r     s    z+BaseDatabaseSchemaEditor._model_indexes_sqlc                 C   s(   g }|  ||r$|| ||g |S )zT
        Return a list of all index SQL statements for the specified field.
        )_field_should_be_indexedrA   r   )r-   r   r   r  r   r   r   r     s    z+BaseDatabaseSchemaEditor._field_indexes_sqlc                 C   s   |j o|j S r   )r   r|   r-   r   r   r   r   r   r    s    z1BaseDatabaseSchemaEditor._field_should_be_indexedc                 C   s   |j  o|j S r   r   r-   r    r#   r   r   r   r     s    z2BaseDatabaseSchemaEditor._field_became_primary_keyc                 C   s"   |j  r|j p |jo |j o |j S r   )r|   r   r  r   r   r   r   
  s    z0BaseDatabaseSchemaEditor._unique_should_be_addedc                 C   s*   | j | || |j| |j|d S )N)rX   Z
old_columnZ
new_columnrr   )sql_rename_columnrG   rJ   )r-   rX   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)rX   r   rJ   rQ   rR   r   )r   r   rb   rG   r   r   rJ   target_fieldr   r'   rF   r   r   sql_create_fk)
r-   r   r   r   rX   r   rJ   rQ   rR   r   r   r   r   rf     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| i |S r   rG   r   r  r2   r   r   create_fk_name)  s    zDBaseDatabaseSchemaEditor._fk_constraint_name.<locals>.create_fk_namer   )r   r   rb   rJ   r	   r  r   )r-   r   r   r   r"  r   r2   r   r   (  s    z,BaseDatabaseSchemaEditor._fk_constraint_namec                 C   s   |  | j||S r   )r   sql_delete_fkr-   r   r   r   r   r   r   5  s    z'BaseDatabaseSchemaEditor._delete_fk_sqlc                 C   s,   |d u rdS |t jkrdS |t jkr(dS d S )Nr<   z DEFERRABLE INITIALLY DEFERREDz DEFERRABLE INITIALLY IMMEDIATE)r
   ZDEFERREDZ	IMMEDIATE)r-   r   r   r   r   _deferrable_constraint_sql8  s    

z3BaseDatabaseSchemaEditor._deferrable_constraint_sqlc                 C   sv   |r| j jjsd S |r<| j||||d}|r8| j| d S | jdt| j	|| 
|d }| j| 	||d S )N)r   r  rW   )ro   r   r   rU   )r'   r*   &supports_deferrable_unique_constraintsrZ   r/   rA   sql_unique_constraintrk   rC   rG   r%  sql_constraint)r-   r   rn   r   r  r   r8   rU   r   r   r   _unique_sql@  s$    z$BaseDatabaseSchemaEditor._unique_sqlc           	   	      s   |r j jjsd S  fdd}t|jj j}|d u rJt|jj|d|}n
 |}t|| j}|r| j jj	std S  j
}n j}t|||| | |dS )Nc                     s      j| i |S r   r!  r  r2   r   r   create_unique_name]  s    zGBaseDatabaseSchemaEditor._create_unique_sql.<locals>.create_unique_name_uniq)rX   r   ro   r  r   )r'   r*   r'  r   r   rb   rG   r   r   supports_partial_indexessql_create_unique_indexsql_create_uniquer   r  r%  )	r-   r   ro   r   r  r   r+  rX   r8   r   r2   r   rZ   V  s0    

z+BaseDatabaseSchemaEditor._create_unique_sqlc                 C   sD   |r| j jjsd S |r4| j jjr0| | j||S d S | | j||S r   )r'   r*   r'  r-  r   r   r   )r-   r   r   r  r   r   r   r   r   u  s    z+BaseDatabaseSchemaEditor._delete_unique_sqlc                 C   s    | j | || jd|i d S )NrN   r&  )r)  rG   r^   )r-   r   rN   r   r   r   
_check_sql  s    z#BaseDatabaseSchemaEditor._check_sqlc                 C   s$   t | jt|jj| j| ||dS )N)rX   r   rN   )r   sql_create_checkr   r   rb   rG   )r-   r   r   rN   r   r   r   r     s    z*BaseDatabaseSchemaEditor._create_check_sqlc                 C   s   |  | j||S r   )r   sql_delete_checkr$  r   r   r   r     s    z*BaseDatabaseSchemaEditor._delete_check_sqlc                 C   s    t |t|jj| j| |dS r  )r   r   r   rb   rG   )r-   templater   r   r   r   r   r     s
    z/BaseDatabaseSchemaEditor._delete_constraint_sqlc
                    s"  |dur fdd|D } j  $}
 j j|
|jj}W d   n1 sN0    Y  g }| D ]\}}|du s||d krd|dur|d |krqd|dur|d |krqd|dur|d |krqd|dur|d |krqd|dur|d	 sqd|dur|d
 |krqd|	r||	vrd|| qd|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   r2   r   r   rL     s   z>BaseDatabaseSchemaEditor._constraint_names.<locals>.<listcomp>ro   r|   r   r   rN   r   rr   )r'   rE   r4  Zget_constraintsr   rb   itemsrA   )r-   r   r  r|   r   r   r   rN   r   r   rE   ri   resultr   Zinfodictr   r2   r   r     s0    
2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   rb   r3   _delete_primary_key_sql)r-   r   r   r   r   r   r   r   r     s    z,BaseDatabaseSchemaEditor._delete_primary_keyc              
   C   sJ   t | jt|jj| j| | j|jj|jgddt|jj|jg| jdS )NZ_pkr   )rX   r   ro   )	r   sql_create_pkr   r   rb   rG   r   rJ   r   r  r   r   r   r     s    z0BaseDatabaseSchemaEditor._create_primary_key_sqlc                 C   s   |  | j||S r   )r   sql_delete_pkr$  r   r   r   r7    s    z0BaseDatabaseSchemaEditor._delete_primary_key_sqlc                 C   s*   | j | |d|d }| | d S )N,)Z	procedureparam_types)sql_delete_procedurerG   rk   r3   )r-   Zprocedure_namer;  r8   r   r   r   remove_procedure  s
    z)BaseDatabaseSchemaEditor.remove_procedure)FT)r   )F)F)F)F)r<   )N)N)NN)NNN)NN)NNNNNNNN)F)r   )a__name__
__module____qualname____doc__rj   r   r   r   r   r   r   r   r   r   r   r   r  r   r(  r^   Zsql_delete_constraintr)  r1  r2  r/  r   r   rd   r   r#  r  r.  r   r8  r9  r<  r.   r1   r4   r3   rG   rq   r\   ru   ry   rw   staticmethodr   rv   rD   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   rf   r   r   r%  r*  rZ   r   r0  r   r   r   r   r   r   r7  r=  r   r   r   r   r&   ,   s   
		
;
1	
9
* 
 y




	


   



r&   )loggingr   Z!django.db.backends.ddl_referencesr   r   r   r   r   Zdjango.db.backends.utilsr   r	   Zdjango.db.modelsr
   r   Zdjango.db.transactionr   r   Zdjango.utilsr   	getLoggerr>   r   r   r%   r&   r   r   r   r   <module>   s   
	