o
    uvXj¡Ó  ã                   @   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 d dlmZmZ d dlmZ e  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)Ú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_keyÚ	to_fieldsÚname)ÚrelationÚaltered_fieldr   © r   ú[/var/www/html/myproject/venv/lib/python3.10/site-packages/django/db/backends/base/schema.pyÚ_is_relevant_relation   s   r   c                    s2   t ‡fdd„ˆjjjD ƒ‡ fdd„ˆ jjjD ƒƒS )Nc                 3   ó   � | ]
}t |ˆ ƒr|V  qd S ©N©r   ©Ú.0Úobj)Ú	old_fieldr   r   Ú	<genexpr>#   ó   € z+_related_non_m2m_objects.<locals>.<genexpr>c                 3   r   r   r   r   )Ú	new_fieldr   r   r   $   r    )ÚzipÚmodelÚ_metaÚrelated_objects)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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*d+„Z(d,d-„ Z)d.d/„ Z*e+d0d1„ ƒZ,d2d3„ Z-d4d5„ Z.d6d7„ Z/d8d9„ Z0d:d;„ Z1d<d=„ Z2d>d?„ Z3d@dA„ Z4dBdC„ Z5dDdE„ Z6dFdG„ Z7dHdI„ Z8dJdK„ Z9dLdM„ Z:dNdO„ Z;d’dPdQ„Z<	d’dRdS„Z=dTdU„ Z>d’dVdW„Z?dXdY„ Z@dZd[„ ZAd“d]d^„ZBd”d_d`„ZCdd\d\dd%dd%ddaœdbdc„ZDddde„ ZEdfdg„ ZFdhdi„ ZGdjdk„ ZHdldm„ ZIdndo„ ZJdpdq„ ZKdrds„ ZLdtdu„ ZMdvdw„ ZNd”dxdy„ZOd•dzd{„ZPd”d|d}„ZQd~d„ ZRd€d�„ ZSd‚dƒ„ ZTd„d…„ ZU			d–d†d‡„ZVd’dˆd‰„ZWdŠd‹„ ZXdŒd�„ ZYd‘dŽd�„ZZd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)z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)zBALTER TABLE %(table)s ADD CONSTRAINT %(name)s UNIQUE (%(columns)s)z|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   r2   d   s
   
z"BaseDatabaseSchemaEditor.__enter__c                 C   s<   |d u r| j D ]}|  |¡ q| jr| j |||¡ d S d S r   )r0   Úexecuter-   r   Ú__exit__)r.   Úexc_typeÚ	exc_valueÚ	tracebackÚsqlr   r   r   r5   k   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 rL| 	d¡r*dnd}|durB| j
 |tt| j|ƒƒ | ¡ dS | j
 || ¡ dS | j ¡ �}| ||¡ W d  ƒ dS 1 scw   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))Úparamsr9   )Úextraú;Ú N)r)   r(   Úin_atomic_blockr+   r,   r   ÚstrÚloggerÚdebugÚendswithr*   ÚappendÚtupleÚmapÚquote_valueÚcursorr4   )r.   r9   r:   ÚendingrG   r   r   r   r4   t   s   ÿ$"ÿz BaseDatabaseSchemaEditor.executec                 C   s   | j j |¡S r   )r(   ÚopsÚ
quote_name)r.   r   r   r   r   rJ   ‹   ó   z#BaseDatabaseSchemaEditor.quote_namec           
      C   s"  |j | jd�}|d }g }|du rdS |j}|o|  |¡ }|rA|  |¡}|durA| jjjr8|d|  |¡ 7 }n	|d7 }||g7 }|jrN|j	sN| jjj
rNd}|rZ| jjjsZ|d7 }n|s`|d7 }|j	rh|d	7 }n|jro|d
7 }|jpu|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.
        ©r(   ÚtypeN©NNz DEFAULT %sTz NULLz	 NOT NULLz PRIMARY KEYz UNIQUEú %s)Úinline)Údb_parametersr(   ÚnullÚskip_defaultÚeffective_defaultr+   Úrequires_literal_defaultsÚprepare_defaultÚempty_strings_allowedr   Ú!interprets_empty_strings_as_nullsÚimplied_column_nullÚuniqueÚdb_tablespacer$   Úsupports_tablespacesrI   Útablespace_sql)
r.   r#   r   Úinclude_defaultÚ	db_paramsr9   r:   rR   Údefault_valueÚ
tablespacer   r   r   Ú
column_sql�   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   rS   À   s   z%BaseDatabaseSchemaEditor.skip_defaultc                 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() method©ÚNotImplementedError©r.   Úvaluer   r   r   rV   Ç   s   ÿz(BaseDatabaseSchemaEditor.prepare_defaultc                 C   s²   |   ¡ r
|  ¡ }|S | js#| jr#| jr#|  ¡ dkrtƒ }|S tƒ }|S t| ddƒs/t| ddƒrUt	 
¡ }|  ¡ }|dkrA| ¡ }|S |dkrK| ¡ }|S |dkrSt 
¡ }|S d }|S )NÚBinaryFieldÚauto_nowFÚauto_now_addÚ	DateFieldÚ	TimeFieldÚDateTimeField)Úhas_defaultÚget_defaultrR   ÚblankrW   Úget_internal_typeÚbytesr?   Úgetattrr   ÚnowÚdateÚtimer   )r   ÚdefaultÚinternal_typer   r   r   Ú_effective_defaultÐ   s.   ðôõúüÿz+BaseDatabaseSchemaEditor._effective_defaultc                 C   s   |  |  |¡| j¡S )z2Return a field's effective database default value.)Úget_db_prep_savery   r(   rc   r   r   r   rT   ç   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).
        rd   rf   r   r   r   rF   ë   s   z$BaseDatabaseSchemaEditor.quote_valuec                    sB  g }g }ˆ j jD ]š}ˆ ˆ |¡\}}|du rq|jˆjd�}|d r+|dˆj|  7 }|jˆjd�}|r:|d| 7 }| |¡ |jr||j	r||jj
j j}	|jj
j  |jj¡j}
ˆjrl|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ˆ j jD ]}‡ fd
d„|D ƒ}ˆ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 }ˆ  ||pþd¡ ˆj ˆ !ˆ ¡¡ ˆ j j"D ]}|jj#j j$�rˆ %|jj#¡ �qdS )zr
        Create a table and any accompanying indexes or unique constraints for
        the given `model`.
        NrL   Úcheckú rO   )Úto_tableÚ	to_columnú_fk_%(to_table)s_%(to_column)sz%s %s)Ú	AutoFieldÚBigAutoFieldc                    ó   g | ]	}ˆ j  |¡j‘qS r   ©r$   Ú	get_fieldÚcolumn©r   r   ©r#   r   r   Ú
<listcomp>&  ó    z9BaseDatabaseSchemaEditor.create_model.<locals>.<listcomp>c                    s   g | ]}|  ˆ ˆ¡‘qS r   )Úconstraint_sql©r   Ú
constraint©r#   r.   r   r   rˆ   (  ó    ú, c                 s   s   � | ]}|r|V  qd S r   r   r‹   r   r   r   r   ,  s   € z8BaseDatabaseSchemaEditor.create_model.<locals>.<genexpr>)ÚtableÚ
definition)&r$   Úlocal_fieldsrb   rQ   r(   Úsql_check_constraintÚdb_type_suffixÚextendÚremote_fieldÚdb_constraintr#   Údb_tabler„   Ú
field_namer…   Úsql_create_inline_fkrJ   r+   Úsupports_foreign_keysr0   rC   Ú_create_fk_sqlrq   rI   Úautoinc_sqlÚunique_togetherÚ_create_unique_sqlÚconstraintsÚsql_create_tableÚjoinr[   r]   r4   Ú_model_indexes_sqlÚlocal_many_to_manyÚthroughÚauto_createdÚcreate_model)r.   r#   Úcolumn_sqlsr:   r   r‘   Úextra_paramsr_   Úcol_type_suffixr}   r~   r�   ÚfieldsÚcolumnsr    r9   r]   r   r�   r   r§   ÷   sf   
þ

þ€þ€þ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.r�   N)r$   r¤   r–   r¥   r¦   Údelete_modelr4   Úsql_delete_tablerJ   r˜   Úlistr0   Ú
isinstancer   Úreferences_tableÚremove)r.   r#   r   r9   r   r   r   r­   =  s   €ÿ€þz%BaseDatabaseSchemaEditor.delete_modelc                 C   s   | j | || ¡dd� dS )zAdd an index on a model.N)r:   )r4   Ú
create_sql©r.   r#   Úindexr   r   r   Ú	add_indexM  s   z"BaseDatabaseSchemaEditor.add_indexc                 C   s   |   | || ¡¡ dS )zRemove an index from a model.N)r4   Ú
remove_sqlr´   r   r   r   Úremove_indexQ  s   z%BaseDatabaseSchemaEditor.remove_indexc                 C   ó"   |  || ¡}|r|  |¡ dS dS )z"Add a check constraint to a model.N)r³   r4   ©r.   r#   rŒ   r9   r   r   r   Úadd_constraintU  ó   ÿz'BaseDatabaseSchemaEditor.add_constraintc                 C   r¹   )z'Remove a check constraint from a model.N)r·   r4   rº   r   r   r   Úremove_constraint[  r¼   z*BaseDatabaseSchemaEditor.remove_constraintc                    sz   dd„ |D ƒ}dd„ |D ƒ}|  |¡D ]}|  ˆ |ddi| 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   ©rD   ©r   r«   r   r   r   Ú	<setcomp>g  ó    zABaseDatabaseSchemaEditor.alter_unique_together.<locals>.<setcomp>c                 S   r¾   r   r¿   rÀ   r   r   r   rÁ   h  rÂ   rZ   Tc                    r‚   r   rƒ   r†   r‡   r   r   rˆ   n  r‰   zBBaseDatabaseSchemaEditor.alter_unique_together.<locals>.<listcomp>N)Ú
differenceÚ_delete_composed_indexÚsql_delete_uniquer4   rŸ   )r.   r#   Úold_unique_togetherÚnew_unique_togetherÚoldsÚnewsr«   r¬   r   r‡   r   Úalter_unique_togethera  s   þz.BaseDatabaseSchemaEditor.alter_unique_togetherc                    s~   dd„ |D ƒ}dd„ |D ƒ}|  |¡D ]}|  ˆ |ddi| 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Á   w  rÂ   z@BaseDatabaseSchemaEditor.alter_index_together.<locals>.<setcomp>c                 S   r¾   r   r¿   rÀ   r   r   r   rÁ   x  rÂ   rµ   Tc                    ó   g | ]}ˆ j  |¡‘qS r   ©r$   r„   r†   r‡   r   r   rˆ   ~  rŽ   zABaseDatabaseSchemaEditor.alter_index_together.<locals>.<listcomp>Ú_idx©ÚsuffixN)rÃ   rÄ   Úsql_delete_indexr4   Ú_create_index_sql)r.   r#   Úold_index_togetherÚnew_index_togetherrÈ   rÉ   r«   Úfield_namesr   r‡   r   Úalter_index_togetherq  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   ó   h | ]}|j ’qS r   ©r   r‹   r   r   r   rÁ   ‚  ó    zBBaseDatabaseSchemaEditor._delete_composed_index.<locals>.<setcomp>c                 S   rÖ   r   r×   r‹   r   r   r   rÁ   ƒ  rØ   c                    r‚   r   rƒ   r†   r‡   r   r   rˆ   „  r‰   zCBaseDatabaseSchemaEditor._delete_composed_index.<locals>.<listcomp>Úexcludeé   z1Found wrong number (%s) of constraints for %s(%s)r�   r   )
r$   r    ÚindexesÚ_constraint_namesÚlenÚ
ValueErrorr˜   r¢   r4   Ú_delete_constraint_sql)	r.   r#   r«   Úconstraint_kwargsr9   Úmeta_constraint_namesÚmeta_index_namesr¬   Ú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	ƒr4| 
||¡ q'dS )z#Rename the table a model points to.N)Ú	old_tableÚ	new_table)r(   r+   Úignores_table_name_caseÚlowerr4   Úsql_rename_tablerJ   r0   r°   r   Úrename_table_references)r.   r#   Úold_db_tableÚnew_db_tabler9   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.)r�   Úold_tablespaceÚnew_tablespaceN)r4   Úsql_retablespace_tablerJ   r$   r˜   )r.   r#   Úold_db_tablespaceÚnew_db_tablespacer   r   r   Úalter_db_tablespace   s
   ýz,BaseDatabaseSchemaEditor.alter_db_tablespacec                 C   sH  |j r|jjjjr|  |jj¡S | j||dd�\}}|du r dS |j| jd�}|d r4|d| j	|  7 }| j
|  |jj¡|  |j¡|dœ }|  ||¡ |  |¡sv|  |¡durv| j|d|dd�\}}| j|  |jj¡|d	œ }|  ||¡ | j |  ||¡¡ |jr–| jjjr–|jr–| j |  ||d
¡¡ | 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^   NrL   r{   r|   )r�   r…   r‘   ©Údrop©r�   Úchangesr   )r   r–   r¥   r$   r¦   r§   rb   rQ   r(   r“   Úsql_create_columnrJ   r˜   r…   r4   rS   rT   Ú_alter_column_default_sqlÚsql_alter_columnr0   r•   Ú_field_indexes_sqlr+   r›   r—   rC   rœ   Úconnection_persists_old_columnsÚclose)r.   r#   r   r‘   r:   r_   r9   Úchanges_sqlr   r   r   Ú	add_field¨  s6   
ýþ
ÿ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.
        rL   rM   NT©Úforeign_key)r�   r…   )r   r–   r¥   r$   r¦   r­   rQ   r(   rÜ   r…   r4   Ú_delete_fk_sqlÚsql_delete_columnrJ   r˜   r+   rû   rü   r¯   r0   r°   r   Úreferences_columnr²   )r.   r#   r   Úfk_namesÚfk_namer9   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 s(|du r0|jdu r0td||f ƒ‚|du rT|du rT|jjrT|jjrT|jjjjrT|jjjjrT|  ||||¡S |du rr|du rr|jjrr|jjrr|jjjjsr|jjjjsrdS |du sz|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.
        rL   rM   NzqCannot 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))	rQ   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ð  sP   	þÿÿÿ
þ
ýÿÿ
þ
ýþÿÿz$BaseDatabaseSchemaEditor.alter_fieldc	           '      C   s6  t ƒ }	|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rJ|  ||¡rƒdd„ |jjD ƒ}| j||jgdd|d�}|rut|ƒdkrutd	t|ƒ|jj|jf ƒ‚|D ]}|  
|  ||¡¡ qw|jr‰|jpŽ|joŽ|jo’||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�r3|d �r3dd„ |jjD ƒ}| j||jgd|d�}|�r$t|ƒdk�r$tdt|ƒ|jj|jf ƒ‚|D ]}|  
|  ||¡¡ �q&|j|jk�r_|  
|  |jj|||¡¡ | jD ]}t|tƒ�r]| |jj|j|j¡ �qJg }g }g }||k�r~|  ||||¡\}}|  |¡ | !|¡ |  "|¡}|  "|¡}|j#�o |j# �o ||k�o |du�o |  $|¡ }|�r®|  |  %|||¡¡ |j#|j#k�rÄ|  &|||¡}|�rÄ|  |¡ | '¡ �oÐ|j#�oÐ|j# }|�s×|�rF|�sÞ|| }| j(j)j*�rú|�rút+t,|Ž ƒ\}} d -|¡t.| g ƒfg}|D ]\}} |  
| j/|  0|jj¡|dœ | ¡ �qü|�rF|  
| j1|  0|jj¡|  0|j¡ddœ |g¡ |D ]\}} |  
| j/|  0|jj¡|dœ | ¡ �q/|�rW|D ]\}} |  
|| ¡ �qK|j�re|j�se|  2||¡ |  3||¡�rw|  
|  4||jg¡¡ |j�r|j�r‘|j�r‘|j�s‘|  
|  5||g¡¡ g }!|j�r¨|j�r¨||k�r¨|! !t||ƒ¡ |  ||¡�rÀ|  
|  6||¡¡ |! !t||ƒ¡ |!D ]B\}"}|jj7| j(d�}#|#d }$|  |j|"j|j|$¡\}}|  
| j/|  0|jjj¡|d dœ |d ¡ |D ]\}} |  
|| ¡ �q÷�qÂ|j�r"|	�s|j�r|j�s"|j�r"|  
|  8||d¡¡ |�rE|j9jj:D ]}%t;|%|ƒ�rC|%jj�rC|  
|  8|%j|%jd¡¡ �q*|d |d k�rk|d �rk| j<|jj|jgdd�}|  
|  =|||d ¡¡ |�rŒ| j%|||dd�\}&} | j/|  0|jj¡|&dœ }|  
|| ¡ | j(j)j>�r™| j( ?¡  dS dS )z3Perform a "physical" (non-ManyToMany) field update.Trÿ   rÚ   z<Found wrong number (%s) of foreign key constraints for %s.%sc                 S   rÖ   r   r×   r‹   r   r   r   rÁ   ,  rØ   z8BaseDatabaseSchemaEditor._alter_field.<locals>.<setcomp>F)rZ   r   rÙ   z7Found wrong number (%s) of unique constraints for %s.%sc                 S   rÖ   r   r×   )r   rµ   r   r   r   rÁ   V  rØ   )rµ   Útype_rÙ   r{   c                 S   rÖ   r   r×   r‹   r   r   r   rÁ   d  rØ   )r{   rÙ   z6Found wrong number (%s) of check constraints for %s.%sNr�   rõ   ú%s)r�   r…   rw   rL   rM   r   r   Ú_fkÚ_checkrÎ   ró   )@Úsetr–   r—   rÜ   r…   rÝ   rÞ   r$   r˜   Úaddr4   r  rZ   Ú_field_became_primary_keyr    Ú_delete_unique_sqlr   r&   Úrelated_modelr   Údb_indexrÛ   r
   rÏ   Ú_delete_index_sqlÚ_delete_check_sqlÚ_rename_field_sqlr0   r°   r   Úrename_column_referencesÚ_alter_column_type_sqlrC   r•   rT   rR   rS   rø   Ú_alter_column_null_sqlrn   r(   r+   Úsupports_combined_altersrD   r"   r¢   Úsumrù   rJ   Úsql_update_with_defaultÚ_delete_primary_keyÚ_unique_should_be_addedrŸ   rÑ   Ú_create_primary_key_sqlrQ   rœ   r#   r%   r   Ú_create_index_nameÚ_create_check_sqlrû   rü   )'r.   r#   r   r!   r  r  r
  r  r	  Úfks_droppedr  r  rá   rã   Úconstraint_nameÚdrop_foreign_keysÚ_old_relÚnew_relÚrel_fk_namesrâ   Úindex_namesÚ
index_namer9   ÚactionsÚnull_actionsÚpost_actionsÚfragmentÚother_actionsÚold_defaultÚnew_defaultÚneeds_database_defaultÚfour_way_default_alterationr:   Úrels_to_updateÚold_relÚrel_db_paramsÚrel_typeÚrelrý   r   r   r   r    sp  ýþý
þüÿÿþ
þý
€




ÿþý
û

þþû
ýú
þû 
ÿþûÿÿÿÿþ€þÿz%BaseDatabaseSchemaEditor._alter_fieldc                 C   sX   | j jjr| ¡ dv 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.
        )Ú	CharFieldÚ	TextFieldNrL   rM   ©r…   rM   )
r(   r+   rX   rq   rQ   rR   Úsql_alter_column_nullÚsql_alter_column_not_nullrJ   r…   )r.   r#   r   r!   r  r9   r   r   r   r    s   

þûz/BaseDatabaseSchemaEditor._alter_column_null_sqlc           
      C   st   |   |¡}d}|g}|rg }n| jjjr|  |¡}g }|j| jd�}|r'| 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  rL   rM   )r…   rM   rw   )
rT   r(   r+   rU   rV   rQ   Úsql_alter_column_no_defaultÚsql_alter_column_defaultrJ   r…   )
r.   r#   r   r!   rô   r5  rw   r:   r  r9   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_typerJ   r…   )r.   r#   r   r!   r  r   r   r   r  B  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$   r˜   rì   r  r„   Úm2m_reverse_field_nameÚm2m_field_name)r.   r#   r   r!   r	  r   r   r   r  W  s   
ÿûüz,BaseDatabaseSchemaEditor._alter_many_to_manyr=   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_%sÚ_é   Né   rÚ   r   zD%séÿÿÿÿ)r	   r   r(   rI   Úmax_name_lengthr¢   rÝ   Úisdigit)	r.   Ú
table_nameÚcolumn_namesrÏ   rJ  Úhash_suffix_partÚ
max_lengthr.  Úother_lengthr   r   r   r%  l  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r*d| jj |¡ S dS )NrÚ   r   r|   r=   )rÝ   r[   r$   r(   rI   r]   )r.   r#   r«   r[   r   r   r   Ú_get_index_tablespace_sql‰  s   z2BaseDatabaseSchemaEditor._get_index_tablespace_sql)r   rÏ   Úusingr[   Úcol_suffixesr9   Ú	opclassesÚ	conditionc                   s‚   ˆj |||d�}dd„ |D ƒ}|pˆj}|jj}‡ ‡fdd„}t|t|ˆjƒt||||ƒ|ˆ ||||	¡||
r=d|
 d�S d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, ...).
        )r[   c                 S   s   g | ]}|j ‘qS r   )r…   r†   r   r   r   rˆ   œ  rØ   z>BaseDatabaseSchemaEditor._create_index_sql.<locals>.<listcomp>c                     s"   ˆ d u rˆj | i |¤Ž‰ ˆ ˆ ¡S r   )r%  rJ   ©ÚargsÚkwargs©r   r.   r   r   Úcreate_index_name   s   
zEBaseDatabaseSchemaEditor._create_index_sql.<locals>.create_index_nameú WHERE r=   )r�   r   rV  r¬   r;   rY  )	rU  Úsql_create_indexr$   r˜   r   r   rJ   r   Ú_index_columns)r.   r#   r«   r   rÏ   rV  r[   rW  r9   rX  rY  r]   r¬   r`  r�   r^  r   r]  r   rÑ   “  s    


ùùz*BaseDatabaseSchemaEditor._create_index_sqlc                 C   s"   t | jt|jj| jƒ|  |¡d�S ©N)r�   r   )r   rÐ   r   r$   r˜   rJ   ©r.   r#   r   r   r   r   r  °  s
   ýz*BaseDatabaseSchemaEditor._delete_index_sqlc                 C   s   t ||| j|d�S )N)rW  )r   rJ   )r.   r�   r¬   rW  rX  r   r   r   ra  ·  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 ]}| | ˆ | ¡¡ q?|S )zŠ
        Return a list of all index SQL statements (field indexes,
        index_together, Meta.indexes) for the specified model.
        c                    rË   r   rÌ   r†   r‡   r   r   rˆ   Æ  rŽ   z?BaseDatabaseSchemaEditor._model_indexes_sql.<locals>.<listcomp>rÍ   rÎ   )r$   ÚmanagedÚproxyÚswappedr’   r•   rú   Úindex_togetherrC   rÑ   rÛ   r³   )r.   r#   Úoutputr   rÔ   r«   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_indexedrC   rÑ   )r.   r#   r   rh  r   r   r   rú   Í  s   z+BaseDatabaseSchemaEditor._field_indexes_sqlc                 C   s   |j o|j S r   )r  rZ   ©r.   r#   r   r   r   r   ri  Ö  rK   z1BaseDatabaseSchemaEditor._field_should_be_indexedc                 C   s   |j  o|j S r   ©r   ©r.   r   r!   r   r   r   r  Ù  rK   z2BaseDatabaseSchemaEditor._field_became_primary_keyc                 C   s"   |j  r|j p|jo|j o|j S r   )rZ   r   rl  r   r   r   r#  Ü  s   ÿz0BaseDatabaseSchemaEditor._unique_should_be_addedc                 C   s*   | j |  |¡|  |j¡|  |j¡|dœ S )N)r�   Ú
old_columnÚ
new_columnrM   )Úsql_rename_columnrJ   r…   )r.   r�   r   r!   r  r   r   r   r  á  s   

üz*BaseDatabaseSchemaEditor._rename_field_sqlc              	      s¶   ‡ fdd„}t |jjˆ jƒ}t|jj|jgt|jjjjƒd |jjg||ƒ}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 )Nc                     ó   ˆ   ˆ j| i |¤Ž¡S r   ©rJ   r%  rZ  r3   r   r   Úcreate_fk_nameê  ó   z?BaseDatabaseSchemaEditor._create_fk_sql.<locals>.create_fk_namerÚ   )r�   r   r…   r}   r~   Ú
deferrable)r   r$   r˜   rJ   r   r…   r	   Útarget_fieldr#   r   r(   rI   Údeferrable_sqlr   Úsql_create_fk)r.   r#   r   rÏ   rr  r�   r   r…   r}   r~   rt  r   r3   r   rœ   é  s.   úùz'BaseDatabaseSchemaEditor._create_fk_sqlc                 C   ó   |   | j||¡S r   )rß   Úsql_delete_fkrc  r   r   r   r    ó   z'BaseDatabaseSchemaEditor._delete_fk_sqlc                 C   s\   |r| j ||||d�}|r| j |¡ d S | jdd t| j|ƒ¡i }| j|  |¡|dœ S )N)r   rY  r¬   r�   ©r   rŒ   )rŸ   r0   rC   Úsql_unique_constraintr¢   rE   rJ   Úsql_constraint)r.   r#   r«   r   rY  r9   rŒ   r   r   r   Ú_unique_sql  s   ÿþz$BaseDatabaseSchemaEditor._unique_sqlc                    sŒ   ‡ fdd„}t |jjˆ jƒ}|d u rt|jj|d|ƒ}nˆ  |¡}t||ˆ jƒ}|r=ˆ jjjr;t	ˆ j
|||d| d�S d S t	ˆ j|||d�S )Nc                     rp  r   rq  rZ  r3   r   r   Úcreate_unique_name  rs  zGBaseDatabaseSchemaEditor._create_unique_sql.<locals>.create_unique_nameÚ_uniqr_  )r�   r   r¬   rY  ©r�   r   r¬   )r   r$   r˜   rJ   r   r   r(   r+   Úsupports_partial_indexesr   Úsql_create_unique_indexÚsql_create_unique)r.   r#   r¬   r   rY  r  r�   r   r3   r   rŸ     s.   
úûúüz+BaseDatabaseSchemaEditor._create_unique_sqlc                 C   s2   |r| j jjr|  | j||¡S d S |  | j||¡S r   )r(   r+   r‚  rß   rÐ   rÅ   )r.   r#   r   rY  r   r   r   r  1  s   ÿÿþz+BaseDatabaseSchemaEditor._delete_unique_sqlc                 C   s    | j |  |¡| jd|i dœ S )Nr{   r{  )r}  rJ   r“   )r.   r   r{   r   r   r   Ú
_check_sql9  s   þz#BaseDatabaseSchemaEditor._check_sqlc                 C   s$   t | jt|jj| jƒ|  |¡|d�S )N)r�   r   r{   )r   Úsql_create_checkr   r$   r˜   rJ   )r.   r#   r   r{   r   r   r   r&  ?  s   üz*BaseDatabaseSchemaEditor._create_check_sqlc                 C   rx  r   )rß   Úsql_delete_checkrc  r   r   r   r  G  rz  z*BaseDatabaseSchemaEditor._delete_check_sqlc                 C   s    t |t|jj| jƒ|  |¡d�S rb  )r   r   r$   r˜   rJ   )r.   Útemplater#   r   r   r   r   rß   J  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 |¡‘qS r   )r(   ÚintrospectionÚidentifier_converter)r   r   r3   r   r   rˆ   V  s    ÿÿz>BaseDatabaseSchemaEditor._constraint_names.<locals>.<listcomp>r¬   rZ   r   rµ   r{   r   rM   )r(   rG   r‰  Úget_constraintsr$   r˜   ÚitemsrC   )r.   r#   rQ  rZ   r   rµ   r   r{   r  rÙ   rG   r    Úresultr   Úinfodictr   r3   r   rÜ   Q  s4   
þÿ
€z*BaseDatabaseSchemaEditor._constraint_namesc                 C   sV   | j |dd�}|rt|ƒdkrtdt|ƒ|jjf ƒ‚|D ]}|  |  ||¡¡ qd S )NTrk  rÚ   z0Found wrong number (%s) of PK constraints for %s)rÜ   rÝ   rÞ   r$   r˜   r4   Ú_delete_primary_key_sql)r.   r#   r	  rã   r(  r   r   r   r"  o  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 )NÚ_pkrÎ   r�  )	r   Úsql_create_pkr   r$   r˜   rJ   r%  r…   r   rj  r   r   r   r$  y  s   ÿúz0BaseDatabaseSchemaEditor._create_primary_key_sqlc                 C   rx  r   )rß   Úsql_delete_pkrc  r   r   r   r�  ƒ  rz  z0BaseDatabaseSchemaEditor._delete_primary_key_sqlc                 C   s*   | j |  |¡d |¡dœ }|  |¡ d S )Nú,)Ú	procedureÚparam_types)Úsql_delete_procedurerJ   r¢   r4   )r.   Úprocedure_namer•  r9   r   r   r   Úremove_procedure†  s
   þz)BaseDatabaseSchemaEditor.remove_procedure)FT)r   )F)r=   r   rN   )NNNNNNNN)[Ú__name__Ú
__module__Ú__qualname__Ú__doc__r¡   rè   rï   r®   r÷   rù   rD  r@  rA  rC  rB  r  ro  r!  r|  r“   Úsql_delete_constraintr}  r†  r‡  r„  rÅ   rw  rš   ry  r`  rƒ  rÐ   r‘  r’  r–  r/   r2   r5   r4   rJ   rb   rS   rV   Ústaticmethodry   rT   rF   r§   r­   r¶   r¸   r»   r½   rÊ   rÕ   rÄ   rì   rò   rþ   r  r  r  r  rø   r  r  r%  rU  rÑ   r  ra  r£   rú   ri  r  r#  r  rœ   r  r~  rŸ   r  r…  r&  r  rß   rÜ   r"  r$  r�  r˜  r   r   r   r   r'   (   sÄ    ÿ
	
	
0	
F*
*
ÿ u



þ	



þ


r'   )Úloggingr   Ú!django.db.backends.ddl_referencesr   r   r   r   r   Údjango.db.backends.utilsr   r	   Údjango.db.modelsr
   Údjango.db.transactionr   r   Údjango.utilsr   Ú	getLoggerr@   r   r&   r'   r   r   r   r   Ú<module>   s    
	