
v^b                 @   s:   d  d l  m Z d  d l m Z Gd 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 e 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   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,ALTER TABLE %(table)s DROP COLUMN %(column)szCALTER TABLE %(table)s CHANGE %(old_column)s %(new_column)s %(type)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)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 Sd 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   A/tmp/pip-build-8lau8j11/django/django/db/backends/mysql/schema.pysql_delete_check    s    z%DatabaseSchemaEditor.sql_delete_checkc             C   s}   |  j  j   t | t  r. | j d d  } |  j  j  j | |  j  j  j  } t | t  ry t | t  ry | j   } | S)N%z%%)	r   Zensure_connection
isinstancestrreplaceescapeencodersbytesdecode)r   valuequotedr   r   r	   quote_value)   s    !z DatabaseSchemaEditor.quote_valuec             C   s4   | j  |  j  } | d  k	 o3 | j   |  j j k S)N)db_typer   lowerZ_limited_data_types)r   fieldr   r   r   r	   _is_limited_data_type3   s    z*DatabaseSchemaEditor._is_limited_data_typec             C   s   |  j  s |  j |  Sd S)NF)$_supports_limited_data_type_defaultsr   )r   r   r   r   r	   skip_default7   s    	z!DatabaseSchemaEditor.skip_defaultc             C   s,   |  j  j r |  j  j d k S|  j  j d k S)	N
            r      )r   r   r   )r   r   r    )r   r   Zmysql_version)r   r   r   r	   r   <   s    z9DatabaseSchemaEditor._supports_limited_data_type_defaultsc                s9   |  j  j r) |  j r) |  j |  r) d St   j |  S)Nz(%s))r   r   r   r   super_column_default_sql)r   r   )	__class__r   r	   r"   D   s
    	z(DatabaseSchemaEditor._column_default_sqlc                s   t    j | |  |  j |  r | j d  t f k r |  j |  } |  j d d |  j | j j	  d |  j | j
  i | 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   r(   )r#   r   r	   r&   O   s    $	zDatabaseSchemaEditor.add_fieldc                s   t    j | |  } |  j j j |  j j   | j j  } | d k rm | rm | j   d k rm | j	 rm d S|  j
 |  o | S)NZInnoDB
ForeignKeyF)r!   _field_should_be_indexedr   ZintrospectionZget_storage_enginecursorr*   r+   get_internal_typeZdb_constraintr   )r   r,   r   Zcreate_indexZstorage)r#   r   r	   r.   [   s    	z-DatabaseSchemaEditor._field_should_be_indexedc                s   | j  j | d  } | j   d k rn |  j | | j g d d } | sn |  j |  j | | g d d  t   j | | |  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.
        http://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   r-   indexTsuffix )	r*   	get_fieldr0   Z_constraint_namesr%   r)   Z_create_index_sqlr!   _delete_composed_index)r   r,   fieldsargsZfirst_fieldZconstraint_names)r#   r   r	   r5   j   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_statusz   s    	
z4DatabaseSchemaEditor._set_field_new_type_null_statusc                s+   |  j  | |  } t   j | | | |  S)N)r:   r!   _alter_column_type_sql)r   r,   	old_field	new_fieldr9   )r#   r   r	   r;      s    z+DatabaseSchemaEditor._alter_column_type_sqlc                s+   |  j  | |  } t   j | | | |  S)N)r:   r!   _rename_field_sql)r   r$   r<   r=   r9   )r#   r   r	   r>      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_delete_columnZsql_rename_columnZsql_delete_uniqueZsql_create_column_inline_fkZsql_delete_fkZsql_delete_indexZsql_create_pkZsql_delete_pkZsql_create_indexpropertyr
   r   r   r   r   r"   r&   r.   r5   r:   r;   r>   r   r   )r#   r	   r      s2   	
r   N)Zdjango.db.backends.base.schemar   Zdjango.db.modelsr   r   r   r   r   r	   <module>   s   