o
    vi                     @  s  d dl mZ d dl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
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mZ d dlmZ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Z0G d+d, d,eZ1G d-d. d.eZ2G d/d0 d0eZ3G d1d2 d2eZ4G d3d4 d4e-Z5G d5d6 d6eZ6G d7d8 d8eZ7G d9d: d:eZ8G d;d< d<eZ9G d=d> d>eZ:G d?d@ d@eZ;G dAdB dBeZ<G dCdD dDeZ=G dEdF dFeZ>G dGdH dHe>Z?G dIdJ dJeZ@G dKdL dLeZAdS )M    )annotationsN)copy)Any)Dialects)CreateQueryBuilderDatabaseDropQueryBuilderQueryQueryBuilder
SelectableTable)	ArithmeticExpression	CriterionEmptyCriterionFieldFunctionNullCriterionStarTermValueWrapper)QueryExceptionbuilderformat_alias_sqlformat_quotesc                   @  s:   e Zd ZdZedddZedddZedddZdS )SnowflakeQueryz7
    Defines a query class for use with Snowflake.
    kwargsr   returnSnowflakeQueryBuilderc                 K     t di |S N )r   clsr   r    r    N/home/air/biblejyuku/back/venv/lib/python3.10/site-packages/pypika/dialects.py_builder%      zSnowflakeQuery._buildertablestr | 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)r   r   r   r   )r&   r'   r   r(   )r&   r'   r   r.   )__name__
__module____qualname____doc__classmethodr$   r+   r/   r    r    r    r#   r           r   c                      s.   e Zd ZdZdZdZeZd
 fdd	Z  Z	S )r   N" r   r   r   Nonec                      t  jddtji| d S Ndialectr    super__init__r   	SNOWFLAKEselfr   	__class__r    r#   r>   8      zSnowflakeQueryBuilder.__init__r   r   r   r8   )
r0   r1   r2   
QUOTE_CHARALIAS_QUOTE_CHARQUERY_ALIAS_QUOTE_CHARr   	QUERY_CLSr>   __classcell__r    r    rB   r#   r   2   s    r   c                      &   e Zd ZdZeZd fddZ  ZS )r(   Nr   r8   c                      t  jtjd d S Nr;   r<   rA   rB   r    r#   r>   @      z$SnowflakeCreateQueryBuilder.__init__r   r8   r0   r1   r2   rF   r   rI   r>   rJ   r    r    rB   r#   r(   <       r(   c                      rK   )r.   Nr   r8   c                   rL   rM   r<   rO   rB   r    r#   r>   H   rP   z"SnowflakeDropQueryBuilder.__init__rQ   rR   r    r    rB   r#   r.   D   rS   r.   c                   @  sH   e Zd ZdZedddZedddZedddZedddZdS )
MySQLQueryz3
    Defines a query class for use with MySQL.
    r   r   r   MySQLQueryBuilderc                 K  r   r   )rU   r!   r    r    r#   r$   Q   r%   zMySQLQuery._builderfpstrMySQLLoadQueryBuilderc                 C  r)   r*   )rX   loadr"   rV   r    r    r#   rY   U   r-   zMySQLQuery.loadr&   r'   MySQLCreateQueryBuilderc                 C  r)   r*   )r[   r+   r,   r    r    r#   r+   Y   r-   zMySQLQuery.create_tableMySQLDropQueryBuilderc                 C  r)   r*   )r\   r/   r,   r    r    r#   r/   ]   r-   zMySQLQuery.drop_tableN)r   r   r   rU   )rV   rW   r   rX   )r&   r'   r   r[   )r&   r'   r   r\   )	r0   r1   r2   r3   r4   r$   rY   r+   r/   r    r    r    r#   rT   L   s    rT   c                      s   e Zd ZdZeZd' fddZd( fdd	Zed)d*ddZ	ed+ddZ
ed,ddZd- fddZd.ddZd-dd Zd.d!d"Zed/d#d$Zd-d%d&Z  ZS )0rU   `r   r   r   r8   c                   sB   t  jddtji| g | _d| _g | _d| _d| _t	 | _
d S Nr;   Fr    )r=   r>   r   MYSQL_duplicate_updates_ignore_duplicates
_modifiers_for_update_nowait_for_update_skip_lockedset_for_update_ofr@   rB   r    r#   r>   f   s   zMySQLQueryBuilder.__init__c                   &   t   }t| j|_t| j|_|S r*   )r=   __copy__r   r`   ra   rA   newonerB   r    r#   rh   p      
zMySQLQueryBuilder.__copy__Fr    nowaitboolskip_lockedoftuple[str, ...]c                 C      d| _ || _|| _t|| _d S NT_for_updaterd   rc   re   rf   rA   rl   rn   ro   r    r    r#   
for_updatev      zMySQLQueryBuilder.for_updatefieldField | strvaluec                 C  s<   | j rtdt|tst|n|}| j|t|f d S )N"Can not have two conflict handlers)ra   r   
isinstancer   r`   appendr   )rA   rx   rz   r    r    r#   on_duplicate_key_update}   s   z)MySQLQueryBuilder.on_duplicate_key_updatec                 C  s   | j rtdd| _d S )Nr{   T)r`   r   ra   rO   r    r    r#   on_duplicate_key_ignore      
z)MySQLQueryBuilder.on_duplicate_key_ignorerW   c                   sT   |  | t jdi |}|r(| jr|| jdi |7 }|S | jr(||  7 }|S r   )_set_kwargs_defaultsr=   get_sqlr`   _on_duplicate_key_update_sqlra   _on_duplicate_key_ignore_sql)rA   r   querystringrB   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 LOCKEDr7   rt   rf   joinrc   rd   rA   r   rv   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}rx   rz   Nr    )formatr   r   rx   rz   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    rO   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)rb   r}   )rA   rz   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 r7   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   	_distinctrb   r   _selectsr@   r    r   r#   _select_sql   s
   zMySQLQueryBuilder._select_sqlrE   )r   rU   FFr    )rl   rm   rn   rm   ro   rp   r   r8   )rx   ry   rz   r   r   r8   rQ   r   r   r   rW   r   rW   )rz   rW   r   r8   )r0   r1   r2   rF   rT   rI   r>   rh   r   rv   r~   r   r   r   r   r   r   r   rJ   r    r    rB   r#   rU   b   s$    




	rU   c                   @  h   e Zd ZeZdddZedddZedddZdddZ	dddZ
dddZdddZd ddZdS )!rX   r   r8   c                 C     d | _ d | _d S r*   )
_load_file_into_tablerO   r    r    r#   r>         
zMySQLLoadQueryBuilder.__init__rV   rW   c                 C  
   || _ d S r*   )r   rA   rV   r    r    r#   rY         
zMySQLLoadQueryBuilder.loadr&   r'   c                 C  "   t |tr
|| _d S t|| _d S r*   )r|   r   r   rA   r&   r    r    r#   into      "zMySQLLoadQueryBuilder.intoargsr   r   c                 O  P   d}| j r&| jr&|| jdi |7 }|| jdi |7 }|| jdi |7 }|S Nr7   r    )r   r   _load_file_sql_into_table_sql_options_sqlrA   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   rO   r    r    r#   __str__      zMySQLLoadQueryBuilder.__str__NrQ   rV   rW   r   r8   r&   r'   r   r8   r   r   r   r   r   rW   r   r   )r0   r1   r2   rT   rI   r>   r   rY   r   r   r   r   r   r   r    r    r    r#   rX          


	

rX   c                   @     e Zd ZdZdS )r[   r]   Nr0   r1   r2   rF   r    r    r    r#   r[          r[   c                   @  r   )r\   r]   Nr   r    r    r    r#   r\      r   r\   c                   @  s:   e Zd ZdZedddZedd	d
Zed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._builderrV   rW   VerticaCopyQueryBuilderc                 C  r)   r*   )r   	from_filerZ   r    r    r#   r      r-   zVerticaQuery.from_filer&   r'   VerticaCreateQueryBuilderc                 C  r)   r*   )r   r+   r,   r    r    r#   r+      r-   zVerticaQuery.create_tableN)r   r   )rV   rW   r   r   )r&   r'   r   r   )r0   r1   r2   r3   r4   r$   r   r+   r    r    r    r#   r      r5   r   c                      s>   e Zd ZeZd fddZedd	d
Zd fddZ  Z	S )r   r   r   r   r8   c                   s"   t  jddtji| d | _d S r:   )r=   r>   r   VERTICA_hintr@   rB   r    r#   r>     s   
zVerticaQueryBuilder.__init__labelrW   c                 C  r   r*   )r   )rA   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 )Nr7      z/*+label({hint})*/)r      )r=   r   r   r   r   )rA   r   r   sqlrB   r    r#   r     s   
*zVerticaQueryBuilder.get_sqlrE   )r   rW   r   r8   r   )
r0   r1   r2   r   rI   r>   r   r   r   rJ   r    r    rB   r#   r     s    r   c                      sj   e Zd ZeZd fddZedddZedddZdddZ	d fddZ
dddZdddZ  ZS )r   r   r8   c                   s    t  jtjd d| _d| _d S )NrN   F)r=   r>   r   r   _local_preserve_rowsrO   rB   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   rO   r    r    r#   local   r   zVerticaCreateQueryBuilder.localc                 C  r   r   )r   r   r   rO   r    r    r#   preserve_rows'  r   z'VerticaCreateQueryBuilder.preserve_rowsr   r   rW   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 r7   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)rA   r   table_optionsrB   r    r#   r   5  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 ROWSr7   )r   rO   r    r    r#   r   @     z,VerticaCreateQueryBuilder._preserve_rows_sqlrQ   r   r   )r0   r1   r2   r   rI   r>   r   r   r   r   r   r   r   rJ   r    r    rB   r#   r     s    

r   c                   @  r   )!r   r   r8   c                 C  r   r*   )_copy_table
_from_filerO   r    r    r#   r>   G  r   z VerticaCopyQueryBuilder.__init__rV   rW   c                 C  r   r*   )r   r   r    r    r#   r   K  r   z!VerticaCopyQueryBuilder.from_filer&   r'   c                 C  r   r*   )r|   r   r   r   r    r    r#   copy_O  r   zVerticaCopyQueryBuilder.copy_r   r   r   c                 O  r   r   )r   r   _copy_table_sql_from_file_sqlr   r   r    r    r#   r   S  r   zVerticaCopyQueryBuilder.get_sqlc                 K  r   )Nz	COPY "{}"r    )r   r   r   r@   r    r    r#   r   \  r   z'VerticaCopyQueryBuilder._copy_table_sqlc                 K  r   )Nz FROM LOCAL '{}')r   r   r@   r    r    r#   r   _  r   z&VerticaCopyQueryBuilder._from_file_sqlc                 K  r   )Nz  PARSER fcsvparser(header=false)r    r@   r    r    r#   r   b  r   z$VerticaCopyQueryBuilder._options_sqlc                 C  r   r*   r   rO   r    r    r#   r   e  r   zVerticaCopyQueryBuilder.__str__NrQ   r   r   r   r   r   )r0   r1   r2   r   rI   r>   r   r   r   r   r   r   r   r   r    r    r    r#   r   D  r   r   c                   @  s.   e Zd ZdddZdddZedd
dZdS )"FetchNextAndOffsetRowsQueryBuilderr   rW   c                 C  s   dj | jdS )Nz FETCH NEXT {limit} ROWS ONLY)limit)r   _limitrO   r    r    r#   
_limit_sqlj  r   z-FetchNextAndOffsetRowsQueryBuilder._limit_sqlc                 C  s   dj | jpddS )Nz OFFSET {offset} ROWSr   )offset)r   _offsetrO   r    r    r#   _offset_sqlm  s   z.FetchNextAndOffsetRowsQueryBuilder._offset_sqlr   intr8   c                 C  s   t dt || _d S )Nz:`fetch_next` is deprecated - please use the `limit` method)warningswarnDeprecationWarningr   )rA   r   r    r    r#   
fetch_nextp  s   
z-FetchNextAndOffsetRowsQueryBuilder.fetch_nextNr   )r   r  r   r8   )r0   r1   r2   r   r  r   r  r    r    r    r#   r   i  s
    

r   c                   @     e Zd ZdZed	ddZdS )
OracleQueryz4
    Defines a query class for use with Oracle.
    r   r   r   OracleQueryBuilderc                 K  r   r   )r  r!   r    r    r#   r$   {  r%   zOracleQuery._builderN)r   r   r   r  r0   r1   r2   r3   r4   r$   r    r    r    r#   r
  v      r
  c                      s>   e Zd ZdZeZd fddZd fd
dZdddZ  Z	S )r  Nr   r   r   r8   c                   r9   r:   )r=   r>   r   ORACLEr@   rB   r    r#   r>     rD   zOracleQueryBuilder.__init__r   rW   c                      d|d< t  j|i |S NFgroupby_aliasr=   r   rA   r   r   rB   r    r#   r        zOracleQueryBuilder.get_sqlr   c                 K  s,   | j r	||  7 }| jd ur||  7 }|S r*   )r  r  r   r   rA   r   r   r    r    r#   _apply_pagination  s
   
z$OracleQueryBuilder._apply_paginationrE   r   r   rW   r   rW   )
r0   r1   r2   rF   r
  rI   r>   r   r  rJ   r    r    rB   r#   r    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  r    r    r    r#   r    r  r  c                      s.  e Zd ZdZeZdN fddZdO fdd	ZedPddZ	edQdRddZ
edSddZedTddZedUdVd"d#ZedW fd&d'ZedXd*d+ZdY fd-d.ZdZd1d2ZdYd3d4Zd[d5d6ZdYd7d8Zed\d:d;Zd]d=d>ZdTd?d@Zd^dAdBZd^dCdDZd_dFdGZdYdHdIZd`da fdLdMZ  ZS )br  r6   r   r   r   r8   c                   sf   t  jddtji| g | _d| _d| _g | _d| _g | _	d | _
d | _g | _d| _d| _t | _d S r^   )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_onrc   rd   re   rf   r@   rB   r    r#   r>     s   zPostgreSQLQueryBuilder.__init__c                   rg   r*   )r=   rh   r   r  r!  ri   rB   r    r#   rh     rk   zPostgreSQLQueryBuilder.__copy__fields
str | Termc                 G  @   |D ]}t |tr| jt| qt |tr| j| qd S r*   r|   rW   r$  r}   r   r   rA   r%  rx   r    r    r#   distinct_on     

z"PostgreSQLQueryBuilder.distinct_onFr    rl   rm   rn   ro   rp   r
   c                 C  rq   rr   rs   ru   r    r    r#   rv     rw   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  r|   rW   r  r}   _conflict_field_strr   )rA   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   r{   T)lenr!  r   r   rO   r    r    r#   
do_nothing  s   
z!PostgreSQLQueryBuilder.do_nothingNupdate_fieldstr | Fieldupdate_value
Any | Nonec                 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 )Nr{   zUnsupported update_field)	r   r   r|   rW   r.  r   r!  r}   r   )rA   r3  r5  rx   r    r    r#   	do_update  s   

z PostgreSQLQueryBuilder.do_update	criterionr   c                   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=   wherer|   r   r   r   r  r!  r#  r"  )rA   r8  rB   r    r#   r9    s   


zPostgreSQLQueryBuilder.wherer&   Selectable | strc                 C  s   | j | d S r*   )_usingr}   r   r    r    r#   using	  s   zPostgreSQLQueryBuilder.usingrW   c                   :   | j rdjd fdd| j D dS t jdi  S )N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@   rB   r   r#   rD    
   z$PostgreSQLQueryBuilder._distinct_sqlr   Field | Nonec                 C  s   | j r
t|| j dS d S Nr&   )r-  r   rA   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   r7   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r9  r    )	r   r1  r!  r  r   r   r"  r   r   )rA   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   r7   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   rL  )r   rP  rM  r7   r    )r   r1  r!  r}   r   r   r   r#  )rA   r   r   rx   rz   
action_sqlr    r    r#   _on_conflict_action_sql9  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)r|   r   _return_fieldrW   _return_field_strr   r   is_aggregater   _return_otherwrap_constant_wrapper_cls)rA   rS  r   r    r    r#   	returningW  s   

z PostgreSQLQueryBuilder.returningr   c                 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    )r8  tables_)r   jr    r    r#   r   k  s    zCPostgreSQLQueryBuilder._validate_returning_term.<locals>.<listcomp>z"You can't return from other tables)fields_anyr-  _update_table_delete_fromr   r&   re   	itertoolschainfrom_iterable_joins_fromrm   r\  )rA   r   rx   table_is_insert_or_update_tablejoin_tablesjoin_and_base_tablestable_not_base_or_joinr    r    r#   _validate_returning_terme  s   z/PostgreSQLQueryBuilder._validate_returning_termc                 C  s   dd | j D | _ d| _d S )Nc                 S  s   g | ]	}t |d s|qS rH  )hasattr)r   rZ  r    r    r#   r   r  s    z@PostgreSQLQueryBuilder._set_returns_for_star.<locals>.<listcomp>T)r  r  rO   r    r    r#   _set_returns_for_starq  s   
z,PostgreSQLQueryBuilder._set_returns_for_starc                 C  s6   | j rd S | | t|tr|   | j| d S r*   )r  rk  r|   r   rm  r  r}   rI  r    r    r#   rT  u  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*rH  r   r[  )rm  r  r}   r   r-  rT  r   r`  ra  rf  r   rI  r    r    r#   rU    s   z(PostgreSQLQueryBuilder._return_field_strfunctionc                 C  s   |  | | j| d S r*   )rk  r  r}   )rA   ro  r    r    r#   rW    s   
z$PostgreSQLQueryBuilder._return_otherc                   r   )Nz RETURNING {returning}r   c                 3  r?  r@  r   r   r   r    r#   r     rA  z8PostgreSQLQueryBuilder._returning_sql.<locals>.<genexpr>)rZ  )r   r   r  r@   r    r   r#   _returning_sql  s   z%PostgreSQLQueryBuilder._returning_sqlr   r   c                   sv   |  | t j||fi |}|| jdi |7 }|| jdi |7 }| jr9| jo,| j|d< || jdi |7 }|S )NrP  r    )	r   r=   r   rO  rR  r  r`  from_rp  )rA   r   r   r   r   rB   r    r#   r     s   
zPostgreSQLQueryBuilder.get_sqlrE   r  r%  r&  r   r8   r   )rl   rm   rn   rm   ro   rp   r   r
   )r,  r&  r   r8   rQ   r*   )r3  r4  r5  r6  r   r8   )r8  r   r   r8   )r&   r:  r   r8   r   )r   rW   r   rF  r   rS  r   r   r8   )r   r   r   r8   )r   r4  r   r8   )ro  r   r   r8   FF)r   rm   r   rm   r   r   r   rW   )r0   r1   r2   rG   r  rI   r>   rh   r   r*  rv   r0  r2  r7  r9  r<  rD  r.  rO  r   rR  rZ  rk  rm  rT  rU  rW  rp  r   rJ   r    r    rB   r#   r    sB    









r  c                   @  r	  )
RedshiftQueryz=
    Defines a query class for use with Amazon Redshift.
    r   r   r   RedShiftQueryBuilderc                 K  s   t ddtji|S r:   )rv  r   REDSHIFTr!   r    r    r#   r$     s   zRedshiftQuery._builderN)r   r   r   rv  r  r    r    r    r#   ru    r  ru  c                   @  s   e Zd ZeZdS )rv  N)r0   r1   r2   ru  rI   r    r    r    r#   rv    r   rv  c                   @  r	  )

MSSQLQueryB
    Defines a query class for use with Microsoft SQL Server.
    r   r   r   MSSQLQueryBuilderc                 K  r   r   )rz  r!   r    r    r#   r$     r%   zMSSQLQuery._builderN)r   r   r   rz  r  r    r    r    r#   rx    r  rx  c                      s^   e Zd ZeZd fddZeddddZdddZd fddZ	dddZ
d ddZ  ZS )!rz  r   r   r   r8   c                   s.   t  jddtji| d | _d| _d| _d S r^   )r=   r>   r   MSSQL_top_top_with_ties_top_percentr@   rB   r    r#   r>     s   
zMSSQLQueryBuilder.__init__Frz   	str | intpercentrm   	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)r  r|  
ValueErrorr   r~  r}  )rA   rz   r  r  r    r    r#   top  s   
zMSSQLQueryBuilder.topr   rW   c                 K  s6   | j d us| jr||  7 }| j d ur||  7 }|S r*   )r   r  r  r   r  r    r    r#   r    s
   
z#MSSQLQueryBuilder._apply_paginationr   c                   r  r  r  r  rB   r    r#   r     r  zMSSQLQueryBuilder.get_sqlc                 C  s<   d}| j rd| j  d}| jr| d}| jr| d}|S )Nr7   zTOP (z) zPERCENT z
WITH TIES )r|  r~  r}  )rA   _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   r7   r   c                 3  r   r   r   r   r   r    r#   r     r   z0MSSQLQueryBuilder._select_sql.<locals>.<genexpr>)r  r   r   )r   r  r   r   r   r@   r    r   r#   r     s
   zMSSQLQueryBuilder._select_sqlrE   rt  )rz   r  r  rm   r  rm   r   r8   r  r   r   r   )r0   r1   r2   rx  rI   r>   r   r  r  r   r  r   rJ   r    r    rB   r#   rz    s    

rz  c                   @  sr   e Zd ZdZedddZed ddZed!ddZed"ddZed#ddZ	ed$ddZ
ed%ddZdS )&ClickHouseQueryz?
    Defines a query class for use with Yandex ClickHouse.
    r   r   r   ClickHouseQueryBuilderc                 K  s   t dtjddd|S )NFT)r;   wrap_set_operation_queries
as_keywordr    )r  r   
CLICKHOUSEr!   r    r    r#   r$     s
   zClickHouseQuery._builderdatabaseDatabase | strClickHouseDropQueryBuilderc                 C  r)   r*   )r  drop_database)rA   r  r    r    r#   r    r-   zClickHouseQuery.drop_databaser&   Table | strc                 C  r)   r*   )r  r/   r   r    r    r#   r/     r-   zClickHouseQuery.drop_table
dictionaryrW   c                 C  r)   r*   )r  drop_dictionaryrA   r  r    r    r#   r    r-   zClickHouseQuery.drop_dictionaryquotac                 C  r)   r*   )r  
drop_quotarA   r  r    r    r#   r    r-   zClickHouseQuery.drop_quotauserc                 C  r)   r*   )r  	drop_user)rA   r  r    r    r#   r    r-   zClickHouseQuery.drop_userviewc                 C  r)   r*   )r  	drop_view)rA   r  r    r    r#   r    r-   zClickHouseQuery.drop_viewN)r   r   r   r  )r  r  r   r  )r&   r  r   r  )r  rW   r   r  )r  rW   r   r  )r  rW   r   r  )r  rW   r   r  )r0   r1   r2   r3   r4   r$   r  r/   r  r  r  r  r    r    r    r#   r    s     r  c                      s   e Zd ZU eZded< ded< d7 fddZd8 fd	d
Zed7ddZ	ed9d:ddZ
ed;ddZd;ddZd<d=ddZd;d d!Zed>d$d%Zd; fd&d'Zed?d)d*Zed?d+d,Zd@ fd.d/Zd;d0d1ZdA fd5d6Z  ZS )Br  z
list[Term]r$  z"tuple[int, int, list[Term]] | None	_limit_byr   r8   c                   s4   t  jdi | d| _d | _d | _g | _d | _d S )NFr    )r=   r>   _final_sample_sample_offsetr$  r  r@   rB   r    r#   r>   &  s   
zClickHouseQueryBuilder.__init__c                   s   t   }t| j|_|S r*   )r=   rh   r   r  ri   rB   r    r#   rh   .  s   
zClickHouseQueryBuilder.__copy__c                 C  s
   d| _ d S rr   )r  rO   r    r    r#   final3  r   zClickHouseQueryBuilder.finalNsampler  r  
int | Nonec                 C  s   || _ || _d S r*   )r  r  )rA   r  r  r    r    r#   r  7  s   
zClickHouseQueryBuilder.sampler   r   rW   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}rH  r    )r   r`  r   r@   r    r    r#   _update_sql@     z"ClickHouseQueryBuilder._update_sqlFrP  rm   c                   s   d  fdd| jD }| jrd| dS |g}| jdur#|d | jd ur1|d| j  | jd ur?|d	| j  d
jd |dS )Nr   c                 3  r   )T)r   r   Nr    r   )r   clauser   r    r#   r   D  r   z3ClickHouseQueryBuilder._from_sql.<locals>.<genexpr>r   z DELETEFFINALzSAMPLE zOFFSET z FROM {clauses})clauses)r   rf  ra  r  r}   r  r  r   )rA   rP  r   
selectabler  r    r   r#   	_from_sqlC  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)rP  r   Nr    )r   r   dictr   r   r    r#   r   R  s    $
z2ClickHouseQueryBuilder._set_sql.<locals>.<genexpr>)re   )r   r   _updatesr@   r    r   r#   _set_sqlP  s
   zClickHouseQueryBuilder._set_sqlr%  r&  c                 G  r'  r*   r(  r)  r    r    r#   r*  Z  r+  z"ClickHouseQueryBuilder.distinct_onc                   r=  )Nr>  r   c                 3  r?  r@  r   r   r   r    r#   r   e  rA  z7ClickHouseQueryBuilder._distinct_sql.<locals>.<genexpr>rB  r    rC  r@   rB   r   r#   rD  b  rE  z$ClickHouseQueryBuilder._distinct_sqlbyc                 G  s   |ddd |D f| _ d S )Nr   c                 S  "   g | ]}t |trt|n|qS r    r|   rW   r   r   rx   r    r    r#   r   k     " z3ClickHouseQueryBuilder.limit_by.<locals>.<listcomp>r  )rA   nr  r    r    r#   limit_byi     zClickHouseQueryBuilder.limit_byc                 G  s   ||dd |D f| _ d S )Nc                 S  r  r    r  r  r    r    r#   r   o  r  z:ClickHouseQueryBuilder.limit_offset_by.<locals>.<listcomp>r  )rA   r  r  r  r    r    r#   limit_offset_bym  r  z&ClickHouseQueryBuilder.limit_offset_byr   c                   s.   | j r|| jdi |7 }t j|fi |S r   )r  _limit_by_sqlr=   r  r  rB   r    r#   r  q  s   z(ClickHouseQueryBuilder._apply_paginationc                   sV   | j \}}}d fdd|D }|dkr"d| d| d| dS d| d| dS )	Nr   c                 3  r?  r@  r   r   r   r    r#   r   {  rA  z7ClickHouseQueryBuilder._limit_by_sql.<locals>.<genexpr>r   z LIMIT z OFFSET z BY (rK  )r  r   )rA   r   r  r  r  r    r   r#   r  y  s
   z$ClickHouseQueryBuilder._limit_by_sqlcurrent_tableTable | None	new_tablec                   sF   t   }| jr!| jd | jd  fdd| jd D f|_|S )Nr      c                   s   g | ]}|  qS r    )replace_table)r   columnr  r  r    r#   r     s    z8ClickHouseQueryBuilder.replace_table.<locals>.<listcomp>   )r=   r  r  )rA   r  r  rj   rB   r  r#   r    s   z$ClickHouseQueryBuilder.replace_tablerQ   )r   r  r*   )r  r  r  r  r   r8   r   F)rP  rm   r   r   r   rW   rr  )r  r&  r   r8   r  )r  r  r  r  r   r  )r0   r1   r2   r  rI   __annotations__r>   rh   r   r  r  staticmethodr  r  r  r  r*  rD  r  r  r  r  r  rJ   r    r    rB   r#   r     s2   
 



r  c                      s`   e Zd ZeZ fddZed fddZed fd
dZedddZ	d fddZ
  ZS )r  c                   s   t  jtjd d | _d S rM   )r=   r>   r   r  _cluster_namerO   rB   r    r#   r>     s   
z#ClickHouseDropQueryBuilder.__init__r  rW   r   r8   c                      t  d| d S )N
DICTIONARYr=   _set_targetr  rB   r    r#   r       z*ClickHouseDropQueryBuilder.drop_dictionaryr  c                   r  )NQUOTAr  r  rB   r    r#   r    r  z%ClickHouseDropQueryBuilder.drop_quotaclusterc                 C  s   | j rtd|| _ d S )Nz5'DropQuery' object already has attribute cluster_name)r  r   )rA   r  r    r    r#   
on_cluster  s   
z%ClickHouseDropQueryBuilder.on_clusterr   r   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   rF   )rA   r   r   rB   r    r#   r     s   z"ClickHouseDropQueryBuilder.get_sql)r  rW   r   r8   )r  rW   r   r8   )r  rW   r   r8   r   )r0   r1   r2   r  rI   r>   r   r  r  r  r   rJ   r    r    rB   r#   r    s    r  c                      s   e Zd Zd fddZ  ZS )SQLLiteValueWrapperr   r   r   rW   c                   s,   t | jtr| jrdS dS t jdi |S )N10r    )r|   rz   rm   r=   get_value_sqlr@   rB   r    r#   r    s   z!SQLLiteValueWrapper.get_value_sqlr   )r0   r1   r2   r  rJ   r    r    rB   r#   r    s    r  c                   @  r	  )
SQLLiteQueryry  r   r   r   SQLLiteQueryBuilderc                 K  r   r   )r  r!   r    r    r#   r$     r%   zSQLLiteQuery._builderN)r   r   r   r  r  r    r    r    r#   r    r  r  c                      s>   e Zd ZeZd fddZeddd	Zd fddZ  Z	S )r  r   r   r   r8   c                   s$   t  jdtjtd| d| _d S )N)r;   wrapper_clsFr    )r=   r>   r   SQLLITEr  _insert_or_replacer@   rB   r    r#   r>     s   
zSQLLiteQueryBuilder.__init__rS  c                 G  s   | j |  d| _d| _d S rr   )_apply_terms_replacer  )rA   rS  r    r    r#   insert_or_replace  s   

z%SQLLiteQueryBuilder.insert_or_replacerW   c                   s$   | j rdnd}|t jdi | S )Nz
INSERT OR r7   r    )r  r=   _replace_sql)rA   r   prefixrB   r    r#   r    s   z SQLLiteQueryBuilder._replace_sqlrE   rs  r   )
r0   r1   r2   r  rI   r>   r   r  r  rJ   r    r    rB   r#   r    s    r  c                   @  sJ   e Zd ZdZedddZedddZeddddZedddZdS )	JiraQueryz2
    Defines a query class for use with Jira.
    r   JiraQueryBuilderc                 K  r   r   )r  r!   r    r    r#   r$     r%   zJiraQuery._builderr
   c                 O  s   t  j|i |S r*   )r  r9  )r"   r   r   r    r    r#   r9    r  zJiraQuery.wherer7   
table_namerW   	JiraTablec                 K  s   ~t  S )z=
        Convenience method for creating a JiraTable
        r  )r"   r  _r    r    r#   r     s   zJiraQuery.Tablenamestuple[str, str] | strr   r   list[JiraTable]c                 O  s   ~dd t t|D S )zJ
        Convenience method for creating many JiraTable instances
        c                 S  s   g | ]}t  qS r    r  )r   r  r    r    r#   r     s    z$JiraQuery.Tables.<locals>.<listcomp>)ranger1  )r"   r  r   r    r    r#   Tables  s   zJiraQuery.TablesN)r   r  )r   r
   )r7   )r  rW   r   r  )r  r  r   r   r   r  )	r0   r1   r2   r3   r4   r$   r9  r   r  r    r    r    r#   r    s    r  c                      s`   e Zd ZdZdZdZeZd fddZdd fddZ	ddddZ
dddZd d!ddZ  ZS )"r  zF
    Defines a main query builder class to produce JQL expression
    r7   r6   r   r8   c                   s6   t  jddtji| t g| _t g| _d| _d S )Nr;   Tr    )	r=   r>   r   JIRAr  rf  r   r   _select_starr@   rB   r    r#   r>     s   


zJiraQueryBuilder.__init__Fr   rm   r   rW   c                   s   t  j||fi | S r*   )r=   r   strip)rA   r   r   r   rB   r    r#   r     r  zJiraQueryBuilder.get_sqlrP  r  r   c                 K  r   )z1
        JQL doen't have from statements
        r7   r    )rA   rP  r  r    r    r#   r       zJiraQueryBuilder._from_sqlc                 K  r   )z3
        JQL doen't have select statements
        r7   r    )rA   r  r    r    r#   r     r  zJiraQueryBuilder._select_sqlNr   c                 K  s   | j jd|dd|S )NT)
quote_charr   r    )_wheresr   )rA   r  r   r    r    r#   
_where_sql	  r   zJiraQueryBuilder._where_sqlrQ   rt  )r   rm   r   rm   r   rW   r  )rP  rm   r  r   r   rW   )r  r   r   rW   r*   r   )r0   r1   r2   r3   rF   SECONDARY_QUOTE_CHARr  rI   r>   r   r  r   r  rJ   r    r    rB   r#   r    s    
r  c                   @  s   e Zd Zdddd	Zd
S )JiraEmptyCriterionFr   rm   r   r   r   rW   c                 K  0   ~dj | jjdi |d}t|| jfi |S )Nz{term} is EMPTYr   r    r   r   r   r   aliasrA   r   r   r   r    r    r#   r     
   zJiraEmptyCriterion.get_sqlNr  )r   rm   r   r   r   rW   r0   r1   r2   r   r    r    r    r#   r        r  c                   @  s   e Zd Zd	d
ddZdS )JiraNotEmptyCriterionFr   rm   r   rW   c                 K  r  )Nz{term} is not EMPTYr  r    r  r  r    r    r#   r     r  zJiraNotEmptyCriterion.get_sqlNr  )r   rm   r   rW   r  r    r    r    r#   r    r  r  c                   @  s    e Zd Zd	ddZd
ddZdS )	JiraFieldr   r  c                 C     t | S r*   )r  rO   r    r    r#   isempty   r   zJiraField.isemptyr  c                 C  r  r*   )r  rO   r    r    r#   notempty#  r   zJiraField.notemptyN)r   r  )r   r  )r0   r1   r2   r  r  r    r    r    r#   r    s    
r  c                      s&   e Zd Z fddZd	ddZ  ZS )
r  c                   s   t  d d S )Nissues)r=   r>   rO   rB   r    r#   r>   (  s   zJiraTable.__init__namerW   r   r  c                 C  s   t || dS rG  )r  )rA   r  r    r    r#   rx   +  r   zJiraTable.field)r  rW   r   r  )r0   r1   r2   r>   rx   rJ   r    r    rB   r#   r  '  s    r  )B
__future__r   rb  r  r   typingr   pypika.enumsr   pypika.queriesr   r   r   r	   r
   r   r   pypika.termsr   r   r   r   r   r   r   r   r   pypika.utilsr   r   r   r   r   r   r(   r.   rT   rU   rX   r[   r\   r   r   r   r   r   r
  r  r  r  ru  rv  rx  rz  r  r  r  r  r  r  r  r  r  r  r  r  r    r    r    r#   <module>   sZ    $,	
c%,%

  

=$l
"		