o
    voiC                     @  s  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 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rd d!lm)Z) d d"l*m+Z+ d d#l*m,Z, d d$l-m.Z. d d%l/m0Z0 d d&l/m1Z1 d d'l2m3Z3 d d(l4m5Z5 dd)lm6Z6 dd*l"m7Z7 G d+d, d,e#Z8G d-d. d.eeZ9G d/d0 d0eeZ:e(e9d1dbd7d8Z;e(e:d1dcd9d:Z<e(ed1ddd=d>Z=dedAdBZ>e(ed1dfdDdEZ?e(ed1dgdGdHZ@e(ed1dhdJdKZAe(ed1didMdNZBe(e!d1djdPdQZCdkdWdXZDdkdYdZZEdld[d\ZFe(ed1dmd`daZGdS )n    )annotationsN)Any)Dict)List)Optional)TYPE_CHECKING)Union)types)Column)CreateIndex)
Executable)ClauseElement   )	AddColumn)alter_column)alter_table)ColumnComment)ColumnDefault)
ColumnName)ColumnNullable)
ColumnType)format_column_name)format_server_default)format_table_name)format_type)RenameTable)DefaultImpl   )util)sqla_compat)compiles)Literal)MSDDLCompiler)MSSQLCompiler)CursorResult)Index)Table)TableClause)
TypeEngine)_ServerDefaultType)_ReflectedConstraintc                	      s   e Zd ZdZdZdZejddhf Zejd ZdC fd	d
Z	dD fddZ
dCddZdC fddZddddddddddE fd(d)ZdFd,d-ZdG fd2d3Zdd4dH fd7d8Zd9d: Z fd;d<ZdIdAdBZ  ZS )J	MSSQLImplmssqlTGOVARCHARNVARCHAR)minvaluemaxvalue
nominvalue
nomaxvaluecyclecachereturnNonec                   s(   t  j|i | | jd| j| _d S )Nmssql_batch_separator)super__init__context_optsgetbatch_separator)selfargkw	__class__ E/home/ubuntu/.local/lib/python3.10/site-packages/alembic/ddl/mssql.pyr:   D   s   
zMSSQLImpl.__init__	constructr   Optional[CursorResult]c                   s6   t  j|g|R i |}| jr| jr| | j |S N)r9   _execas_sqlr=   static_output)r>   rE   argsr@   resultrA   rC   rD   rH   J   s   zMSSQLImpl._execc                 C  s   |  d| j  d S )NzBEGIN TRANSACTION)rJ   command_terminatorr>   rC   rC   rD   
emit_beginP   s   zMSSQLImpl.emit_beginc                   s.   t    | jr| jr| | j d S d S d S rG   )r9   emit_commitrI   r=   rJ   rN   rA   rC   rD   rP   S   s   
zMSSQLImpl.emit_commitNF)nullableserver_defaultnametype_schemaexisting_typeexisting_server_defaultexisting_nullable
table_namestrcolumn_namerQ   Optional[bool]rR   3Optional[Union[_ServerDefaultType, Literal[False]]]rS   Optional[str]rT   Optional[TypeEngine]rU   rV   rW   /Union[_ServerDefaultType, Literal[False], None]rX   r@   c                  s4  |d ur|d ur|}d }n"|d u rt dn|
d ur&|d ur&|
}|}d }n	|d ur/t d d}t||	s=t||	rGd}||d< |	|d< |dura|du ra|	dusW|d u ra| t||d| t j	||f|||||
d| |dur|du r|d urt j	||||d	 |d urt j	||||d
 d S d S )NzhMS-SQL ALTER COLUMN operations with NULL or NOT NULL require the existing_type or a new type_ be passed.zMS-SQL ALTER COLUMN operations that specify type_= should also specify a nullable= or existing_nullable= argument to avoid implicit conversion of NOT NULL columns to NULL.FTrR   rW   sys.default_constraints)rQ   rT   rU   rV   rX   )rU   rR   )rU   rS   )
r   CommandErrorwarnr   _server_default_is_identity_server_default_is_computedrH   _ExecDropConstraintr9   r   )r>   rY   r[   rQ   rR   rS   rT   rU   rV   rW   rX   r@   used_defaultrA   rC   rD   r   X   s   
zMSSQLImpl.alter_columnindexr%   c                 K  sd   |j dd pd}|jd usJ |D ]}||jjvr$|jt|tj q| t	|fi | d S )Nmssql_includerC   )
kwargsr<   tablecappend_columnr
   sqltypesNullTyperH   r   )r>   rh   r@   ri   colrC   rC   rD   create_index   s   zMSSQLImpl.create_indexrk   Union[TableClause, Table]rows
List[dict]c                   sj   | j r(| d| jj|  t j||fi | | d| jj|  d S t j||fi | d S )NzSET IDENTITY_INSERT %s ONzSET IDENTITY_INSERT %s OFF)rI   rH   dialectidentifier_preparerformat_tabler9   bulk_insert)r>   rk   rs   r@   rA   rC   rD   rx      s   zMSSQLImpl.bulk_insert)rU   columnColumn[Any]c                  s   | dd}|r| t||d| | dd}|r$| t||d| | dd}|r5| t||| t j||fd|i| d S )Nmssql_drop_defaultFra   mssql_drop_checkzsys.check_constraintsmssql_drop_foreign_keyrU   )poprH   rf   _ExecDropFKConstraintr9   drop_column)r>   rY   ry   rU   r@   drop_default
drop_checkdrop_fksrA   rC   rD   r      s$   zMSSQLImpl.drop_columnc                 C  s4   |d urt dd|}|d urt dd|}||kS )Nz[\(\) \"\'] )resub)r>   inspector_columnmetadata_columnrendered_metadata_defaultrendered_inspector_defaultrC   rC   rD   compare_server_default   s   z MSSQLImpl.compare_server_defaultc                   sH   t  ||\}}}|d u r|d ur|s|jd ur|jjrd}|||fS )NF)r9   _compare_identity_defaultry   primary_key)r>   metadata_identityinspector_identitydiffignoredis_alterrA   rC   rD   r     s   


z#MSSQLImpl._compare_identity_defaultreflected_objectr*   kindDict[str, Any]c                 C  s@   | di  }| ds|dd  | ds|dd  |S )Ndialect_optionsri   mssql_clustered)r<   copyr~   )r>   r   r   optionsrC   rC   rD    adjust_reflected_dialect_options  s   

z*MSSQLImpl.adjust_reflected_dialect_options)r6   r7   )rE   r   r6   rF   )rY   rZ   r[   rZ   rQ   r\   rR   r]   rS   r^   rT   r_   rU   r^   rV   r_   rW   r`   rX   r\   r@   r   r6   r7   )rh   r%   r@   r   r6   r7   )rk   rr   rs   rt   r@   r   r6   r7   )rY   rZ   ry   rz   rU   r^   r6   r7   )r   r*   r   rZ   r6   r   )__name__
__module____qualname____dialect__transactional_ddlr=   r   type_synonymsidentity_attrs_ignorer:   rH   rO   rP   r   rq   rx   r   r   r   r   __classcell__rC   rC   rA   rD   r+   5   s4    
	


gr+   c                   @  s   e Zd ZdZdddZdS )rf   FtnamerZ   colnameUnion[Column[Any], str]rT   rU   r^   r6   r7   c                 C  s   || _ || _|| _|| _d S rG   )r   r   rT   rU   )r>   r   r   rT   rU   rC   rC   rD   r:   ,  s   
z_ExecDropConstraint.__init__N)
r   rZ   r   r   rT   rZ   rU   r^   r6   r7   r   r   r   inherit_cacher:   rC   rC   rC   rD   rf   )      rf   c                   @  s   e Zd ZdZdd
dZdS )r   Fr   rZ   r   rz   rU   r^   r6   r7   c                 C  s   || _ || _|| _d S rG   )r   r   rU   )r>   r   r   rU   rC   rC   rD   r:   <  s   
z_ExecDropFKConstraint.__init__N)r   rZ   r   rz   rU   r^   r6   r7   r   rC   rC   rC   rD   r   9  r   r   r,   elementcompilerr#   r6   rZ   c                 K  sJ   | j | j| j| jf\}}}}d|||t||||r |d d S dd S )Na  declare @const_name varchar(256)
select @const_name = QUOTENAME([name]) from %(type)s
where parent_object_id = object_id('%(schema_dot)s%(tname)s')
and col_name(parent_object_id, parent_column_id) = '%(colname)s'
exec('alter table %(tname_quoted)s drop constraint ' + @const_name).r   )typer   r   tname_quoted
schema_dot)rU   r   r   rT   r   )r   r   r@   rU   r   r   rT   rC   rC   rD   _exec_drop_col_constraintD  s    

	r   c                 K  sB   | j | j| j}}}d||t||||r|d d S dd S )Nay  declare @const_name varchar(256)
select @const_name = QUOTENAME([name]) from
sys.foreign_keys fk join sys.foreign_key_columns fkc
on fk.object_id=fkc.constraint_object_id
where fkc.parent_object_id = object_id('%(schema_dot)s%(tname)s')
and col_name(fkc.parent_object_id, fkc.parent_column_id) = '%(colname)s'
exec('alter table %(tname_quoted)s drop constraint ' + @const_name)r   r   )r   r   r   r   )rU   r   r   r   )r   r   r@   rU   r   r   rC   rC   rD   _exec_drop_col_fk_constraint]  s   


r   r   r"   c                 K  s(   dt || j| jt|| jfi |f S )Nz%s %s)r   rY   rU   mssql_add_columnry   r   r   r@   rC   rC   rD   visit_add_columnq  s   r   ry   rz   c                 K  s   d| j |fi | S )NzADD %s)get_column_specification)r   ry   r@   rC   rC   rD   r   y  s   r   r   c                 K  s:   dt || j| jt|| jt|| j| jrdf S df S )Nz%s %s %s %sNULLzNOT NULL)r   rY   rU   r   r[   r   rV   rQ   r   rC   rC   rD   visit_column_nullable  s   

r   r   c                 K  *   dt || j| jt|| jt|| jf S )Nz%s ADD DEFAULT %s FOR %s)r   rY   rU   r   defaultr   r[   r   rC   rC   rD   visit_column_default  s
   

r   r   c                 K  s*   dt || j| jt|| jt|| jf S )Nz$EXEC sp_rename '%s.%s', %s, 'COLUMN')r   rY   rU   r   r[   newnamer   rC   rC   rD   visit_rename_column  
   

r   r   c                 K  r   )Nz%s %s %s)r   rY   rU   r   r[   r   rT   r   rC   rC   rD   visit_column_type  r   r   r   c                 K  s"   dt || j| jt || jd f S )NzEXEC sp_rename '%s', %s)r   rY   rU   new_table_namer   rC   rC   rD   visit_rename_table  s   r   rU   r^   r   cnamecommentc                 C  N   |r|n| j j}|sJ d| j|t | j|| j	|| j	|S )NzYexec sp_addextendedproperty 'MS_Description', {}, 'schema', {}, 'table', {}, 'column', {}
ru   default_schema_nameformatsql_compilerrender_literal_valuern   r/   preparerquote_schemaquoter   rU   r   r   r   schema_namerC   rC   rD   _add_column_comment     


r   c                 C  r   )Nz\exec sp_updateextendedproperty 'MS_Description', {}, 'schema', {}, 'table', {}, 'column', {}r   r   rC   rC   rD   _update_column_comment  r   r   c                 C  s>   |r|n| j j}|sJ d| j|| j|| j|S )NzVexec sp_dropextendedproperty 'MS_Description', 'schema', {}, 'table', {}, 'column', {})ru   r   r   r   r   r   )r   rU   r   r   r   rC   rC   rD   _drop_column_comment  s   


r   r   r@   r   c                 K  sX   | j d ur"| jd urt|| j| j| j| j S t|| j| j| j| j S t|| j| j| jS rG   )r   existing_commentr   rU   rY   r[   r   r   r   rC   rC   rD   visit_column_comment  s&   

r   )r   rf   r   r#   r6   rZ   )r   r   r   r#   r6   rZ   )r   r   r   r"   r6   rZ   )r   r"   ry   rz   r6   rZ   )r   r   r   r"   r6   rZ   )r   r   r   r"   r6   rZ   )r   r   r   r"   r6   rZ   )r   r   r   r"   r6   rZ   )r   r   r   r"   r6   rZ   )r   r"   rU   r^   r   rZ   r   rZ   r   rZ   r6   rZ   )
r   r"   rU   r^   r   rZ   r   rZ   r6   rZ   )r   r   r   r"   r@   r   r6   rZ   )H
__future__r   r   typingr   r   r   r   r   r   
sqlalchemyr	   rn   sqlalchemy.schemar
   r   sqlalchemy.sql.baser   sqlalchemy.sql.elementsr   baser   r   r   r   r   r   r   r   r   r   r   r   r   implr   r   r   r   util.sqla_compatr    r!   sqlalchemy.dialects.mssql.baser"   r#   sqlalchemy.engine.cursorr$   sqlalchemy.sql.schemar%   r&   sqlalchemy.sql.selectabler'   sqlalchemy.sql.type_apir(   r)   r*   r+   rf   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rC   rC   rC   rD   <module>   s    u



	

