o
    ekl[)(                     @   s  d dl 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mZ d dlmZ d dlmZmZ d dlmZmZmZmZmZmZmZmZmZmZmZmZm Z m!Z! d	Z"i Z#G d
d dej$Z%i dedededededededededede de dededededede%iZ&G dd deZ'G d d! d!eZ(G d"d# d#e
j)Z*G d$d% d%ej+Z,G d&d' d'e
j-Z.e.Z/dS )(    N)exc)util)default
reflection)compiler
expression)quoted_name)
PGCompilerPGIdentifierPreparer)CHARDATEDATETIMEINTEGERSMALLINTBIGINTDECIMALTIME	TIMESTAMPVARCHARBINARYBOOLEANFLOATREAL)r      r   Nc                   @   s   e Zd Zd ZdS )ARRAYN)__name__
__module____qualname____visit_name__ r   r   S/var/www/Datamplify/venv/lib/python3.10/site-packages/sqlalchemy_clickhouse/base.pyr      s    r   Int64Int32Int16Int8UInt64UInt32UInt16UInt8DateDateTimeFloat64Float32StringFixedStringEnumEnum8Enum16Arrayc                   @   s   e Zd Zdd ZdddZdS )ClickHouseIdentifierPreparerc                 C   s
   |  |S )z Never quote identifiers. )_escape_identifier)selfvaluer   r   r    quote_identifier4   s   
z-ClickHouseIdentifierPreparer.quote_identifierNc                 C   s   |  |r
d|S |S )Nz"{}")_requires_quotesformat)r5   identforcer   r   r    quote7   s   

z"ClickHouseIdentifierPreparer.quoteN)r   r   r   r7   r<   r   r   r   r    r3   3   s    r3   c                       s   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Z fddZ	dd Z
dd Zdd Zdd Z		d! fdd	Z fddZdd Zdd  Z  ZS )"ClickHouseCompilerc                 K      dS )Nzcount()r   r5   fnkwr   r   r    visit_count_func=      z#ClickHouseCompiler.visit_count_funcc                 K   r?   )Nzrand()r   r@   r   r   r    visit_random_func@   rD   z$ClickHouseCompiler.visit_random_funcc                 K   r?   )Nznow()r   r@   r   r   r    visit_now_funcC   rD   z!ClickHouseCompiler.visit_now_funcc                 K   r?   )Nztoday()r   r@   r   r   r    visit_current_date_funcF   rD   z*ClickHouseCompiler.visit_current_date_funcc                 K   r?   )N1r   r5   elementrB   r   r   r    
visit_trueI   rD   zClickHouseCompiler.visit_truec                 K   r?   )N0r   rI   r   r   r    visit_falseL   rD   zClickHouseCompiler.visit_falsec                    s4   | j jrtt| j|fi |S | j|jfi |S r=   )dialectsupports_castsuperr>   
visit_castprocessclause)r5   castkwargs	__class__r   r    rQ   O   s   zClickHouseCompiler.visit_castc                 K   sx   | j |jjd fi |}| j |jjd fi |}t|jjdkr6| j |jjd fi |}d|||f S d||f S )Nr   r      zsubstring(%s, %s, %s)zsubstring(%s, %s))rR   clauseslen)r5   funcrB   sstartlengthr   r   r    visit_substring_funcU   s   z'ClickHouseCompiler.visit_substring_funcc                 K   s   d|  |j|  |jf S )Nzconcat(%s, %s)rR   leftrightr5   binaryoperatorrB   r   r   r    visit_concat_op_binary^   s   z)ClickHouseCompiler.visit_concat_op_binaryc                 K   4   d|d< d| j |jfi || j |jfi |f S )NTliteral_bindsz%s IN %sr`   rc   r   r   r    visit_in_op_binarya   
   z%ClickHouseCompiler.visit_in_op_binaryc                 K   rg   )NTrh   z%s NOT IN %sr`   rc   r   r   r    visit_notin_op_binaryh   rj   z(ClickHouseCompiler.visit_notin_op_binaryNTc                    s   t t| j|f|dd|S )NF)add_to_result_mapinclude_table)rP   r>   visit_column)r5   columnrl   rm   rU   rV   r   r    rn   o   s
   zClickHouseCompiler.visit_columnc                    s>   t t| ||}t|tjrd| }t|tjrd| }|S )NztoDateTime(%s)z
toDate(%s))rP   r>   render_literal_value
isinstancesqltypesr*   r)   )r5   r6   type_rV   r   r    rp   u   s   z'ClickHouseCompiler.render_literal_valuec                 K   s   d}|j d ur|d| j|j fi | 7 }|jd ur>d}|j d u r,|| td7 }n|d7 }|d| j|jfi | 7 }|S )N z
 LIMIT rL   ,)_limit_clauserR   _offset_clausesqlliteral)r5   selectrB   textr   r   r    limit_clause}   s   


zClickHouseCompiler.limit_clausec                 K   r?   )Nrt   r   )r5   r{   rB   r   r   r    for_update_clause   rD   z$ClickHouseCompiler.for_update_clauseNT)r   r   r   rC   rE   rF   rG   rK   rM   rQ   r_   rf   ri   rk   rn   rp   r}   r~   __classcell__r   r   rV   r    r>   <   s$    	r>   c                   @   s   e Zd Zejdd ZdS )ClickHouseExecutionContextc                 C   r?   )NFr   )r5   r   r   r    should_autocommit      z,ClickHouseExecutionContext.should_autocommitN)r   r   r   sa_utilmemoized_propertyr   r   r   r   r    r      s    r   c                   @   s   e Zd Zdd ZdS )ClickHouseTypeCompilerc                 K   s   d| S )Nz	Array(%s)r   )r5   typerB   r   r   r    visit_ARRAY   s   z"ClickHouseTypeCompiler.visit_ARRAYN)r   r   r   r   r   r   r   r    r      s    r   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eZeZdZdZdZdZeZeZeZeZdZedd Z d	d
 Z!dd Z"d#ddZ#dd Z$d#ddZ%e&j'd#ddZ(e&j'd#ddZ)e&j'd#ddZ*e&j'd#ddZ+e&j'd#ddZ,dd Z-d#dd Z.d!d" Z/dS )$ClickHouseDialect
clickhouseTF   pyformatNc                 C   s(   z	dd l m} W |S    dd l}Y |S )Nr   )sqlalchemy_clickhouse.connector	connector)clsr   r   r   r    dbapi   s   
zClickHouseDialect.dbapic                 C   s<   d|j |jpdf |j|jd}||j |jpdg|fS )Nzhttp://%s:%d/i  )db_urlusernamepasswordr   )hostportr   r   updatequerydatabase)r5   urlrU   r   r   r    create_connect_args   s   z%ClickHouseDialect.create_connect_argsc                 K   s   dd | dD S )Nc                 S      g | ]}|j qS r   name.0rowr   r   r    
<listcomp>       z6ClickHouseDialect.get_schema_names.<locals>.<listcomp>zSHOW DATABASESexecute)r5   
connectionrB   r   r   r    get_schema_names      z"ClickHouseDialect.get_schema_namesc                 K   s   | j ||fi |S r=   )get_table_names)r5   r   schemarB   r   r   r    get_view_names   r   z ClickHouseDialect.get_view_namesc                 C   s(   |}|r
|d | }| d| S )N.zDESCRIBE TABLE {})r   r9   fetchall)r5   r   
table_namer   
full_tabler   r   r    _get_table_columns   s   z$ClickHouseDialect._get_table_columnsc                 C   s>   |}|r
|d | }| d|D ]
}|jdkr dS qdS )Nr   zEXISTS TABLE {}r   TF)r   r9   result)r5   r   r   r   r   rr   r   r    	has_table   s   
zClickHouseDialect.has_tablec              	   K   s   |  |||}g }|D ]<}|j}d}	|jdr |jdd }	n
td|jd}	zt|	 }
W n ty<   t	j
}
Y nw |||
dd d q|S )	Nrt   AggregateFunction   ru   z^\w+r   T)r   r   nullabler   )r   r   r   
startswithresearchgroupischema_namesKeyErrorrr   NullTypeappend)r5   r   r   r   rB   rowsr   r   col_namecol_typecoltyper   r   r    get_columns   s(   

zClickHouseDialect.get_columnsc                 K      g S r=   r   r5   r   r   r   rB   r   r   r    get_foreign_keys      z"ClickHouseDialect.get_foreign_keysc                 K   r   r=   r   r   r   r   r    get_pk_constraint   r   z#ClickHouseDialect.get_pk_constraintc                 K   s   |}|r
|d | }dd | d|D }t|dk rg S td|d j}|s,g S |dd\}}	td	|	}
|
s>g S d
d |
ddD }d|ddgS )Nr   c                 S   s   g | ]}|qS r   r   )r   r   r   r   r    r   
  s    z1ClickHouseDialect.get_indexes.<locals>.<listcomp>zSHOW CREATE TABLE {}r   zENGINE = (\w+)\((.+)\)r   rX   z\((.+)\)c                 S   s   g | ]}|  qS r   )strip)r   cr   r   r    r     s    rv   	partitionF)r   column_namesunique)r   r9   rZ   r   r   	statementr   split)r5   r   r   r   rB   r   r   engine_specengineparamscols	col_namesr   r   r    get_indexes  s   zClickHouseDialect.get_indexesc                 K   s(   d}|r
|d| 7 }dd | |D S )NzSHOW TABLESz FROM c                 S   r   r   r   r   r   r   r    r     r   z5ClickHouseDialect.get_table_names.<locals>.<listcomp>r   )r5   r   r   rB   r   r   r   r    r     s   z!ClickHouseDialect.get_table_namesc                 C   s   d S r=   r   )r5   dbapi_connectionr   r   r    do_rollback!  r   zClickHouseDialect.do_rollbackc                 C   r?   r   r   )r5   r   additional_testsr   r   r    _check_unicode_returns%  r   z(ClickHouseDialect._check_unicode_returnsc                 C   r?   r   r   )r5   r   r   r   r    _check_unicode_description)  r   z,ClickHouseDialect._check_unicode_descriptionr=   )0r   r   r   r   rO   supports_unicode_statementssupports_unicode_bindssupports_sane_rowcountsupports_sane_multi_rowcountsupports_native_decimalsupports_native_booleansupports_altersupports_sequencessupports_native_enummax_identifier_lengthdefault_paramstylecolspecsr   convert_unicodereturns_unicode_stringsdescription_encodingpostfetch_lastrowidr3   preparerr   type_compilerr>   statement_compilerr   execution_ctx_cls_backslash_escapesclassmethodr   r   r   r   r   r   r   cacher   r   r   r   r   r   r   r   r   r   r   r    r      sZ    
	

	
r   )0r   sqlalchemy.typestypesrr   
sqlalchemyr   sa_excr   r   sqlalchemy.enginer   r   sqlalchemy.sqlr   r   sqlalchemy.sql.elementsr   #sqlalchemy.dialects.postgresql.baser	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   VERSIONr   
TypeEnginer   r   r3   r>   DefaultExecutionContextr   GenericTypeCompilerr   DefaultDialectr   rN   r   r   r   r    <module>   sp   @	
	Q 