U
    Y]hC                     @  sr  d dl m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 d dlm	Z	 d dlm
Z d	d
lmZ d	dlmZ d	dlmZ d	dlmZ d	dlmZ d	dlmZ d	dlmZ d	dlmZ d	dlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ erRd dlmZ d dlm Z  d dl!m"Z" d dl#m$Z$ d dl%m&Z& d	dlm'Z' G dd  d eZ(G d!d" d"e(Z)G d#d$ d$eZ*G d%d& d&eZ+G d'd( d(e+Z,eed)d*eed)d*eed)d*eed)d*d+d, Z-ee*d)d*d$d-d.d/d0d1Z.ee,d)d*d(d-d.d/d2d3Z/ee+d)d*d&d-d.d/d4d5Z0d-d6d7d8d6d9d.d:d;d<Z1ee	j"d)d*d=d-d.d/d>d?Z2dS )@    )annotationsN)Any)Optional)TYPE_CHECKING)Unionschema)types   )alter_table)AlterColumn)ColumnDefault)
ColumnName)ColumnNullable)
ColumnType)format_column_name)format_server_default)DefaultImpl   )util)sqla_compat)_is_mariadb)_is_type_bound)compiles)Literal)MySQLDDLCompiler)DropConstraint)
Constraint)
TypeEngine)_ServerDefaultc                      s   e Zd ZdZdZejddhddhf ZddgZd$d
d
ddddddddddddddd fddZddd fddZ	ddddddZ
dd Zd d! Zd"d# Z  ZS )%	MySQLImplmysqlFZBOOLZTINYINTZJSONZLONGTEXTzcharacter set ([\w\-_]+)zcollate ([\w\-_]+)NstrOptional[bool]z%Union[_ServerDefault, Literal[False]]Optional[str]Optional[TypeEngine]zOptional[_ServerDefault]$Optional[Union[str, Literal[False]]]r   None)
table_namecolumn_namenullableserver_defaultnametype_r   existing_typeexisting_server_defaultexisting_nullableautoincrementexisting_autoincrementcommentexisting_commentkwreturnc                   s  t ||	st ||	r>t j||f|||||
||	d| |d k	s^| |d k	rV|n||r| t||||d k	rv|n||d k	r|n|
d k	r|
nd|d k	r|n||dk	r|n|	|d k	r|n||dk	r|n|d	 n|d k	s|d k	s|d k	s|dk	rz| t||||d k	r|n||d k	r |n|
d k	r.|
nd|d k	r>|n||dk	rN|n|	|d k	r^|n||dk	rn|n|d	 n |dk	r| t	||||d d S )N)r*   r-   r   r.   r0   r+   r/   TF)r   newnamer*   r-   defaultr1   r3   r   )
r   Z_server_default_is_identityZ_server_default_is_computedsuperalter_column$_is_mysql_allowed_functional_default_execMySQLChangeColumnMySQLModifyColumnMySQLAlterDefault)selfr(   r)   r*   r+   r,   r-   r   r.   r/   r0   r1   r2   r3   r4   r5   	__class__ 5/tmp/pip-unpacked-wheel-u4jwnyja/alembic/ddl/mysql.pyr:   3   s      
  
   zMySQLImpl.alter_columnr   )constr6   c                   s(   t |tjrt|rd S t | d S N)
isinstancer   CheckConstraintr   r9   drop_constraint)r@   rE   rA   rC   rD   rI      s    zMySQLImpl.drop_constraintbool)r-   r+   r6   c                 C  s   |d k	o|j tjko|d k	S rF   )_type_affinitysqltypesDateTime)r@   r-   r+   rC   rC   rD   r;      s
    
z.MySQLImpl._is_mysql_allowed_functional_defaultc                 C  s"  |j jtjkr*|jr*|js*|s*|dkr*dS |r^|j jtjkr^|d k	rRtdd|nd }||kS |r|j jtjkrtdd|}|d| dkS |r|rt	d|
 }t	d|
 }|r|sdS |d|dkrdS |d	}|d	}td
d|
 td
d|
 kS ||kS d S )Nz'0'Fz^'|'$ 'z(.*) (on update.*?)(?:\(\))?$Tr   r
   z(.*?)(?:\(\))?$z\1)typerK   rL   ZIntegerZprimary_keyr1   resubStringmatchlowergroup)r@   Zinspector_columnZmetadata_columnZrendered_metadata_defaultZrendered_inspector_defaultZmetadata_defaultZonupdate_insZonupdate_metrC   rC   rD   compare_server_default   sl    

    z MySQLImpl.compare_server_defaultc           	      C  s   t  }t|D ]~}|jrq|jD ]j}|j|jkrJ|| ||j  q|jD ]*}|j|jkrP|| ||j  q|qP|j|kr  qq qt|D ]}|j|kr|| qd S rF   )setlistuniquecolumnsr,   removeaddZforeign_keys)	r@   Zconn_unique_constraintsZconn_indexesZmetadata_unique_constraintsZmetadata_indexesremovedidxcolfkrC   rC   rD   correct_for_autogen_constraints   s&    	





z)MySQLImpl.correct_for_autogen_constraintsc                   s    fdd|D } fdd|D }t ||D ]d}|| }|| }|jd k	rn|j dkrn|jd krnd|_|jd k	r2|j dkr2|jd kr2d|_q2d S )Nc                   s   i | ]}  |j|qS rC   )Z _create_reflected_constraint_sigunnamed_no_options.0ra   r@   rC   rD   
<dictcomp>#  s   
 z=MySQLImpl.correct_for_autogen_foreignkeys.<locals>.<dictcomp>c                   s   i | ]}  |j|qS rC   )Z_create_metadata_constraint_sigrc   rd   rf   rC   rD   rg   '  s   
 ZrestrictZRESTRICT)rX   intersectionZondeleterU   Zonupdate)r@   Zconn_fksZmetadata_fksZconn_fk_by_sigZmetadata_fk_by_sigsigZmdfkZcnfkrC   rf   rD   correct_for_autogen_foreignkeys"  s.    

z)MySQLImpl.correct_for_autogen_foreignkeys)NFNNNNNNNNFN)__name__
__module____qualname____dialect__Ztransactional_ddlr   Ztype_synonymsZtype_arg_extractr:   rI   r;   rW   rb   rj   __classcell__rC   rC   rA   rD   r    )   s2               2s	C%r    c                   @  s   e Zd ZdZdS )MariaDBImplmariadbN)rk   rl   rm   rn   rC   rC   rC   rD   rp   @  s   rp   c                      s,   e Zd Zd	dddddd fddZ  ZS )
r?   Nr"   r   r$   r'   )r,   r)   r8   r   r6   c                   s$   t t| j||d || _|| _d S )Nr   )r9   r   __init__r)   r8   )r@   r,   r)   r8   r   rA   rC   rD   rr   E  s    zMySQLAlterDefault.__init__)Nrk   rl   rm   rr   ro   rC   rC   rA   rD   r?   D  s    r?   c                      s6   e Zd Zddddddddddd	d

 fddZ  ZS )r=   NFr"   r$   r%   r#   /Optional[Union[_ServerDefault, Literal[False]]]r&   r'   )
r,   r)   r   r7   r-   r*   r8   r1   r3   r6   c
           
        sZ   t t| j||d || _|| _|| _|| _|| _|	| _|d krJt	
dt|| _d S )Nr   zDAll MySQL CHANGE/MODIFY COLUMN operations require the existing type.)r9   r   rr   r)   r*   r7   r8   r1   r3   r   CommandErrorrL   Zto_instancer-   )
r@   r,   r)   r   r7   r-   r*   r8   r1   r3   rA   rC   rD   rr   R  s    zMySQLChangeColumn.__init__)NNNNFNFrs   rC   rC   rA   rD   r=   Q  s          r=   c                   @  s   e Zd ZdS )r>   N)rk   rl   rm   rC   rC   rC   rD   r>   n  s   r>   r!   rq   c                 K  s   t dd S )Nz9Individual alter column constructs not supported by MySQL)NotImplementedErrorelementcompilerr5   rC   rC   rD    _mysql_doesnt_support_individualr  s    rz   r   r"   )rx   ry   r6   c                 K  s<   dt || j| jt|| j| jd k	r4dt|| j ndf S )Nz%s ALTER COLUMN %s %szSET DEFAULT %szDROP DEFAULT)r   r(   r   r   r)   r8   r   rw   rC   rC   rD   _mysql_alter_default|  s    
r{   c                 K  s<   dt || j| jt|| jt|| j| j| j| j	| j
df S )Nz%s MODIFY %s %sr*   r+   r-   r1   r3   )r   r(   r   r   r)   _mysql_colspecr*   r8   r-   r1   r3   rw   rC   rC   rD   _mysql_modify_column  s    
r~   c                 K  sF   dt || j| jt|| jt|| jt|| j| j| j	| j
| jdf S )Nz%s CHANGE %s %s %sr|   )r   r(   r   r   r)   r7   r}   r*   r8   r-   r1   r3   rw   rC   rC   rD   _mysql_change_column  s    

r   r#   rt   r   r&   )ry   r*   r+   r-   r1   r3   r6   c                 C  sn   d| j j||rdndf }|r*|d7 }|dk	rL|d k	rL|dt| | 7 }|rj|d| j|t  7 }|S )Nz%s %sZNULLzNOT NULLz AUTO_INCREMENTFz DEFAULT %sz COMMENT %s)dialectZtype_compilerprocessr   Zsql_compilerZrender_literal_valuerL   rS   )ry   r*   r+   r-   r1   r3   specrC   rC   rD   r}     s    

 r}   r   c                 K  s   | j }t|tjtjtjfr.|r$t|| S t|tjrt	|j
rbd|j|j|j|f S d|j|j|j|f S ntddS )zVRedefine SQLAlchemy's drop constraint to
    raise errors for invalid constraint type.z!ALTER TABLE %s DROP CONSTRAINT %szALTER TABLE %s DROP CHECK %szFNo generic 'DROP CONSTRAINT' in MySQL - please specify constraint typeN)rx   rG   r   ZForeignKeyConstraintZPrimaryKeyConstraintZUniqueConstraintAssertionErrorZvisit_drop_constraintrH   r   r   preparerZformat_tabletableZformat_constraintrv   )rx   ry   r5   
constraintrC   rC   rD   _mysql_drop_constraint  s.    



r   )3
__future__r   rQ   typingr   r   r   r   Z
sqlalchemyr   r	   rL   baser   r   r   r   r   r   r   r   implr   rN   r   r   Zutil.sqla_compatr   r   r   r   Zsqlalchemy.dialects.mysql.baser   Zsqlalchemy.sql.ddlr   Zsqlalchemy.sql.schemar   Zsqlalchemy.sql.type_apir   r   r    rp   r?   r=   r>   rz   r{   r~   r   r}   r   rC   rC   rC   rD   <module>   sb     






