o
    ÖŸŽið ã                   @   sÈ   d dl Z d dlZd dlmZ d dlmZ d dlmZmZmZm	Z	m
Z
mZ d dlmZmZmZ d dlmZmZ d dlmZ d dlmZmZ d d	lmZ e  d
¡Zdd„ Zdd„ Zdd„ ZG dd„ dƒZdS )é    N)Údatetime)Úsettings)ÚColumnsÚExpressionsÚForeignKeyNameÚ	IndexNameÚ	StatementÚTable)Únames_digestÚsplit_identifierÚtruncate_name)Ú
DeferrableÚIndex)ÚQuery)ÚTransactionManagementErrorÚatomic)Útimezonezdjango.db.backends.schemac                 C   s2   | j }|jrdS |jr|jdgkrdS |j|j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   úhC:\Users\psant\Downloads\Anu Raj Backend\school\venv\Lib\site-packages\django/db/backends/base/schema.pyÚ_is_relevant_relation   s   r   c                 C   s"   t | jjddddd�t d¡d�S )NFT)ZforwardÚreverseZinclude_hiddenZinclude_parentsr   )Úkey)ÚsortedÚ_metaZ_get_fieldsÚoperatorÚ
attrgetter©Úmodelr   r   r   Ú_all_related_fields'   s   üùr"   c                 #   sd   � t ‡fdd„tˆjƒD ƒ‡ fdd„tˆ jƒD ƒƒ}|D ]\}}||fV  t|j|jƒE d H  qd S )Nc                 3   ó   � | ]
}t |ˆ ƒr|V  qd S ©N©r   ©Ú.0Úobj)Ú	old_fieldr   r   Ú	<genexpr>8   ó   € ý
ÿz+_related_non_m2m_objects.<locals>.<genexpr>c                 3   r#   r$   r%   r&   )Ú	new_fieldr   r   r*   =   r+   )Úzipr"   r!   Ú_related_non_m2m_objectsÚremote_field)r)   r,   Zrelated_fieldsÚold_relÚnew_relr   )r,   r)   r   r.   4   s    €
þ
þú
þþr.   c                   @   sL  e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZeZdZdZdZdZdZdZdZdZeZdZeZdZdZdZeZdZdZ dZ!dZ"dZ#eZ$dZ%dZ&dZ'd³d"d#„Z(d$d%„ Z)d&d'„ Z*d´d)d*„Z+d+d,„ Z,d-d.„ Z-d/d0„ Z.dµd1d2„Z/d3d4„ Z0d5d6„ Z1d7d8„ Z2d9d:„ Z3e4d;d<„ ƒZ5d=d>„ Z6d?d@„ Z7dAdB„ Z8dCdD„ Z9dEdF„ Z:dGdH„ Z;dIdJ„ Z<dKdL„ Z=dMdN„ Z>dOdP„ Z?dQdR„ Z@dSdT„ ZAdUdV„ ZBdWdX„ ZCdYdZ„ ZDd[d\„ ZEd]d^„ ZFdµd_d`„ZG	 dµdadb„ZHdcdd„ ZIdµdedf„ZJdgdh„ ZKdidj„ ZLdkdl„ ZMdmdn„ ZNd¶dpdq„ZOd·drds„ZPdtdu„ ZQdvdw„ ZRdddododd(dd(ddddxœdydz„ZSd·d{d|„ZTd}d~„ ZUdd€„ ZVd�d‚„ ZWdƒd„„ ZXd·d…d†„ZYd‡dˆ„ ZZd‰dŠ„ Z[d‹dŒ„ Z\d�dŽ„ Z]d�d�„ Z^d‘d’„ Z_d“d”„ Z`d•d–„ Za					d¸d—d˜„Zb						d¹d™dš„Zcdºd›dœ„Zd					d¸d�dž„ZedŸd „ Zfd¡d¢„ Zgd£d¤„ Zhd¥d¦„ Zi								d»d§d¨„Zjdµd©dª„Zkd«d¬„ Zld­d®„ Zmd¼d¯d°„Znd´d±d²„ZodS )½ÚBaseDatabaseSchemaEditorzÈ
    This class and its subclasses are responsible for emitting schema-changing
    statements to the databases - model creation/removal/alteration, field
    renaming, index fiddling, and so on.
    z'CREATE TABLE %(table)s (%(definition)s)z1ALTER TABLE %(old_table)s RENAME TO %(new_table)sz7ALTER TABLE %(table)s SET TABLESPACE %(new_tablespace)szDROP TABLE %(table)s CASCADEz:ALTER TABLE %(table)s ADD COLUMN %(column)s %(definition)sz!ALTER TABLE %(table)s %(changes)sz2ALTER COLUMN %(column)s TYPE %(type)s%(collation)sz%ALTER COLUMN %(column)s DROP NOT NULLz$ALTER COLUMN %(column)s SET NOT NULLz/ALTER COLUMN %(column)s SET DEFAULT %(default)sz$ALTER COLUMN %(column)s DROP DEFAULTz4ALTER TABLE %(table)s DROP COLUMN %(column)s CASCADEzDALTER TABLE %(table)s RENAME COLUMN %(old_column)s TO %(new_column)szFUPDATE %(table)s SET %(column)s = %(default)s WHERE %(column)s IS NULLz"UNIQUE (%(columns)s)%(deferrable)szCHECK (%(check)s)z.ALTER TABLE %(table)s DROP CONSTRAINT %(name)sz"CONSTRAINT %(name)s %(constraint)sz?ALTER TABLE %(table)s ADD CONSTRAINT %(name)s CHECK (%(check)s)zPALTER TABLE %(table)s ADD CONSTRAINT %(name)s UNIQUE (%(columns)s)%(deferrable)sz|ALTER TABLE %(table)s ADD CONSTRAINT %(name)s FOREIGN KEY (%(column)s) REFERENCES %(to_table)s (%(to_column)s)%(deferrable)sNzQCREATE INDEX %(name)s ON %(table)s (%(columns)s)%(include)s%(extra)s%(condition)szOCREATE UNIQUE INDEX %(name)s ON %(table)s (%(columns)s)%(include)s%(condition)sz/ALTER INDEX %(old_name)s RENAME TO %(new_name)szDROP INDEX %(name)szGALTER TABLE %(table)s ADD CONSTRAINT %(name)s PRIMARY KEY (%(columns)s)zDROP PROCEDURE %(procedure)sz)COMMENT ON TABLE %(table)s IS %(comment)sz5COMMENT ON COLUMN %(table)s.%(column)s IS %(comment)sFTc                 C   s,   || _ || _| jrg | _| j jjo|| _d S r$   )Ú
connectionÚcollect_sqlÚcollected_sqlÚfeaturesÚcan_rollback_ddlÚatomic_migration)Úselfr3   r4   r   r   r   r   Ú__init__“   s
   z!BaseDatabaseSchemaEditor.__init__c                 C   s(   g | _ | jrt| jjƒ| _| j ¡  | S r$   )Údeferred_sqlr8   r   r3   ÚaliasÚ	__enter__©r9   r   r   r   r=   œ   s
   
z"BaseDatabaseSchemaEditor.__enter__c                 C   s<   |d u r| j D ]}|  |¡ q| jr| j |||¡ d S d S r$   )r;   Úexecuter8   r   Ú__exit__)r9   Úexc_typeÚ	exc_valueÚ	tracebackÚsqlr   r   r   r@   £   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 rN| 	¡  
d¡r,dnd}|durD| j |tt| j|ƒƒ | ¡ dS | j || ¡ dS | j ¡ �}| ||¡ W d  ƒ dS 1 sew   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))ÚparamsrD   )Úextraú;Ú N)r4   r3   Zin_atomic_blockr6   r7   r   ÚstrÚloggerÚdebugÚrstripÚendswithr5   ÚappendÚtupleÚmapÚquote_valueÚcursorr?   )r9   rD   rE   ÚendingrR   r   r   r   r?   ¬   s.   ÿþýÿÿÿ"ÿz BaseDatabaseSchemaEditor.executec                 C   s   | j j |¡S r$   )r3   ÚopsÚ
quote_name)r9   r   r   r   r   rU   Ë   ó   z#BaseDatabaseSchemaEditor.quote_namec                    sø  ˆ j jD ]}‡ fdd„|D ƒ}ˆj ˆ ˆ |¡¡ qg }g }ˆ j jD ]š}ˆ ˆ |¡\}}|du r1q"|jˆjd�}	|	d rE|dˆj	|	  7 }|j
ˆjd�}
|
rT|d|
 7 }| |¡ |jr–|jr–|jjj j}|jjj  |jj¡j}ˆjr†|dˆjˆ |¡ˆ |¡dœ  7 }nˆjjjr–ˆj ˆ ˆ |d	¡¡ | d
ˆ |j¡|f ¡ | ¡ dv r¼ˆjj ˆ j j|j¡}|r¼ˆj |¡ q"‡ ‡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                    ó   g | ]}ˆ j  |¡‘qS r   ©r   Ú	get_field©r'   r   r    r   r   Ú
<listcomp>Ó   ó    z6BaseDatabaseSchemaEditor.table_sql.<locals>.<listcomp>N©r3   Ú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!   r9   r   r   r[     s    
ÿÿú, c                 s   s   � | ]	}|rt |ƒV  qd S r$   )rI   rc   r   r   r   r*     s   € ý
ÿz5BaseDatabaseSchemaEditor.table_sql.<locals>.<genexpr>)ÚtableÚ
definition) r   Zunique_togetherr;   rN   Ú_create_unique_sqlÚlocal_fieldsÚ
column_sqlÚdb_parametersr3   Úsql_check_constraintÚdb_type_suffixÚextendr/   Údb_constraintr!   Údb_tablerY   Ú
field_nameÚcolumnÚsql_create_inline_fkrU   r6   Úsupports_foreign_keysÚ_create_fk_sqlÚget_internal_typerT   Úautoinc_sqlÚconstraintsÚsql_create_tableÚjoinÚdb_tablespaceÚtablespace_sql)r9   r!   Úfield_namesÚfieldsZcolumn_sqlsrE   r   rh   Zextra_paramsÚ	db_paramsÚcol_type_suffixr`   ra   rx   ry   rD   r}   r   re   r   Ú	table_sqlÎ   s€   

ÿþþ
ÿÿ
þÿÿ	
ÿ€þ
þþÿz"BaseDatabaseSchemaEditor.table_sqlc                 c   sL  � |V  |  d¡ }r|  |¡V  | jjjr |jr |  |j¡V  |j}|o2|  |¡ o2|o1|  	|¡ }|r[|  
|¡}	|	d ur[d|  |¡ }
| jjjrS|
|  |	¡ V  n|
V  | |	¡ |jrh|jsh| jjjrhd}|sndV  n| jjjsvd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 d S d S d S )	NÚ	collationzDEFAULT TzNOT NULLÚNULLzPRIMARY KEYZUNIQUE)Úinline)ÚgetÚ_collate_sqlr3   r6   Úsupports_comments_inlineÚ
db_commentÚ_comment_sqlÚnullÚskip_defaultÚskip_default_on_alterÚeffective_defaultÚ_column_default_sqlÚrequires_literal_defaultsÚprepare_defaultrN   Úempty_strings_allowedr   Ú!interprets_empty_strings_as_nullsZimplied_column_nullÚuniquer|   r   Zsupports_tablespacesrT   r}   )r9   Úcolumn_db_typerE   r!   r   Úfield_db_paramsÚinclude_defaultrƒ   r‹   Údefault_valueZcolumn_defaultZ
tablespacer   r   r   Ú_iter_column_sql!  sX   €
ÿù	


ÿþý
ÿþýûz)BaseDatabaseSchemaEditor._iter_column_sqlc              
   C   sD   |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.
        r]   ÚtypeN©NNr_   )rl   r3   r{   r™   )r9   r!   r   r—   r–   r•   rE   r   r   r   rk   Z  s"   úþôz#BaseDatabaseSchemaEditor.column_sqlc                 C   ó   dS )z�
        Some backends don't accept default values for certain columns types
        (i.e. MySQL longtext and longblob).
        FNr   ©r9   r   r   r   r   rŒ   u  ó   z%BaseDatabaseSchemaEditor.skip_defaultc                 C   rœ   )zŸ
        Some backends don't accept default values for certain columns types
        (i.e. MySQL longtext and longblob) in the ALTER COLUMN statement.
        FNr   r�   r   r   r   r�   |  rž   z.BaseDatabaseSchemaEditor.skip_default_on_alterc                 C   s   t dƒ‚)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©r9   Úvaluer   r   r   r‘   ƒ  s   ÿz(BaseDatabaseSchemaEditor.prepare_defaultc                 C   rœ   )z�
        Return the SQL to use in a DEFAULT clause. The resulting string should
        contain a '%s' placeholder for a default value.
        ú%sNr   r�   r   r   r   r�   Œ  rž   z,BaseDatabaseSchemaEditor._column_default_sqlc                 C   s®   |   ¡ r
|  ¡ }|S | js!| jr!| jr!|  ¡ dkrd}|S d}|S t| ddƒs-t| ddƒrS|  ¡ }|dkr;t ¡ }|S t	 ¡ }|dkrI| 
¡ }|S |d	krQ| ¡ }|S d }|S )
NZBinaryFieldó    rH   Zauto_nowFZauto_now_addZDateTimeFieldZ	DateFieldZ	TimeField)Úhas_defaultZget_defaultr‹   Zblankr’   rw   Úgetattrr   Ú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.N)Zget_db_prep_saver«   r3   r�   r   r   r   rŽ   «  s   z*BaseDatabaseSchemaEditor.effective_defaultc                 C   s   t ƒ ‚)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   rQ   ¯  s   z$BaseDatabaseSchemaEditor.quote_valuec                 C   sÌ   |   |¡\}}|  ||pd¡ | jjjrG|jjr!|  |d|jj¡ | jjjsG|jj	D ]}|j
rF|j| jd�}|d }| j|  ||||j
¡Ž  q*| j |  |¡¡ |jjD ]}|jjjjrc|  |jj¡ qTdS )zr
        Create a table and any accompanying indexes or unique constraints for
        the given `model`.
        Nr]   rš   )r‚   r?   r3   r6   Úsupports_commentsr   Zdb_table_commentÚalter_db_table_commentrˆ   rj   r‰   rl   Ú_alter_column_comment_sqlr;   ro   Ú_model_indexes_sqlÚlocal_many_to_manyr/   ÚthroughÚauto_createdÚcreate_model)r9   r!   rD   rE   r   r–   Ú
field_typer   r   r   r³   »  s0   

ÿ
ÿÿ€€þz%BaseDatabaseSchemaEditor.create_modelc                 C   s~   |j jD ]}|jjj jr|  |jj¡ q|  | jd|  |j j	¡i ¡ t
| jƒD ]}t|tƒr<| |j j	¡r<| j |¡ q(dS )z!Delete a model from the database.rg   N)r   r°   r/   r±   r²   Údelete_modelr?   Úsql_delete_tablerU   rq   Úlistr;   Ú
isinstancer   Zreferences_tableÚremove)r9   r!   r   rD   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©rE   )Úcontains_expressionsr3   r6   Úsupports_expression_indexesr?   Ú
create_sql©r9   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»   r3   r6   r¼   r?   Ú
remove_sqlr¾   r   r   r   Úremove_indexÿ  s   ÿþz%BaseDatabaseSchemaEditor.remove_indexc                 C   sF   | j jjr| j|  ||j|j¡d d� d S |  ||¡ |  ||¡ d S )Nrº   )r3   r6   Zcan_rename_indexr?   Ú_rename_index_sqlr   rÂ   rÀ   )r9   r!   Z	old_indexZ	new_indexr   r   r   Úrename_index  s   

þz%BaseDatabaseSchemaEditor.rename_indexc                 C   s&   |  || ¡}|r| j|dd� dS dS )zAdd a constraint to a model.Nrº   )r½   r?   ©r9   r!   rd   rD   r   r   r   Úadd_constraint  s   ýz'BaseDatabaseSchemaEditor.add_constraintc                 C   s"   |  || ¡}|r|  |¡ dS dS )z!Remove a constraint from a model.N)rÁ   r?   rÅ   r   r   r   Úremove_constraint  s   ÿz*BaseDatabaseSchemaEditor.remove_constraintc                    s|   dd„ |D ƒ}dd„ |D ƒ}|  |¡D ]}|  ˆ |dddœ| j¡ q|  |¡D ]}‡ fdd„|D ƒ}|  |  ˆ |¡¡ q'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   ó   h | ]}t |ƒ’qS r   ©rO   ©r'   r   r   r   r   Ú	<setcomp>&  ó    zABaseDatabaseSchemaEditor.alter_unique_together.<locals>.<setcomp>c                 S   rÈ   r   rÉ   rÊ   r   r   r   rË   '  rÌ   TF)r”   r   c                    rW   r   rX   rZ   r    r   r   r[   2  r\   zBBaseDatabaseSchemaEditor.alter_unique_together.<locals>.<listcomp>N)Ú
differenceÚ_delete_composed_indexÚsql_delete_uniquer?   ri   )r9   r!   Zold_unique_togetherZnew_unique_togetherÚoldsÚnewsr   r~   r   r    r   Úalter_unique_together   s   üþz.BaseDatabaseSchemaEditor.alter_unique_togetherc                    s€   dd„ |D ƒ}dd„ |D ƒ}|  |¡D ]}|  ˆ |dddœ| j¡ q|  |¡D ]}‡ fdd„|D ƒ}|  | jˆ |d	d
�¡ q'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   rÈ   r   rÉ   rÊ   r   r   r   rË   ;  rÌ   z@BaseDatabaseSchemaEditor.alter_index_together.<locals>.<setcomp>c                 S   rÈ   r   rÉ   rÊ   r   r   r   rË   <  rÌ   TF)r¿   r”   c                    rW   r   rX   rZ   r    r   r   r[   G  r\   zABaseDatabaseSchemaEditor.alter_index_together.<locals>.<listcomp>Ú_idx©r   ÚsuffixN)rÍ   rÎ   Úsql_delete_indexr?   Ú_create_index_sql)r9   r!   Zold_index_togetherZnew_index_togetherrÐ   rÑ   r   r~   r   r    r   Úalter_index_together5  s   üþz-BaseDatabaseSchemaEditor.alter_index_togetherc           
         sÜ   dd„ ˆ j jD ƒ}dd„ ˆ j jD ƒ}‡ fdd„|D ƒ}| jˆ |fd||B i|¤Ž}| d¡du rJ|rJ| jjjrJt| j	ˆ j j
|d	d
�ƒ}	|	|v rJ|	g}t|ƒdkr`tdt|ƒˆ j j
d |¡f ƒ‚|  |  |ˆ |d ¡¡ d S )Nc                 S   ó   h | ]}|j ’qS r   ©r   rc   r   r   r   rË   K  ó    ÿzBBaseDatabaseSchemaEditor._delete_composed_index.<locals>.<setcomp>c                 S   rÙ   r   rÚ   rc   r   r   r   rË   N  ó    c                    s   g | ]	}ˆ j  |¡j‘qS r   )r   rY   rs   rZ   r    r   r   r[   O  s    zCBaseDatabaseSchemaEditor._delete_composed_index.<locals>.<listcomp>Úexcluder”   TF©Úquoteé   z1Found wrong number (%s) of constraints for %s(%s)rf   r   )r   ry   ÚindexesÚ_constraint_namesr†   r3   r6   Z*allows_multiple_constraints_on_same_fieldsrI   Ú_unique_constraint_namerq   ÚlenÚ
ValueErrorr{   r?   Ú_delete_constraint_sql)
r9   r!   r   Zconstraint_kwargsrD   Úmeta_constraint_namesÚmeta_index_namesÚcolumnsÚconstraint_namesÚdefault_namer   r    r   rÎ   J  sD   ÿþýüÿþýÿýÿÿz/BaseDatabaseSchemaEditor._delete_composed_indexc                 C   sn   ||ks| j jjr| ¡ | ¡ krdS |  | j|  |¡|  |¡dœ ¡ | jD ]}t|t	ƒr4| 
||¡ q'dS )z#Rename the table a model points to.N)Z	old_tableZ	new_table)r3   r6   Zignores_table_name_caseÚlowerr?   Úsql_rename_tablerU   r;   r¸   r   Zrename_table_references)r9   r!   Zold_db_tableZnew_db_tablerD   r   r   r   Úalter_db_tablel  s$   ÿþþÿÿ

€þz'BaseDatabaseSchemaEditor.alter_db_tablec                 C   s.   |   | j|  |jj¡|  |pd¡dœ ¡ d S )NrH   )rg   Úcomment)r?   Úsql_alter_table_commentrU   r   rq   rQ   )r9   r!   Zold_db_table_commentZnew_db_table_commentr   r   r   r­     s   þÿÿz/BaseDatabaseSchemaEditor.alter_db_table_commentc                 C   s2   |   | j|  |jj¡|  |¡|  |¡dœ ¡ dS )z)Move a model's table between tablespaces.)rg   Zold_tablespaceZnew_tablespaceN)r?   Úsql_retablespace_tablerU   r   rq   )r9   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� }r0|d|› �7 }|j	| jd�}|d rD|d| j
|  7 }|jr¥| jjjr¥|jr¥d}| 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"�r| jjj#�r| jjj$�s|d }| j|  %||||j"¡Ž  | j &|  '||¡¡ | jjj(�r| j )¡  dS dS )z�
        Create a field on a model. Usually involves adding a column, but may
        involve adding a table instead (for M2M fields).
        T)r—   Nr]   r_   r^   rb   z%s.rH   )r   Ú	namespacers   r`   ra   Ú
deferrable)rg   rs   rh   ©Údrop©rg   Úchangesrš   )*r   r/   r±   r   r²   r³   rk   rn   r3   rl   rm   r6   ru   rp   Úsql_create_column_inline_fkr!   rq   rY   rr   rs   r   Ú_fk_constraint_namerU   rT   Údeferrable_sqlr;   rN   rv   Úsql_create_columnr?   r�   rŽ   Ú_alter_column_default_sqlÚsql_alter_columnr‰   r¬   rˆ   r®   ro   Ú_field_indexes_sqlÚconnection_persists_old_columnsÚclose)r9   r!   r   rh   rE   r�   r€   Zconstraint_suffixr`   ra   ró   Ú_rD   Úchanges_sqlr´   r   r   r   Ú	add_field“  s�   ÿþý
ÿþÿ

øÿ
ýÿþ
ÿþÿþý
ÿÿÿz"BaseDatabaseSchemaEditor.add_fieldc                 C   sì   |j r|jjjjr|  |jj¡S |j| jd�d du rdS |jr8| j||j	gdd�}|D ]}|  
|  ||¡¡ q,| j|  |jj¡|  |j	¡dœ }|  
|¡ | jjjrX| j ¡  t| jƒD ]}t|tƒrs| |jj|j	¡rs| j |¡ q]dS )z…
        Remove a field from a model. Usually involves deleting a column,
        but for M2Ms may involve deleting a table.
        r]   rš   NT©Úforeign_key)rg   rs   )r   r/   r±   r   r²   rµ   rl   r3   râ   rs   r?   Ú_delete_fk_sqlÚsql_delete_columnrU   rq   r6   r   r  r·   r;   r¸   r   Zreferences_columnr¹   )r9   r!   r   Úfk_namesÚfk_namerD   r   r   r   Úremove_fieldé  s,   
þ



ÿ€üz%BaseDatabaseSchemaEditor.remove_fieldc           	   
   C   s0  |   ||¡sdS |j| jd�}|d }|j| jd�}|d }|du r'|jdu s0|du r8|jdu r8td||f ƒ‚|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 rz|du rz|jjrz|jjrz|jjjjsz|jjjjszd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.
        Nr]   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_alteredrl   r3   r/   rå   r±   r   r²   Ú_alter_many_to_manyÚ_alter_field)	r9   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rL|jrL|jrL| j||dhd�rL| j||jgdd�}
|r7t	|
ƒdkr7t
dt	|
ƒ|jj|jf ƒ‚|
D ]}|	 |jf¡ |  |  ||¡¡ q9|jr‘|jrX|  ||¡r‘dd„ |jjD ƒ}| j||jgdd	|d
�}|rƒt	|ƒdkrƒt
dt	|ƒ|jj|jf ƒ‚|D ]}|  |  ||¡¡ q…| d¡}| d¡}| jjjo³|jr¦|jp«|jo«|jo³||kp³||k}|rÛt||ƒD ]\}}| j|j|jjgdd�}|D ]}|  |  |j|¡¡ qÍq»|j�r|j�s|jrê|j�rdd„ |jjD ƒ}| j||jgdtj|d�}|D ]}|  |  ||¡¡ �q|d |d k�rX|d �rXdd„ |jjD ƒ}| j||jgd|d�}|�rIt	|ƒdk�rIt
dt	|ƒ|jj|jf ƒ‚|D ]}|  |  ||¡¡ �qK|j|jk�r„|  |  |jj|||¡¡ | j D ]}t!|t"ƒ�r‚| #|jj|j|j¡ �qog }g }g }|j$| jd�}|j$| jd�}||k�s´||k�s´||k�s´| jjj%�rÊ|j&|j&k�rÊ|  '||||||¡\}}| (|¡ | )|¡ d	} |j*�rú|j*�sú|  +|¡}!|  +|¡}"|  ,|¡�sú|!|"k�rú|"du�rúd} | (|  -|||¡¡ |j*|j*k�r|  .|||¡}|�r| (|¡ | /¡ �o|j*�o|j* }#|�s#|�r’|#�s*||7 }| jjj0�rF|�rFt1t2|Ž ƒ\}}$d 3|¡t4|$g ƒfg}|D ]\}}$|  | j5|  6|jj¡|dœ |$¡ �qH|#�r’|  | j7|  6|jj¡|  6|j¡ddœ |"g¡ |D ]\}}$|  | j5|  6|jj¡|dœ |$¡ �q{|�r£|D ]\}}$|  ||$¡ �q—|j�r±|j�s±|  8||¡ |  9||¡�rÂ|  |  :||g¡¡ |j�rÊ|j�rÝ|j�rÝ|j�sÝ|  | j;||gd�¡ g }%|�rê|% )t||ƒ¡ |  ||¡�r|  |  <||¡¡ |% )t||ƒ¡ |%D ]V\}&}|jj=| jd�}'|'d }(|' d¡})|&jj=| jd�}*|* d¡}+|  '|j|&j|j|(|+|)¡\}}|  | j5|  6|jjj¡|d dœ |d ¡ |D ]\}}$|  ||$¡ �qM�q| jjj�r~|j�r~|	�sp|j�rp|j�s~|j�r~|  |  >||d¡¡ |�rš|%D ]\},}-|-jj�r˜|  |  >|-j|-jd¡¡ �qƒ|d |d k�rÀ|d �rÀ| j?|jj|jgdd�}|  |  @|||d ¡¡ | �rá| j-|||dd �\}.}$| j5|  6|jj¡|.dœ }|  ||$¡ | jjjA�rî| j B¡  dS dS )!z3Perform a "physical" (non-ManyToMany) field update.r‰   )ÚignoreTr  rà   z<Found wrong number (%s) of foreign key constraints for %s.%sc                 S   rÙ   r   rÚ   rc   r   r   r   rË   u  rÛ   z8BaseDatabaseSchemaEditor._alter_field.<locals>.<setcomp>F)r”   r   rÝ   z7Found wrong number (%s) of unique constraints for %s.%srƒ   c                 S   rÙ   r   rÚ   )r'   r¿   r   r   r   rË   ¯  rÜ   )r¿   Útype_rÝ   r^   c                 S   rÙ   r   rÚ   rc   r   r   r   rË   À  rÛ   )r^   rÝ   z6Found wrong number (%s) of check constraints for %s.%sr]   Nrf   r÷   r£   )rg   rs   rª   ©r   rš   r   rb   Z_fkÚ_check©rÕ   rõ   )CÚsetr3   r6   ru   r/   rp   r  râ   rs   rä   rå   r   rq   Úaddr?   r  r”   Ú_field_became_primary_keyry   Ú_delete_unique_sqlr†   r   r.   Zrelated_modelr   Údb_indexrá   r   rÕ   Ú_delete_index_sqlÚ_delete_check_sqlÚ_rename_field_sqlr;   r¸   r   Zrename_column_referencesrn   r¬   r‰   Ú_alter_column_type_sqlrN   ro   r‹   rŽ   r�   rý   Ú_alter_column_null_sqlr¥   Zsupports_combined_altersrO   r-   r{   Úsumrþ   rU   Úsql_update_with_defaultÚ_delete_primary_keyÚ_unique_should_be_addedri   r×   Ú_create_primary_key_sqlrl   rv   Ú_create_index_nameÚ_create_check_sqlr   r  )/r9   r!   r)   r,   r  r  r  r  r  Zfks_droppedr	  r
  rç   rê   Úconstraint_nameÚold_collationÚnew_collationZdrop_foreign_keysZ_old_relr1   Zrel_fk_namesrè   Zindex_namesÚ
index_namerD   ZactionsZnull_actionsZpost_actionsZold_type_suffixZnew_type_suffixÚfragmentÚother_actionsZneeds_database_defaultZold_defaultÚnew_defaultZfour_way_default_alterationrE   Zrels_to_updater0   Zrel_db_paramsZrel_typeZrel_collationZold_rel_db_paramsZold_rel_collationr  Úrelr  r   r   r   r  I  s8  ÿþýýü

ÿýÿÿÿ
ÿÿûýÿÿ



ýúÿÿÿþýýûÿüýÿÿÿÿ
ÿ€ÿþýû
ú	ÿ



ÿþýÿ

ÿþÿú
ýÿùþÿúÿÿþý

úþÿúÿÿþüüüúÿ
ÿ€ÿÿ
ÿþÿz%BaseDatabaseSchemaEditor._alter_fieldc                 C   sR   | j jjr
|jr
dS |j| j d�}|jr| jn| j}||  |j	¡|d dœ g fS )zÏ
        Hook to specialize column null alteration.

        Return a (sql, params) fragment to set a column to null or non-null
        as required by new_field, or None if no changes are required.
        Nr]   rš   )rs   rš   )
r3   r6   r“   r’   rl   r‹   Úsql_alter_column_nullÚsql_alter_column_not_nullrU   rs   )r9   r!   r)   r,   r  rD   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�}|r2|jr.| j}	n| j	}	n| j
}	|	|  |j¡|d |dœ |fS )zÁ
        Hook to specialize column default alteration.

        Return a (sql, params) fragment to add or drop (depending on the drop
        argument) a default to new_field's column.
        r]   rš   )rs   rš   rª   N)rŽ   r�   r3   r6   r�   r‘   rl   r‹   Ú sql_alter_column_no_default_nullÚsql_alter_column_no_defaultÚsql_alter_column_defaultrU   rs   )
r9   r!   r)   r,   rö   r1  rª   rE   r  rD   r   r   r   rý   À  s,   




ýÿùz2BaseDatabaseSchemaEditor._alter_column_default_sqlc                 C   s¨   g }|   |||jj¡ }rd|› �}nd}d}	| jjjrB|jsB|j|jkr9|  ||||j¡\}
}|
r9| 	|
|f¡ |jrB|  
|j¡}	| j|  |j¡|||	dœ g f|fS )a–  
        Hook to specialize column type alteration for different backends,
        for cases when a creation type is different to an alteration type
        (e.g. SERIAL in PostgreSQL, PostGIS fields).

        Return a two-tuple of: an SQL fragment of (sql, params) to insert into
        an ALTER TABLE statement and a list of extra (sql, params) tuples to
        run once the field is altered.
        r_   rH   )rs   rš   rƒ   rï   N)r‡   r   rq   r3   r6   r¬   r   r‰   r®   rN   rŠ   Úsql_alter_column_typerU   rs   )r9   r!   r)   r,   r  r,  r-  r0  Zcollate_sqlZcomment_sqlrD   rE   r   r   r   r"  æ  s6   
ÿ
ÿ
üÿø
õz/BaseDatabaseSchemaEditor._alter_column_type_sqlc                 C   s.   | j |  |jj¡|  |j¡|  |¡dœ g fS )N)rg   rs   rï   )Úsql_alter_column_commentrU   r   rq   rs   rŠ   )r9   r!   r,   r  Znew_db_commentr   r   r   r®     s   
ýÿùz2BaseDatabaseSchemaEditor._alter_column_comment_sqlc                 C   s   |   |pd¡S )NrH   )rQ   )r9   rï   r   r   r   rŠ     rV   z%BaseDatabaseSchemaEditor._comment_sqlc                 C   s¢   |j jjj|j jjjkr|  |j j|j jjj|j jjj¡ |  |j j|j jj | ¡ ¡|j jj | ¡ ¡¡ |  |j j|j jj | ¡ ¡|j jj | ¡ ¡¡ dS )z*Alter M2Ms to repoint their to= endpoints.N)	r/   r±   r   rq   rî   r  rY   Zm2m_reverse_field_nameZm2m_field_name)r9   r!   r)   r,   r  r   r   r   r  "  s.   

ÿÿ

ý
ÿ
ÿøüz,BaseDatabaseSchemaEditor._alter_many_to_manyrH   c           	      C   sâ   t |ƒ\}}dt|g|¢R ddiŽ|f }| jj ¡ pd}d|d |¡|f }t|ƒ|kr/|S t|ƒ|d kr?|d|d … }|t|ƒ d	 d
 }d|d|… d |¡d|… |f }|d dksg|d  ¡ rod|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
   r3   rT   Úmax_name_lengthr{   rä   Úisdigit)	r9   Ú
table_nameÚcolumn_namesrÕ   r  Zhash_suffix_partÚ
max_lengthr.  Zother_lengthr   r   r   r)  B  s(   þ
ýz+BaseDatabaseSchemaEditor._create_index_namec                 C   sf   |d u r$t |ƒdkr|d jr|d j}ntjrtj}n|jjr$|jj}|d ur1d| jj |¡ S dS )Nrà   r   r_   rH   )rä   r|   r   ZDEFAULT_INDEX_TABLESPACEr   r3   rT   r}   )r9   r!   r   r|   r   r   r   Ú_get_index_tablespace_sqlb  s   z2BaseDatabaseSchemaEditor._get_index_tablespace_sqlc                 C   s   |rd| S dS )Nz WHERE rH   r   )r9   Ú	conditionr   r   r   Ú_index_condition_sqln  s   z-BaseDatabaseSchemaEditor._index_condition_sqlc                 C   s,   |r| j jjs	dS tdt|jj|| jƒd�S )NrH   z INCLUDE (%(columns)s))ré   )r3   r6   Úsupports_covering_indexesr   r   r   rq   rU   )r9   r!   ré   r   r   r   Ú_index_include_sqls  s   þz+BaseDatabaseSchemaEditor._index_include_sql)r   r   rÕ   Úusingr|   Úcol_suffixesrD   Ú	opclassesrF  ÚincludeÚexpressionsc                   s¼   |pg }|pg }t |dd�jˆjd�}ˆj|||d�}dd„ |D ƒ}|p&ˆj}|jj}‡ ‡fdd„}t|t|ˆj	ƒt
||||ƒ||rJˆ ||||	¡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_colsr]   )r|   c                 S   ó   g | ]}|j ‘qS r   ©rs   rZ   r   r   r   r[   ˜  rÜ   z>BaseDatabaseSchemaEditor._create_index_sql.<locals>.<listcomp>c                     s"   ˆ d u rˆj | i |¤Ž‰ ˆ ˆ ¡S r$   )r)  rU   ©ÚargsÚkwargs©r   r9   r   r   Úcreate_index_nameœ  s   
zEBaseDatabaseSchemaEditor._create_index_sql.<locals>.create_index_name)rg   r   rJ  ré   rF   rF  rM  N)r   Úget_compilerr3   rE  Úsql_create_indexr   rq   r   r	   rU   r   Ú_index_columnsr   rQ   rG  rI  )r9   r!   r   r   rÕ   rJ  r|   rK  rD   rL  rF  rM  rN  Úcompilerr}   ré   rX  rg   rV  r   rU  r   r×   {  s0   ÿÿ

ÿ
ôz*BaseDatabaseSchemaEditor._create_index_sqlc                 C   s&   t |p| jt|jj| jƒ|  |¡d�S ©N)rg   r   )r   rÖ   r	   r   rq   rU   )r9   r!   r   rD   r   r   r   r  ±  s
   ýz*BaseDatabaseSchemaEditor._delete_index_sqlc                 C   s*   t | jt|jj| jƒ|  |¡|  |¡d�S )N)rg   Úold_nameÚnew_name)r   Úsql_rename_indexr	   r   rq   rU   )r9   r!   r\  r]  r   r   r   rÃ   ¸  s   üz*BaseDatabaseSchemaEditor._rename_index_sqlc                 C   s   t ||| j|d�S )N)rK  )r   rU   )r9   rg   ré   rK  rL  r   r   r   rY  À  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�¡ q$ˆ j j
D ]}|jrI| jjjrR| | ˆ | ¡¡ q?|S )zŠ
        Return a list of all index SQL statements (field indexes,
        index_together, Meta.indexes) for the specified model.
        c                    rW   r   rX   rZ   r    r   r   r[   Ï  r\   z?BaseDatabaseSchemaEditor._model_indexes_sql.<locals>.<listcomp>rÓ   rÔ   N)r   ZmanagedÚproxyZswappedrj   ro   rÿ   Zindex_togetherrN   r×   rá   r»   r3   r6   r¼   r½   )r9   r!   Úoutputr   r~   r   r¿   r   r    r   r¯   Ã  s    ÿþ€z+BaseDatabaseSchemaEditor._model_indexes_sqlc                 C   s*   g }|   ||¡r| | j||gd�¡ |S )zT
        Return a list of all index SQL statements for the specified field.
        r  N)Ú_field_should_be_indexedrN   r×   )r9   r!   r   r`  r   r   r   rÿ   Ú  s   z+BaseDatabaseSchemaEditor._field_indexes_sqlc                 C   s’   |pt ƒ }| ¡ \}}}}| ¡ \}}}	}
| |j¡D ]}| |d ¡ q| |j¡D ]}|
 |d ¡ q*|  |j¡|  |j¡kpH|||f||	|
fkS r$   )r  ZdeconstructÚunionZnon_db_attrsÚpoprU   rs   )r9   r)   r,   r  r  Úold_pathZold_argsZ
old_kwargsÚnew_pathÚnew_argsZ
new_kwargsÚattrr   r   r   r  ã  s   
ÿþz1BaseDatabaseSchemaEditor._field_should_be_alteredc                 C   s   |j o|j S r$   )r  r”   ©r9   r!   r   r   r   r   ra  ô  rV   z1BaseDatabaseSchemaEditor._field_should_be_indexedc                 C   s   |j  o|j S r$   ©r   ©r9   r)   r,   r   r   r   r  ÷  rV   z2BaseDatabaseSchemaEditor._field_became_primary_keyc                 C   s   |j  o|jo|j p|j S r$   )r   r”   rj  r   r   r   r'  ú  s
   ÿýz0BaseDatabaseSchemaEditor._unique_should_be_addedc                 C   s*   | j |  |¡|  |j¡|  |j¡|dœ S )N)rg   Z
old_columnZ
new_columnrš   )Úsql_rename_columnrU   rs   )r9   rg   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)rg   r   rs   r`   ra   rô   )r	   r   rq   rU   rú   r   rs   Útarget_fieldr!   r3   rT   rû   r   Úsql_create_fk)
r9   r!   r   rÕ   rg   r   rs   r`   ra   rô   r   r   r   rv   	  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                     ó   ˆ   ˆ j| i |¤Ž¡S r$   ©rU   r)  rR  r>   r   r   Úcreate_fk_name  ó   zDBaseDatabaseSchemaEditor._fk_constraint_name.<locals>.create_fk_namerà   )r   r   rq   rs   r   rl  r!   )r9   r!   r   rÕ   rp  r   r>   r   rú     s   úz,BaseDatabaseSchemaEditor._fk_constraint_namec                 C   ó   |   | j||¡S r$   )ræ   Úsql_delete_fk©r9   r!   r   r   r   r   r  +  ó   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 )NrH   z DEFERRABLE INITIALLY DEFERREDz DEFERRABLE INITIALLY IMMEDIATE)r   ZDEFERREDZ	IMMEDIATE)r9   rô   r   r   r   Ú_deferrable_constraint_sql.  s   

ÿz3BaseDatabaseSchemaEditor._deferrable_constraint_sqlc	              	      sŽ   |r	ˆ j jjs	d S |s|s|s|r'ˆ j|||||||d�}	|	r%ˆ j |	¡ d S ˆ jd ‡ fdd„|D ƒ¡ˆ  |¡dœ }
ˆ j	ˆ  
|¡|
dœ S )N)r   rF  rM  rL  rN  rf   c                    s   g | ]}ˆ   |j¡‘qS r   )rU   rs   rZ   r>   r   r   r[   V  r\   z8BaseDatabaseSchemaEditor._unique_sql.<locals>.<listcomp>)ré   rô   ©r   rd   )r3   r6   Ú&supports_deferrable_unique_constraintsri   r;   rN   Úsql_unique_constraintr{   rv  Úsql_constraintrU   )r9   r!   r   r   rF  rô   rM  rL  rN  rD   rd   r   r>   r   Ú_unique_sql6  s4   ÿþù	þþz$BaseDatabaseSchemaEditor._unique_sqlc	                 C   s  |r| j jjr|r| j jjr|r| j jjr|r| j jjsd S t|dd�j| j d�}	|jj	}
dd„ |D ƒ}|d u rA| j
|
|dd�}n|  |¡}|sN|sN|sN|rR| j}n| j}|ra| j|
|d|d	�}nt|
||	| jƒ}t|t|
| jƒ|||  |¡|  |¡|  ||¡d
�S )NFrO  r]   c                 S   rP  r   rQ  rZ   r   r   r   r[   z  rÜ   z?BaseDatabaseSchemaEditor._create_unique_sql.<locals>.<listcomp>TrÞ   r   )rK  rL  )rg   r   ré   rF  rô   rM  )r3   r6   rx  Úsupports_partial_indexesrH  r¼   r   rW  r   rq   rã   rU   Úsql_create_unique_indexÚsql_create_uniquerY  r   rQ   r   r	   rG  rv  rI  )r9   r!   r   r   rF  rô   rM  rL  rN  rZ  rg   ré   rD   r   r   r   ri   ^  sT   þýûûúúøøÿ
ÿ

ùz+BaseDatabaseSchemaEditor._create_unique_sqlc                    s&   |r	‡ fdd„}nˆ j }t||d|ƒS )Nc                     rn  r$   ro  rR  r>   r   r   Úcreate_unique_name–  rq  zLBaseDatabaseSchemaEditor._unique_constraint_name.<locals>.create_unique_nameÚ_uniq)r)  r   )r9   rg   ré   rß   r  r   r>   r   rã   “  s   z0BaseDatabaseSchemaEditor._unique_constraint_namec           	      C   sh   |r| j jjr|r| j jjr|r| j jjr|r| j jjsd S |s&|s&|s&|r*| j}n| j}|  |||¡S r$   )	r3   r6   rx  r|  rH  r¼   rÖ   rÏ   ræ   )	r9   r!   r   rF  rô   rM  rL  rN  rD   r   r   r   r  ž  s*   þýûûúúøøz+BaseDatabaseSchemaEditor._delete_unique_sqlc                 C   s    | j |  |¡| jd|i dœ S )Nr^   rw  )rz  rU   rm   )r9   r   r^   r   r   r   Ú
_check_sqlº  s   þz#BaseDatabaseSchemaEditor._check_sqlc                 C   s$   t | jt|jj| jƒ|  |¡|d�S )N)rg   r   r^   )r   Úsql_create_checkr	   r   rq   rU   )r9   r!   r   r^   r   r   r   r*  À  s   üz*BaseDatabaseSchemaEditor._create_check_sqlc                 C   s   | j jjsd S |  | j||¡S r$   )r3   r6   Z supports_table_check_constraintsræ   Úsql_delete_checkrt  r   r   r   r   È  s   
z*BaseDatabaseSchemaEditor._delete_check_sqlc                 C   s    t |t|jj| jƒ|  |¡d�S r[  )r   r	   r   rq   rU   )r9   Ú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 s'w   Y  g }| ¡ D ]Y\}}|du s@||d kr‹|durK|d |krKq2|durV|d |krVq2|dura|d |kraq2|durl|d |krlq2|duru|d	 suq2|dur€|d
 |kr€q2|	r†||	vr‹| |¡ q2|S )z@Return all constraint names matching the columns and conditions.Nc                    s@   g | ]}ˆ j jjrˆ j j t|ˆ j j ¡ ƒ¡nˆ j j |¡‘qS r   )r3   r6   Ztruncates_namesÚintrospectionZidentifier_converterr   rT   r@  )r'   r   r>   r   r   r[   â  s    þ
ýÿûz>BaseDatabaseSchemaEditor._constraint_names.<locals>.<listcomp>ré   r”   r   r¿   r^   r  rš   )r3   rR   r…  Zget_constraintsr   rq   ÚitemsrN   )r9   r!   rC  r”   r   r¿   r  r^   r  rÝ   rR   ry   Úresultr   Zinfodictr   r>   r   râ   Ô  s8   
úÿÿ
€z*BaseDatabaseSchemaEditor._constraint_namesc                 C   sV   | j |dd�}|rt|ƒdkrtdt|ƒ|jjf ƒ‚|D ]}|  |  ||¡¡ qd S )NTri  rà   z0Found wrong number (%s) of PK constraints for %s)râ   rä   rå   r   rq   r?   Ú_delete_primary_key_sql)r9   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  )rg   r   ré   )	r   Úsql_create_pkr	   r   rq   rU   r)  rs   r   rh  r   r   r   r(    s   ÿÿøz0BaseDatabaseSchemaEditor._create_primary_key_sqlc                 C   rr  r$   )ræ   Úsql_delete_pkrt  r   r   r   rˆ    ru  z0BaseDatabaseSchemaEditor._delete_primary_key_sqlc                 C   s   |r	d|   |¡ S dS )NzCOLLATE rH   )rU   )r9   rƒ   r,  rB  r   r   r   r‡     rq  z%BaseDatabaseSchemaEditor._collate_sqlc                 C   s*   | j |  |¡d |¡dœ }|  |¡ d S )Nú,)Z	procedureÚparam_types)Úsql_delete_procedurerU   r{   r?   )r9   Zprocedure_namerŒ  rD   r   r   r   Úremove_procedure   s
   þz)BaseDatabaseSchemaEditor.remove_procedure)FT)r   )F)rH   r$   )NNNNN)NNNNNN)T)NNNNNNNNr›   )pÚ__name__Ú
__module__Ú__qualname__Ú__doc__rz   rí   rñ   r¶   rü   rþ   r8  r3  r4  r7  r6  r5  r  rk  r%  ry  rm   Zsql_delete_constraintrz  r‚  rƒ  r~  rÏ   rm  rt   rù   rs  rX  r}  r^  rÖ   r‰  rŠ  r�  rð   r9  r:   r=   r@   r?   rU   r‚   r™   rk   rŒ   r�   r‘   r�   Ústaticmethodr«   rŽ   rQ   r³   rµ   rÀ   rÂ   rÄ   rÆ   rÇ   rÒ   rØ   rÎ   rî   r­   rò   r  r  r  r  r#  rý   r"  r®   rŠ   r  r)  rE  rG  rI  r×   r  rÃ   rY  r¯   rÿ   r  ra  r  r'  r!  rv   rú   r  rv  r{  ri   rã   r  r�  r*  r   ræ   râ   r&  r(  rˆ  r‡   rŽ  r   r   r   r   r2   K   s6   ÿÿÿÿÿÿÿ
	
	S
9	
$	
"	V
 I
÷  \
&.
 
 ò
6
	
÷,
÷
5
ø

ö
-
r2   ) Úloggingr   r   Zdjango.confr   Z!django.db.backends.ddl_referencesr   r   r   r   r   r	   Zdjango.db.backends.utilsr
   r   r   Zdjango.db.modelsr   r   Zdjango.db.models.sqlr   Zdjango.db.transactionr   r   Zdjango.utilsr   Ú	getLoggerrJ   r   r"   r.   r2   r   r   r   r   Ú<module>   s     
