U
    d                     @   s,   d dl mZ d dlmZ G dd deZdS )    )BaseDatabaseSchemaEditor)NOT_PROVIDEDc                       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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d&d' Z fd(d)Z fd*d+Z   Z!S ),DatabaseSchemaEditorz+RENAME TABLE %(old_table)s TO %(new_table)szMODIFY %(column)s %(type)s NULLz#MODIFY %(column)s %(type)s NOT NULLzMODIFY %(column)s %(type)sz'MODIFY %(column)s %(type)s%(collation)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)sc                 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-7vj2equ7/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_value7   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_typeC   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_defaultJ   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_alterO   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&   V   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_tabler-   )r   modelr$   r0   r   r	   r
   r.   h   s    

zDatabaseSchemaEditor.add_fieldc                    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   ZintrospectionZget_storage_enginecursorr2   r3   get_internal_typeZdb_constraintr%   )r   r4   r$   Zstorager   r	   r
   r6   x   s     
z-DatabaseSchemaEditor._field_should_be_indexedc                    s`   |j |d }| dkrL| j||jgdd}|sL| | j||gdd t j||f| 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 starts like the simpler one.
        https://bugs.mysql.com/bug.php?id=37910 / Django ticket #24757
        We check here before removing the [unique|index]_together if we have to
        recreate a FK index.
        r   r5   T)index )fieldssuffix)	r2   	get_fieldr8   Z_constraint_namesr-   r1   Z_create_index_sqlr   _delete_composed_index)r   r4   r;   argsZfirst_fieldZconstraint_namesr   r	   r
   r>      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!   )rB   r   _alter_column_type_sql)r   r4   	old_field	new_fieldrA   r   r	   r
   rC      s    z+DatabaseSchemaEditor._alter_column_type_sqlc                    s   |  ||}t ||||S r!   )rB   r   _rename_field_sql)r   r,   rD   rE   rA   r   r	   r
   rF      s    z&DatabaseSchemaEditor._rename_field_sql)"__name__
__module____qualname__Zsql_rename_tableZsql_alter_column_nullZsql_alter_column_not_nullZsql_alter_column_typeZsql_alter_column_collateZ 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_indexpropertyr   r   r    r%   r(   r)   r&   r+   r.   r6   r>   rB   rC   rF   __classcell__r	   r	   r   r
   r      sD   


r   N)Zdjango.db.backends.base.schemar   Zdjango.db.modelsr   r   r	   r	   r	   r
   <module>   s   