a
    ÛEbj ã                   @   s°   d dl Z d dlmZ d dlmZmZmZmZmZmZ d dl	m
Z
mZ d dlmZmZ d dlmZ d dlmZmZ d dlmZ e  d	¡Zd
d„ Zdd„ Zdd„ ZG dd„ dƒZdS )é    N)Údatetime)ÚColumnsÚExpressionsÚForeignKeyNameÚ	IndexNameÚ	StatementÚTable)Únames_digestÚsplit_identifier)Ú
DeferrableÚIndex)ÚQuery)ÚTransactionManagementErrorÚatomic)Útimezonezdjango.db.backends.schemac                 C   s2   | j }|jrdS |jr&|jdgkr&dS |j|j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   ú^/home/ja/django-apps/lartica_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d�S )NFT)ÚforwardÚreverseZinclude_hiddenZinclude_parents)Ú_metaZ_get_fields©Ú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>2   s   
þz+_related_non_m2m_objects.<locals>.<genexpr>c                 3   s   | ]}t |ˆ ƒr|V  qd S r   r   r    )Ú	new_fieldr   r   r$   7   s   
þ)Úzipr   r   Ú_related_non_m2m_objectsÚremote_field)r#   r%   Zrelated_fieldsÚold_relÚnew_relr   )r%   r#   r   r'   .   s    
þ
þú
þr'   c                   @   sä  e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZeZdZdZdZdZdZdZdZdZdZeZdZeZdZdZdZeZdZ dZ!dZ"dZ#eZ$dZ%d§d d!„Z&d"d#„ Z'd$d%„ Z(d¨d'd(„Z)d)d*„ Z*d+d,„ Z+d-d.„ Z,d©d/d0„Z-d1d2„ Z.d3d4„ Z/d5d6„ Z0d7d8„ Z1e2d9d:„ ƒZ3d;d<„ Z4d=d>„ Z5d?d@„ Z6dAdB„ Z7dCdD„ Z8dEdF„ Z9dGdH„ Z:dIdJ„ Z;dKdL„ Z<dMdN„ Z=dOdP„ Z>dQdR„ Z?dSdT„ Z@dUdV„ ZAdWdX„ ZBdªdYdZ„ZCd«d[d\„ZDd]d^„ ZEd¬d_d`„ZFdadb„ ZGdcdd„ ZHdedf„ ZId­dhdi„ZJd®djdk„ZKdldm„ ZLdndo„ ZMdddgdgdd&dd&ddddpœdqdr„ZNd¯dsdt„ZOdudv„ ZPdwdx„ ZQdydz„ ZRd{d|„ ZSd}d~„ ZTdd€„ ZUd�d‚„ ZVdƒd„„ ZWd…d†„ ZXd‡dˆ„ ZYd‰dŠ„ ZZd‹dŒ„ Z[d°d�dŽ„Z\d±d�d�„Z]d²d‘d’„Z^d“d”„ Z_d•d–„ Z`d—d˜„ Zad™dš„ Zbd³d›dœ„Zcd´d�dž„ZddŸd „ Zed¡d¢„ Zfd£d¤„ Zgdµd¥d¦„ZhdS )¶ÚBaseDatabaseSchemaEditorzÈ
    This class and its subclasses are responsible for emitting schema-changing
    statements to the databases - model creation/removal/alteration, field
    renaming, index fiddling, and so on.
    z'CREATE TABLE %(table)s (%(definition)s)z1ALTER TABLE %(old_table)s RENAME TO %(new_table)sz7ALTER TABLE %(table)s SET TABLESPACE %(new_tablespace)szDROP TABLE %(table)s CASCADEz:ALTER TABLE %(table)s ADD COLUMN %(column)s %(definition)sz!ALTER TABLE %(table)s %(changes)sz%ALTER COLUMN %(column)s TYPE %(type)sz%ALTER COLUMN %(column)s DROP NOT NULLz$ALTER COLUMN %(column)s SET NOT NULLz/ALTER COLUMN %(column)s SET DEFAULT %(default)sz$ALTER COLUMN %(column)s DROP DEFAULTz2ALTER COLUMN %(column)s TYPE %(type)s%(collation)sz4ALTER TABLE %(table)s DROP COLUMN %(column)s CASCADEzDALTER TABLE %(table)s RENAME COLUMN %(old_column)s TO %(new_column)szFUPDATE %(table)s SET %(column)s = %(default)s WHERE %(column)s IS NULLz"UNIQUE (%(columns)s)%(deferrable)szCHECK (%(check)s)z.ALTER TABLE %(table)s DROP CONSTRAINT %(name)sz"CONSTRAINT %(name)s %(constraint)sz?ALTER TABLE %(table)s ADD CONSTRAINT %(name)s CHECK (%(check)s)zPALTER TABLE %(table)s ADD CONSTRAINT %(name)s UNIQUE (%(columns)s)%(deferrable)sz|ALTER TABLE %(table)s ADD CONSTRAINT %(name)s FOREIGN KEY (%(column)s) REFERENCES %(to_table)s (%(to_column)s)%(deferrable)sNzQCREATE INDEX %(name)s ON %(table)s (%(columns)s)%(include)s%(extra)s%(condition)szOCREATE UNIQUE INDEX %(name)s ON %(table)s (%(columns)s)%(include)s%(condition)szDROP INDEX %(name)szGALTER TABLE %(table)s ADD CONSTRAINT %(name)s PRIMARY KEY (%(columns)s)zDROP PROCEDURE %(procedure)sFTc                 C   s,   || _ || _| jrg | _| j jjo$|| _d S r   )Ú
connectionÚcollect_sqlÚcollected_sqlÚfeaturesÚcan_rollback_ddlÚatomic_migration)Úselfr,   r-   r   r   r   r   Ú__init__Š   s
    z!BaseDatabaseSchemaEditor.__init__c                 C   s(   g | _ | jr$t| jjƒ| _| j ¡  | S r   )Údeferred_sqlr1   r   r,   ÚaliasÚ	__enter__©r2   r   r   r   r6   “   s
    
z"BaseDatabaseSchemaEditor.__enter__c                 C   s8   |d u r| j D ]}|  |¡ q| jr4| j |||¡ d S r   )r4   Úexecuter1   r   Ú__exit__)r2   Úexc_typeÚ	exc_valueÚ	tracebackÚsqlr   r   r   r9   š   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ur†| j |tt| j|ƒƒ | ¡ qÎ| j || ¡ n6| j ¡ �}| ||¡ W d  ƒ n1 sÄ0    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))Úparamsr=   )Úextraú;Ú N)r-   r,   Zin_atomic_blockr/   r0   r   ÚstrÚloggerÚdebugÚrstripÚendswithr.   ÚappendÚtupleÚmapÚquote_valueÚcursorr8   )r2   r=   r>   ÚendingrK   r   r   r   r8   £   s,    ÿþýÿÿÿz BaseDatabaseSchemaEditor.executec                 C   s   | j j |¡S r   )r,   ÚopsÚ
quote_name)r2   r   r   r   r   rN   Â   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  |¡‘qS r   ©r   Ú	get_field©r!   r   r   r   r   Ú
<listcomp>Ê   ó    z6BaseDatabaseSchemaEditor.table_sql.<locals>.<listcomp>N©r,   Úcheckú z %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   r2   r   r   rR     s   ÿú, c                 s   s   | ]}|r|V  qd S r   r   rZ   r   r   r   r$     s   z5BaseDatabaseSchemaEditor.table_sql.<locals>.<genexpr>)ÚtableÚ
definition) r   Zunique_togetherr4   rG   Ú_create_unique_sqlÚlocal_fieldsÚ
column_sqlÚdb_parametersr,   Úsql_check_constraintZdb_type_suffixÚextendr(   Údb_constraintr   Údb_tablerP   Ú
field_nameÚcolumnÚsql_create_inline_fkrN   r/   Úsupports_foreign_keysÚ_create_fk_sqlÚget_internal_typerM   Úautoinc_sqlÚconstraintsÚsql_create_tableÚjoinÚdb_tablespaceÚtablespace_sql)r2   r   Úfield_namesÚfieldsZcolumn_sqlsr>   r   r_   Zextra_paramsÚ	db_paramsZcol_type_suffixrW   rX   rn   ro   r=   rs   r   r\   r   Ú	table_sqlÅ   sz    

ÿþÿÿ
þÿÿ	
ÿþ
ÿþ
ÿz"BaseDatabaseSchemaEditor.table_sqlc                 c   s(  |V  t |dd ƒ}|r"|  |¡V  |j}|oF|  |¡ oF|oD|  |¡ }|r˜|  |¡}|d ur˜d|  |¡ }	| jjj	rˆ|	|  
|¡ V  n|	V  | |¡ |jr²|js²| jjjr²d}|s¾dV  n| jjjsÎdV  |jrÜdV  n|jrèdV  |jpô|jj}
|
�r$| jjj�r$|j�r$| jjj|
dd�V  d S )	NÚdb_collationzDEFAULT TzNOT NULLZNULLzPRIMARY KEYZUNIQUE)Úinline)ÚgetattrÚ_collate_sqlÚnullÚskip_defaultÚskip_default_on_alterÚeffective_defaultÚ_column_default_sqlr,   r/   Úrequires_literal_defaultsÚprepare_defaultrG   Úempty_strings_allowedr   Ú!interprets_empty_strings_as_nullsZimplied_column_nullÚuniquerr   r   Zsupports_tablespacesrM   rs   )r2   Úcolumn_db_typer>   r   r   Úinclude_defaultÚ	collationr|   Údefault_valueZcolumn_defaultZ
tablespacer   r   r   Ú_iter_column_sql  sR    
ÿù	


ÿþý
ÿþýz)BaseDatabaseSchemaEditor._iter_column_sqlc              	   C   sB   |j | jd�}|d }|du 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.
        rT   ÚtypeN)NNrV   )rc   r,   rq   rŠ   )r2   r   r   r‡   rv   r†   r>   r   r   r   rb   L  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   ©r2   r   r   r   r   r}   b  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~   i  s    z.BaseDatabaseSchemaEditor.skip_default_on_alterc                 C   s   t dƒ‚dS )zU
        Only used for backends which have requires_literal_defaults feature
        z€subclasses of BaseDatabaseSchemaEditor for backends which have requires_literal_defaults must provide a prepare_default() methodN©ÚNotImplementedError©r2   Úvaluer   r   r   r‚   p  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€   y  s    z,BaseDatabaseSchemaEditor._column_default_sqlc                 C   s¢   |   ¡ r|  ¡ }nŒ| js<| jr<| jr<|  ¡ dkr6d}qžd}nbt| ddƒsTt| ddƒrš|  ¡ }|dkrnt ¡ }qžt	 ¡ }|dkrˆ| 
¡ }qž|d	krž| ¡ }nd }|S )
NZBinaryFieldrS   rA   Zauto_nowFZauto_now_addZDateTimeFieldZ	DateFieldZ	TimeField)Úhas_defaultÚget_defaultr|   Úblankrƒ   rm   rz   r   Únowr   ÚdateÚtime)r   ÚdefaultZinternal_typer   r   r   Ú_effective_default€  s"    



z+BaseDatabaseSchemaEditor._effective_defaultc                 C   s   |  |  |¡| j¡S )z2Return a field's effective database default value.)Zget_db_prep_saver™   r,   rŒ   r   r   r   r   ˜  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   rJ   œ  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)rw   r8   r4   re   Ú_model_indexes_sqlr   Úlocal_many_to_manyr(   ÚthroughÚauto_createdÚcreate_model)r2   r   r=   r>   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.r^   N)r   r›   r(   rœ   r�   Údelete_modelr8   Úsql_delete_tablerN   rg   Úlistr4   Ú
isinstancer   Zreferences_tableÚremove)r2   r   r   r=   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©r>   )Úcontains_expressionsr,   r/   Úsupports_expression_indexesr8   Ú
create_sql©r2   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¥   r,   r/   r¦   r8   Ú
remove_sqlr¨   r   r   r   Úremove_indexÛ  s    ÿþz%BaseDatabaseSchemaEditor.remove_indexc                 C   s"   |  || ¡}|r| j|dd� dS )zAdd a constraint to a model.Nr¤   )r§   r8   ©r2   r   r[   r=   r   r   r   Úadd_constraintä  s    z'BaseDatabaseSchemaEditor.add_constraintc                 C   s   |  || ¡}|r|  |¡ dS )z!Remove a constraint from a model.N)r«   r8   r­   r   r   r   Úremove_constraintì  s    z*BaseDatabaseSchemaEditor.remove_constraintc                    sz   dd„ |D ƒ}dd„ |D ƒ}|  |¡D ]}|  ˆ |ddi| j¡ q&|  |¡D ](}‡ fdd„|D ƒ}|  |  ˆ |¡¡ qLdS )	z°
        Deal with a model changing its unique_together. The input
        unique_togethers must be doubly-nested, not the single-nested
        ["foo", "bar"] format.
        c                 S   s   h | ]}t |ƒ’qS r   ©rH   ©r!   ru   r   r   r   Ú	<setcomp>ø  rS   zABaseDatabaseSchemaEditor.alter_unique_together.<locals>.<setcomp>c                 S   s   h | ]}t |ƒ’qS r   r°   r±   r   r   r   r²   ù  rS   r…   Tc                    s   g | ]}ˆ j  |¡‘qS r   rO   rQ   r   r   r   rR     rS   zBBaseDatabaseSchemaEditor.alter_unique_together.<locals>.<listcomp>N)Ú
differenceÚ_delete_composed_indexÚsql_delete_uniquer8   r`   )r2   r   Zold_unique_togetherZnew_unique_togetherÚoldsÚnewsru   rt   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²   
  rS   z@BaseDatabaseSchemaEditor.alter_index_together.<locals>.<setcomp>c                 S   s   h | ]}t |ƒ’qS r   r°   r±   r   r   r   r²     rS   TF)r©   r…   c                    s   g | ]}ˆ j  |¡‘qS r   rO   rQ   r   r   r   rR     rS   zABaseDatabaseSchemaEditor.alter_index_together.<locals>.<listcomp>Ú_idx©ru   ÚsuffixN)r³   r´   Úsql_delete_indexr8   Ú_create_index_sql)r2   r   Zold_index_togetherZnew_index_togetherr¶   r·   ru   rt   r   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   rZ   r   r   r   r²     s   zBBaseDatabaseSchemaEditor._delete_composed_index.<locals>.<setcomp>c                 S   s   h | ]
}|j ’qS r   r¿   rZ   r   r   r   r²     rS   c                    s   g | ]}ˆ j  |¡j‘qS r   )r   rP   ri   rQ   r   r   r   rR     rS   zCBaseDatabaseSchemaEditor._delete_composed_index.<locals>.<listcomp>Úexcludeé   z1Found wrong number (%s) of constraints for %s(%s)r]   r   )
r   ro   ÚindexesÚ_constraint_namesÚlenÚ
ValueErrorrg   rq   r8   Ú_delete_constraint_sql)	r2   r   ru   Zconstraint_kwargsr=   Úmeta_constraint_namesÚmeta_index_namesÚcolumnsÚ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Úlowerr8   Úsql_rename_tablerN   r4   r¢   r   Zrename_table_references)r2   r   Zold_db_tableZnew_db_tabler=   r   r   r   Úalter_db_table0  s     ÿþþÿÿ

z'BaseDatabaseSchemaEditor.alter_db_tablec                 C   s2   |   | j|  |jj¡|  |¡|  |¡dœ ¡ dS )z)Move a model's table between tablespaces.)r^   Zold_tablespaceZnew_tablespaceN)r8   Úsql_retablespace_tablerN   r   rg   )r2   r   Zold_db_tablespaceZnew_db_tablespacer   r   r   Úalter_db_tablespaceC  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|  |||¡|	rèd|  |	¡ 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‡   NrT   rU   rV   rY   z%s.rA   )r   Ú	namespaceri   rW   rX   Ú
deferrable)r^   ri   r_   ©Údrop©r^   Úchanges)%r   r(   rœ   r   r�   rž   rb   rc   r,   rd   r/   rk   rf   Úsql_create_column_inline_fkr   rg   rP   rh   ri   r
   Ú_fk_constraint_namerN   rM   Údeferrable_sqlr4   rG   rl   Úsql_create_columnr8   r~   r   Ú_alter_column_default_sqlÚsql_alter_columnre   Ú_field_indexes_sqlÚconnection_persists_old_columnsÚclose)r2   r   r   r_   r>   rv   Zconstraint_suffixrW   rX   rÐ   Ú_r=   Úchanges_sqlr   r   r   Ú	add_fieldN  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 |¡ qºdS )z…
        Remove a field from a model. Usually involves deleting a column,
        but for M2Ms may involve deleting a table.
        rT   r‹   NT©Úforeign_key)r^   ri   )r   r(   rœ   r   r�   rŸ   rc   r,   rÃ   ri   r8   Ú_delete_fk_sqlÚsql_delete_columnrN   rg   r/   rÝ   rÞ   r¡   r4   r¢   r   Zreferences_columnr£   )r2   r   r   Úfk_namesÚfk_namer=   r   r   r   Úremove_field–  s(    
þ



ÿz%BaseDatabaseSchemaEditor.remove_fieldc           	   
   C   s6  |   ||¡sdS |j| jd�}|d }|j| jd�}|d }|du rN|jdu s`|du rr|jdu rrt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söd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.
        NrT   r‹   zqCannot alter field %s into %s - they do not properly define db_type (are you using a badly-written custom field?)z�Cannot alter field %s into %s - they are not compatible types (you cannot alter to or from M2M fields, or add or remove through= on M2M fields))
Ú_field_should_be_alteredrc   r,   r(   rÅ   rœ   r   r�   Ú_alter_many_to_manyÚ_alter_field)	r2   r   r#   r%   Ú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||jgdd�}
|r\t|
ƒdkr\t	dt|
ƒ|j
j|jf ƒ‚|
D ]$}|	 |jf¡ |  |  ||¡¡ q`|j�r|jr¢|  ||¡�rdd„ |j
jD ƒ}| j||jgdd|d�}|røt|ƒdkrøt	d	t|ƒ|j
j|jf ƒ‚|D ]}|  |  ||¡¡ qü| jjj�oF|j�r0|j�s@|j�oF|j�oF||k}|�rœt||ƒD ]B\}}| j|j|jjgdd�}|D ]}|  |  |j|¡¡ �q|�qX|j�r|j�s|j�r¼|j�rd
d„ |j
jD ƒ}| j||jgdtj|d�}|D ]}|  |  ||¡¡ �qì|d |d k�r˜|d �r˜dd„ |j
jD ƒ}| j||jgd|d�}|�rzt|ƒdk�rzt	dt|ƒ|j
j|jf ƒ‚|D ]}|  |  ||¡¡ �q~|j|jk�rð|  |  |j
j|||¡¡ | jD ](}t|t ƒ�rÆ| !|j
j|j|j¡ �qÆg }g }g }t"|ddƒ}t"|ddƒ}||k�r:|  #||||¡}| $|¡ n2||k�rl|  %||||¡\}}| $|¡ | &|¡ d}|j'�rÌ|j'�sÌ|  (|¡}|  (|¡} |  )|¡�sÌ|| k�rÌ| du�rÌd}| $|  *|||¡¡ |j'|j'k�rø|  +|||¡}|�rø| $|¡ | ,¡ �o|j'�o|j' }!|�s|�rü|!�s,|| }| jjj-�rd|�rdt.t/|Ž ƒ\}}"d 0|¡t1|"g ƒfg}|D ],\}}"|  | j2|  3|j
j¡|dœ |"¡ �qh|!�rü|  | j4|  3|j
j¡|  3|j¡ddœ | g¡ |D ],\}}"|  | j2|  3|j
j¡|dœ |"¡ �qÎ|�r|D ]\}}"|  ||"¡ �q|j�r:|j�s:|  5||¡ |  6||¡�r\|  |  7||g¡¡ |j�rl|j�r’|j�r’|j�s’|  | j8||gd�¡ g }#|�r¬|# &t||ƒ¡ |  ||¡�rÜ|  |  9||¡¡ |# &t||ƒ¡ |#D ]„\}$}|jj:| jd�}%|%d }&|  %|j|$j|j|&¡\}}|  | j2|  3|jj
j¡|d dœ |d ¡ |D ]\}}"|  ||"¡ �qJ�qà| jjj�r¬|j�r¬|	�s�|j�r�|j�s¬|j�r¬|  |  ;||d¡¡ |�rä|#D ],\}'}(|(jj�r¶|  |  ;|(j|(jd¡¡ �q¶|d |d k�r0|d �r0| j<|j
j|jgdd�}|  |  =|||d ¡¡ |�rr| j*|||dd�\})}"| j2|  3|j
j¡|)dœ }|  ||"¡ | jjj>�rˆ| 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¿   rZ   r   r   r   r²     s   z8BaseDatabaseSchemaEditor._alter_field.<locals>.<setcomp>F)r…   r   rÀ   z7Found wrong number (%s) of unique constraints for %s.%sc                 S   s   h | ]
}|j ’qS r   r¿   )r!   r©   r   r   r   r²   U  rS   )r©   Útype_rÀ   rU   c                 S   s   h | ]
}|j ’qS r   r¿   rZ   r   r   r   r²   f  s   )rU   rÀ   z6Found wrong number (%s) of check constraints for %s.%srx   Nr]   rÔ   r‘   )r^   ri   r˜   ©ru   rT   r‹   r   rY   Z_fkÚ_check©r»   rÒ   )@Úsetr,   r/   rk   r(   rf   rÃ   ri   rÄ   rÅ   r   rg   Úaddr8   rä   r…   Ú_field_became_primary_keyro   Ú_delete_unique_sqlr   r'   Zrelated_modelr   Údb_indexrÂ   r   r»   Ú_delete_index_sqlÚ_delete_check_sqlÚ_rename_field_sqlr4   r¢   r   Zrename_column_referencesrz   Ú_alter_column_collation_sqlrG   Ú_alter_column_type_sqlre   r|   r   r~   rÚ   Ú_alter_column_null_sqlr’   Zsupports_combined_altersrH   r&   rq   ÚsumrÛ   rN   Úsql_update_with_defaultÚ_delete_primary_keyÚ_unique_should_be_addedr`   r½   Ú_create_primary_key_sqlrc   rl   Ú_create_index_nameÚ_create_check_sqlrÝ   rÞ   )*r2   r   r#   r%   rî   rð   rí   rï   rì   Zfks_droppedræ   rç   rÇ   rÊ   Úconstraint_nameZdrop_foreign_keysZ_old_relr*   Zrel_fk_namesrÈ   Zindex_namesÚ
index_namer=   ÚactionsZnull_actionsZpost_actionsZold_collationÚnew_collationÚfragmentZother_actionsZneeds_database_defaultZold_defaultÚnew_defaultZfour_way_default_alterationr>   Zrels_to_updater)   Zrel_db_paramsZrel_typerß   Úrelrà   r   r   r   rë   ö  s   ÿþý
ÿýÿÿÿ
ÿÿûýÿÿýúÿÿþýýûÿüýÿÿÿÿ
ÿ
ÿ
ÿ



ÿþýÿ

ÿþÿú
ýÿùþÿúÿÿþýÿþÿúÿþüüüúÿ
ÿÿÿÿ
þ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.
        NrT   r‹   ©ri   r‹   )
r,   r/   r„   rƒ   rc   r|   Úsql_alter_column_nullÚsql_alter_column_not_nullrN   ri   )r2   r   r#   r%   rï   r=   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.
        rT   r‹   )ri   r‹   r˜   )r   r€   r,   r/   r�   r‚   rc   r|   Ú sql_alter_column_no_default_nullÚsql_alter_column_no_defaultÚsql_alter_column_defaultrN   ri   )
r2   r   r#   r%   rÓ   r  r˜   r>   rï   r=   r   r   r   rÚ   \  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_typerN   ri   )r2   r   r#   r%   rð   r   r   r   rÿ   ‚  s    
þÿú÷z/BaseDatabaseSchemaEditor._alter_column_type_sqlc                 C   s0   | j |  |j¡||r"d|  |¡ nddœ g fS )NrV   rA   )ri   r‹   rˆ   )Úsql_alter_column_collaterN   ri   r{   )r2   r   r%   rð   r  r   r   r   rþ   ˜  s    
ÿûÿ÷z4BaseDatabaseSchemaEditor._alter_column_collation_sqlc                 C   s¢   |j jjj|j jjjkr:|  |j j|j jjj|j jjj¡ |  |j j|j jj | ¡ ¡|j jj | ¡ ¡¡ |  |j j|j jj | ¡ ¡|j jj | ¡ ¡¡ dS )z*Alter M2Ms to repoint their to= endpoints.N)	r(   rœ   r   rg   rÍ   rñ   rP   Zm2m_reverse_field_nameZm2m_field_name)r2   r   r#   r%   rì   r   r   r   rê   ¥  s.    

ÿÿ

ý
ÿ
ÿøüz,BaseDatabaseSchemaEditor._alter_many_to_manyrA   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  ¡ rÞd|dd…  }|S )z½
        Generate a unique name for an index/unique constraint.

        The name is divided into 3 parts: the table name, the column names,
        and a unique digest and suffix.
        z%s%sÚlengthé   éÈ   z%s_%s_%srß   é   Né   rÁ   r   zD%séÿÿÿÿ)r
   r	   r,   rM   Zmax_name_lengthrq   rÄ   Úisdigit)	r2   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   rV   rA   )rÄ   rr   r   r,   rM   rs   )r2   r   ru   rr   r   r   r   Ú_get_index_tablespace_sqlå  s    z2BaseDatabaseSchemaEditor._get_index_tablespace_sqlc                 C   s   |rd| S dS )Nz WHERE rA   r   )r2   Ú	conditionr   r   r   Ú_index_condition_sqlï  s    z-BaseDatabaseSchemaEditor._index_condition_sqlc                 C   s,   |r| j jjsdS tdt|jj|| jƒd�S )NrA   z INCLUDE (%(columns)s))rÉ   )r,   r/   Úsupports_covering_indexesr   r   r   rg   rN   )r2   r   rÉ   r   r   r   Ú_index_include_sqlô  s    þz+BaseDatabaseSchemaEditor._index_include_sql)ru   r   r»   Úusingrr   Úcol_suffixesr=   Ú	opclassesr!  ÚincludeÚexpressionsc                   s¼   |pg }|pg }t |dd�jˆjd�}ˆj|||d�}dd„ |D ƒ}|pLˆj}|jj}‡ ‡fdd„}t|t|ˆj	ƒt
||||ƒ||r”ˆ ||||	¡nt|||ˆjƒ|ˆ |
¡ˆ ||¡d	�S )
zË
        Return the SQL statement to create the index for one or several fields
        or expressions. `sql` can be specified if the syntax differs from the
        standard (GIS indexes, ...).
        F©Z
alias_colsrT   )rr   c                 S   s   g | ]
}|j ‘qS r   ©ri   rQ   r   r   r   rR     rS   z>BaseDatabaseSchemaEditor._create_index_sql.<locals>.<listcomp>c                     s"   ˆ d u rˆj | i |¤Ž‰ ˆ ˆ ¡S r   )r  rN   ©ÚargsÚkwargs©r   r2   r   r   Úcreate_index_name  s    zEBaseDatabaseSchemaEditor._create_index_sql.<locals>.create_index_name)r^   r   r%  rÉ   r?   r!  r(  )r   Úget_compilerr,   r   Úsql_create_indexr   rg   r   r   rN   r   Ú_index_columnsr   rJ   r"  r$  )r2   r   ru   r   r»   r%  rr   r&  r=   r'  r!  r(  r)  Úcompilerrs   rÉ   r2  r^   r0  r   r/  r   r½   ü  s0    ÿÿ

ÿ
ôz*BaseDatabaseSchemaEditor._create_index_sqlc                 C   s&   t |p
| jt|jj| jƒ|  |¡d�S ©N)r^   r   )r   r¼   r   r   rg   rN   )r2   r   r   r=   r   r   r   rû   2  s
    ýz*BaseDatabaseSchemaEditor._delete_index_sqlc                 C   s   t ||| j|d�S )N)r&  )r   rN   )r2   r^   rÉ   r&  r'  r   r   r   r3  9  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   rO   rQ   r   r   r   rR   H  rS   z?BaseDatabaseSchemaEditor._model_indexes_sql.<locals>.<listcomp>r¹   rº   )r   ZmanagedÚproxyZswappedra   re   rÜ   Zindex_togetherrG   r½   rÂ   r¥   r,   r/   r¦   r§   )r2   r   Úoutputr   rt   ru   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_indexedrG   r½   )r2   r   r   r7  r   r   r   rÜ   S  s    z+BaseDatabaseSchemaEditor._field_indexes_sqlc                 C   sv   |  ¡ \}}}}|  ¡ \}}}}	g d¢}
|
D ]}| |d ¡ |	 |d ¡ q,|  |j¡|  |j¡kpt|||f|||	fkS )N)r”   Z	db_columnÚeditableZerror_messagesÚ	help_textZlimit_choices_toZ	on_deleteZrelated_nameZrelated_query_nameZ
validatorsZverbose_name)ZdeconstructÚpoprN   ri   )r2   r#   r%   rß   Úold_pathZold_argsZ
old_kwargsÚnew_pathÚnew_argsZ
new_kwargsZnon_database_attrsÚattrr   r   r   ré   \  s    ÿþz1BaseDatabaseSchemaEditor._field_should_be_alteredc                 C   s   |j o|j S r   )rú   r…   ©r2   r   r   r   r   r   r8  x  s    z1BaseDatabaseSchemaEditor._field_should_be_indexedc                 C   s   |j  o|j S r   ©r   ©r2   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   rB  r   r   r   r  ~  s    ÿz0BaseDatabaseSchemaEditor._unique_should_be_addedc                 C   s*   | j |  |¡|  |j¡|  |j¡|dœ S )N)r^   Z
old_columnZ
new_columnr‹   )Úsql_rename_columnrN   ri   )r2   r^   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)r^   r   ri   rW   rX   rÑ   )r   r   rg   rN   r×   r   ri   Útarget_fieldr   r,   rM   rØ   r   Úsql_create_fk)
r2   r   r   r»   r^   r   ri   rW   rX   rÑ   r   r   r   rl   ‹  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   ©rN   r  r,  r7   r   r   Úcreate_fk_name¡  s    zDBaseDatabaseSchemaEditor._fk_constraint_name.<locals>.create_fk_namerÁ   )r   r   rg   ri   r
   rD  r   )r2   r   r   r»   rG  r   r7   r   r×      s    úz,BaseDatabaseSchemaEditor._fk_constraint_namec                 C   s   |   | j||¡S r   )rÆ   Úsql_delete_fk©r2   r   r   r   r   r   rä   ­  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 )NrA   z DEFERRABLE INITIALLY DEFERREDz DEFERRABLE INITIALLY IMMEDIATE)r   ZDEFERREDZ	IMMEDIATE)r2   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   r!  r(  r'  r)  r]   c                    s   g | ]}ˆ   |j¡‘qS r   )rN   ri   rQ   r7   r   r   rR   Ø  rS   z8BaseDatabaseSchemaEditor._unique_sql.<locals>.<listcomp>)rÉ   rÑ   ©r   r[   )r,   r/   Ú&supports_deferrable_unique_constraintsr`   r4   rG   Úsql_unique_constraintrq   rJ  Úsql_constraintrN   )r2   r   ru   r   r!  rÑ   r(  r'  r)  r=   r[   r   r7   r   Ú_unique_sql¸  s4    ÿþù	þþz$BaseDatabaseSchemaEditor._unique_sqlc	                    s  |rˆ j jjr8|rˆ j jjr8|r*ˆ j jjr8|r<ˆ j jjs<d S ‡ fdd„}	t|dd�jˆ j d�}
|jj	}dd„ |D ƒ}|d u rŒt
||d|	ƒ}n
ˆ  |¡}|s¦|s¦|s¦|r®ˆ j}nˆ j}|rÌˆ j||d	|d
�}nt|||
ˆ jƒ}t|t|ˆ jƒ||ˆ  |¡ˆ  |¡ˆ  ||¡d�S )Nc                     s   ˆ   ˆ j| i |¤Ž¡S r   rF  r,  r7   r   r   Úcreate_unique_nameø  s    zGBaseDatabaseSchemaEditor._create_unique_sql.<locals>.create_unique_nameFr*  rT   c                 S   s   g | ]
}|j ‘qS r   r+  rQ   r   r   r   rR   ÿ  rS   z?BaseDatabaseSchemaEditor._create_unique_sql.<locals>.<listcomp>Ú_uniqr   )r&  r'  )r^   r   rÉ   r!  rÑ   r(  )r,   r/   rL  Úsupports_partial_indexesr#  r¦   r   r1  r   rg   r   rN   Úsql_create_unique_indexÚsql_create_uniquer3  r   rJ   r   r   r"  rJ  r$  )r2   r   ru   r   r!  rÑ   r(  r'  r)  rP  r4  r^   rÉ   r=   r   r7   r   r`   à  sV    þýûûúúøøÿ
ÿ

ùz+BaseDatabaseSchemaEditor._create_unique_sqlc           	      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   )	r,   r/   rL  rR  r#  r¦   r¼   rµ   rÆ   )	r2   r   r   r!  rÑ   r(  r'  r)  r=   r   r   r   rù     s*    þýûûúúøøz+BaseDatabaseSchemaEditor._delete_unique_sqlc                 C   s    | j |  |¡| jd|i dœ S )NrU   rK  )rN  rN   rd   )r2   r   rU   r   r   r   Ú
_check_sql4  s    þz#BaseDatabaseSchemaEditor._check_sqlc                 C   s$   t | jt|jj| jƒ|  |¡|d�S )N)r^   r   rU   )r   Úsql_create_checkr   r   rg   rN   )r2   r   r   rU   r   r   r   r  :  s    üz*BaseDatabaseSchemaEditor._create_check_sqlc                 C   s   |   | j||¡S r   )rÆ   Úsql_delete_checkrI  r   r   r   rü   B  s    z*BaseDatabaseSchemaEditor._delete_check_sqlc                 C   s    t |t|jj| jƒ|  |¡d�S r5  )r   r   r   rg   rN   )r2   Útemplater   r   r   r   r   rÆ   E  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r–qd|dur¬|d |kr¬qd|durÂ|d |krÂqd|durØ|d |krØqd|durê|d	 sêqd|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   r7   r   r   rR   Z  s   ÿz>BaseDatabaseSchemaEditor._constraint_names.<locals>.<listcomp>rÉ   r…   r   r©   rU   rã   r‹   )r,   rK   rY  Zget_constraintsr   rg   ÚitemsrG   )r2   r   r  r…   r   r©   rã   rU   rò   rÀ   rK   ro   Úresultr   Zinfodictr   r7   r   rÃ   L  s4    
þÿ"z*BaseDatabaseSchemaEditor._constraint_namesc                 C   sV   | j |dd�}|r6t|ƒdkr6tdt|ƒ|jjf ƒ‚|D ]}|  |  ||¡¡ q:d S )NTrA  rÁ   z0Found wrong number (%s) of PK constraints for %s)rÃ   rÄ   rÅ   r   rg   r8   Ú_delete_primary_key_sql)r2   r   rì   rÊ   r  r   r   r   r  u  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õ   )r^   r   rÉ   )	r   Úsql_create_pkr   r   rg   rN   r  ri   r   r@  r   r   r   r  ‚  s    ÿÿøz0BaseDatabaseSchemaEditor._create_primary_key_sqlc                 C   s   |   | j||¡S r   )rÆ   Úsql_delete_pkrI  r   r   r   r\  Ž  s    z0BaseDatabaseSchemaEditor._delete_primary_key_sqlc                 C   s   d|   |¡ S )NzCOLLATE )rN   )r2   rˆ   r   r   r   r{   ‘  s    z%BaseDatabaseSchemaEditor._collate_sqlc                 C   s*   | j |  |¡d |¡dœ }|  |¡ d S )Nú,)Z	procedureÚparam_types)Úsql_delete_procedurerN   rq   r8   )r2   Zprocedure_namer`  r=   r   r   r   Úremove_procedure”  s
    þz)BaseDatabaseSchemaEditor.remove_procedure)FT)r   )F)F)F)F)rA   )N)N)NNNNN)NNNNNN)NNNNN)NNNNNNNN)F)r   )iÚ__name__Ú
__module__Ú__qualname__Ú__doc__rp   rÌ   rÎ   r    rÙ   rÛ   r  r  r  r  r  r  r  rå   rC  r  rM  rd   Zsql_delete_constraintrN  rV  rW  rT  rµ   rE  rj   rÖ   rH  r2  rS  r¼   r]  r^  ra  r3   r6   r9   r8   rN   rw   rŠ   rb   r}   r~   r‚   r€   Ústaticmethodr™   r   rJ   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û   r3  rš   rÜ   ré   r8  rø   r  rý   rl   r×   rä   rJ  rO  r`   rù   rU  r  rü   rÆ   rÃ   r  r  r\  r{   rb  r   r   r   r   r+   E   s&  ÿÿÿÿÿÿÿ
		
Q6
	
	H 
I ÷
  K
& 
 

ò6
	     ÷
,      ÷
<     ø

        ö
)
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   Ú	getLoggerrC   r   r   r'   r+   r   r   r   r   Ú<module>   s    
	