U
    d(                  	   @  s  d dl mZ d dlmZ d dl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 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 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dlm&Z& dd l'm(Z( ejrd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m0Z0 dd)lm1Z1 dd*l2m3Z3 dd+l)m4Z4 dd,l)m5Z5 dd-l)m6Z6 dd.l)m7Z7 dd/l)m8Z8 dd0l)m9Z9 dd1l)m:Z: dd2l+m;Z; dd3l,m<Z< dd4l,m=Z= dd5l,m>Z> dd6l,m?Z? dd7l,m@Z@ dd8l,mAZA dd9lmBZB ed:ejCd;ZDed<e	d=ef d;ZEed>ejFd;ZGed?ed;ZHd@dA ZIdBdC ZJdDdDdDdEdFdGdHZKdDdDdIdJdKdLdMZLedNdOdOdDdPdQdRZMed=dSdTdOdUdOdDdVdWdRZMedXdOdOdYdPdZdRZMed[dOdOd\dPd]dRZMed^dOdOd_dPd`dRZMedadOdOdbdPdcdRZMedddedOdfdPdgdRZMedhdedOdidPdjdRZMedkdOdOdldPdmdRZMedndodOdpdPdqdRZMedrdsdOdsdPdtdRZMedudvdOdvdPdwdRZMedxdydOdzdPd{dRZMed=d|dxdvdUdOd}d~ddRZMedddOddPddRZMedddOddPddRZMeddOdOdOdPddRZMddddddOddddOdOdddRZMdTdOdOdDdPddZNd^dddddZOG dd dZPG dd dZQG dd dZRG dd dePZSG dd dePZTde$jUddfdOddddddddZVG dd dePZWG dd dePZXG dd dePZYG dd dePZZG dd dePZ[G dd dePZ\G dd deTePZ]G dd de]ePZ^G dd dePZ_G dd deTePZ`G dd deXeTePZaG dd deXePZbG dd deWePZcG dd deSePZdG ddĄ deXePZeG ddƄ deXeTePejfZgG ddȄ degePZhG ddʄ degePZiG dd̄ deSePZjG dd΄ dePZkG ddЄ deRePZlG dd҄ deQeXePZmG ddԄ deQeSePZnG ddք denZoG dd؄ dePZpG ddڄ de]ZqG dd܄ deZeXePZrG ddބ dePZsG dd deXePZtG dd deWePZuG dd desZvG dd dePZwG dd dePZxG dd deZeWePZyG dd deyZzG dd dezZ{G dd deZeWePZ|G dd deWePZ}G dd deWePZ~i ZeeD ]JZeeeZedrBeddZee krBe e eZeee< qBeseej ZeeeefD ]Zeeeje < qdS )    )annotationsN)Any)Callable)cast)Dict)Iterable)Iterator)List)NoReturn)Optional)overload)Sequence)Tuple)Type)TYPE_CHECKING)TypeVar)Union   )	operators)roles)visitors)is_from_clause)ExecutableOption)Options)HasCacheKey)	Visitable   )exc)
inspection)util)Literal)elements)lambdas)schema)
selectable)_ColumnExpressionArgument)_ColumnsClauseArgument)_DDLColumnArgument)_DMLTableArgument)_FromClauseArgument)_DMLTableElement)BindParameter)ClauseElement)ColumnClause)ColumnElement)DQLDMLClauseElement)NamedColumn)SQLCoreOperations)Column)_ColumnsClauseElement)_JoinTargetProtocol)
FromClause)HasCTE)
SelectBase)Subquery)_TraverseCallableType_SR)bound_F._StringOnlyR_Tc                 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   r#   SchemaEventTargethasattr)element rD   </tmp/pip-unpacked-wheel-wbr0uges/sqlalchemy/sql/coercions.py_is_literalO   s    
rF   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@   collections_abcr   str_deep_is_literalr   r#   rA   r   r   r   ZlanghelperssymbolrB   type
issubclass)rC   elemrD   rD   rE   rI   [   s,    
 


rI   rH   zCallable[[_F], _F])	paramnamemeth_rst	param_rstreturnc                 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)rN   rO   rP   rD   rD   rE   _document_text_coercion   s    rR   z+Union[Sequence[_T], Sequence[Sequence[_T]]]Sequence[_T])attrnamefnnameargsrQ   c                 C  sb   |rXt |d tttfrXt|dkrXt |d trJtd|  d| dtd|d S td|S )Nr   r   zThe "z" argument to zt(), when referring to a sequence of items, is now passed as a series of positional elements, rather than as a list. rS   )r@   listsetdictlenr   ArgumentErrorr   )rT   rU   rV   rD   rD   rE   !_expression_collection_was_a_list   s    $r\   zType[roles.TruncatedLabelRole]r   )rolerC   kwrQ   c                 K  s   d S NrD   r]   rC   r^   rD   rD   rE   expect   s    ra   )as_keyzType[roles.DMLColumnRole]zLiteral[True])r]   rC   rb   r^   rQ   c                K  s   d S r_   rD   )r]   rC   rb   r^   rD   rD   rE   ra      s    zType[roles.LiteralValueRole]zBindParameter[Any]c                 K  s   d S r_   rD   r`   rD   rD   rE   ra      s    z!Type[roles.DDLReferredColumnRole]zColumn[Any]c                 K  s   d S r_   rD   r`   rD   rD   rE   ra      s    z#Type[roles.DDLConstraintColumnRole]zUnion[Column[Any], str]c                 K  s   d S r_   rD   r`   rD   rD   rE   ra      s    zType[roles.StatementOptionRole]r/   c                 K  s   d S r_   rD   r`   rD   rD   rE   ra      s    z&Type[roles.LabeledColumnExprRole[Any]]z_ColumnExpressionArgument[_T]zNamedColumn[_T]c                 K  s   d S r_   rD   r`   rD   rD   rE   ra      s    zgUnion[Type[roles.ExpressionElementRole[Any]], Type[roles.LimitOffsetRole], Type[roles.WhereHavingRole]]zColumnElement[_T]c                 K  s   d S r_   rD   r`   rD   rD   rE   ra      s    
zUnion[Type[roles.ExpressionElementRole[Any]], Type[roles.LimitOffsetRole], Type[roles.WhereHavingRole], Type[roles.OnClauseRole], Type[roles.ColumnArgumentRole]]zColumnElement[Any]c                 K  s   d S r_   rD   r`   rD   rD   rE   ra      s    zType[roles.DMLTableRole]r(   r*   c                 K  s   d S r_   rD   r`   rD   rD   rE   ra      s    zType[roles.HasCTERole]r6   c                 K  s   d S r_   rD   r`   rD   rD   rE   ra   	  s    zType[roles.SelectStatementRole]r7   c                 K  s   d S r_   rD   r`   rD   rD   rE   ra     s    zType[roles.FromClauseRole]r)   r5   c                 K  s   d S r_   rD   r`   rD   rD   rE   ra     s    )explicit_subqueryr8   )r]   rC   rc   r^   rQ   c                K  s   d S r_   rD   )r]   rC   rc   r^   rD   rD   rE   ra   $  s    zType[roles.ColumnsClauseRole]z_ColumnsClauseArgument[Any]r3   c                 K  s   d S r_   rD   r`   rD   rD   rE   ra   /  s    zType[roles.JoinTargetRole]r4   c                 K  s   d S r_   rD   r`   rD   rD   rE   ra   8  s    z	Type[_SR]c                 K  s   d S r_   rD   r`   rD   rD   rE   ra   B  s    F)apply_propagate_attrsargnamepost_inspectzOptional[ClauseElement]Optional[str]bool)r]   rC   rd   re   rf   r^   rQ   c                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	rtjrt|ttfst|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__)rd   Fr?   Tis_clause_element)Zraiseerrre   )re   original_element)%allows_lambdacallablerB   r"   ZLambdaElementZLambdaOptions_impl_lookupr@   r!   ZCompilerElementr#   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_literaltypingr   r1   r,   AssertionErrorZ_propagate_attrs_role_class	__class____mro___post_coercion_implicit_coercions)r]   rC   rd   re   rf   r^   implrk   resolvedrj   ZinsprD   rD   rE   ra   K  s    
	
		




 c                 K  s"   | dd  t| |fddi|S )Nrb   T)popra   r`   rD   rD   rE   expect_as_key  s    r   zIterable[_DDLColumnArgument]zwIterator[Tuple[Union[str, Column[Any]], Optional[ColumnClause[Any]], Optional[str], Optional[Union[Column[Any], str]]]])r]   expressionsrQ   c           	      c  s   |D ]~}d }d }t | |}t|tr<t|ts2t| }}n(g }|j}t|i d|i |rd|d }|d k	rp|n|}||||fV  qd S )Ncolumnr   )ra   r@   rH   rx   appendr   Ztraverse)	r]   r   exprZstrnamer   r   colsZ
col_appendZadd_elementrD   rD   rE    expect_col_expression_collection  s    


r   c                
   @  sl   e Zd ZU dZdd ZdZded< dZdZdd	 Z	dddd
dddddZ
ddd
dd
d
ddddddZdS )RoleImpl)ry   namers   c                 K  s
   t  d S r_   )NotImplementedErrorselfrC   r^   rD   rD   rE   rp     s    zRoleImpl._literal_coercionNr   r|   Fc                 C  s    || _ |j| _t|tj| _d S r_   )ry   Z
_role_namer   rL   r   ZUsesInspectionrs   )r   Z
role_classrD   rD   rE   __init__  s    zRoleImpl.__init__rg   rC   r   re   r^   rQ   c                 K  s   |  ||| d S r_   rv   r   rC   r   re   r^   rD   rD   rE   r}     s    zRoleImpl._implicit_coercionsOptional[Any]Optional[Exception]r
   rC   re   r   advicecodeerrr^   rQ   c           
      K  sn   |d k	r||k	rd||f }nt |}|r<d| j||f }	nd| j|f }	|rZ|	d| 7 }	tj|	|d|d S )Nz!%r object resolved from %r objectz$%s expected for argument %r; got %s.z%s expected, got %s. )r   )reprr   r   r[   )
r   rC   re   r   r   r   r   r^   gotmsgrD   rD   rE   rv     s    
zRoleImpl._raise_for_expected)N)NNNNN)__name__
__module____qualname__	__slots__rp   r|   __annotations__ro   rq   r   r}   rv   rD   rD   rD   rE   r     s   
	      r   c                   @  s   e Zd ZdZdd ZdS )_DeannotaterD   c                 K  s   ddl m} ||S )Nr   )_deep_deannotate)r   r   )r   r   r^   r   rD   rD   rE   r|     s    z_Deannotate._post_coercionNr   r   r   r   r|   rD   rD   rD   rE   r     s   r   c                   @  s   e Zd ZdZdZdS )_StringOnlyrD   TN)r   r   r   r   ro   rD   rD   rD   rE   r   $  s   r   c                   @  s"   e Zd ZdZdddZdd ZdS )_ReturnsStringKeyrD   Nc                 K  s    t |tr|S | ||| d S r_   r@   rH   rv   r   rD   rD   rE   r}   -  s    
z%_ReturnsStringKey._implicit_coercionsc                 K  s   |S r_   rD   r   rD   rD   rE   rp   3  s    z#_ReturnsStringKey._literal_coercion)Nr   r   r   r   r}   rp   rD   rD   rD   rE   r   *  s   
r   c                   @  s"   e Zd ZdZdd ZdddZdS )_ColumnCoercionsrD   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)r   rD   rD   rE   "_warn_for_scalar_subquery_coercion:  s    z3_ColumnCoercions._warn_for_scalar_subquery_coercionNc                 K  s~   |}t |dds | ||| nZ|jr6|   | S |jrZt|tjrZ|   |j	 S | j
jrl|jrl|S | ||| d S )Nrj   F)rr   rv   _is_select_baser   scalar_subquery_is_from_clauser@   r$   r8   rC   ry   rl   _is_lambda_element)r   rC   r   re   r^   rk   rD   rD   rE   r}   A  s     
z$_ColumnCoercions._implicit_coercions)N)r   r   r   r   r   r}   rD   rD   rD   rE   r   7  s   r   zType[exc.SQLAlchemyError]r   r
   )rC   re   exc_clsextrar   rQ   c                 C  s:   |dt | |rd|f nd|r(d| n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 )r   re   r   )r   ellipses_string)rC   re   r   r   r   rD   rD   rE   _no_text_coercionS  s    r   c                   @  s   e Zd ZdZdddZdS )_NoTextCoercionrD   Nc                 K  s4   t |tr$ttj| jr$t|| n| || d S r_   )r@   rH   rL   r!   
TextClausery   r   rv   r   rC   re   r^   rD   rD   rE   rp   h  s     z!_NoTextCoercion._literal_coercion)Nr   r   r   r   rp   rD   rD   rD   rE   r   e  s   r   c                   @  s0   e Zd ZdZdZdZdZdddZd	ddZdS )
_CoerceLiteralsrD   FNc                 C  s
   t ||S r_   r   r   rC   re   rD   rD   rE   _text_coercionw  s    z_CoerceLiterals._text_coercionc                 K  s   t |tr6| jr&|dkr&tjdddS | j||f|S | jrl|d krLt S |dkr\t S |dkrlt	 S | j
rt |tjrtjt|ddS | || d S )N*T)Z
is_literalF)r@   rH   _coerce_starr!   r-   r   _coerce_constsNullFalse_True__coerce_numericsnumbersNumberrv   r   rD   rD   rE   rp   z  s    
z!_CoerceLiterals._literal_coercion)N)N)	r   r   r   r   r   r   r   r   rp   rD   rD   rD   rE   r   q  s   
r   c                   @  s$   e Zd ZdZdddZd	ddZdS )
LiteralValueImplTNFc                 K  s4   t |s | j|f||d| tjd ||d|dS )N)r   re   T)type_uniqueliteral_execute)rF   rv   r!   r+   )r   rC   r   re   r   r   r^   rD   rD   rE   r}     s     	 z$LiteralValueImpl._implicit_coercionsc                 K  s   |S r_   rD   )r   rC   re   r   r^   rD   rD   rE   rp     s    z"LiteralValueImpl._literal_coercion)NF)NN)r   r   r   ro   r}   rp   rD   rD   rD   rE   r     s
     
r   c                
      s6   e Zd ZdZdddddddddd fd	d
Z  ZS )_SelectIsNotFromrD   Nr   rg   r   r   r
   r   c                   sj   |st |tjst |tjr:d|d k	r,|jn|f }d}nd }t j|f|||||d| dsftd S )NzETo create a FROM clause from a %s object, use the .subquery() method.Z89ve)re   r   r   r   r   F)r@   r   ZSelectStatementRolerz   superrv   rx   )r   rC   re   r   r   r   r   r^   rz   rD   rE   rv     s0    


z$_SelectIsNotFrom._raise_for_expected)NNNNNr   r   r   r   rv   __classcell__rD   rD   r   rE   r     s        r   c                   @  s0   e Zd ZdZd
ddddddddZdd	 ZdS )HasCacheKeyImplrD   Nr   rg   r   c                 K  s    t |tr|S | ||| d S r_   )r@   r   rv   r   rD   rD   rE   r}     s    
z#HasCacheKeyImpl._implicit_coercionsc                 K  s   |S r_   rD   r   rD   rD   rE   rp     s    z!HasCacheKeyImpl._literal_coercion)Nr   rD   rD   rD   rE   r     s    r   c                   @  s0   e Zd ZdZd
ddddddddZdd	 ZdS )ExecutableOptionImplrD   Nr   rg   r   c                 K  s    t |tr|S | ||| d S r_   )r@   r   rv   r   rD   rD   rE   r}     s    
z(ExecutableOptionImpl._implicit_coercionsc                 K  s   |S r_   rD   r   rD   rD   rE   rp     s    z&ExecutableOptionImpl._literal_coercion)Nr   rD   rD   rD   rE   r     s    r   c                      s,   e Zd ZdZdddZd	 fdd	Z  ZS )
ExpressionElementImplrD   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_noner!   r   r+   r   r[   rv   )r   rC   r   r   re   is_crudr^   r   rD   rD   rE   rp     s&        z'ExpressionElementImpl._literal_coercionc                   sD   t |tjrd}nt |tjr$d}nd }t j|f|||d|S )NzTTo create a column expression from a VALUES clause, use the .scalar_values() method.z`To create a column expression from a FROM clause row as a whole, use the .table_valued() method.re   r   r   )r@   r$   Valuesr   ZAnonymizedFromClauseRoler   rv   r   rC   re   r   r^   r   r   rD   rE   rv     s       z)ExpressionElementImpl._raise_for_expected)NNNF)NN)r   r   r   r   rp   rv   r   rD   rD   r   rE   r     s          
r   c                   @  s$   e Zd ZdZdddZdddZdS )	BinaryElementImplrD   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   r[   rv   )r   rC   r   operatorbindparam_typere   r^   r   rD   rD   rE   rp   )  s    z#BinaryElementImpl._literal_coercionc                 K  s,   |j jr(|j js(||d k	r |n|j }|S r_   )rK   Z_isnullZ_with_binary_element_type)r   r   r   r   r^   rD   rD   rE   r|   1  s
    z BinaryElementImpl._post_coercion)NN)N)r   r   r   r   rp   r|   rD   rD   rD   rE   r   %  s
      
r   c                   @  s@   e Zd ZdZdddddddddZdd	 Zd
d Zdd ZdS )InElementImplrD   Nr   rg   r   c                 K  sd   |j rRt|tjr4|jjr4| | | j|jf|S | | | j| f|S n| 	||| d S r_   )
r   r@   r$   AliasrC   r   _warn_for_implicit_coercionr|   selectrv   r   rD   rD   rE   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   r   rz   r   )r   rM   rD   rD   rE   r   P  s
    z)InElementImpl._warn_for_implicit_coercionc                   s   t |tjrt |tsi t|}|D ]F}t|sXt |tjsN| j|f| ql||< 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 rD   )r   ).0or   Znon_literal_expressionsr   rD   rE   
<listcomp>l  s   
z3InElementImpl._literal_coercion.<locals>.<listcomp>T)	expanding)r@   rG   r   rH   rW   rF   r   ZColumnOperatorsrv   r!   r   
ClauseListr   )r   rC   r   r   r^   r   rD   r   rE   rp   W  s,     
	zInElementImpl._literal_coercionc                 K  s|   |j r| S t|tjr8t|jdkr,t|j|dS t|tj	r`|j
dd}d|_||_|S t|tjrt| S |S d S )Nr   )ZagainstT)Zmaintain_key)r   r   r@   r!   r   rZ   Zclausesrx   Z
self_groupr+   Z_cloner   Z	expand_opr$   r   Zscalar_values)r   rC   r   r   r^   rD   rD   rE   r|   y  s    zInElementImpl._post_coercion)N)r   r   r   r   r}   r   rp   r|   rD   rD   rD   rE   r   9  s    "r   c                   @  s(   e Zd ZdZdZd	ddZd
ddZdS )OnClauseImplrD   TNFc                 K  s   |  | d S r_   r   )r   rC   r   r   re   r   r^   rD   rD   rE   rp     s    zOnClauseImpl._literal_coercionc                 K  s   t |tjr|S |S r_   )r@   r   JoinTargetRole)r   r   rk   r^   rD   rD   rE   r|     s    zOnClauseImpl._post_coercion)NNNF)N)r   r   r   r   r   rp   r|   rD   rD   rD   rE   r     s          
r   c                   @  s   e Zd ZdZdZdddZdS )WhereHavingImplrD   TNc                 C  s
   t ||S r_   r   r   rD   rD   rE   r     s    zWhereHavingImpl._text_coercion)Nr   r   r   r   r   r   rD   rD   rD   rE   r     s   r   c                   @  s   e Zd ZdZdZdddZdS )StatementOptionImplrD   TNc                 C  s
   t |S r_   r!   r   r   rD   rD   rE   r     s    z"StatementOptionImpl._text_coercion)Nr   rD   rD   rD   rE   r     s   r   c                   @  s   e Zd ZdZdS )ColumnArgumentImplrD   Nr   r   r   r   rD   rD   rD   rE   r     s   r   c                   @  s   e Zd ZdZdS )ColumnArgumentOrKeyImplrD   Nr   rD   rD   rD   rE   r     s   r   c                   @  s   e Zd ZdZdddZdS )StrAsPlainColumnImplrD   Nc                 C  s
   t |S r_   )r!   r-   r   rD   rD   rE   r     s    z#StrAsPlainColumnImpl._text_coercion)N)r   r   r   r   r   rD   rD   rD   rE   r     s   r   c                   @  s   e Zd ZdZdZdddZdS )ByOfImplrD   TNc                 C  s
   t |S r_   )r!   Z_textual_label_referencer   rD   rD   rE   r     s    zByOfImpl._text_coercion)Nr   rD   rD   rD   rE   r     s   r   c                   @  s   e Zd ZdZdd ZdS )OrderByImplrD   c                 K  s(   t || jr |jd k	r t|S |S d S r_   )r@   ry   Z_order_by_label_elementr!   Z_label_reference)r   r   r^   rD   rD   rE   r|     s    

zOrderByImpl._post_coercionNr   rD   rD   rD   rE   r     s   r   c                   @  s(   e Zd ZdZdddddddddZdS )	GroupByImplrD   Nr   rg   r   c                 K  s   t |rtj|j S |S d S r_   )r   r!   r   cr   rD   rD   rE   r}     s    zGroupByImpl._implicit_coercions)Nr   r   r   r   r}   rD   rD   rD   rE   r     s    r   c                   @  s   e Zd ZdZdddZdS )DMLColumnImplrD   Fc                 K  s   |r
|j S |S d S r_   )key)r   rC   rb   r^   rD   rD   rE   r|     s    zDMLColumnImpl._post_coercionN)Fr   rD   rD   rD   rE   r     s   r   c                   @  s   e Zd ZdZdddZdS )ConstExprImplrD   Nc                 K  s@   |d krt  S |dkr t  S |dkr0t  S | || d S )NFT)r!   r   r   r   rv   r   rD   rD   rE   rp     s    zConstExprImpl._literal_coercion)Nr   rD   rD   rD   rE   r     s   r   c                   @  s2   e Zd ZdZd
ddddddddZddd	ZdS )TruncatedLabelImplrD   Nr   rg   r   c                 K  s    t |tr|S | ||| d S r_   r   r   rD   rD   rE   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@   r!   Z_truncated_labelr   rD   rD   rE   rp     s    z$TruncatedLabelImpl._literal_coercion)N)Nr   rD   rD   rD   rE   r     s    r   c                   @  s   e Zd ZdZdZdddZdS )DDLExpressionImplrD   TNc                 C  s
   t |S r_   r   r   rD   rD   rE   r   &  s    z DDLExpressionImpl._text_coercion)Nr   rD   rD   rD   rE   r      s   r   c                   @  s   e Zd ZdZdS )DDLConstraintColumnImplrD   Nr   rD   rD   rD   rE   r   .  s   r   c                   @  s   e Zd ZdZdS )DDLReferredColumnImplrD   Nr   rD   rD   rD   rE   r   2  s   r   c                   @  s0   e Zd ZdZd
ddddddddZdd	 ZdS )LimitOffsetImplrD   Nr   rg   r   c                 K  s   |d krd S |  ||| d S r_   r   r   rD   rD   rE   r}   9  s    z#LimitOffsetImpl._implicit_coercionsc                 K  s,   |d krd S t |}tj|||ddS d S )NT)r   r   )r   Zasintr$   Z_OffsetLimitParam)r   rC   r   r   r^   valuerD   rD   rE   rp   E  s    
   z!LimitOffsetImpl._literal_coercion)Nr   rD   rD   rD   rE   r   6  s    r   c                      s0   e Zd ZdZddddddd fddZ  ZS )	LabeledColumnExprImplrD   Nr   rg   r   c                   sX   t |tjr|d S t j||fd|i|}t |tjrF|d S | ||| d S Nre   )r@   r   ExpressionElementRolelabelr   r}   rv   )r   rC   r   re   r^   newr   rD   rE   r}   R  s    
 
z)LabeledColumnExprImpl._implicit_coercions)N)r   r   r   r   r}   r   rD   rD   r   rE   r   O  s    r   c                      sF   e Zd ZdZdZdZdZedej	Z
d	 fdd	Zd
ddZ  ZS )ColumnsClauseImplrD   Tz^\w\S*$Nc                   sF   |s*t |tr*dddd |D  d}t j|f|||d|S )NzDid you mean to say select(z, c                 s  s   | ]}t |V  qd S r_   )r   )r   erD   rD   rE   	<genexpr>s  s     z8ColumnsClauseImpl._raise_for_expected.<locals>.<genexpr>z)?r   )r@   rW   joinr   rv   )r   rC   re   r   r   r^   r   rD   rE   rv   n  s      z%ColumnsClauseImpl._raise_for_expectedc                 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 specificityr   r   literal_columnr   )r   re   r  )rH   _guess_straight_columnmatchr   r[   r   r   )r   rC   re   Zguess_is_literalrD   rD   rE   r   {  s    z ColumnsClauseImpl._text_coercion)NNN)N)r   r   r   r   r   r   r   recompileIr  rv   r   r   rD   rD   r   rE   r  e  s        r  c                   @  s   e Zd ZdZdS )ReturnsRowsImplrD   Nr   rD   rD   rD   rE   r    s   r  c                      s:   e Zd ZdZd
ddZddddddd fdd	Z  ZS )StatementImplrD   Nc                 K  sF   ||k	rBt |tsBz
|j W n$ tk
r@   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@   rH   Z_execute_on_connectionru   r   warn_deprecated)r   r   rk   re   r^   rD   rD   rE   r|     s    
 

zStatementImpl._post_coercionr   rg   r   c                   s(   |j r
|S t j||fd|i|S d S r   )r   r   r}   r   r   rD   rE   r}     s     z!StatementImpl._implicit_coercions)N)N)r   r   r   r   r|   r}   r   rD   rD   r   rE   r    s   
 r  c                   @  s(   e Zd ZdZdddddddddZdS )	SelectStatementImplrD   Nr   rg   r   c                 K  s    |j r| S | ||| d S r_   )_is_text_clausecolumnsrv   r   rD   rD   rE   r}     s    z'SelectStatementImpl._implicit_coercions)Nr   rD   rD   rD   rE   r    s    r  c                   @  s   e Zd ZdZdS )
HasCTEImplrD   Nr   rD   rD   rD   rE   r    s   r  c                   @  s   e Zd ZdZdS )	IsCTEImplrD   Nr   rD   rD   rD   rE   r    s   r  c                   @  s8   e Zd ZdZdZdddZddddd	ddd
ddZdS )JoinTargetImplrD   TNc                 K  s   |  || d S r_   r   r   rD   rD   rE   rp     s    z JoinTargetImpl._literal_coercionFr   rg   rh   )rC   r   re   legacyr^   rQ   c                 K  s>   t |tjr|S |r,|jr,tjddd |S | ||| d S NzImplicit 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  rv   )r   rC   r   re   r  r^   rD   rD   rE   r}     s    
z"JoinTargetImpl._implicit_coercions)N)NF)r   r   r   r   rq   rp   r}   rD   rD   rD   rE   r    s   
  r  c                	   @  s6   e Zd ZdZdddddddddd	d
ZdddZdS )FromClauseImplrD   NFTr   rg   rh   rC   r   re   rc   allow_selectr^   rQ   c                 K  sH   |j r,|r| S |rDtjddd |jS n|jr6|S | ||| d S r  )r   Zsubqueryr   r  _implicit_subqueryr  rv   r   rC   r   re   rc   r  r^   rD   rD   rE   r}     s    	z"FromClauseImpl._implicit_coercionsc                 K  s   |r|  S |S d S r_   )Z_deannotate)r   rC   Z
deannotater^   rD   rD   rE   r|     s    zFromClauseImpl._post_coercion)NFT)F)r   r   r   r   r}   r|   rD   rD   rD   rE   r    s      r  c                	   @  s,   e Zd ZdZd
dddddddddd	ZdS )StrictFromClauseImplrD   NFr   rg   rh   r  c                 K  s0   |j r|rtjddd |jS | ||| d S r  )r   r   r  r  rv   r  rD   rD   rE   r}     s    	
z(StrictFromClauseImpl._implicit_coercions)NFFr   rD   rD   rD   rE   r    s
      r  c                   @  s   e Zd ZdZdddZdS )AnonymizedFromClauseImplrD   FNc                 K  s   |d kst |j|dS )N)flat)rx   Z_anonymous_fromclause)r   rC   r  r   r^   rD   rD   rE   r|   8  s    z'AnonymizedFromClauseImpl._post_coercion)FNr   rD   rD   rD   rE   r  5  s   r  c                   @  s   e Zd ZdZdd ZdS )DMLTableImplrD   c                 K  s   d|j kr|j d S |S d S )NZ	dml_table)Z_annotationsr   rD   rD   rE   r|   A  s    

zDMLTableImpl._post_coercionNr   rD   rD   rD   rE   r   >  s   r   c                   @  s(   e Zd ZdZdddddddddZdS )	DMLSelectImplrD   Nr   rg   r   c                 K  s<   |j r*t|tjr |jjr |jS | S n| ||| d S r_   )r   r@   r$   r   rC   r   r   rv   r   rD   rD   rE   r}   K  s    

z!DMLSelectImpl._implicit_coercions)Nr   rD   rD   rD   rE   r!  H  s    r!  c                      s"   e Zd ZdZd fdd	Z  ZS )CompoundElementImplrD   Nc                   s>   t |tjr|jrd}q"d}nd }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   rv   r   r   rD   rE   rv   a  s       z'CompoundElementImpl._raise_for_expected)NNr   rD   rD   r   rE   r"  ^  s   r"  ZRoleZImpl)
__future__r   collections.abcabcrG   r   r  rw   r   r   r   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   _typingr   baser   r   	cache_keyr   r   r   r   r   Zutil.typingr    r!   r"   r#   r$   r%   r&   r'   r(   r)   Zdmlr*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   r7   r8   r9   ZSQLRoler:   r<   Z
StringRoler=   r>   rF   rI   rR   r\   ra   r   r   r   r   r   r   r   r[   r   r   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"  rn   dirr   rr   clsendswithreplaceglobalsr~   r   Zee_implintrh   rH   floatZpy_typerD   rD   rD   rE   <module>	   sR  &

	u6	(+U		

)(&$	


