o
    Rhv                     @   sH  d dl Z d dlmZ d dlmZmZmZmZ d dlm	Z	 d dl
mZmZmZmZmZmZmZ d dlmZmZmZmZmZmZmZmZ d dlmZmZ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#G dd deZ$G dd d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*G d d! d!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Z0G d,d- d-eZ1G d.d/ d/eZ2G d0d1 d1eZ3G d2d3 d3eZ4G d4d5 d5eZ5G d6d7 d7eZ6G d8d9 d9eZ7G d:d; d;eZ8G d<d= d=eZ9dS )>    N)copy)AnyOptionalUnionTuple)Dialects)CreateQueryBuilderDatabaseDropQueryBuilder
SelectableTableQueryQueryBuilder)ArithmeticExpression	CriterionEmptyCriterionFieldFunctionStarTermValueWrapper)QueryExceptionbuilderformat_quotesc                   @   sb   e Zd ZdZededdfddZedeee	f ddfd	d
Z
edeee	f ddfddZdS )SnowflakeQueryz7
    Defines a query class for use with Snowflake.
    kwargsreturnSnowflakeQueryBuilderc                 K      t di |S N )r   clsr   r    r    Q/home/air/sanwanet/backup_V2/venv/lib/python3.10/site-packages/pypika/dialects.py_builder      zSnowflakeQuery._buildertableSnowflakeCreateQueryBuilderc                 C      t  |S N)r'   create_tabler"   r&   r    r    r#   r*         zSnowflakeQuery.create_tableSnowflakeDropQueryBuilderc                 C   r(   r)   )r-   
drop_tabler+   r    r    r#   r.       r,   zSnowflakeQuery.drop_tableN)__name__
__module____qualname____doc__classmethodr   r$   r   strr   r*   r.   r    r    r    r#   r      s     r   c                       s6   e Zd ZdZdZdZeZdeddf fddZ	  Z
S )r   N" r   r   c                       t  jddtji| d S Ndialectr    super__init__r   	SNOWFLAKEselfr   	__class__r    r#   r<   +      zSnowflakeQueryBuilder.__init__)r/   r0   r1   
QUOTE_CHARALIAS_QUOTE_CHARQUERY_ALIAS_QUOTE_CHARr   	QUERY_CLSr   r<   __classcell__r    r    r@   r#   r   %   s    r   c                       &   e Zd ZdZeZd fddZ  ZS )r'   Nr   c                       t  jtjd d S Nr9   r:   r?   r@   r    r#   r<   3      z$SnowflakeCreateQueryBuilder.__init__r   Nr/   r0   r1   rC   r   rF   r<   rG   r    r    r@   r#   r'   /       r'   c                       rH   )r-   Nr   c                    rI   rJ   r:   rL   r@   r    r#   r<   ;   rM   z"SnowflakeDropQueryBuilder.__init__rN   rO   r    r    r@   r#   r-   7   rP   r-   c                   @   sx   e Zd ZdZededdfddZededdfd	d
Zede	ee
f ddfddZede	ee
f ddfddZdS )
MySQLQueryz3
    Defines a query class for use with MySQL.
    r   r   MySQLQueryBuilderc                 K   r   r   )rR   r!   r    r    r#   r$   D   r%   zMySQLQuery._builderfpMySQLLoadQueryBuilderc                 C   r(   r)   )rT   loadr"   rS   r    r    r#   rU   H   r,   zMySQLQuery.loadr&   MySQLCreateQueryBuilderc                 C   r(   r)   )rW   r*   r+   r    r    r#   r*   L   r,   zMySQLQuery.create_tableMySQLDropQueryBuilderc                 C   r(   r)   )rX   r.   r+   r    r    r#   r.   P   r,   zMySQLQuery.drop_tableN)r/   r0   r1   r2   r3   r   r$   r4   rU   r   r   r*   r.   r    r    r    r#   rQ   ?   s     rQ   c                
       s  e Zd ZdZeZdeddf fddZd$ fddZe		
d%de
de
deedf ddfddZe	deeef dedd fddZe	d$ddZdedef fddZdefddZdedefddZdefddZe	dedd fd d!Zdedefd"d#Z  ZS )&rR   `r   r   Nc                    sD   t  jdtjdd| g | _d| _g | _d| _d| _t	 | _
d S )NF)r9   wrap_set_operation_queriesr    )r;   r<   r   MYSQL_duplicate_updates_ignore_duplicates
_modifiers_for_update_nowait_for_update_skip_lockedset_for_update_ofr>   r@   r    r#   r<   Y   s   zMySQLQueryBuilder.__init__c                    &   t   }t| j|_t| j|_|S r)   )r;   __copy__r   r\   r]   r?   newoner@   r    r#   rd   c      
zMySQLQueryBuilder.__copy__Fr    nowaitskip_lockedof.r   c                 C       d| _ || _|| _t|| _d S NT_for_updater`   r_   ra   rb   r?   rh   ri   rj   r    r    r#   
for_updatei      zMySQLQueryBuilder.for_updatefieldvaluec                 C   s<   | j rtdt|tst|n|}| j|t|f d S )N"Can not have two conflict handlers)r]   r   
isinstancer   r\   appendr   )r?   rr   rs   r    r    r#   on_duplicate_key_updater   s   z)MySQLQueryBuilder.on_duplicate_key_updatec                 C   s   | j rtdd| _d S )Nrt   T)r\   r   r]   rL   r    r    r#   on_duplicate_key_ignorez      
z)MySQLQueryBuilder.on_duplicate_key_ignorec                    sX   |  | tt| jdi |}|r*| jr!|| jdi |7 }|S | jr*||  7 }|S r   )_set_kwargs_defaultsr;   rR   get_sqlr\   _on_duplicate_key_update_sqlr]   _on_duplicate_key_ignore_sql)r?   r   querystringr@   r    r#   r{      s   
zMySQLQueryBuilder.get_sqlc                    `   | j r,d}| jr|dd fdd| jD  7 }| jr#|d7 }|S | jr*|d7 }|S d}|S )	N FOR UPDATE OF , c                        g | ]}t |jd i  qS r    r   r{   .0itemr   r    r#   
<listcomp>        z5MySQLQueryBuilder._for_update_sql.<locals>.<listcomp> NOWAIT SKIP LOCKEDr6   rn   rb   joinr_   r`   r?   r   rp   r    r   r#   _for_update_sql      $z!MySQLQueryBuilder._for_update_sqlc                    "   dj d fdd| jD dS )Nz" ON DUPLICATE KEY UPDATE {updates},c                 3   s:    | ]\}}d j |jdi  |jdi  dV  qdS ){field}={value}rr   rs   Nr    )formatr{   r   rr   rs   r   r    r#   	<genexpr>   s
    $
zAMySQLQueryBuilder._on_duplicate_key_update_sql.<locals>.<genexpr>updates)r   r   r\   r>   r    r   r#   r|      s
   z.MySQLQueryBuilder._on_duplicate_key_update_sqlc                 C      dS )Nz ON DUPLICATE KEY IGNOREr    rL   r    r    r#   r}         z.MySQLQueryBuilder._on_duplicate_key_ignore_sqlc                 C   s   | j | dS )z
        Adds a modifier such as SQL_CALC_FOUND_ROWS to the query.
        https://dev.mysql.com/doc/refman/5.7/en/select.html

        :param value: The modifier value e.g. SQL_CALC_FOUND_ROWS
        N)r^   rv   )r?   rs   r    r    r#   modifier   s   zMySQLQueryBuilder.modifierc                    sH   dj | jrdnd| jrd d| jndd fdd| jD d	S )
z
        Overridden function to generate the SELECT part of the SQL statement,
        with the addition of the a modifier if present.
        z#SELECT {distinct}{modifier}{select}	DISTINCT r6   z{}  r   c                 3   &    | ]}|j dd d d V  qdS T)
with_aliassubqueryNr    r{   r   termr   r    r#   r         $ z0MySQLQueryBuilder._select_sql.<locals>.<genexpr>)distinctr   select)r   	_distinctr^   r   _selectsr>   r    r   r#   _select_sql   s
   zMySQLQueryBuilder._select_sql)r   rR   FFr    )r/   r0   r1   rC   rQ   rF   r   r<   rd   r   bool
TypedTupler4   rp   r   r   rw   rx   r{   r   r|   r}   r   r   rG   r    r    r@   r#   rR   U   s6    

 
	rR   c                   @      e Zd ZeZdddZededd fddZede	ee
f dd fd	d
ZdededefddZdedefddZdedefddZdedefddZdefddZdS )rT   r   Nc                 C      d | _ d | _d S r)   )
_load_file_into_tablerL   r    r    r#   r<         
zMySQLLoadQueryBuilder.__init__rS   c                 C   
   || _ d S r)   )r   r?   rS   r    r    r#   rU         
zMySQLLoadQueryBuilder.loadr&   c                 C   "   t |tr
|| _d S t|| _d S r)   )ru   r   r   r?   r&   r    r    r#   into      "zMySQLLoadQueryBuilder.intoargsr   c                 O   P   d}| j r&| jr&|| jdi |7 }|| jdi |7 }|| jdi |7 }|S Nr6   r    )r   r   _load_file_sql_into_table_sql_options_sqlr?   r   r   r~   r    r    r#   r{         zMySQLLoadQueryBuilder.get_sqlc                 K      d | jS )NzLOAD DATA LOCAL INFILE '{}')r   r   r>   r    r    r#   r         z$MySQLLoadQueryBuilder._load_file_sqlc                 K      d | jjdi |S )Nz INTO TABLE `{}`r    )r   r   r{   r>   r    r    r#   r         z%MySQLLoadQueryBuilder._into_table_sqlc                 K   r   )Nz FIELDS TERMINATED BY ','r    r>   r    r    r#   r      r   z"MySQLLoadQueryBuilder._options_sqlc                 C      |   S r)   r   rL   r    r    r#   __str__      zMySQLLoadQueryBuilder.__str__rN   )r/   r0   r1   rQ   rF   r<   r   r4   rU   r   r   r   r   r{   r   r   r   r   r    r    r    r#   rT          
	rT   c                   @      e Zd ZdZdS )rW   rY   Nr/   r0   r1   rC   r    r    r    r#   rW          rW   c                   @   r   )rX   rY   Nr   r    r    r    r#   rX      r   rX   c                   @   sR   e Zd ZdZedddZededdfdd	Zed
eee	f ddfddZ
dS )VerticaQueryz5
    Defines a query class for use with Vertica.
    r   VerticaQueryBuilderc                 K   r   r   )r   r!   r    r    r#   r$      r%   zVerticaQuery._builderrS   VerticaCopyQueryBuilderc                 C   r(   r)   )r   	from_filerV   r    r    r#   r      r,   zVerticaQuery.from_filer&   VerticaCreateQueryBuilderc                 C   r(   r)   )r   r*   r+   r    r    r#   r*      r,   zVerticaQuery.create_tableN)r   r   )r/   r0   r1   r2   r3   r$   r4   r   r   r   r*   r    r    r    r#   r      s     r   c                       sZ   e Zd ZeZdeddf fddZededd fddZ	d	ededef fd
dZ
  ZS )r   r   r   Nc                    s"   t  jddtji| d | _d S r8   )r;   r<   r   VERTICA_hintr>   r@   r    r#   r<      s   
zVerticaQueryBuilder.__init__labelc                 C   r   r)   )r   )r?   r   r    r    r#   hint   r   zVerticaQueryBuilder.hintr   c                    sJ   t  j|i |}| jd ur#d|d d dj| jd|dd  g}|S )Nr6      z/*+label({hint})*/)r      )r;   r{   r   r   r   )r?   r   r   sqlr@   r    r#   r{     s   
*zVerticaQueryBuilder.get_sql)r/   r0   r1   r   rF   r   r<   r   r4   r   r{   rG   r    r    r@   r#   r      s    "r   c                       s   e Zd ZeZd fddZedddZedddZd	e	de
fd
dZde
f fddZd	e	de
fddZde
fddZ  ZS )r   r   Nc                    s    t  jtjd d| _d| _d S )NrK   F)r;   r<   r   r   _local_preserve_rowsrL   r@   r    r#   r<     s   
z"VerticaCreateQueryBuilder.__init__c                 C      | j stdd| _d S Nz)'Query' object has no attribute temporaryT)
_temporaryAttributeErrorr   rL   r    r    r#   local  ry   zVerticaCreateQueryBuilder.localc                 C   r   r   )r   r   r   rL   r    r    r#   preserve_rows  ry   z'VerticaCreateQueryBuilder.preserve_rowsr   c                 K   s2   dj | jrdnd| jrdnd| jjdi |dS )Nz&CREATE {local}{temporary}TABLE {table}zLOCAL r6   z
TEMPORARY )r   	temporaryr&   r    )r   r   r   _create_tabler{   r>   r    r    r#   _create_table_sql#  s
   z+VerticaCreateQueryBuilder._create_table_sqlc                    s"   t  jdi |}||  7 }|S r   )r;   _table_options_sql_preserve_rows_sql)r?   r   table_optionsr@   r    r#   r   *  s   z,VerticaCreateQueryBuilder._table_options_sqlc                 K   s    dj |  | jjdi |dS )Nz{preserve_rows} AS ({query}))r   queryr    )r   r   
_as_selectr{   r>   r    r    r#   _as_select_sql/  s   z(VerticaCreateQueryBuilder._as_select_sqlc                 C   s   | j rdS dS )Nz ON COMMIT PRESERVE ROWSr6   )r   rL   r    r    r#   r   5     z,VerticaCreateQueryBuilder._preserve_rows_sqlrN   )r   r   )r/   r0   r1   r   rF   r<   r   r   r   r   r4   r   r   r   r   rG   r    r    r@   r#   r     s    r   c                   @   r   )r   r   Nc                 C   r   r)   )_copy_table
_from_filerL   r    r    r#   r<   <  r   z VerticaCopyQueryBuilder.__init__rS   c                 C   r   r)   )r   r   r    r    r#   r   @  r   z!VerticaCopyQueryBuilder.from_filer&   c                 C   r   r)   )ru   r   r   r   r    r    r#   copy_D  r   zVerticaCopyQueryBuilder.copy_r   r   c                 O   r   r   )r   r   _copy_table_sql_from_file_sqlr   r   r    r    r#   r{   H  r   zVerticaCopyQueryBuilder.get_sqlc                 K   r   )Nz	COPY "{}"r    )r   r   r{   r>   r    r    r#   r   Q  r   z'VerticaCopyQueryBuilder._copy_table_sqlc                 K   r   )Nz FROM LOCAL '{}')r   r   r>   r    r    r#   r   T  r   z&VerticaCopyQueryBuilder._from_file_sqlc                 K   r   )Nz  PARSER fcsvparser(header=false)r    r>   r    r    r#   r   W  r   z$VerticaCopyQueryBuilder._options_sqlc                 C   r   r)   r   rL   r    r    r#   r   Z  r   zVerticaCopyQueryBuilder.__str__rN   )r/   r0   r1   r   rF   r<   r   r4   r   r   r   r   r   r{   r   r   r   r   r    r    r    r#   r   9  r   r   c                   @   &   e Zd ZdZededdfddZdS )OracleQueryz4
    Defines a query class for use with Oracle.
    r   r   OracleQueryBuilderc                 K   r   r   )r   r!   r    r    r#   r$   c  r%   zOracleQuery._builderNr/   r0   r1   r2   r3   r   r$   r    r    r    r#   r   ^      r   c                       sH   e Zd ZdZeZdeddf fddZdededef fddZ	  Z
S )	r   Nr   r   c                    r7   r8   )r;   r<   r   ORACLEr>   r@   r    r#   r<   l  rB   zOracleQueryBuilder.__init__r   c                       d|d< t  j|i |S NFgroupby_aliasr;   r{   r?   r   r   r@   r    r#   r{   o     zOracleQueryBuilder.get_sql)r/   r0   r1   rC   r   rF   r   r<   r4   r{   rG   r    r    r@   r#   r   h  s
    "r   c                   @   s   e Zd ZdZedddZdS )PostgreSQLQueryz8
    Defines a query class for use with PostgreSQL.
    r   PostgreSQLQueryBuilderc                 K   r   r   )r   r!   r    r    r#   r$   {  r%   zPostgreSQLQuery._builderNr   r   )r/   r0   r1   r2   r3   r$   r    r    r    r#   r   v  s    r   c                
       s  e Zd ZdZeZdeddf fddZdC fddZe	d	e
eef dd fd
dZe		dDdededeedf ddfddZe	de
eef dd fddZe	dCddZe		dEde
eef dee dd fddZe	dedd f fdd Ze	d!e
eef ddfd"d#Zdedef fd$d%Zd&edee fd'd(Zdedefd)d*Zdefd+d,Zdedefd-d.Ze	d/edd fd0d1Zd&eddfd2d3Z dFd4d5Z!d&e
eef ddfd6d7Z"d&e
eef ddfd8d9Z#d:eddfd;d<Z$dedefd=d>Z%dGd?ed@ededef fdAdBZ&  Z'S )Hr   r5   r   r   Nc                    sf   t  jddtji| g | _d| _d| _g | _d| _g | _	d | _
d | _g | _d| _d| _t | _d S Nr9   Fr    )r;   r<   r   
POSTGRESQL_returns_return_star_on_conflict_on_conflict_fields_on_conflict_do_nothing_on_conflict_do_updates_on_conflict_wheres_on_conflict_do_update_wheres_distinct_onr_   r`   ra   rb   r>   r@   r    r#   r<     s   zPostgreSQLQueryBuilder.__init__c                    rc   r)   )r;   rd   r   r  r	  re   r@   r    r#   rd     rg   zPostgreSQLQueryBuilder.__copy__fieldsc                 G   s@   |D ]}t |tr| jt| qt |tr| j| qd S r)   )ru   r4   r  rv   r   r   )r?   r  rr   r    r    r#   distinct_on  s   

z"PostgreSQLQueryBuilder.distinct_onFr    rh   ri   rj   .r   c                 C   rk   rl   rm   ro   r    r    r#   rp     rq   z!PostgreSQLQueryBuilder.for_updatetarget_fieldsc                 G   sV   | j stdd| _|D ]}t|tr| j| | qt|tr(| j| qd S )Nz(On conflict only applies to insert queryT)	_insert_tabler   r  ru   r4   r  rv   _conflict_field_strr   )r?   r  target_fieldr    r    r#   on_conflict  s   

z"PostgreSQLQueryBuilder.on_conflictc                 C   s    t | jdkrtdd| _d S )Nr   rt   T)lenr	  r   r  rL   r    r    r#   
do_nothing  s   
z!PostgreSQLQueryBuilder.do_nothingupdate_fieldupdate_valuec                 C   sp   | j rtdt|tr| |}nt|tr|}ntd|d ur.| j|t|f d S | j|d f d S )Nrt   zUnsupported update_field)	r  r   ru   r4   r  r   r	  rv   r   )r?   r  r  rr   r    r    r#   	do_update  s   

z PostgreSQLQueryBuilder.do_update	criterionc                    s   | j s	t |S t|trd S | jrtd| jr.| jr.| j	r)|  j	|M  _	d S || _	d S | jrB| j
r=|  j
|M  _
d S || _
d S td)Nz"DO NOTHING doest not support WHEREz(Can not have fieldless ON CONFLICT WHERE)r  r;   whereru   r   r  r   r  r	  r  r
  )r?   r  r@   r    r#   r    s   


zPostgreSQLQueryBuilder.wherer&   c                 C   s   | j | d S r)   )_usingrv   r   r    r    r#   using  s   zPostgreSQLQueryBuilder.usingc                    s:   | j rdjd fdd| j D dS t jdi  S )NzDISTINCT ON({distinct_on}) r   c                 3   $    | ]}|j dd di V  qdS r   TNr    r   r   r   r    r#   r        " z7PostgreSQLQueryBuilder._distinct_sql.<locals>.<genexpr>)r  r    )r  r   r   r;   _distinct_sqlr>   r@   r   r#   r     s
   z$PostgreSQLQueryBuilder._distinct_sqlr   c                 C   s   | j r
t|| j dS d S )Nr&   )r  r   r?   r   r    r    r#   r    s   z*PostgreSQLQueryBuilder._conflict_field_strc                    s   | j st| jdkr| jsdS td| jr| jstdd}| jr7 fdd| jD }|dd	| d
 7 }| jrK|dj| jjdddi d7 }|S )Nr   r6   z"No handler defined for on conflictz,Can not have fieldless on conflict do updatez ON CONFLICTc                    s    g | ]}|j dd di qS )r   Tr    r   )r   fr   r    r#   r     r   z;PostgreSQLQueryBuilder._on_conflict_sql.<locals>.<listcomp>z (r   ) WHERE {where}r   Tr  r    )	r  r  r	  r  r   r   r
  r   r{   )r?   r   conflict_queryr  r    r   r#   _on_conflict_sql  s   "z'PostgreSQLQueryBuilder._on_conflict_sqlc                    r   )	Nr   r   r   c                    r   r   r   r   r   r    r#   r     r   z:PostgreSQLQueryBuilder._for_update_sql.<locals>.<listcomp>r   r   r6   r   r   r    r   r#   r     r   z&PostgreSQLQueryBuilder._for_update_sqlc              	   K   s   | j rdS t| jdkrgg }| jD ]5\}}|r0|dj|jdi ||jdddi|d q|dj|jdi ||jdi |d qdjd	|d
}| jre|dj| jjdddd|d7 }|S dS )Nz DO NOTHINGr   r   with_namespaceTr   z{field}=EXCLUDED.{value}z DO UPDATE SET {updates}r   r   r%  )r   r)  r&  r6   r    )r  r  r	  rv   r   r{   r   r  )r?   r   r   rr   rs   
action_sqlr    r    r#   _on_conflict_action_sql  s2   z.PostgreSQLQueryBuilder._on_conflict_action_sqltermsc                 G   sv   |D ]6}t |tr| | qt |tr| | qt |ttfr.|jr(td| 	| q| 	| 
|| j qd S )Nz0Aggregate functions are not allowed in returning)ru   r   _return_fieldr4   _return_field_strr   r   is_aggregater   _return_otherwrap_constant_wrapper_cls)r?   r,  r   r    r    r#   	returning9  s   

z PostgreSQLQueryBuilder.returningc                 C   s   |  D ]=}t| j| j| jgstd|j| j| jhv }ttj	
dd | jD }t| j|B }t|j| }|sA|rAtdqd S )N%Returning can't be used in this queryc                 S   s   g | ]}|j jqS r    )r  tables_)r   jr    r    r#   r   M  s    zCPostgreSQLQueryBuilder._validate_returning_term.<locals>.<listcomp>z"You can't return from other tables)fields_anyr  _update_table_delete_fromr   r&   ra   	itertoolschainfrom_iterable_joins_fromr   r5  )r?   r   rr   table_is_insert_or_update_tablejoin_tablesjoin_and_base_tablestable_not_base_or_joinr    r    r#   _validate_returning_termG  s   z/PostgreSQLQueryBuilder._validate_returning_termc                 C   s   dd | j D | _ d| _d S )Nc                 S   s   g | ]	}t |d s|qS r!  )hasattr)r   r3  r    r    r#   r   T  s    z@PostgreSQLQueryBuilder._set_returns_for_star.<locals>.<listcomp>T)r  r  rL   r    r    r#   _set_returns_for_starS  s   
z,PostgreSQLQueryBuilder._set_returns_for_starc                 C   s6   | j rd S | | t|tr|   | j| d S r)   )r  rD  ru   r   rF  r  rv   r"  r    r    r#   r-  W  s   

z$PostgreSQLQueryBuilder._return_fieldc                 C   s   |dkr|    | jt  d S | jr | t|| jd d S | jr/| t|| jd d S | jr@| t|| j	d d d S t
d)N*r!  r   r4  )rF  r  rv   r   r  r-  r   r9  r:  r?  r   r"  r    r    r#   r.  c  s   z(PostgreSQLQueryBuilder._return_field_strfunctionc                 C   s   |  | | j| d S r)   )rD  r  rv   )r?   rH  r    r    r#   r0  r  s   
z$PostgreSQLQueryBuilder._return_otherc                    r   )Nz RETURNING {returning}r   c                 3   r  r  r   r   r   r    r#   r   x  r  z8PostgreSQLQueryBuilder._returning_sql.<locals>.<genexpr>)r3  )r   r   r  r>   r    r   r#   _returning_sqlv  s   z%PostgreSQLQueryBuilder._returning_sqlr   r   c                    sz   |  | tt| j||fi |}|| jdi |7 }|| jdi |7 }| jr;| jo.| j|d< || j	di |7 }|S )Nr)  r    )
rz   r;   r   r{   r(  r+  r  r9  from_rI  )r?   r   r   r   r~   r@   r    r#   r{   {  s   
zPostgreSQLQueryBuilder.get_sqlr  r   r)   rN   FF)(r/   r0   r1   rD   r   rF   r   r<   rd   r   r   r4   r   r  r   r   rp   r  r  r   r   r  r   r  r   r  r   r  r(  r   r+  r3  rD  rF  r-  r.  r0  rI  r{   rG   r    r    r@   r#   r     sb    


(r   c                   @   r   )RedshiftQueryz=
    Defines a query class for use with Amazon Redshift.
    r   r   RedShiftQueryBuilderc                 K   s   t ddtji|S r8   )rM  r   REDSHIFTr!   r    r    r#   r$     s   zRedshiftQuery._builderNr   r    r    r    r#   rL    r   rL  c                   @   s   e Zd ZeZdS )rM  N)r/   r0   r1   rL  rF   r    r    r    r#   rM    r   rM  c                   @   r   )
MSSQLQueryB
    Defines a query class for use with Microsoft SQL Server.
    r   r   MSSQLQueryBuilderc                 K   r   r   )rQ  r!   r    r    r#   r$     r%   zMSSQLQuery._builderNr   r    r    r    r#   rO    r   rO  c                
       s   e Zd ZeZdeddf fddZeddee	e
f ded	edd fd
dZede
dd fddZde	fddZde	fddZde	de	fddZdedede	f fddZde	fddZdede	fddZ  ZS )rQ  r   r   Nc                    s.   t  jddtji| d | _d| _d| _d S r  )r;   r<   r   MSSQL_top_top_with_ties_top_percentr>   r@   r    r#   r<     s   
zMSSQLQueryBuilder.__init__Frs   percent	with_tiesc                 C   sb   zt || _W n ty   tdw |r)dt |  kr$dks)td td|| _|| _dS )z
        Implements support for simple TOP clauses.
        https://docs.microsoft.com/en-us/sql/t-sql/queries/top-transact-sql?view=sql-server-2017
        zTOP value must be an integerr   d   z?TOP value must be between 0 and 100 when `percent` is specifiedN)intrS  
ValueErrorr   rU  rT  )r?   rs   rV  rW  r    r    r#   top  s   
zMSSQLQueryBuilder.toplimitc                 C   r   r)   )_limit)r?   r\  r    r    r#   
fetch_next  s   
zMSSQLQueryBuilder.fetch_nextc                 C   s   dj | jpddS )Nz OFFSET {offset} ROWSr   )offset)r   _offsetrL   r    r    r#   _offset_sql  s   zMSSQLQueryBuilder._offset_sqlc                 C   s   dj | jdS )Nz FETCH NEXT {limit} ROWS ONLY)r\  )r   r]  rL   r    r    r#   
_limit_sql  r   zMSSQLQueryBuilder._limit_sqlr~   c                 C   s6   | j d us| jr||  7 }| j d ur||  7 }|S r)   )r]  r`  ra  rb  )r?   r~   r    r    r#   _apply_pagination  s
   
z#MSSQLQueryBuilder._apply_paginationr   c                    r   r   r   r   r@   r    r#   r{     r   zMSSQLQueryBuilder.get_sqlc                 C   s<   d}| j rd| j  d}| jr| d}| jr| d}|S )Nr6   zTOP (z) zPERCENT z
WITH TIES )rS  rU  rT  )r?   _top_statementr    r    r#   _top_sql  s   

zMSSQLQueryBuilder._top_sqlc                    s4   dj |  | jr
dndd fdd| jD dS )NzSELECT {distinct}{top}{select}r   r6   r   c                 3   r   r   r   r   r   r    r#   r     r   z0MSSQLQueryBuilder._select_sql.<locals>.<genexpr>)r[  r   r   )r   re  r   r   r   r>   r    r   r#   r     s
   zMSSQLQueryBuilder._select_sqlrK  )r/   r0   r1   rO  rF   r   r<   r   r   r4   rY  r   r[  r^  ra  rb  rc  r{   re  r   rG   r    r    r@   r#   rQ    s    &rQ  c                   @   s   e Zd ZdZededdfddZedeee	f ddfd	d
Z
edeee	f ddfddZede	ddfddZede	ddfddZede	ddfddZede	ddfddZdS )ClickHouseQueryz?
    Defines a query class for use with Yandex ClickHouse.
    r   r   ClickHouseQueryBuilderc                 K   s   t dtjddd|S )NFT)r9   rZ   
as_keywordr    )rg  r   
CLICKHOUSEr!   r    r    r#   r$     s
   zClickHouseQuery._builderdatabaseClickHouseDropQueryBuilderc                 C   r(   r)   )rk  drop_database)r?   rj  r    r    r#   rl    r,   zClickHouseQuery.drop_databaser&   c                 C   r(   r)   )rk  r.   r   r    r    r#   r.     r,   zClickHouseQuery.drop_table
dictionaryc                 C   r(   r)   )rk  drop_dictionaryr?   rm  r    r    r#   rn    r,   zClickHouseQuery.drop_dictionaryquotac                 C   r(   r)   )rk  
drop_quotar?   rp  r    r    r#   rq     r,   zClickHouseQuery.drop_quotauserc                 C   r(   r)   )rk  	drop_user)r?   rs  r    r    r#   rt    r,   zClickHouseQuery.drop_userviewc                 C   r(   r)   )rk  	drop_view)r?   ru  r    r    r#   rv    r,   zClickHouseQuery.drop_viewN)r/   r0   r1   r2   r3   r   r$   r   r	   r4   rl  r   r.   rn  rq  rt  rv  r    r    r    r#   rf    s     rf  c                   @   sb   e Zd ZeZededefddZdedefddZ	dde
dedefd	d
ZdedefddZdS )rg  r   r   c                  K   r   )NzALTER TABLEr    r   r    r    r#   _delete_sql  s   z"ClickHouseQueryBuilder._delete_sqlc                 K   s   dj | jjdi |dS )NzALTER TABLE {table}r!  r    )r   r9  r{   r>   r    r    r#   _update_sql  s   z"ClickHouseQueryBuilder._update_sqlFr)  c                    s8   d  fdd| jD }| jrdj|dS dj|dS )Nr   c                 3   r   )T)r   r   Nr    r   )r   clauser   r    r#   r     r   z3ClickHouseQueryBuilder._from_sql.<locals>.<genexpr>z {selectable} DELETE)
selectablez FROM {selectable})r   r?  r:  r   )r?   r)  r   rz  r    r   r#   	_from_sql  s   z ClickHouseQueryBuilder._from_sqlc                    r   )Nz UPDATE {set}r   c              	   3   sB    | ]\}}d j |jdi t dd|jdi  dV  qdS )r   F)r)  r   Nr    )r   r{   dictr   r   r    r#   r     s    $
z2ClickHouseQueryBuilder._set_sql.<locals>.<genexpr>)ra   )r   r   _updatesr>   r    r   r#   _set_sql  s
   zClickHouseQueryBuilder._set_sqlN)F)r/   r0   r1   rf  rF   staticmethodr   r4   rw  rx  r   r{  r~  r    r    r    r#   rg    s    rg  c                       s   e Zd ZeZ fddZededd f fddZededd f fdd	Z	ed
edd fddZ
dedef fddZ  ZS )rk  c                    s   t  jtjd d | _d S rJ   )r;   r<   r   ri  _cluster_namerL   r@   r    r#   r<   +  s   
z#ClickHouseDropQueryBuilder.__init__rm  r   c                       t  d| d S )N
DICTIONARYr;   _set_targetro  r@   r    r#   rn  /     z*ClickHouseDropQueryBuilder.drop_dictionaryrp  c                    r  )NQUOTAr  rr  r@   r    r#   rq  3  r  z%ClickHouseDropQueryBuilder.drop_quotaclusterc                 C   s   | j rtd|| _ d S )Nz5'DropQuery' object already has attribute cluster_name)r  r   )r?   r  r    r    r#   
on_cluster7  s   
z%ClickHouseDropQueryBuilder.on_clusterr   c                    sB   t  jdi |}| jdkr| jd ur|dt| jt  j 7 }|S )Nr  z ON CLUSTER r    )r;   r{   _drop_target_kindr  r   rC   )r?   r   r   r@   r    r#   r{   =  s   z"ClickHouseDropQueryBuilder.get_sql)r/   r0   r1   rf  rF   r<   r   r4   rn  rq  r  r   r{   rG   r    r    r@   r#   rk  (  s    rk  c                       s&   e Zd Zdedef fddZ  ZS )SQLLiteValueWrapperr   r   c                    s,   t | jtr| jrdS dS t jdi |S )N10r    )ru   rs   r   r;   get_value_sqlr>   r@   r    r#   r  G  s   z!SQLLiteValueWrapper.get_value_sql)r/   r0   r1   r   r4   r  rG   r    r    r@   r#   r  F  s    r  c                   @   r   )SQLLiteQueryrP  r   r   SQLLiteQueryBuilderc                 K   r   r   )r  r!   r    r    r#   r$   R  r%   zSQLLiteQuery._builderNr   r    r    r    r#   r  M  r   r  c                       sV   e Zd ZeZdeddf fddZededd fddZdede	f fd	d
Z
  ZS )r  r   r   Nc                    s$   t  jdtjtd| d| _d S )N)r9   wrapper_clsFr    )r;   r<   r   SQLLITEr  _insert_or_replacer>   r@   r    r#   r<   Z  s   
zSQLLiteQueryBuilder.__init__r,  c                 G   s   | j |  d| _d| _d S rl   )_apply_terms_replacer  )r?   r,  r    r    r#   insert_or_replace^  s   

z%SQLLiteQueryBuilder.insert_or_replacec                    s$   | j rdnd}|t jdi | S )Nz
INSERT OR r6   r    )r  r;   _replace_sql)r?   r   prefixr@   r    r#   r  d  s   z SQLLiteQueryBuilder._replace_sql)r/   r0   r1   r  rF   r   r<   r   r  r4   r  rG   r    r    r@   r#   r  W  s    r  ):r;  r   typingr   r   r   r   r   pypika.enumsr   pypika.queriesr   r	   r
   r   r   r   r   pypika.termsr   r   r   r   r   r   r   r   pypika.utilsr   r   r   r   r   r'   r-   rQ   rR   rT   rW   rX   r   r   r   r   r   r   r   r   rL  rM  rO  rQ  rf  rg  rk  r  r  r  r    r    r    r#   <module>   sH    $(	
e%,%

  

H$
