o
    ifB                     @   s  d dl Z d dlmZmZmZmZ d dlm	Z	m
Z
 d dlmZ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mZ ddlmZ i Zi dejdejdejdejdejdej dej!dej"dej#dej$dej%dej&dej'dej(dej)dej*dej+i dej,d ej-d!ej.d"ej/d#ej/d$ej0d%ej1d&ej2d'ej.d(ej3d)ej4d*ej5d+ej6d,ej7d-ej8d.ej9d/ej:d0ej;iZ<G d1d2 d2ej=Z>G d3d4 d4e	j?Z@G d5d6 d6e	jAZBeB ZCdS )7    N)schematypesutiltext)default
reflection)compilerelements)warn   )ClickHouseDDLCompiler)ClickHouseSQLCompiler)ClickHouseTypeCompiler)ClickHouseInspector)get_inner_specparse_arguments   )r   Int256Int128Int64Int32Int16Int8UInt256UInt128UInt64UInt32UInt16UInt8DateDate32DateTime
DateTime64Float64Float32DecimalStringBoolBooleanUUIDIPv4IPv6FixedStringEnum8Enum16_array	_nullable_lowcardinality_tuple_map_aggregatefunction_simpleaggregatefunctionc                   @   s$   e Zd ZejjedB Zdd ZdS )ClickHouseIdentifierPreparer)indexc                 C   s   | | j| j}| ddS )N%z%%)replaceescape_quoteescape_to_quote)selfvalue r>   [/var/www/Datamplify/venv/lib/python3.10/site-packages/clickhouse_sqlalchemy/drivers/base.py_escape_identifierF   s   z/ClickHouseIdentifierPreparer._escape_identifierN)__name__
__module____qualname__r   IdentifierPreparerreserved_wordssetr@   r>   r>   r>   r?   r6   ?   s    r6   c                   @   s   e Zd Zejdd ZdS )ClickHouseExecutionContextBasec                 C      dS )NFr>   r<   r>   r>   r?   should_autocommitL      z0ClickHouseExecutionContextBase.should_autocommitN)rA   rB   rC   sa_utilmemoized_propertyrJ   r>   r>   r>   r?   rG   K   s    rG   c                       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dZdZdZdZdZdZdZdZeZeZdZdZdZdZdZ e!Z"e#Z$e%Z&e'Z(e)j*g ddfe)j+dddddfgZ,e-Z. fd	d
Z/dAddZ0e1j2dBddZ3dBddZ4dd Z5e1j2dBddZ6dd Z7dd Z8dd Z9e:dd Z;e:dd Z<e:dd  Z=e:d!d" Z>e1j2d#d$ Z?e1j2dBd%d&Z@e1j2dBd'd(ZAe1j2dBd)d*ZBe1j2dBd+d,ZCe1j2dBd-d.ZDe1j2dBd/d0ZEd1d2 ZFdBd3d4ZGdBd5d6ZHdBd7d8ZId9d: ZJd;d< ZKd=d> ZL fd?d@ZM  ZNS )CClickHouseDialect
clickhouseTF   pyformatN)datacluster)codecmaterializedaliasafterc                    sB   t t| | | j}|dk| _|dk| _|dk| _|dk| _d S )N)r   r   it  )         )rX      )      )superrN   
initializeserver_version_infosupports_deletesupports_updatesupports_engine_reflection!supports_table_comment_reflectionr<   
connectionversion	__class__r>   r?   r_      s   


zClickHouseDialect.initializec                 K   s   t N)NotImplementedError)r<   rf   sqlscalarkwargsr>   r>   r?   _execute      zClickHouseDialect._executec                 K   4   t d}|p
|jjj}| j|||d}dd |D S )NzQSELECT name FROM system.tables WHERE engine LIKE '%View' AND database = :databasedatabasec                 S      g | ]}|j qS r>   name.0rowr>   r>   r?   
<listcomp>       z4ClickHouseDialect.get_view_names.<locals>.<listcomp>r   engineurlrs   ro   r<   rf   r   kwqueryrs   rowsr>   r>   r?   get_view_names   s   z ClickHouseDialect.get_view_namesc           	      K   s\   | j }|r||d || }n||}td|}| ||D ]
}|jdkr+ dS q!dS )N.zEXISTS TABLE {}r   TF)_quote_table_namer   formatro   result)	r<   rf   
table_namer   r   quotequalified_namer   rr>   r>   r?   	has_table   s   
zClickHouseDialect.has_tablec                 C   s    t |tjr
t|S | j|S rj   )
isinstancer	   
TextClausestridentifier_preparerquote_identifier)r<   r   r>   r>   r?   r      s   z#ClickHouseDialect._quote_table_namec           	         sP    j }|r||d || }n||}d|} ||} fdd|D S )Nr   zDESCRIBE TABLE {}c                    s.   g | ]}  |j|j|j|jt|d dqS )commentN)_get_column_inforv   typedefault_typedefault_expressiongetattr)rx   r   rI   r>   r?   rz      s    
z1ClickHouseDialect.get_columns.<locals>.<listcomp>)r   r   ro   )	r<   rf   r   r   r   r   r   r   r   r>   rI   r?   get_columns   s   

zClickHouseDialect.get_columnsc           	      C   s6   |  ||}| ||}|||d||pd d}|S )Nz	Nullable()rv   r   nullabler   r   )_get_column_type_get_column_default
startswith)	r<   rv   format_typer   r   r   col_typecol_defaultr   r>   r>   r?   r      s   z"ClickHouseDialect._get_column_infoc                 C   s   |dkr|S d S )NDEFAULTr>   )r<   r   r   r>   r>   r?   r      s   z%ClickHouseDialect._get_column_defaultc                    s*  | dr|dd }jd   |S | dr,t|dd }jd |S | drD|dd }jd	   |S | d
r\|dd }jd   |S | dr|dd }t|}|d |dd  }}fdd|D }jd   |g|R  S | dr|dd }t|}|d |dd  }}fdd|D }jd   |g|R  S | dr|dd }jd  fdd|dD } | S | dr|dd }jd  fdd|ddD } | S | d rC|d!}	|d |	 }
j|
  t }|	dkr.||	d |	d" }|s4t
jS td# | fd$d%S | d&rUjd&   | S | d'rgjd'   | S | d(ryjd(   | S zj| W S  ty   td)|f  t
j Y S w )*NArrayr]   r/   r,   rY   Nullable	   r0   LowCardinality   r1   AggregateFunctionrX   r   r   c                       g | ]}  |qS r>   r   rx   paramrv   r<   r>   r?   rz          
z6ClickHouseDialect._get_column_type.<locals>.<listcomp>r4   SimpleAggregateFunction   c                    r   r>   r   r   r   r>   r?   rz      r   r5   Tupler2   c                       g | ]
}  | qS r>   r   striprx   tr   r>   r?   rz   	      ,Map   r3   c                    r   r>   r   r   r   r>   r?   rz     r   Enum()z%s_enumc                      s    S rj   r>   r>   )coltype	type_enumr>   r?   <lambda>&  s    z4ClickHouseDialect._get_column_type.<locals>.<lambda>r%   r"   r!   z*Did not recognize type '%s' of column '%s')r   ischema_namesr   intr   splitfinddict_parse_optionsrfindsqltypesNullTypeenumr   _parse_decimal_params_parse_detetime64_params_parse_detetime_paramsKeyErrorr
   )r<   rv   specinnerlengthparams	argumentsagg_funcinner_typesposr   optionsr>   )r   rv   r<   r   r?   r      s   





















z"ClickHouseDialect._get_column_typec                 C   s.   t | }|d\}}t| t| fS )Nr   )r   r   r   r   )r   
inner_spec	precisionscaler>   r>   r?   r   9  s   z'ClickHouseDialect._parse_decimal_paramsc                 C   sL   t | }|sg S |dd}t|d |d< t|dkr$|d  |d< |S )Nr   r   r   )r   r   r   lenr   )r   r   r   r>   r>   r?   r   ?  s   z*ClickHouseDialect._parse_detetime64_paramsc                 C   s   t | }|sg S |gS rj   )r   )r   r   r>   r>   r?   r   J  s   z(ClickHouseDialect._parse_detetime_paramsc                 C   s   t  }d}d}d }d}d}| D ]E}|r||7 }d}q|r7|dv r!q|dkr2t|||< d}d}d}q||7 }q|rN|dkr@d}q||krId }d}q||7 }q|dkrT|}q|r_||t| |S )NF ) =r   \T')r   r   
setdefault)option_stringr   
after_nameescapedquote_characterrv   r=   chr>   r>   r?   r   Q  s@   

z ClickHouseDialect._parse_optionsc                 K   s   |  |d}dd |D S )NzSHOW DATABASESc                 S   rt   r>   ru   rw   r>   r>   r?   rz     r{   z6ClickHouseDialect.get_schema_names.<locals>.<listcomp>ro   )r<   rf   r   r   r>   r>   r?   get_schema_names|  s   z"ClickHouseDialect.get_schema_namesc                 K      g S rj   r>   r<   rf   r   r   r   r>   r>   r?   get_foreign_keys     z"ClickHouseDialect.get_foreign_keysc           	      K   s`   | j si S |rd||}nd|}| ||}|D ]}|j}|r-dt|di  S qi S )NzGSELECT primary_key FROM system.tables WHERE database='{}' AND name='{}'z5SELECT primary_key FROM system.tables WHERE name='{}'constrained_columns, )rc   r   ro   primary_keytupler   )	r<   rf   r   r   r   r   r   r   primary_keysr>   r>   r?   get_pk_constraint  s"   z#ClickHouseDialect.get_pk_constraintc                 K   r   rj   r>   r   r>   r>   r?   get_indexes  r   zClickHouseDialect.get_indexesc                 K   rq   )NzqSELECT name FROM system.tables WHERE engine NOT LIKE '%View' AND name NOT LIKE '.inner%' AND database = :databaserr   c                 S   rt   r>   ru   rw   r>   r>   r?   rz     r{   z5ClickHouseDialect.get_table_names.<locals>.<listcomp>r|   r   r>   r>   r?   get_table_names  s   z!ClickHouseDialect.get_table_namesc           	         sd   g d}|r|n|j jj}tdd|}| j||||d}t|d   r0 fdd|D S d S )N)rv   engine_fullr}   partition_keysorting_keyr   sampling_keyzHSELECT {} FROM system.tables WHERE database = :database AND name = :namer   )rs   rv   c                    s   i | ]	}|t  |d qS rj   )r   )rx   xry   r>   r?   
<dictcomp>  s    z0ClickHouseDialect.get_engine.<locals>.<dictcomp>)r}   r~   rs   r   r   joinro   next)	r<   rf   r   r   r   columnsrs   r   r   r>   r   r?   
get_engine  s   
zClickHouseDialect.get_enginec                 K   sF   | j st |r
|n|jjj}td}| j||||dd}d|p!d iS )NzMSELECT comment FROM system.tables WHERE database = :database AND name = :nameT)rs   rv   rm   r   )rd   rk   r}   r~   rs   r   ro   )r<   rf   r   r   r   rs   r   r   r>   r>   r?   get_table_comment  s   
z#ClickHouseDialect.get_table_commentc                 C   s   d S rj   r>   )r<   dbapi_connectionr>   r>   r?   do_rollback  rK   zClickHouseDialect.do_rollbackc                 C   s8   |r|j r|jjrt|jd sd }|j|||d d S )Nr   context)isinsertcompiledinsert_single_values_exprr   compiled_parametersexecutemanyr<   cursor	statement
parametersr  r>   r>   r?   do_executemany  s   z ClickHouseDialect.do_executemanyc                 C   s   |j |||d d S )Nr  )executer	  r>   r>   r?   
do_execute  s   zClickHouseDialect.do_executec                 C   rH   NTr>   )r<   rf   additional_testsr>   r>   r?   _check_unicode_returns  rp   z(ClickHouseDialect._check_unicode_returnsc                 C   rH   r  r>   r<   rf   r>   r>   r?   _check_unicode_description  rp   z,ClickHouseDialect._check_unicode_descriptionc                 C   s6   | j }|d u r| j|ddd}tdd |dD S )Nzselect version()Trm   c                 s   s$    | ]}|  rt|n|V  qd S rj   )isdigitr   )rx   pr>   r>   r?   	<genexpr>  s   " z=ClickHouseDialect._get_server_version_info.<locals>.<genexpr>r   )forced_server_version_stringro   r   r   re   r>   r>   r?   _get_server_version_info  s   z*ClickHouseDialect._get_server_version_infoc                 C   s   | j |dddS )Nzselect currentDatabase()Tr  r   r  r>   r>   r?   _get_default_schema_name  s   z*ClickHouseDialect._get_default_schema_namec                    s&   | d| j| _tt| j|i |S )Nserver_version)popr  r^   rN   connect)r<   cargscparamsrh   r>   r?   r     s   zClickHouseDialect.connect)Frj   )OrA   rB   rC   rv   supports_castsupports_unicode_statementssupports_unicode_bindssupports_sane_rowcountsupports_sane_multi_rowcountsupports_native_decimalsupports_native_boolean#non_native_boolean_check_constraintsupports_altersupports_sequencessupports_native_enumsupports_multivalues_insertsupports_statement_cachesupports_commentsinline_commentsra   rb   rc   rd   engine_reflectionmax_identifier_lengthdefault_paramstylecolspecsr   convert_unicodereturns_unicode_stringsdescription_encodingpostfetch_lastrowidr  r6   preparerr   type_compilerr   statement_compilerr   ddl_compilerr   TableColumnconstruct_argumentsr   	inspectorr_   ro   r   cacher   r   r   r   r   r   r   staticmethodr   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r  r  r  r  __classcell__r>   r>   rh   r?   rN   Q   s    



a




*



rN   )Dr   
sqlalchemyr   r   r   r   rL   r   sqlalchemy.enginer   r   sqlalchemy.sqlr   r	   sqlalchemy.utilr
   compilers.ddlcompilerr   compilers.sqlcompilerr   compilers.typecompilerr   r   r   r   r   r3  r   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r(   r)   r*   r+   r-   r.   r   r   r   r   r   r   r   r   rD   r6   DefaultExecutionContextrG   DefaultDialectrN   clickhouse_dialectr>   r>   r>   r?   <module>   s    	
 !"#'   
8