U
    e%                     @   s@   d dl mZ d dlmZmZmZ d dlmZ G dd deZdS )    )BaseDatabaseSchemaEditor)NOT_PROVIDEDFUniqueConstraint)
LOOKUP_SEPc                       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edd Ze fddZdd Zdd Zdd Zdd Zedd Z fdd Z fd!d"Z fd#d$Z fd%d&Z fd'd(Zdd)d*d+Z  fd,d-Z!d.d/ Z" fd0d1Z# fd2d3Z$d4d5 Z% fd6d7Z&  Z'S )8DatabaseSchemaEditorz+RENAME TABLE %(old_table)s TO %(new_table)szMODIFY %(column)s %(type)s NULLz#MODIFY %(column)s %(type)s NOT NULLz2MODIFY %(column)s %(type)s%(collation)s%(comment)sz(ALTER COLUMN %(column)s SET DEFAULT NULLz,ALTER TABLE %(table)s DROP COLUMN %(column)sz)ALTER TABLE %(table)s DROP INDEX %(name)szY, ADD CONSTRAINT %(name)s FOREIGN KEY (%(column)s) REFERENCES %(to_table)s(%(to_column)s)z/ALTER TABLE %(table)s DROP FOREIGN KEY %(name)sz DROP INDEX %(name)s ON %(table)sz?ALTER TABLE %(table)s RENAME INDEX %(old_name)s TO %(new_name)szGALTER TABLE %(table)s ADD CONSTRAINT %(name)s PRIMARY KEY (%(columns)s)z&ALTER TABLE %(table)s DROP PRIMARY KEYz9CREATE INDEX %(name)s ON %(table)s (%(columns)s)%(extra)sz+ALTER TABLE %(table)s COMMENT = %(comment)sNc                 C   s   | j jrdS dS )Nz8ALTER TABLE %(table)s DROP CONSTRAINT IF EXISTS %(name)sz)ALTER TABLE %(table)s DROP CHECK %(name)s)
connectionmysql_is_mariadbself r   C/tmp/pip-unpacked-wheel-lctamlir/django/db/backends/mysql/schema.pysql_delete_check%   s    z%DatabaseSchemaEditor.sql_delete_checkc                    s6   | j jr| j jdkr2t jS n| j jdkr2t jS dS )N)
         )   r      zCALTER TABLE %(table)s CHANGE %(old_column)s %(new_column)s %(type)s)r   r	   mysql_versionsupersql_rename_columnr
   	__class__r   r   r   .   s    
z&DatabaseSchemaEditor.sql_rename_columnc                 C   sV   | j   t|tr |dd}| j j || j j j}t|trRt|trR| }|S )N%z%%)	r   Zensure_connection
isinstancestrreplaceescapeencodersbytesdecode)r   valuequotedr   r   r   quote_value9   s    

 z DatabaseSchemaEditor.quote_valuec                 C   s$   | | j}|d k	o"| | jjkS N)db_typer   lowerZ_limited_data_types)r   fieldr%   r   r   r   _is_limited_data_typeE   s    z*DatabaseSchemaEditor._is_limited_data_typec                 C   s   | j s| |S dS )NF)$_supports_limited_data_type_defaultsr(   r   r'   r   r   r   skip_defaultL   s    
z!DatabaseSchemaEditor.skip_defaultc                 C   s   |  |r| jjsdS dS )NTF)r(   r   r	   r*   r   r   r   skip_default_on_alterQ   s    z*DatabaseSchemaEditor.skip_default_on_alterc                 C   s   | j jrdS | j jdkS )NT)r   r      )r   r	   r   r
   r   r   r   r)   X   s    z9DatabaseSchemaEditor._supports_limited_data_type_defaultsc                    s(   | j js| jr| |rdS t |S )Nz(%s))r   r	   r)   r(   r   _column_default_sqlr*   r   r   r   r.   _   s    z(DatabaseSchemaEditor._column_default_sqlc                    s^   t  || | |rZ|jd tfkrZ| |}| d| |jj	| |j
d |g d S )Nz%UPDATE %(table)s SET %(column)s = %%s)tablecolumn)r   	add_fieldr+   defaultr   effective_defaultexecuteZ
quote_name_metadb_tabler0   )r   modelr'   r3   r   r   r   r1   j   s    

zDatabaseSchemaEditor.add_fieldc                    s@   t |tr.||| d k	r.| j||j|jd t || d S )Nfieldsexpressions)r   r   Z
create_sql_create_missing_fk_indexr9   r:   r   remove_constraint)r   r7   
constraintr   r   r   r<   z   s    z&DatabaseSchemaEditor.remove_constraintc                    s0   | j |dd |jD |jd t || d S )Nc                 S   s   g | ]\}}|qS r   r   ).0
field_name_r   r   r   
<listcomp>   s     z5DatabaseSchemaEditor.remove_index.<locals>.<listcomp>r8   )r;   Zfields_ordersr:   r   remove_index)r   r7   indexr   r   r   rB      s    z!DatabaseSchemaEditor.remove_indexc                    sV   t  ||sdS | jj| j |jj}|dkrJ| dkrJ|j	rJdS | 
| S )NFZInnoDB
ForeignKey)r   _field_should_be_indexedr   introspectionZget_storage_enginecursorr5   r6   get_internal_typeZdb_constraintr(   )r   r7   r'   Zstorager   r   r   rE      s     
z-DatabaseSchemaEditor._field_should_be_indexed)r:   c             	      s   d}|r|d }n4|rF| j jjrFt|d trFt|d jkrF|d j}|sNdS |j|}|	 dkr| j j
|j | j  ,} fdd| j j
||jj D }W 5 Q R X t|dkr| | j||gdd dS )	a  
        MySQL can remove an implicit FK index on a field when that field is
        covered by another index like a unique_together. "covered" here means
        that the more complex index has the FK field as its first field (see
        https://bugs.mysql.com/bug.php?id=37910).

        Manually create an implicit FK index to make it possible to remove the
        composed index.
        Nr   rD   c                    s,   g | ]$\}}|d  r|d d  kr|qS )rC   columnsr   r   )r>   nameZinfodictr0   r   r   rA      s    zADatabaseSchemaEditor._create_missing_fk_index.<locals>.<listcomp>    )r9   suffix)r   featuresZsupports_expression_indexesr   r   r   rJ   r5   	get_fieldrH   rF   Zidentifier_converterr0   rG   Zget_constraintsr6   itemslenr4   Z_create_index_sql)r   r7   r9   r:   Zfirst_field_nameZfirst_fieldrG   Zconstraint_namesr   rK   r   r;      s<    


 	z-DatabaseSchemaEditor._create_missing_fk_indexc                    s"   | j ||d t j||f| S )N)r9   )r;   r   _delete_composed_index)r   r7   r9   argsr   r   r   rS      s    z+DatabaseSchemaEditor._delete_composed_indexc                 C   s   |j r|d7 }n|d7 }|S )zt
        Keep the null property of the old field. If it has changed, it will be
        handled separately.
        z NULLz	 NOT NULL)null)r   r'   new_typer   r   r   _set_field_new_type_null_status   s    
z4DatabaseSchemaEditor._set_field_new_type_null_statusc                    s"   |  ||}t ||||||S r$   )rW   r   _alter_column_type_sql)r   r7   	old_field	new_fieldrV   Zold_collationZnew_collationr   r   r   rX      s         z+DatabaseSchemaEditor._alter_column_type_sqlc                    s   |  ||}t ||||S r$   )rW   r   _rename_field_sql)r   r/   rY   rZ   rV   r   r   r   r[      s    z&DatabaseSchemaEditor._rename_field_sqlc                 C   s   dg fS )NrM   r   )r   r7   rZ   rV   Znew_db_commentr   r   r   _alter_column_comment_sql   s    z.DatabaseSchemaEditor._alter_column_comment_sqlc                    s   t  |}d| S )Nz	 COMMENT )r   _comment_sql)r   commentZcomment_sqlr   r   r   r]      s    z!DatabaseSchemaEditor._comment_sql)(__name__
__module____qualname__Zsql_rename_tableZsql_alter_column_nullZsql_alter_column_not_nullZsql_alter_column_typeZ sql_alter_column_no_default_nullZsql_delete_columnZsql_delete_uniqueZsql_create_column_inline_fkZsql_delete_fkZsql_delete_indexZsql_rename_indexZsql_create_pkZsql_delete_pkZsql_create_indexZsql_alter_table_commentZsql_alter_column_commentpropertyr   r   r#   r(   r+   r,   r)   r.   r1   r<   rB   rE   r;   rS   rW   rX   r[   r\   r]   __classcell__r   r   r   r   r      sR   


2r   N)	Zdjango.db.backends.base.schemar   Zdjango.db.modelsr   r   r   Zdjango.db.models.constantsr   r   r   r   r   r   <module>   s   