o
    þÞh“A ã                   @   sà   d dl Z d dlZd dlm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 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)Ú
FieldError)ÚColumnsÚExpressionsÚForeignKeyNameÚ	IndexNameÚ	StatementÚTable)Únames_digestÚsplit_identifierÚtruncate_name)Ú
DeferrableÚIndex)ÚCompositePrimaryKey)Ú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_keyÚ	to_fieldsÚname)ÚrelationÚaltered_fieldr   © r   ú^/var/www/html/premium_crap/venv/lib/python3.10/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)ÚforwardÚreverseÚinclude_hiddenÚinclude_parentsr   )Úkey)ÚsortedÚ_metaÚ_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>:   ó   € ý
ÿz+_related_non_m2m_objects.<locals>.<genexpr>c                 3   r,   r-   r.   r/   )Ú	new_fieldr   r   r3   ?   r4   )Úzipr+   r*   Ú_related_non_m2m_objectsÚremote_field)r2   r5   Úrelated_fieldsÚold_relÚnew_relr   )r5   r2   r   r7   6   s    €
þ
þú
þþr7   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#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.d0d1„ Z/dÄd2d3„Z0d4d5„ Z1d6d7„ Z2d8d9„ Z3d:d;„ Z4d<d=„ Z5d>d?„ Z6e7d@dA„ ƒZ8dBdC„ Z9dDdE„ Z:dFdG„ Z;dHdI„ Z<dJdK„ Z=dLdM„ Z>dNdO„ Z?dPdQ„ Z@dRdS„ ZAdTdU„ ZBdVdW„ ZCdXdY„ ZDdZd[„ ZEd\d]„ ZFd^d_„ ZGd`da„ ZHdbdc„ ZIdÄddde„ZJdfdg„ ZK	!dÄdhdi„ZLdjdk„ ZMdÄdldm„ZN	!dÄdndo„ZOdpdq„ ZPdrds„ ZQdtdu„ ZRdvdw„ ZSdÅdydz„ZTdÆd{d|„ZUd}d~„ ZVdd€„ ZWdddxdxdd)dd)dddd�œd‚dƒ„ZXdÆd„d…„ZYd†d‡„ ZZdˆd‰„ Z[dŠd‹„ Z\dŒd�„ Z]dÆdŽd�„Z^d�d‘„ Z_d’d“„ Z`d”d•„ Zad–d—„ Zbd˜d™„ Zcdšd›„ Zddœd�„ ZedždŸ„ Zfd d¡„ Zg					dÇd¢d£„Zh						dÈd¤d¥„Zi							dÉd¦d§„ZjdÊd¨d©„Zk						dÈdªd«„Zld¬d­„ Zmd®d¯„ Znd°d±„ Zod²d³„ Zp								dËd´dµ„Zqd¶d·„ ZrdÄd¸d¹„Zsdºd»„ Ztd¼d½„ ZudÌd¾d¿„ZvdÃdÀdÁ„Zwd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PRIMARY KEY (%(columns)s)z?ALTER TABLE %(table)s ADD CONSTRAINT %(name)s CHECK (%(check)s)zbALTER TABLE %(table)s ADD CONSTRAINT %(name)s UNIQUE%(nulls_distinct)s (%(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)szaCREATE UNIQUE INDEX %(name)s ON %(table)s (%(columns)s)%(include)s%(nulls_distinct)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)Úselfr=   r>   r   r   r   r   Ú__init__–   s
   z!BaseDatabaseSchemaEditor.__init__c                 C   s(   g | _ | jrt| jjƒ| _| j ¡  | S r-   )Údeferred_sqlrB   r   r=   ÚaliasÚ	__enter__©rC   r   r   r   rG   Ÿ   s
   
z"BaseDatabaseSchemaEditor.__enter__c                 C   s>   |d u r| j D ]}|  |d ¡ q| jr| j |||¡ d S d S r-   )rE   ÚexecuterB   r   Ú__exit__)rC   Úexc_typeÚ	exc_valueÚ	tracebackÚsqlr   r   r   rJ   ¦   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))ÚparamsrN   )Úextraú;Ú N)r>   r=   Úin_atomic_blockr@   rA   r   ÚstrÚloggerÚdebugÚrstripÚendswithr?   ÚappendÚtupleÚmapÚquote_valueÚcursorrI   )rC   rN   rO   Úendingr]   r   r   r   rI   ¯   s.   ÿþýÿÿÿ"ÿz BaseDatabaseSchemaEditor.executec                 C   s   | j j |¡S r-   )r=   ÚopsÚ
quote_name)rC   r   r   r   r   r`   Î   ó   z#BaseDatabaseSchemaEditor.quote_namec                    sR  ˆ 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"g }|rÓˆ j jD ]}ˆj | ˆ ˆ¡¡ qÅn| ‡ ‡fdd„ˆ j jD ƒ¡ ˆ j j}t|tƒrô| ˆ  |j!¡¡ ˆ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©r0   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)Ú	AutoFieldÚBigAutoFieldÚSmallAutoFieldc                 3   s   � | ]	}|  ˆ ˆ¡V  qd S r-   )Úconstraint_sql©r0   Ú
constraint©r*   rC   r   r   r3     s
   € 
ÿ
ÿz5BaseDatabaseSchemaEditor.table_sql.<locals>.<genexpr>ú, c                 s   s   � | ]	}|rt |ƒV  qd S r-   )rT   )r0   Ú	statementr   r   r   r3   &  s   € ý
ÿ)ÚtableÚ
definition)&r%   Úunique_togetherrE   rY   Ú_create_unique_sqlÚlocal_fieldsÚ
column_sqlÚdb_parametersr=   Úsql_check_constraintÚdb_type_suffixÚextendr8   Údb_constraintr*   Údb_tablerd   Ú
field_nameÚcolumnÚsql_create_inline_fkr`   r@   Úsupports_foreign_keysÚ_create_fk_sqlÚget_internal_typer_   Úautoinc_sqlÚconstraintsÚ
create_sqlÚpkÚ
isinstancer   Ú_pk_constraint_sqlÚcolumnsÚsql_create_tableÚjoinÚdb_tablespaceÚtablespace_sql)rC   r*   Úfield_namesÚfieldsÚcolumn_sqlsrO   r   rx   Úextra_paramsÚ	db_paramsÚcol_type_suffixrk   rl   r‰   Úconstraint_sqlsrs   rŒ   rN   r“   r   rt   r   Ú	table_sqlÑ   s�   

ÿþþ
ÿÿ
þÿÿ	
ÿ€ÿþ

þþ
ÿz"BaseDatabaseSchemaEditor.table_sqlc                 c   s¢  � |V  |  d¡ }r|  |¡V  | jjjr |jr |  |j¡V  |j}| ¡ r;|  	|¡\}	}
d|	› �V  | 
|
¡ d}|oJ|  |¡ oJ|oI|  |¡ }|rs|  |¡}|d ursd|  |¡ }| jjjrk||  |¡ V  n|V  | |¡ |jr€|js€| jjjr€d}|jr“|  |¡\}}| 
|¡ |V  n|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 d S d S d S )
NÚ	collationzDEFAULT FTzNOT NULLÚNULLzPRIMARY KEYÚUNIQUE)Úinline)ÚgetÚ_collate_sqlr=   r@   Úsupports_comments_inlineÚ
db_commentÚ_comment_sqlÚnullÚhas_db_defaultÚdb_default_sqlr€   Úskip_defaultÚskip_default_on_alterÚeffective_defaultÚ_column_default_sqlÚrequires_literal_defaultsÚprepare_defaultrY   Úempty_strings_allowedr   Ú!interprets_empty_strings_as_nullsÚ	generatedÚ_column_generated_sqlÚimplied_column_nullÚuniquer’   r%   Úsupports_tablespacesr_   r“   )rC   Úcolumn_db_typerO   r*   r   Úfield_db_paramsÚinclude_defaultrœ   r¥   Údefault_sqlÚdefault_paramsÚdefault_valueÚcolumn_defaultÚgenerated_sqlÚgenerated_paramsÚ
tablespacer   r   r   Ú_iter_column_sql6  sj   €

ÿù	


ÿþý

ÿþýû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.
        rh   ÚtypeN©NNrj   )r}   r=   r‘   r¿   )rC   r*   r   r·   r¶   rµ   rO   r   r   r   r|   y  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).
        Fr   ©rC   r   r   r   r   r¨   ”  ó   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.
        Fr   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() method©ÚNotImplementedError©rC   Ú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.
        ú%sr   rÃ   r   r   r   r«   «  rÄ   z,BaseDatabaseSchemaEditor._column_default_sqlc           	         s†   ddl m} |j}t||ƒrˆ  |¡nd}t|jd�}|jˆ jd�}| 	|¡\}}ˆ jj
jr=|t‡ fdd„|D ƒƒ; }g }|| |fS )z;Return the sql and params for the field's database default.r   )ÚValuez(%s)r)   rh   c                 3   ó   � | ]}ˆ   |¡V  qd S r-   )r­   ©r0   ÚprH   r   r   r3   Á  ó   € z:BaseDatabaseSchemaEditor.db_default_sql.<locals>.<genexpr>)Údjango.db.models.expressionsrÊ   Ú_db_default_expressionr�   r«   r   r*   Úget_compilerr=   Úcompiler@   r¬   rZ   )	rC   r   rÊ   Ú
db_defaultrN   ÚqueryÚcompilerr¸   rO   r   rH   r   r§   ²  s   ÿ
z'BaseDatabaseSchemaEditor.db_default_sqlc                    sZ   |  ˆ j¡\}}|jrdnd}ˆ jjjr#|t‡ fdd„|D ƒƒ }d}d|› d|› �|fS )z3Return the SQL to use in a GENERATED ALWAYS clause.ÚSTOREDÚVIRTUALc                 3   rË   r-   ©r\   rÌ   rH   r   r   r3   Ê  rÎ   zABaseDatabaseSchemaEditor._column_generated_sql.<locals>.<genexpr>r   zGENERATED ALWAYS AS (z) )r¼   r=   Ú
db_persistr@   r¬   rZ   )rC   r   Úexpression_sqlrO   Úpersistency_sqlr   rH   r   r±   Å  s   
z.BaseDatabaseSchemaEditor._column_generated_sqlc                 C   s¼   |   ¡ r
|  ¡ }|S | jrd }|S | js(| jr(| jr(|  ¡ dkr$d}|S d}|S t| ddƒs4t| ddƒrZ|  ¡ }|dkrBt 	¡ }|S t
 	¡ }|dkrP| ¡ }|S |d	krX| ¡ }|S d }|S )
NÚBinaryFieldó    rR   Úauto_nowFÚauto_now_addÚDateTimeFieldÚ	DateFieldÚ	TimeField)Úhas_defaultÚget_defaultr°   r¥   Úblankr®   rˆ   Úgetattrr   Únowr   ÚdateÚtime)r   ÚdefaultÚinternal_typer   r   r   Ú_effective_defaultÎ  s4   íïóô	ùüÿz+BaseDatabaseSchemaEditor._effective_defaultc                 C   s   |  |  |¡| j¡S )z2Return a field's effective database default value.)Úget_db_prep_saverì   r=   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).
        rÅ   rÇ   r   r   r   r\   ì  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`.
        Nrh   rÀ   )r›   rI   r=   r@   Úsupports_commentsr%   Údb_table_commentÚalter_db_table_commentr¢   r{   r£   r}   Ú_alter_column_comment_sqlrE   r€   Ú_model_indexes_sqlÚlocal_many_to_manyr8   ÚthroughÚauto_createdÚcreate_model)rC   r*   rN   rO   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.rw   N)r%   ró   r8   rô   rõ   Údelete_modelrI   Úsql_delete_tabler`   r‚   ÚlistrE   r�   r	   Úreferences_tableÚremove)rC   r*   r   rN   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©rO   )Úcontains_expressionsr=   r@   Úsupports_expression_indexesrI   r‹   ©rC   r*   Úindexr   r   r   Ú	add_index0  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ÿ   rI   Ú
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ý   )r=   r@   Úcan_rename_indexrI   Ú_rename_index_sqlr   r  r  )rC   r*   Ú	old_indexÚ	new_indexr   r   r   Úrename_indexD  s   

þz%BaseDatabaseSchemaEditor.rename_indexc                 C   s&   |  || ¡}|r| j|dd� dS dS )zAdd a constraint to a model.Nrý   )r‹   rI   ©rC   r*   rs   rN   r   r   r   Úadd_constraintN  s   ýz'BaseDatabaseSchemaEditor.add_constraintc                 C   s"   |  || ¡}|r|  |¡ dS dS )z!Remove a constraint from a model.N)r  rI   r
  r   r   r   Úremove_constraintV  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   ©rZ   ©r0   r•   r   r   r   Ú	<setcomp>b  ó    zABaseDatabaseSchemaEditor.alter_unique_together.<locals>.<setcomp>c                 S   r  r   r  r  r   r   r   r  c  r  TF)r³   r   c                    rb   r   rc   re   r)   r   r   rf   n  rg   zBBaseDatabaseSchemaEditor.alter_unique_together.<locals>.<listcomp>N)Ú
differenceÚ_delete_composed_indexÚsql_delete_uniquerI   rz   )rC   r*   Úold_unique_togetherÚ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  w  r  z@BaseDatabaseSchemaEditor.alter_index_together.<locals>.<setcomp>c                 S   r  r   r  r  r   r   r   r  x  r  TF)r  r³   c                    rb   r   rc   re   r)   r   r   rf   ƒ  rg   zABaseDatabaseSchemaEditor.alter_index_together.<locals>.<listcomp>Ú_idx)r•   ÚsuffixN)r  r  Úsql_delete_indexrI   Ú_create_index_sql)rC   r*   Úold_index_togetherÚnew_index_togetherr  r  r•   r”   r   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|¤Ž}| 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   rr   r   r   r   r  ‡  ó    ÿzBBaseDatabaseSchemaEditor._delete_composed_index.<locals>.<setcomp>c                 S   r!  r   r"  rr   r   r   r   r  Š  ó    c                    s   g | ]	}ˆ j  |¡j‘qS r   )r%   rd   r„   re   r)   r   r   rf   ‹  s    zCBaseDatabaseSchemaEditor._delete_composed_index.<locals>.<listcomp>Úexcluder³   TF©Úquoteé   z1Found wrong number (%s) of constraints for %s(%s)ru   r   )r%   rŠ   ÚindexesÚ_constraint_namesr    r=   r@   Ú*allows_multiple_constraints_on_same_fieldsrT   Ú_unique_constraint_namer‚   ÚlenÚ
ValueErrorr‘   rI   Ú_delete_constraint_sql)
rC   r*   r•   Úconstraint_kwargsrN   Úmeta_constraint_namesÚmeta_index_namesr�   Úconstraint_namesÚdefault_namer   r)   r   r  †  sB   ÿþýüÿþÿýÿÿ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ÚlowerrI   Úsql_rename_tabler`   rE   r�   r	   Úrename_table_references)rC   r*   Úold_db_tableÚnew_db_tablerN   r   r   r   Úalter_db_table¨  s"   ÿþÿÿ

€þz'BaseDatabaseSchemaEditor.alter_db_tablec                 C   sF   | j r| jjjr!|  | j |  |jj¡|  |pd¡dœ ¡ d S d S d S )NrR   )rw   Úcomment)	Úsql_alter_table_commentr=   r@   rî   rI   r`   r%   r‚   r\   )rC   r*   Úold_db_table_commentÚ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.)rw   Úold_tablespaceÚnew_tablespaceN)rI   Úsql_retablespace_tabler`   r%   r‚   )rC   r*   Úold_db_tablespaceÚnew_db_tablespacer   r   r   Úalter_db_tablespaceÅ  s   ýÿÿz,BaseDatabaseSchemaEditor.alter_db_tablespacec              
   C   sL  |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œ }|  ||p½d¡ | ¡ sí|  |¡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·   Nrh   rj   ri   rm   z%s.rR   )r   Ú	namespacer„   rk   rl   Ú
deferrable)rw   r„   rx   ©Údrop©rw   ÚchangesrÀ   )+r   r8   rô   r%   rõ   rö   r|   r   r=   r}   r~   r@   r†   r�   Úsql_create_column_inline_fkr*   r‚   rd   rƒ   r„   r   Ú_fk_constraint_namer`   r_   Údeferrable_sqlrE   rY   r‡   Úsql_create_columnrI   r¦   r©   rª   Ú_alter_column_default_sqlÚsql_alter_columnr£   rî   r¢   rñ   r€   Ú_field_indexes_sqlÚconnection_persists_old_columnsÚclose)rC   r*   r   rx   rO   r™   r˜   Úconstraint_suffixrk   rl   rH  Ú_rN   Ú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.
        rh   rÀ   NT©Úforeign_key)rw   r„   )r   r8   rô   r%   rõ   rø   r}   r=   r*  r„   rI   Ú_delete_fk_sqlÚsql_delete_columnr`   r‚   r@   rU  rV  rú   rE   r�   r	   Úreferences_columnrü   )rC   r*   r   Úfk_namesÚfk_namerN   r   r   r   Úremove_field(  s,   
þ



ÿ€üz%BaseDatabaseSchemaEditor.remove_fieldc              
   C   s®  |   ||¡sdS |j| jd�}|d }|j| jd�}|d }d}	|du r)|jdu s2|du r:|jdu r:t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 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 ƒ‚|j	|j	ks›|j	rž|j
|j
kržd}	n!|j	r¿z| | j¡}
W n ty´   d}	Y nw | | j¡}|
|k}	|	rÉtd|› d	�ƒ‚|  ||||||||¡ 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.
        Nrh   rÀ   FzqCannot 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)Tz7Modifying GeneratedFields is not supported - the field z6 must be removed and re-added with the new definition.)Ú_field_should_be_alteredr}   r=   r8   r.  rô   r%   rõ   Ú_alter_many_to_manyr°   rÙ   r¼   r   Ú_alter_field)rC   r*   r2   r5   ÚstrictÚold_db_paramsÚold_typeÚnew_db_paramsÚnew_typeÚmodifying_generated_fieldÚold_field_sqlÚnew_field_sqlr   r   r   Úalter_fieldH  sŠ   þÿþý
ü
ûþý
ü
û	þÿÿþ
ÿøz$BaseDatabaseSchemaEditor.alter_fieldc                 C   sD   | j j}| | j ¡}d|d< z	|| ¡  | W S  ty!   Y d S w )NÚ__column_name__r„   )r=   Údata_type_check_constraintsÚdb_type_parametersrˆ   ÚKeyError)rC   r   r¶   Úcheck_constraintsÚdatar   r   r   Ú_field_db_check›  s   ÿz(BaseDatabaseSchemaEditor._field_db_checkc	           2   	   C   sp  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|  ||¡}|  ||¡}||k�r^|�r^dd„ |jjD ƒ}| j||jgd|d�}|�rOt	|ƒdk�rOt
dt	|ƒ|jj|jf ƒ‚|D ]}|  |  ||¡¡ �qQ|j|jk�rŠ|  |   |jj|||¡¡ | j!D ]}t"|t#ƒ�rˆ| $|jj|j|j¡ �qug }g }g }|j%| jd�}|j%| jd�}||k�sº||k�sº||k�sº| jjj&�rÐ|j'|j'k�rÐ|  (||||||¡\} }!| )| ¡ | *|!¡ | +¡ �rì| +¡ �rá|j,|j,k�rë| )|  -|||¡¡ n| +¡ �rý| )| j-|||dd�¡ d	}"|j.�r2|j.�s2| +¡ �s2|  /|¡}#|  /|¡}$|  0|¡�s2|#|$k�r2|$du�r2d}"| )|  1|||¡¡ |j.|j.k�rH|  2|||¡} | �rH| )| ¡ | 3¡ �pP| +¡ �oY|j.�oY|j. }%|�s`|�rà|%�sg||7 }| jjj4�rƒ|�rƒt5t6|Ž ƒ\}}&d 7|¡t8|&g ƒfg}|D ]\}}&|  | j9|  :|jj¡|dœ |&¡ �q…|%�rà| +¡ �sªd}'|$g}&n|  ;|¡\}'}&|  | j<|  :|jj¡|  :|j¡|'dœ |&¡ |D ]\}}&|  | j9|  :|jj¡|dœ |&¡ �qÉ|�rñ|D ]\}}&|  ||&¡ �qå|j�rÿ|j�sÿ|  =||¡ |  >||¡�r|  |  ?||g¡¡ |j�r|j�r+|j�r+|j�s+|  | j@||gd�¡ g }(|�r8|( *t||ƒ¡ |  ||¡�rP|  |  A||¡¡ |( *t||ƒ¡ |(D ]V\})}|jjB| jd�}*|*d }+|* d¡},|)jjB| jd�}-|- d¡}.|  (|j|)j|j|+|.|,¡\} }!|  | j9|  :|jjj¡| d dœ | d ¡ |!D ]\}}&|  ||&¡ �q›�qR| jjj�rÌ|j�rÌ|	�s¾|j�r¾|j�sÌ|j�rÌ|  |  C||d¡¡ |�rè|(D ]\}/}0|0jj�ræ|  |  C|0j|0jd¡¡ �qÑ||k�r|�r| jD|jj|jgdd�}|  |  E|||d  ¡¡ |"�r)| j1|||dd�\}1}&| j9|  :|jj¡|1dœ }|  ||&¡ | jjjF�r6| j G¡  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"  rr   r   r   r   r  Ò  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"  )r0   r  r   r   r   r    r$  )r  Útype_r%  c                 S   r!  r   r"  rr   r   r   r   r    r#  )ri   r%  z6Found wrong number (%s) of check constraints for %s.%srh   rJ  Nru   rL  rÉ   )rw   r„   rê   ©r•   rÀ   r   rm   Ú_fkÚ_check©r  ri   )HÚsetr=   r@   r†   r8   r�   rc  r*  r„   r-  r.  r%   r‚   ÚaddrI   r]  r³   Ú_field_became_primary_keyrŠ   Ú_delete_unique_sqlr    r   r7   Úrelated_modelr   Údb_indexr)  r   r  Ú_delete_index_sqlru  Ú_delete_check_sqlÚ_rename_field_sqlrE   r�   r	   Úrename_column_referencesr   rî   r£   Ú_alter_column_type_sqlrY   r€   r¦   rÓ   Ú"_alter_column_database_default_sqlr¥   rª   r©   rR  Ú_alter_column_null_sqlrã   Úsupports_combined_altersrZ   r6   r‘   ÚsumrS  r`   r§   Úsql_update_with_defaultÚ_delete_primary_keyÚ_unique_should_be_addedrz   r  Ú_create_primary_key_sqlr}   r‡   Ú_create_index_nameÚ_create_check_sqlrU  rV  )2rC   r*   r2   r5   rh  rj  rg  ri  rf  Úfks_droppedr`  ra  r1  r3  Úconstraint_nameÚold_collationÚnew_collationÚdrop_foreign_keysÚ_old_relr;   Úrel_fk_namesr2  Úindex_namesÚ
index_nameÚold_db_checkÚnew_db_checkrN   ÚactionsÚnull_actionsÚpost_actionsÚold_type_suffixÚnew_type_suffixÚfragmentÚother_actionsÚneeds_database_defaultÚold_defaultÚnew_defaultÚfour_way_default_alterationrO   r¸   Úrels_to_updater:   Úrel_db_paramsÚrel_typeÚrel_collationÚold_rel_db_paramsÚold_rel_collationrX  ÚrelrY  r   r   r   re  ¦  sV  ÿþýýü

ÿýÿÿÿ
ÿÿûýÿÿ



ýúÿÿÿþýýûÿüýÿÿÿÿ
ÿ€


þÿ


ÿÿ€
ÿÿ

ÿ

ÿ
ÿþþÿú

ýÿùþÿúÿÿþý

úþÿúÿÿþüüüúÿ
ÿ€ÿÿ
ÿþÿ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.
        Nrh   rÀ   )r„   rÀ   )
r=   r@   r¯   r®   r}   r¥   Úsql_alter_column_nullÚsql_alter_column_not_nullr`   r„   )rC   r*   r2   r5   ri  rN   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.
        rh   rÀ   ©r„   rÀ   rê   )rª   r«   r=   r@   r¬   r­   r}   r¥   Ú sql_alter_column_no_default_nullÚsql_alter_column_no_defaultÚsql_alter_column_defaultr`   r„   )
rC   r*   r2   r5   rK  r¥  rê   rO   ri  rN   r   r   r   rR  3  s,   




ýÿùz2BaseDatabaseSchemaEditor._alter_column_default_sqlc           	      C   sV   |r
| j }d}g }n
| j}|  |¡\}}|j| jd�}||  |j¡|d |dœ |fS )zÊ
        Hook to specialize column database default alteration.

        Return a (sql, params) fragment to add or drop (depending on the drop
        argument) a default to new_field's column.
        rR   rh   rÀ   r°  )r²  r³  r§   r}   r=   r`   r„   )	rC   r*   r2   r5   rK  rN   r¸   rO   ri  r   r   r   r‡  Y  s   	
ýÿùz;BaseDatabaseSchemaEditor._alter_column_database_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 2-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.
        rj   rR   )r„   rÀ   rœ   r>  )r¡   r%   r‚   r=   r@   rî   r   r£   rñ   rY   r¤   Úsql_alter_column_typer`   r„   )rC   r*   r2   r5   rj  r“  r”  r¢  Úcollate_sqlÚcomment_sqlrN   rO   r   r   r   r†  u  s6   
ÿ
ÿ
üÿø
õz/BaseDatabaseSchemaEditor._alter_column_type_sqlc                 C   s.   | j |  |jj¡|  |j¡|  |¡dœ g fS )N)rw   r„   r>  )Úsql_alter_column_commentr`   r%   r‚   r„   r¤   )rC   r*   r5   rj  Únew_db_commentr   r   r   rñ   £  s   
ýÿùz2BaseDatabaseSchemaEditor._alter_column_comment_sqlc                 C   s   |   |pd¡S )NrR   rØ   )rC   r>  r   r   r   r¤   ®  ra   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)	r8   rô   r%   r‚   r=  rn  rd   Úm2m_reverse_field_nameÚm2m_field_name)rC   r*   r2   r5   rf  r   r   r   rd  ±  s,   

ÿ

ý
ÿ
ÿøüz,BaseDatabaseSchemaEditor._alter_many_to_manyrR   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_%srX  é   Né   r(  r   zD%séÿÿÿÿ)r   r   r=   r_   Úmax_name_lengthr‘   r-  Úisdigit)	rC   Ú
table_nameÚcolumn_namesr  rX  Úhash_suffix_partÚ
max_lengthr™  Úother_lengthr   r   r   r�  Ñ  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   rj   rR   )r-  r’   r   ÚDEFAULT_INDEX_TABLESPACEr%   r=   r_   r“   )rC   r*   r•   r’   r   r   r   Ú_get_index_tablespace_sqlñ  s   z2BaseDatabaseSchemaEditor._get_index_tablespace_sqlc                 C   s   |rd| S dS )Nz WHERE rR   r   )rC   Ú	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 )NrR   z INCLUDE (%(columns)s))r�   )r=   r@   Úsupports_covering_indexesr	   r   r%   r‚   r`   )rC   r*   r�   r   r   r   Ú_index_include_sql  s   þz+BaseDatabaseSchemaEditor._index_include_sql)r•   r   r  Úusingr’   Úcol_suffixesrN   Ú	opclassesrÊ  Ú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©Ú
alias_colsrh   )r’   c                 S   ó   g | ]}|j ‘qS r   ©r„   re   r   r   r   rf   '  r$  z>BaseDatabaseSchemaEditor._create_index_sql.<locals>.<listcomp>c                     s"   ˆ d u rˆj | i |¤Ž‰ ˆ ˆ ¡S r-   )r�  r`   ©ÚargsÚkwargs©r   rC   r   r   Úcreate_index_name+  s   
zEBaseDatabaseSchemaEditor._create_index_sql.<locals>.create_index_name)rw   r   rÎ  r�   rP   rÊ  rÑ  )r   rÑ   r=   rÉ  Úsql_create_indexr%   r‚   r	   r
   r`   r   Ú_index_columnsr   r\   rË  rÍ  )rC   r*   r•   r   r  rÎ  r’   rÏ  rN   rÐ  rÊ  rÑ  rÒ  rÕ   r“   r�   rÜ  rw   rÛ  r   rÚ  r   r  
  s0   ÿÿ

ÿ
ôz*BaseDatabaseSchemaEditor._create_index_sqlc                 C   sr   t |p| jt|jj| jƒ|  |¡d�}|jd j}|jd }t| j	ƒD ]}t
|t ƒr6| ||¡r6| j	 |¡ q#|S )N©rw   r   rw   r   )r	   r  r
   r%   r‚   r`   Úpartsrw   rú   rE   r�   Úreferences_indexrü   )rC   r*   r   rN   rv   rÃ  r™  r   r   r   r‚  @  s   ý
ÿ€z*BaseDatabaseSchemaEditor._delete_index_sqlc                 C   s*   t | jt|jj| jƒ|  |¡|  |¡d�S )N)rw   Úold_nameÚnew_name)r	   Úsql_rename_indexr
   r%   r‚   r`   )rC   r*   rá  râ  r   r   r   r  R  s   üz*BaseDatabaseSchemaEditor._rename_index_sqlc                 C   s   t ||| j|d�S )N)rÏ  )r   r`   )rC   rw   r�   rÏ  rÐ  r   r   r   rÝ  Z  s   z'BaseDatabaseSchemaEditor._index_columnsc                 C   st   |j jr|j js|j jrg S g }|j jD ]}| |  ||¡¡ q|j jD ]}|jr.| j	j
jr7| | || ¡¡ q$|S )zz
        Return a list of all index SQL statements (field indexes, Meta.indexes)
        for the specified model.
        )r%   ÚmanagedÚproxyÚswappedr{   r€   rT  r)  rþ   r=   r@   rÿ   rY   r‹   )rC   r*   Úoutputr   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.
        rx  )Ú_field_should_be_indexedrY   r  )rC   r*   r   rç  r   r   r   rT  p  s   z+BaseDatabaseSchemaEditor._field_indexes_sqlc                 C   s   |j s|j sdS |ptƒ }| ¡ \}}}}| ¡ \}}}	}
| |j¡D ]}| |d ¡ q#| |j¡D ]}|
 |d ¡ q2|js\|jr\|jr\|jjj	j
|jjj	j
kr\| dd ¡ |
 dd ¡ | d¡rz|
 d¡rz|  |¡|  |¡krz| d¡ |
 d¡ |  |j¡|  |j¡kp�|||f||	|
fkS )NFÚtorÓ   )Úconcreter|  ÚdeconstructÚunionÚnon_db_attrsÚpopr   r8   r*   r%   r‚   r    r§   r`   r„   )rC   r2   r5   rv  rX  Úold_pathÚold_argsÚ
old_kwargsÚnew_pathÚnew_argsÚ
new_kwargsÚattrr   r   r   rc  y  s@   
ÿþý

ÿÿþ

ÿþz1BaseDatabaseSchemaEditor._field_should_be_alteredc                 C   s   |j o|j S r-   )r�  r³   ©rC   r*   r   r   r   r   rè  ž  ra   z1BaseDatabaseSchemaEditor._field_should_be_indexedc                 C   s   |j  o|j S r-   ©r   ©rC   r2   r5   r   r   r   r~  ¡  ra   z2BaseDatabaseSchemaEditor._field_became_primary_keyc                 C   s   |j  o|jo|j p|j S r-   )r   r³   rø  r   r   r   r�  ¤  s
   ÿýz0BaseDatabaseSchemaEditor._unique_should_be_addedc                 C   s*   | j |  |¡|  |j¡|  |j¡|dœ S )N)rw   Ú
old_columnÚ
new_columnrÀ   )Úsql_rename_columnr`   r„   )rC   rw   r2   r5   rj  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)rw   r   r„   rk   rl   rI  )r
   r%   r‚   r`   rO  r   r„   Útarget_fieldr*   r=   r_   rP  r	   Úsql_create_fk)
rC   r*   r   r  rw   r   r„   rk   rl   rI  r   r   r   r‡   ³  s&   
ýùz'BaseDatabaseSchemaEditor._create_fk_sqlc                    s<   ‡ fdd„}t |jj|jgt|jjjjƒd |jjg||ƒS )Nc                     ó   ˆ   ˆ j| i |¤Ž¡S r-   ©r`   r�  r×  rH   r   r   Úcreate_fk_nameÉ  ó   zDBaseDatabaseSchemaEditor._fk_constraint_name.<locals>.create_fk_namer(  )r   r%   r‚   r„   r   rü  r*   )rC   r*   r   r  r   r   rH   r   rO  È  s   úz,BaseDatabaseSchemaEditor._fk_constraint_namec                 C   ó   |   | j||¡S r-   )r/  Úsql_delete_fk©rC   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 )NrR   z DEFERRABLE INITIALLY DEFERREDz DEFERRABLE INITIALLY IMMEDIATE)r   ÚDEFERREDÚ	IMMEDIATE)rC   rI  r   r   r   Ú_deferrable_constraint_sqlØ  s   

ÿz3BaseDatabaseSchemaEditor._deferrable_constraint_sqlc                 C   s   |du rdS |du rdS dS )NFz NULLS NOT DISTINCTTz NULLS DISTINCTrR   r   )rC   Únulls_distinctr   r   r   Ú _unique_index_nulls_distinct_sqlà  s
   z9BaseDatabaseSchemaEditor._unique_index_nulls_distinct_sqlc                 C   sR   | s| j jjo(| p| j jjo(| p| j jjo(| p| j jjo(|d u p(| j jjS r-   )r=   r@   Úsupports_partial_indexesÚ&supports_deferrable_unique_constraintsrÌ  rÿ   Ú*supports_nulls_distinct_unique_constraints)rC   rÊ  rI  rÑ  rÒ  r	  r   r   r   Ú_unique_supportedç  s   	ýûù
ôz*BaseDatabaseSchemaEditor._unique_supportedc
              
      sž   ˆ j |||||	d�sd S |s|s|s|s|	d ur/ˆ j||||||||	d�}
|
r-ˆ j |
¡ d S ˆ jd ‡ fdd„|D ƒ¡ˆ  |¡dœ }ˆ jˆ  |¡|dœ S )N©rÊ  rI  rÑ  rÒ  r	  )r   rÊ  rÑ  rÐ  rÒ  r	  ru   c                    s   g | ]}ˆ   |j¡‘qS r   )r`   r„   re   rH   r   r   rf   +  rg   z8BaseDatabaseSchemaEditor._unique_sql.<locals>.<listcomp>)r�   rI  ©r   rs   )	r  rz   rE   rY   Úsql_unique_constraintr‘   r  Úsql_constraintr`   )rC   r*   r•   r   rÊ  rI  rÑ  rÐ  rÒ  r	  rN   rs   r   rH   r   Ú_unique_sqlÿ  sL   ûÿþýüø
þþz$BaseDatabaseSchemaEditor._unique_sqlc
                 C   sè   | j |||||	d�sd S t|dd�j| jd�}
|jj}dd„ |D ƒ}|d u r/| j||dd�}n|  |¡}|s<|s<|s<|r@| j}n| j	}|rO| j
||d	|d
�}nt|||
| jƒ}t|t|| jƒ|||  |¡|  |¡|  ||¡|  |	¡d�S )Nr  FrÓ  rh   c                 S   rÕ  r   rÖ  re   r   r   r   rf   L  r$  z?BaseDatabaseSchemaEditor._create_unique_sql.<locals>.<listcomp>Tr&  r   )rÏ  rÐ  )rw   r   r�   rÊ  rI  rÑ  r	  )r  r   rÑ   r=   r%   r‚   r,  r`   Úsql_create_unique_indexÚsql_create_uniquerÝ  r   r\   r	   r
   rË  r  rÍ  r
  )rC   r*   r•   r   rÊ  rI  rÑ  rÐ  rÒ  r	  rÕ   rw   r�   rN   r   r   r   rz   3  sD   ûÿ
ÿ

øz+BaseDatabaseSchemaEditor._create_unique_sqlc                    s&   |r	‡ fdd„}nˆ j }t||d|ƒS )Nc                     rþ  r-   rÿ  r×  rH   r   r   Úcreate_unique_namei  r  zLBaseDatabaseSchemaEditor._unique_constraint_name.<locals>.create_unique_nameÚ_uniq)r�  r   )rC   rw   r�   r'  r  r   rH   r   r,  f  s   z0BaseDatabaseSchemaEditor._unique_constraint_namec	           
      C   sD   | j |||||d�sd S |s|s|s|r| j}	n| j}	|  |	||¡S )Nr  )r  r  r  r/  )
rC   r*   r   rÊ  rI  rÑ  rÐ  rÒ  r	  rN   r   r   r   r  q  s   ûz+BaseDatabaseSchemaEditor._delete_unique_sqlc                 C   s    | j |  |¡| jd|i dœ S )Nri   r  )r  r`   r~   )rC   r   ri   r   r   r   Ú
_check_sqlŠ  s   þz#BaseDatabaseSchemaEditor._check_sqlc                 C   s2   | j jjsd S t| jt|jj| jƒ|  |¡|d�S )N)rw   r   ri   )	r=   r@   Ú supports_table_check_constraintsr	   Úsql_create_checkr
   r%   r‚   r`   )rC   r*   r   ri   r   r   r   r�  �  s   
üz*BaseDatabaseSchemaEditor._create_check_sqlc                 C   s   | j jjsd S |  | j||¡S r-   )r=   r@   r  r/  Úsql_delete_checkr  r   r   r   rƒ  š  s   
z*BaseDatabaseSchemaEditor._delete_check_sqlc                 C   s    t |t|jj| jƒ|  |¡d�S )NrÞ  )r	   r
   r%   r‚   r`   )rC   Ú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   )r=   r@   Útruncates_namesÚintrospectionÚidentifier_converterr   r_   rÁ  )r0   r   rH   r   r   rf   ´  s    ý
ýÿúz>BaseDatabaseSchemaEditor._constraint_names.<locals>.<listcomp>r�   r³   r   r  ri   r\  rÀ   )r=   r]   r  Úget_constraintsr%   r‚   ÚitemsrY   )rC   r*   rÄ  r³   r   r  r\  ri   rw  r%  r]   rŠ   Úresultr   Úinfodictr   rH   r   r*  ¦  s8   
ø
ÿÿ
€z*BaseDatabaseSchemaEditor._constraint_namesc                    s"   ˆ j dd ‡ fdd„|D ƒ¡i S )Nr�   ru   c                 3   rË   r-   ©r`   )r0   r„   rH   r   r   r3   ×  rÎ   z>BaseDatabaseSchemaEditor._pk_constraint_sql.<locals>.<genexpr>)Úsql_pk_constraintr‘   )rC   r�   r   rH   r   rŽ   Õ  s   ÿz+BaseDatabaseSchemaEditor._pk_constraint_sqlc                 C   sV   | j |dd�}|rt|ƒdkrtdt|ƒ|jjf ƒ‚|D ]}|  |  ||¡¡ qd S )NTr÷  r(  z0Found wrong number (%s) of PK constraints for %s)r*  r-  r.  r%   r‚   rI   Ú_delete_primary_key_sql)rC   r*   rf  r3  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 )NÚ_pkr{  )rw   r   r�   )	r	   Úsql_create_pkr
   r%   r‚   r`   r�  r„   r   rö  r   r   r   rŽ  ç  s   ÿÿøz0BaseDatabaseSchemaEditor._create_primary_key_sqlc                 C   r  r-   )r/  Úsql_delete_pkr  r   r   r   r&  ó  r  z0BaseDatabaseSchemaEditor._delete_primary_key_sqlc                 C   s   |r	d|   |¡ S dS )NzCOLLATE rR   r$  )rC   rœ   r“  rÃ  r   r   r   r¡   ö  r  z%BaseDatabaseSchemaEditor._collate_sqlc                 C   s*   | j |  |¡d |¡dœ }|  |¡ d S )Nú,)Ú	procedureÚparam_types)Úsql_delete_procedurer`   r‘   rI   )rC   Úprocedure_namer,  rN   r   r   r   Úremove_procedureù  s
   þz)BaseDatabaseSchemaEditor.remove_procedure)FT)r   )F)rR   r-   )NNNNN)NNNNNN)NNNNNNN)T)NNNNNNNNrÁ   )xÚ__name__Ú
__module__Ú__qualname__Ú__doc__r�   r9  rD  rù   rQ  rS  r´  r®  r¯  r³  r²  r±  r^  rû  r‹  r  r~   Úsql_delete_constraintr  r%  r  r  r  r  rý  r…   rN  r  rÜ  r  rã  r  r(  r)  r-  r?  r·  rD   rG   rJ   rI   r`   r›   r¿   r|   r¨   r©   r­   r«   r§   r±   Ústaticmethodrì   rª   r\   rö   rø   r  r  r	  r  r  r  r   r  r=  rð   rG  rZ  rb  rn  ru  re  rˆ  rR  r‡  r†  rñ   r¤   rd  r�  rÉ  rË  rÍ  r  r‚  r  rÝ  rò   rT  rc  rè  r~  r�  r„  r‡   rO  r]  r  r
  r  r  rz   r,  r  r  r�  rƒ  r/  r*  rŽ   rŒ  rŽ  r&  r¡   r/  r   r   r   r   r<   M   sX   ÿÿÿÿÿÿÿ
	
	e
C		
#	
"
X
 S
÷  r
'
ÿ.
 
 ò
6
	%	
ú
ö8
ö
3
÷


ö/

r<   )$Úloggingr'   r   Údjango.confr   Údjango.core.exceptionsr   Ú!django.db.backends.ddl_referencesr   r   r   r   r	   r
   Údjango.db.backends.utilsr   r   r   Údjango.db.modelsr   r   Ú!django.db.models.fields.compositer   Údjango.db.models.sqlr   Údjango.db.transactionr   r   Údjango.utilsr   Ú	getLoggerrU   r   r+   r7   r<   r   r   r   r   Ú<module>   s"     
