o
    [h+                     @   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                       sB  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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"d0d1 Z# fd2d3Z$ fd4d5Z% fd6d7Z&d8d9 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 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   /home/ubuntu/experiments/live_experiments/Pythonexperiments/Otree/venv/lib/python3.10/site-packages/django/db/backends/mysql/schema.pysql_delete_check%   s   z%DatabaseSchemaEditor.sql_delete_checkc                    s$   | j j}|r| j jdk rdS t jS )N
         zCALTER TABLE %(table)s CHANGE %(old_column)s %(new_column)s %(type)s)r   r	   mysql_versionsupersql_rename_column)r   Z
is_mariadb	__class__r   r   r   .   s   z&DatabaseSchemaEditor.sql_rename_columnc                 C   s@   | j   | j j || j j j}t|trt|tr| }|S N)r   Zensure_connectionescapeencoders
isinstancestrbytesdecode)r   valuequotedr   r   r   quote_value7   s   

z DatabaseSchemaEditor.quote_valuec                 C   s$   | | j}|d uo| | jjv S r   )db_typer   lowerZ_limited_data_typesr   fieldr"   r   r   r   _is_limited_data_typeA   s   z*DatabaseSchemaEditor._is_limited_data_typec                 C   s   | | j}|o| dS )N)Zblobtext)r"   r   r#   endswithr$   r   r   r   _is_text_or_blobH      z%DatabaseSchemaEditor._is_text_or_blobc                 C   s4   |  |dv }|r| |rdS | js| |S dS N)     TF)effective_defaultr)   $_supports_limited_data_type_defaultsr&   r   r%   Zdefault_is_emptyr   r   r   skip_defaultL   s   
z!DatabaseSchemaEditor.skip_defaultc                 C   s:   |  |dv }|r| |rdS | |r| jjsdS dS r+   )r.   r)   r&   r   r	   r0   r   r   r   skip_default_on_alterT   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/   ^   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_sql)r   r%   r   r   r   r5   e   s   z(DatabaseSchemaEditor._column_default_sqlc                    sf   t  || | |r/|jd tfvr1| |}| d| |jj	| |j
d |g d S d S d S )Nz%UPDATE %(table)s SET %(column)s = %%s)tablecolumn)r   	add_fieldr1   defaultr   r.   execute
quote_name_metadb_tabler7   )r   modelr%   r.   r   r   r   r8   p   s   

zDatabaseSchemaEditor.add_fieldc                    s@   t |tr||| d ur| j||j|jd t || d S )Nfieldsexpressions)r   r   Z
create_sql_create_missing_fk_indexr@   rA   r   remove_constraint)r   r>   
constraintr   r   r   rC      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>r?   )rB   Zfields_ordersrA   r   remove_index)r   r>   indexr   r   r   rI      s   z!DatabaseSchemaEditor.remove_indexc                    sV   t  ||s	dS | jj| j |jj}|dkr%| dkr%|j	r%dS | 
| S )NFZInnoDB
ForeignKey)r   _field_should_be_indexedr   introspectionZget_storage_enginecursorr<   r=   get_internal_typeZdb_constraintr&   )r   r>   r%   Zstorager   r   r   rL      s   z-DatabaseSchemaEditor._field_should_be_indexed)rA   c                   s   d}|r	|d }n|r#| j jjr#t|d tr#t|d jvr#|d j}|s'dS |j|}|	 dkrw| j j
|j | j  } fdd| j j
||jj D }W d   n1 s^w   Y  t|dkry| | j||gdd dS dS 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   rK   c                    s,   g | ]\}}|d  r|d d  kr|qS )rJ   columnsr   r   )rE   nameZinfodictr7   r   r   rH      s    zADatabaseSchemaEditor._create_missing_fk_index.<locals>.<listcomp>   r,   )r@   suffix)r   featuresZsupports_expression_indexesr   r   r   rQ   r<   	get_fieldrO   rM   Zidentifier_converterr7   rN   Zget_constraintsr=   itemslenr:   Z_create_index_sql)r   r>   r@   rA   Zfirst_field_nameZfirst_fieldrN   Zconstraint_namesr   rR   r   rB      s@   



z-DatabaseSchemaEditor._create_missing_fk_indexc                    s$   | j ||d t j||g|R  S )N)r@   )rB   r   _delete_composed_index)r   r>   r@   argsr   r   r   rY      s   z+DatabaseSchemaEditor._delete_composed_indexc                    s\   |  r |\}}|t fdd|D ; }|d| 7 }|jr(|d7 }|S |d7 }|S )z
        Keep the NULL and DEFAULT properties of the old field. If it has
        changed, it will be handled separately.
        c                 3   s    | ]}  |V  qd S r   )r!   )rE   pr
   r   r   	<genexpr>   s    z;DatabaseSchemaEditor._set_field_new_type.<locals>.<genexpr>z	 DEFAULT z NULLz	 NOT NULL)has_db_defaultZdb_default_sqltuplenull)r   r%   new_typeZdefault_sqlparamsr   r
   r   _set_field_new_type   s   z(DatabaseSchemaEditor._set_field_new_typec                    s"   |  ||}t ||||||S r   )rb   r   _alter_column_type_sql)r   r>   	old_field	new_fieldr`   Zold_collationZnew_collationr   r   r   rc      s   z+DatabaseSchemaEditor._alter_column_type_sqlc                    s*   | j jr| j jdkrt ||S |d S )Nr   check)r   r	   r   r   _field_db_check)r   r%   Zfield_db_paramsr   r   r   rg      s   z$DatabaseSchemaEditor._field_db_checkc                    s   |  ||}t ||||S r   )rb   r   _rename_field_sql)r   r6   rd   re   r`   r   r   r   rh      r*   z&DatabaseSchemaEditor._rename_field_sqlc                 C   s   dg fS )Nr,   r   )r   r>   re   r`   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   rj     s   
z!DatabaseSchemaEditor._comment_sqlc                    sP   |  st |||S |j| jd}| ||d }d| |j|d g fS )N)r   typezMODIFY %(column)s %(type)s)r7   rl   )r]   r   _alter_column_null_sqlZdb_parametersr   rb   r;   r7   )r   r>   rd   re   Znew_db_paramsZtype_sqlr   r   r   rm     s   
z+DatabaseSchemaEditor._alter_column_null_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)   r1   r2   r/   r5   r8   rC   rI   rL   rB   rY   rb   rc   rg   rh   ri   rj   rm   __classcell__r   r   r   r   r      sZ    



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    