U
    [h                     @   sV  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 ddlmZ ddl	m
Z
 dd	lmZ d
dlmZ d
dlmZ d
dlmZ d
dlmZ dZdZdZdZdZdZ	dd Zdd Zdd Zdd ZdzddZdd Z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!dej"ddfd(d)Z#G d*d+ d+eZ$G d,d- d-eZ%G d.d/ d/eZ&G d0d1 d1eZ'G d2d3 d3eZ(G d4d5 d5eZ)G d6d7 d7e!eZ*G d8d9 d9e*eZ+G d:d; d;eZ,G d<d= d=e%e!eZ-G d>d? d?e%e!eZ.G d@dA dAe%eZ/G dBdC dCe$eZ0G dDdE dEe eZ1G dFdG dGe%eZ2G dHdI dIe%e!eej3Z4G dJdK dKe4eZ5G dLdM dMe4eZ6G dNdO dOe eZ7G dPdQ dQeZ8G dRdS dSeeZ9G dTdU dUee%eZ:G dVdW dWee eZ;G dXdY dYe;Z<G dZd[ d[eZ=G d\d] d]e*Z>G d^d_ d_e'e%eZ?G d`da daeZ@G dbdc dce%eZAG ddde dee$eZBG dfdg dge@ZCG dhdi dieZDG djdk dkeZEG dldm dme'e$eZFG dndo doeFZGG dpdq dqeGZHG drds dse'e$eZIG dtdu due$eZJG dvdw dwe$eZKi ZLeMeD ]JZNeOeeNZPeNQdxreNRdxdyZNeNeS kreS eN ePZTeTeLeP< qdS ){    N   )	operators)roles)visitors)ExecutableOption)Options)HasCacheKey)	Visitable   )exc)
inspection)util)collections_abcc                 C   s   t | ttjf ot| d S )zhReturn whether or not the element is a "literal" in the context
    of a SQL expression construct.

    __clause_element__)
isinstancer	   schemaSchemaEventTargethasattr)element r   </tmp/pip-unpacked-wheel-joqu7d3y/sqlalchemy/sql/coercions.py_is_literal    s    
r   c                 C   sr   t | tjr2t | ts2| D ]}t|s dS qdS t | ttjtt	t
jjf opt| d opt | t ppt| t S )a  Return whether or not the element is a "literal" in the context
    of a SQL expression construct.

    does a deeper more esoteric check than _is_literal.   is used
    for lambda elements that have to distinguish values that would
    be bound vs. not without any context.

    FTr   )r   r   Sequencestr_deep_is_literalr	   r   r   r   r   r   ZlanghelpersZ_symbolr   type
issubclass)r   elemr   r   r   r   /   s,    
 


r   c                 C   s   t | d||f S )Nz.. warning:: The %s argument to %s can be passed as a Python string argument, which will be treated as **trusted SQL text** and rendered as given.  **DO NOT PASS UNTRUSTED INPUT TO THIS PARAMETER**.)r   Zadd_parameter_text)Z	paramnameZmeth_rstZ	param_rstr   r   r   _document_text_coercionU   s    r   c                 C   sT   |rLt |d tttfrLt|dkrLt |d trDtd| |f  |d S |S d S )Nr   r   zThe "%s" argument to %s(), when referring to a sequence of items, is now passed as a series of positional elements, rather than as a list. )r   listsetdictlenr   warn_deprecated_20)attrnameZfnnameargsr   r   r   !_expression_collection_was_a_listc   s    $r&   Fc                 K   s  | j r2t|r2t|dr2tj|| tjf ||dS t|  }|}t|tj	t
jt
jtjfsLd }|jrt|j|f|}n|}d}	|jrt|| rt|drd}	n(t|drd}	t|dds| }qqq|	sF|jr$tj|dd}
|
d k	r$|r|
j z|
 }W n" tk
r"   ||| Y nX |d krJ|j|fd|i|}n|}n t|tjrh|jf |}n|}|d k	r|js|jr|j|_|j|jjkr|jr|j|f||d	|}|S |j||fd|i|S d S )
N__code__)apply_propagate_attrsFr   Tis_clause_element)Zraiseerrargname)r*   original_element) allows_lambdacallabler   lambdasZLambdaElementZLambdaOptions_impl_lookupr   elementsZClauseElementr   Z
SchemaItemZFetchedValueZ	PyWrapper_resolve_literal_only_literal_coercion$_skip_clauseelement_for_target_matchgetattrr   _use_inspectionr   inspectZ_post_inspectAttributeError_raise_for_expectedZ_sa__py_wrapper_literalZ_propagate_attrs_role_class	__class____mro___post_coercion_implicit_coercions)roler   r(   r*   Zpost_inspectkwimplr+   resolvedr)   Zinspr   r   r   expectp   s    		
		



 rB   c                 K   s   d|d< t | |f|S )NTas_key)rB   )r>   r   r?   r   r   r   expect_as_key   s    rD   c                 c   sx   |D ]n}d }d }t | |}t|tjr0| }}n$g }t|i d|ji |rT|d }|d k	r`|n|}||||fV  qd S )Ncolumnr   )rB   r   r   string_typesr   Ztraverseappend)r>   ZexpressionsexprZstrnamerE   rA   colsZadd_elementr   r   r    expect_col_expression_collection   s    

rJ   c                   @   s@   e Zd ZdZdd ZdZdZdZdd Zddd	Z	dd
dZ
dS )RoleImpl)r9   namer5   c                 K   s
   t  d S N)NotImplementedErrorselfr   r?   r   r   r   r2      s    zRoleImpl._literal_coercionNFc                 C   s    || _ |j| _t|tj| _d S rM   )r9   Z
_role_namerL   r   r   ZUsesInspectionr5   )rP   Z
role_classr   r   r   __init__   s    zRoleImpl.__init__c                 K   s   |  ||| d S rM   r8   rP   r   rA   r*   r?   r   r   r   r=     s    zRoleImpl._implicit_coercionsc           	      C   sv   |d k	r||k	rd||f }nt |}|r<d| j||f }nd| j|f }|rZ|d| 7 }tjtj||d|d d S )Nz!%r object resolved from %r objectz$%s expected for argument %r; got %s.z%s expected, got %s. )codeZreplace_context)reprrL   r   raise_r   ArgumentError)	rP   r   r*   rA   advicerU   errgotmsgr   r   r   r8     s    	zRoleImpl._raise_for_expected)N)NNNNN)__name__
__module____qualname__	__slots__r2   r<   r1   r3   rQ   r=   r8   r   r   r   r   rK      s   
     rK   c                   @   s   e Zd ZdZdd ZdS )_Deannotater   c                 K   s   ddl m} ||S )Nr   )_deep_deannotate)r   rc   )rP   rA   r?   rc   r   r   r   r<   (  s    z_Deannotate._post_coercionNr^   r_   r`   ra   r<   r   r   r   r   rb   %  s   rb   c                   @   s   e Zd ZdZdZdS )_StringOnlyr   TN)r^   r_   r`   ra   r1   r   r   r   r   re   .  s   re   c                   @   s"   e Zd ZdZdddZdd ZdS )_ReturnsStringKeyr   Nc                 K   s"   t |tjr|S | ||| d S rM   r   r   rF   r8   rP   r+   rA   r*   r?   r   r   r   r=   7  s    z%_ReturnsStringKey._implicit_coercionsc                 K   s   |S rM   r   rO   r   r   r   r2   ?  s    z#_ReturnsStringKey._literal_coercion)Nr^   r_   r`   ra   r=   r2   r   r   r   r   rf   4  s    
rf   c                   @   s"   e Zd ZdZdd ZdddZdS )_ColumnCoercionsr   c                 C   s   t d d S )Nz|implicitly coercing SELECT object to scalar subquery; please use the .scalar_subquery() method to produce a scalar subquery.)r   warn)rP   r   r   r   "_warn_for_scalar_subquery_coercionF  s    z3_ColumnCoercions._warn_for_scalar_subquery_coercionNc                 K   sz   t |dds| ||| nZ|jr2|   | S |jrVt|tjrV|   |j	 S | j
jrh|jrh|S | ||| d S )Nr)   F)r4   r8   _is_select_statementrl   scalar_subquery_is_from_clauser   
selectableZSubqueryr   r9   r,   _is_lambda_elementrh   r   r   r   r=   M  s     
z$_ColumnCoercions._implicit_coercions)N)r^   r_   r`   ra   rl   r=   r   r   r   r   rj   C  s    rj   c                 C   sB   t j|dt | |rd|f nd|r,d| ndd |d d S )Nzc%(extra)sTextual SQL expression %(expr)r %(argname)sshould be explicitly declared as text(%(expr)r)for argument %s z%s )rH   r*   extrarV   )r   rX   ellipses_string)r   r*   Zexc_clsrt   r[   r   r   r   _no_text_coercion`  s    	rv   c                   @   s   e Zd ZdZdddZdS )_NoTextCoercionr   Nc                 K   s6   t |tjr&ttj| jr&t|| n| || d S rM   )	r   r   rF   r   r0   
TextClauser9   rv   r8   rP   r   r*   r?   r   r   r   r2   t  s     z!_NoTextCoercion._literal_coercion)Nr^   r_   r`   ra   r2   r   r   r   r   rw   q  s   rw   c                   @   s0   e Zd ZdZdZdZdZdddZd	ddZdS )
_CoerceLiteralsr   FNc                 C   s
   t ||S rM   rv   rP   r   r*   r   r   r   _text_coercion  s    z_CoerceLiterals._text_coercionc                 K   s   t |tjr8| jr(|dkr(tjdddS | j||f|S | jrn|d krNt S |dkr^t	 S |dkrnt
 S | jrt |tjrtjt|ddS | || d S )N*T)Z
is_literalF)r   r   rF   _coerce_starr0   ColumnClauser~   _coerce_constsNullFalse_True__coerce_numericsnumbersNumberr   r8   ry   r   r   r   r2     s    z!_CoerceLiterals._literal_coercion)N)N)	r^   r_   r`   ra   r   r   r   r~   r2   r   r   r   r   r{   }  s   
r{   c                   @   s$   e Zd ZdZdddZdddZdS )	LiteralValueImplTNc                 K   s2   t |s | j|f||d| tjd ||ddS )N)rA   r*   Ttype_unique)r   r8   r0   BindParameter)rP   r   rA   r*   r   r?   r   r   r   r=     s     z$LiteralValueImpl._implicit_coercionsc                 K   s   |S rM   r   )rP   r   r*   r   r?   r   r   r   r2     s    z"LiteralValueImpl._literal_coercion)N)NN)r^   r_   r`   r1   r=   r2   r   r   r   r   r     s    

r   c                       s"   e Zd ZdZd fdd	Z  ZS )_SelectIsNotFromr   Nc                    s`   t |tjst |tjr6d|d k	r(|jn|f }d}nd  }}tt| j|f||||d|S )NzETo create a FROM clause from a %s object, use the .subquery() method.Z89ve)r*   rA   rZ   rU   )r   r   ZSelectStatementRoler:   superr   r8   )rP   r   r*   rA   r?   rZ   rU   r:   r   r   r8     s(     
z$_SelectIsNotFrom._raise_for_expected)NNr^   r_   r`   ra   r8   __classcell__r   r   r   r   r     s   r   c                   @   s"   e Zd ZdZdddZdd ZdS )HasCacheKeyImplr   Nc                 K   s"   t |tjr|S | ||| d S rM   )r   
traversalsr   r8   rh   r   r   r   r=     s    z#HasCacheKeyImpl._implicit_coercionsc                 K   s   |S rM   r   rO   r   r   r   r2     s    z!HasCacheKeyImpl._literal_coercion)Nri   r   r   r   r   r     s    
r   c                   @   s"   e Zd ZdZdddZdd ZdS )ExecutableOptionImplr   Nc                 K   s    t |tr|S | ||| d S rM   )r   r   r8   rh   r   r   r   r=     s    
z(ExecutableOptionImpl._implicit_coercionsc                 K   s   |S rM   r   rO   r   r   r   r2     s    z&ExecutableOptionImpl._literal_coercion)Nri   r   r   r   r   r     s    
r   c                       s,   e Zd ZdZdddZd	 fdd	Z  ZS )
ExpressionElementImplr   NFc              
   K   sp   |d kr"|s"|d ks|j s"t S ztj|||d|dW S  tjk
rj } z| j||d W 5 d }~X Y nX d S )NT)r   Z_is_crudr[   )Zshould_evaluate_noner0   r   r   r   rY   r8   )rP   r   rL   r   r*   Zis_crudr?   r[   r   r   r   r2     s&        z'ExpressionElementImpl._literal_coercionc                    s6   t |tjrd}nd }tt| j|f|||d|S )Nz`To create a column expression from a FROM clause row as a whole, use the .table_valued() method.r*   rA   rZ   )r   r   ZAnonymizedFromClauseRoler   r   r8   rP   r   r*   rA   r?   rZ   r   r   r   r8     s    
  z)ExpressionElementImpl._raise_for_expected)NNNF)NN)r^   r_   r`   ra   r2   r8   r   r   r   r   r   r     s          
r   c                   @   s$   e Zd ZdZdddZdddZdS )	BinaryElementImplr   Nc              
   K   sJ   z|j |||dW S  tjk
rD } z| j||d W 5 d }~X Y nX d S )N)r   r   )_bind_paramr   rY   r8   )rP   r   rH   operatorbindparam_typer*   r?   r[   r   r   r   r2     s    z#BinaryElementImpl._literal_coercionc                 K   s,   |j jr(|j js(||d k	r |n|j }|S rM   )r   Z_isnullZ_with_binary_element_type)rP   rA   rH   r   r?   r   r   r   r<     s
    z BinaryElementImpl._post_coercion)NN)N)r^   r_   r`   ra   r2   r<   r   r   r   r   r   
  s
      
r   c                   @   s2   e Zd ZdZdddZdd Zdd Zd	d
 ZdS )InElementImplr   Nc                 K   sd   |j rRt|tjr4|jjr4| | | j|jf|S | | | j| f|S n| 	||| d S rM   )
ro   r   rp   Aliasr   rm   _warn_for_implicit_coercionr<   selectr8   rh   r   r   r   r=   !  s    


z!InElementImpl._implicit_coercionsc                 C   s   t d|jj  d S )Nz_Coercing %s object into a select() for use in IN(); please pass a select() construct explicitly)r   rk   r:   r^   )rP   r   r   r   r   r   1  s
    z)InElementImpl._warn_for_implicit_coercionc                    s   t |tjrt |tjsi t|}|D ]F}t|sZt |tjsP| j	|f| qn||< q(|d kr(t
 |< q(rt
j fdd|D  S  j|ddS n| j	|f| d S )Nc                    s(   g | ] }|kr| n
  |qS r   )r   ).0orH   Znon_literal_expressionsr   r   r   
<listcomp>I  s   
z3InElementImpl._literal_coercion.<locals>.<listcomp>T)	expanding)r   r   Iterabler   rF   r   r   r   ZColumnOperatorsr8   r0   r   
ClauseListr   )rP   r   rH   r   r?   r   r   r   r   r2   8  s*     
	zInElementImpl._literal_coercionc                 K   sh   |j r| S t|tjr8t|jdkr,t|j|dS t|tj	r`|j
dd}d|_||_|S |S d S )Nr   )ZagainstT)Zmaintain_key)rm   rn   r   r0   r   r"   ZclausesAssertionErrorZ
self_groupr   Z_cloner   Z	expand_op)rP   r   rH   r   r?   r   r   r   r<   V  s    zInElementImpl._post_coercion)N)r^   r_   r`   ra   r=   r   r2   r<   r   r   r   r   r     s    
r   c                       s>   e Zd ZdZdZd fdd	Zd fdd	Zdd	d
Z  ZS )OnClauseImplr   TNFc                    s6   |rt |tr|S tt| j||f||d|S d S )N)r*   legacy)r   r   r   r   r=   rP   r+   rA   r*   r   r?   r   r   r   r=   n  s    
z OnClauseImpl._implicit_coercionsc                    s.   |rt |trtd |S tt| ||S )NUsing strings to indicate relationship names in Query.join() is deprecated and will be removed in SQLAlchemy 2.0.  Please use the class-bound attribute directly.)r   r   r   r#   r   r   r~   )rP   r   r*   r   r   r   r   r~   |  s    zOnClauseImpl._text_coercionc                 K   s   t |tjr|S |S rM   )r   r   JoinTargetRole)rP   rA   r+   r?   r   r   r   r<     s    zOnClauseImpl._post_coercion)NF)NF)N)	r^   r_   r`   ra   r   r=   r~   r<   r   r   r   r   r   r   i  s      r   c                   @   s   e Zd ZdZdZdddZdS )WhereHavingImplr   TNc                 C   s
   t ||S rM   r|   r}   r   r   r   r~     s    zWhereHavingImpl._text_coercion)Nr^   r_   r`   ra   r   r~   r   r   r   r   r     s   r   c                   @   s   e Zd ZdZdZdddZdS )StatementOptionImplr   TNc                 C   s
   t |S rM   r0   rx   r}   r   r   r   r~     s    z"StatementOptionImpl._text_coercion)Nr   r   r   r   r   r     s   r   c                   @   s   e Zd ZdZdS )ColumnArgumentImplr   Nr^   r_   r`   ra   r   r   r   r   r     s   r   c                   @   s   e Zd ZdZdS )ColumnArgumentOrKeyImplr   Nr   r   r   r   r   r     s   r   c                   @   s   e Zd ZdZdddZdS )StrAsPlainColumnImplr   Nc                 C   s
   t |S rM   )r0   r   r}   r   r   r   r~     s    z#StrAsPlainColumnImpl._text_coercion)N)r^   r_   r`   ra   r~   r   r   r   r   r     s   r   c                   @   s   e Zd ZdZdZdddZdS )ByOfImplr   TNc                 C   s
   t |S rM   )r0   Z_textual_label_referencer}   r   r   r   r~     s    zByOfImpl._text_coercion)Nr   r   r   r   r   r     s   r   c                   @   s   e Zd ZdZdd ZdS )OrderByImplr   c                 K   s(   t || jr |jd k	r t|S |S d S rM   )r   r9   Z_order_by_label_elementr0   Z_label_reference)rP   rA   r?   r   r   r   r<     s    

zOrderByImpl._post_coercionNrd   r   r   r   r   r     s   r   c                   @   s   e Zd ZdZdddZdS )GroupByImplr   Nc                 K   s    t |tjrtj|j S |S d S rM   )r   r   ZStrictFromClauseRoler0   r   crh   r   r   r   r=     s    zGroupByImpl._implicit_coercions)Nr^   r_   r`   ra   r=   r   r   r   r   r     s    r   c                   @   s   e Zd ZdZdddZdS )DMLColumnImplr   Fc                 K   s   |r
|j S |S d S rM   )key)rP   r   rC   r?   r   r   r   r<     s    zDMLColumnImpl._post_coercionN)Frd   r   r   r   r   r     s   r   c                   @   s   e Zd ZdZdddZdS )ConstExprImplr   Nc                 K   s@   |d krt  S |dkr t  S |dkr0t  S | || d S )NFT)r0   r   r   r   r8   ry   r   r   r   r2     s    zConstExprImpl._literal_coercion)Nrz   r   r   r   r   r     s   r   c                   @   s$   e Zd ZdZdddZdddZdS )	TruncatedLabelImplr   Nc                 K   s"   t |tjr|S | ||| d S rM   rg   rh   r   r   r   r=     s    z&TruncatedLabelImpl._implicit_coercionsc                 K   s   t |tjr|S t|S dS )zcoerce the given value to :class:`._truncated_label`.

        Existing :class:`._truncated_label` and
        :class:`._anonymous_label` objects are passed
        unchanged.
        N)r   r0   Z_truncated_labelry   r   r   r   r2     s    z$TruncatedLabelImpl._literal_coercion)N)Nri   r   r   r   r   r     s    
r   c                   @   s   e Zd ZdZdZdddZdS )DDLExpressionImplr   TNc                 C   s
   t |S rM   r   r}   r   r   r   r~     s    z DDLExpressionImpl._text_coercion)Nr   r   r   r   r   r     s   r   c                   @   s   e Zd ZdZdS )DDLConstraintColumnImplr   Nr   r   r   r   r   r     s   r   c                   @   s   e Zd ZdZdS )DDLReferredColumnImplr   Nr   r   r   r   r   r     s   r   c                   @   s"   e Zd ZdZdddZdd ZdS )LimitOffsetImplr   Nc                 K   s   |d krd S |  ||| d S rM   rR   rS   r   r   r   r=   !  s    z#LimitOffsetImpl._implicit_coercionsc                 K   s,   |d krd S t |}tj|||ddS d S )NTr   )r   Zasintrp   Z_OffsetLimitParam)rP   r   rL   r   r?   valuer   r   r   r2   '  s    
   z!LimitOffsetImpl._literal_coercion)Nri   r   r   r   r   r     s   
r   c                       s"   e Zd ZdZd fdd	Z  ZS )LabeledColumnExprImplr   Nc                    s\   t |tjr|d S tt| j||fd|i|}t |tjrJ|d S | ||| d S Nr*   )r   r   ZExpressionElementRolelabelr   r   r=   r8   )rP   r+   rA   r*   r?   newr   r   r   r=   4  s    

 
z)LabeledColumnExprImpl._implicit_coercions)N)r^   r_   r`   ra   r=   r   r   r   r   r   r   1  s    r   c                   @   s4   e Zd ZdZdZdZdZedej	Z
dddZdS )ColumnsClauseImplr   Tz^\w\S*$Nc                 C   sL   t |}| j| }tdt||r2d|f nd|r<dndd d S )NzTextual column expression %(column)r %(argname)sshould be explicitly declared with text(%(column)r), or use %(literal_column)s(%(column)r) for more specificityrr   rs   literal_columnrE   )rE   r*   r   )r   _guess_straight_columnmatchr   rY   r   ru   )rP   r   r*   Zguess_is_literalr   r   r   r~   L  s    z ColumnsClauseImpl._text_coercion)N)r^   r_   r`   ra   r   r   r   recompileIr   r~   r   r   r   r   r   C  s   r   c                   @   s   e Zd ZdZdS )ReturnsRowsImplr   Nr   r   r   r   r   r   _  s   r   c                       s6   e Zd ZdZd	ddZd
 fdd	ZdddZ  ZS )StatementImplr   Nc                 K   sH   ||k	rDt |tjsDz
|j W n$ tk
rB   td| d Y nX |S )Na  Object %r should not be used directly in a SQL statement context, such as passing to methods such as session.execute().  This usage will be disallowed in a future release.  Please use Core select() / update() / delete() etc. with Session.execute() and other statement execution methods.1.4)r   r   rF   Z_execute_on_connectionr7   warn_deprecated)rP   rA   r+   r*   r?   r   r   r   r<   f  s    
 

zStatementImpl._post_coercionc                    s,   |j r
|S tt| j||fd|i|S d S r   )rq   r   r   r=   rh   r   r   r   r=   |  s    
 z!StatementImpl._implicit_coercionsc                 C   s   t d t|S )NzUsing plain strings to indicate SQL statements without using the text() construct is  deprecated and will be removed in version 2.0.  Ensure plain SQL statements are passed using the text() construct.)r   r#   r0   rx   r}   r   r   r   r~     s    zStatementImpl._text_coercion)N)N)N)r^   r_   r`   ra   r<   r=   r~   r   r   r   r   r   r   c  s
   
 
r   c                   @   s   e Zd ZdZdddZdS )SelectStatementImplr   Nc                 K   s    |j r| S | ||| d S rM   )_is_text_clausecolumnsr8   rh   r   r   r   r=     s    z'SelectStatementImpl._implicit_coercions)Nr   r   r   r   r   r     s    r   c                   @   s   e Zd ZdZdS )
HasCTEImplr   Nr   r   r   r   r   r     s   r   c                   @   s   e Zd ZdZdS )	IsCTEImplr   Nr   r   r   r   r   r     s   r   c                   @   s(   e Zd ZdZdZd	ddZd
ddZdS )JoinTargetImplr   TFc                 K   s   t |tr|S d S rM   )r   r   )rP   r   r   r?   r   r   r   r2     s    
z JoinTargetImpl._literal_coercionNc                 K   sn   t |tjr|S |r,t |tr,td |S |r@t |tjr@|S |r\|jr\tjddd |S | 	||| d S )Nr   Implicit coercion of SELECT and textual SELECT constructs into FROM clauses is deprecated; please call .subquery() on any Core select or ORM Query object in order to produce a subquery object.r   version)
r   r   r   r   r   r#   ZWhereHavingRolerm   r   r8   r   r   r   r   r=     s     
z"JoinTargetImpl._implicit_coercions)F)NF)r^   r_   r`   ra   r3   r2   r=   r   r   r   r   r     s   
   r   c                   @   s$   e Zd ZdZd	ddZd
ddZdS )FromClauseImplr   NFTc                 K   sH   |j r,|r| S |rDtjddd |jS n|jr6|S | ||| d S Nr   r   r   )rm   Zsubqueryr   r   _implicit_subqueryr   r8   )rP   r+   rA   r*   Zexplicit_subqueryallow_selectr?   r   r   r   r=     s    	z"FromClauseImpl._implicit_coercionsc                 K   s   |r|  S |S d S rM   )Z_deannotate)rP   r   Z
deannotater?   r   r   r   r<     s    zFromClauseImpl._post_coercion)NFT)F)r^   r_   r`   ra   r=   r<   r   r   r   r   r     s      
r   c                   @   s   e Zd ZdZdddZdS )StrictFromClauseImplr   NFc                 K   s0   |j r|rtjddd |jS | ||| d S r   )rm   r   r   r   r8   )rP   r+   rA   r*   r   r?   r   r   r   r=     s    
z(StrictFromClauseImpl._implicit_coercions)NFr   r   r   r   r   r     s     r   c                   @   s   e Zd ZdZdddZdS )AnonymizedFromClauseImplr   FNc                 K   s   |d kst |j|dS )N)flat)r   Z_anonymous_fromclause)rP   r   r   rL   r?   r   r   r   r<     s    z'AnonymizedFromClauseImpl._post_coercion)FNrd   r   r   r   r   r     s   r   c                   @   s   e Zd ZdZdd ZdS )DMLTableImplr   c                 K   s   d|j kr|j d S |S d S )NZ	dml_table)Z_annotationsrO   r   r   r   r<     s    

zDMLTableImpl._post_coercionNrd   r   r   r   r   r     s   r   c                   @   s   e Zd ZdZdddZdS )DMLSelectImplr   Nc                 K   s<   |j r*t|tjr |jjr |jS | S n| ||| d S rM   )ro   r   rp   r   r   rm   r   r8   rh   r   r   r   r=   "  s    

z!DMLSelectImpl._implicit_coercions)Nr   r   r   r   r   r     s    r   c                       s"   e Zd ZdZd fdd	Z  ZS )CompoundElementImplr   Nc                    sB   t |tjr|jrd}q"d}nd }tt| j|f|||d|S )NzFUse the plain select() object without calling .subquery() or .alias().z9To SELECT from any FROM clause, use the .select() method.r   )r   r   ZFromClauseRoleZ_is_subqueryr   r   r8   r   r   r   r   r8   4  s     
  z'CompoundElementImpl._raise_for_expected)NNr   r   r   r   r   r   1  s   r   ZRoleZImpl)NNF)Ur   r   rs   r   r   r   baser   r   r   r   r	   r   r   r   r   r0   r.   r   rp   Zsqltypesr   r   r   r&   rB   rD   rJ   objectrK   rb   re   rf   rj   rY   rv   rw   r{   r   r   r   r   r   r   r   r   r   r   r   r   r   ZByOfRoler   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r/   dirrL   r4   clsendswithreplaceglobalsr@   r   r   r   r   <module>   s   &   
p/	   
&K*		

-,$	

