ó
    Ñ]jøÀ  ã                  ó  • % S SK Jr  S SKJr  S SKrS SKrS SKrS SKrS SK	r	S SK	J
r
  S SKJr  S SKJr  S SKJr  S SKJr  S SKJr  S S	KJr  S S
KJr  S SKJr  S SKJr  S SKJr  S SKJr  S SKrSSKJr  SSKJr  SSKJr  SSKJr  SSKJr  SSKJr  SSK J!r!  SSK J"r"  SSK J#r#  SSKJ$r$  SSK%J&r&  SSKJ'r'  SSKJ(r(  SSKJ)r)  SSK*J+r+  \(       a  SS KJ,r,  SS!KJ-r-  SS"KJ.r.  SS#KJ/r/  \\\S$4   \S%   4   r0\S$\4   r1\)Rd                  " S&5      r3S'\4S('   \/ \4   r5\S$\4   r6\/ \4   r7\" S)\"S*9r8\\8/\4   r9 " S+ S,\#5      r:      SA               SBS. jjr; " S/ S0\RZ                  5      r< " S1 S2\<5      r= " S3 S-\R|                  \<\"5      r? " S4 S5\R|                  \RZ                  5      r@ " S6 S7\?5      rA " S8 S95      rB " S: S;5      rC " S< S=5      rD " S> S?\&5      rE\(RŒ                  " \<5      S@ 5       rGg)Cé    )ÚannotationsN)ÚCodeType)ÚAny)ÚCallable)Úcast)ÚList)ÚMutableMapping)ÚOptional)ÚTuple)ÚType)ÚTYPE_CHECKING)ÚTypeVar)ÚUnioné   )Ú	cache_key)Ú	coercions)Úelements)Úroles)Úschema)Úvisitors)Ú_clone)Ú
Executable)ÚOptions)Ú
CacheConst)ÚColumnOperatorsé   )Úexc)Ú
inspection)Úutil)ÚLiteral)ÚBindParameter)ÚClauseElement)ÚSQLRole)Ú_CloneCallableType.)ÚNonAnalyzedFunctionÚAnalyzedFunctioniè  Ú_LambdaCacheTypeÚ_closure_per_cache_keyÚ_E)Úboundc                  óB   • \ rS rSr% SrSrSrS\S'   SrSr	Sr
S\S'   Srg)	ÚLambdaOptionséH   TNúOptional[object]Útrack_onúOptional[_LambdaCacheType]Úlambda_cache© )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Úenable_trackingÚtrack_closure_variablesr/   Ú__annotations__Úglobal_track_bound_valuesÚtrack_bound_valuesr1   Ú__static_attributes__r2   ó    ÚS/home/mande/repo/quber/.venv/lib/python3.13/site-packages/sqlalchemy/sql/lambdas.pyr,   r,   H   s/   ‡ Ø€OØ"ÐØ!%€HÐÓ%Ø $ÐØÐØ/3€LÐ,Ö3r=   r,   ÚStatementLambdaElementc                óP   • [        U [        R                  [        UUUUUUS95      $ )aØ  Produce a SQL statement that is cached as a lambda.

The Python code object within the lambda is scanned for both Python
literals that will become bound parameters as well as closure variables
that refer to Core or ORM constructs that may vary.   The lambda itself
will be invoked only once per particular set of constructs detected.

E.g.::

    from sqlalchemy import lambda_stmt

    stmt = lambda_stmt(lambda: table.select())
    stmt += lambda s: s.where(table.c.id == 5)

    result = connection.execute(stmt)

The object returned is an instance of :class:`_sql.StatementLambdaElement`.

.. versionadded:: 1.4

:param lmb: a Python function, typically a lambda, which takes no arguments
 and returns a SQL expression construct
:param enable_tracking: when False, all scanning of the given lambda for
 changes in closure variables or bound parameters is disabled.  Use for
 a lambda that produces the identical results in all cases with no
 parameterization.
:param track_closure_variables: when False, changes in closure variables
 within the lambda will not be scanned.   Use for a lambda where the
 state of its closure variables will never change the SQL structure
 returned by the lambda.
:param track_bound_values: when False, bound parameter tracking will
 be disabled for the given lambda.  Use for a lambda that either does
 not produce any bound values, or where the initial bound values never
 change.
:param global_track_bound_values: when False, bound parameter tracking
 will be disabled for the entire statement including additional links
 added via the :meth:`_sql.StatementLambdaElement.add_criteria` method.
:param lambda_cache: a dictionary or other mapping-like object where
 information about the lambda's Python code as well as the tracked closure
 variables in the lambda itself will be stored.   Defaults
 to a global LRU cache.  This cache is independent of the "compiled_cache"
 used by the :class:`_engine.Connection` object.

.. seealso::

    :ref:`engine_lambda_caching`


)r7   r/   r8   r:   r;   r1   )r?   r   ÚStatementRoler,   )Úlmbr7   r8   r/   r:   r;   r1   s          r>   Úlambda_stmtrC   Q   s8   € ôv "ØÜ×ÑÜØ+ØØ$;Ø&?Ø1Ø%ñ	
óð r=   c                  ón  • \ rS rSr% SrSrSrS\R                  R                  4/r
SrS\S'   S	\S
'   SrS\S'   S\S'   S\S'   S\S'   S\S'   S\S'   S r\S4       S&S jjrS rS r\S 5       r\S 5       r\S 5       rS rS  r\S4       S'S! jjr\R8                  S" 5       rS# rS(S$ jrS%r g))ÚLambdaElementéš   a×  A SQL construct where the state is stored as an un-invoked lambda.

The :class:`_sql.LambdaElement` is produced transparently whenever
passing lambda expressions into SQL constructs, such as::

    stmt = select(table).where(lambda: table.c.col == parameter)

The :class:`_sql.LambdaElement` is the base of the
:class:`_sql.StatementLambdaElement` which represents a full statement
within a lambda.

.. versionadded:: 1.4

.. seealso::

    :ref:`engine_lambda_caching`

Úlambda_elementTÚ	_resolvedr2   zTuple[_CloneCallableType, ...]Ú_transformszList[BindParameter[Any]]Ú_resolved_bindparamsNz Optional[StatementLambdaElement]Úparent_lambdaz4Union[Tuple[Any, ...], Literal[CacheConst.NO_CACHE]]Úclosure_cache_keyúType[SQLRole]Úrolez,Union[AnalyzedFunction, NonAnalyzedFunction]Ú_recÚ_AnyLambdaTypeÚfnzTuple[CodeType, ...]Útracker_keyc                óf   • U R                   R                  < SU R                  R                  < S3$ )NÚ(Ú))Ú	__class__r3   rQ   Ú__code__©Úselfs    r>   Ú__repr__ÚLambdaElement.__repr__À   s&   € à�N‰N×#Ô#Ø�G‰G×Ôð
ð 	
r=   c                óÜ   • Xl         X l        UR                  4U l        X0l        Uc  U[
        R                  L a  U nU R                  XU5      nUb  UR                  nU(       a  Xdl	        g g g ©N)
rQ   rN   rW   rR   Úoptsr   rA   Ú_retrieve_tracker_recÚpropagate_attrsÚ_propagate_attrs)rY   rQ   rN   r^   Úapply_propagate_attrsÚrecr`   s          r>   Ú__init__ÚLambdaElement.__init__Æ   sp   € ð ŒØŒ	ØŸK™K˜>ˆÔØŒ	à Ñ(¨d´e×6IÑ6IÒ.IØ$(Ð!à×(Ñ(¨ÀDÓIˆà Ñ,Ø!×1Ñ1ˆOÞØ9HÕ6ð ð -r=   c                ój  • UR                   nUc  [        nU R                  nU R                  nUR                  n[
        R                  UU U5      n/ =U l        nU R                  b  U R                  R                  n	OSn	U	[        R                  La‡  [        R                  " 5       n
[        UR                   Vs/ s H  nU" XcX¨5      PM     sn5      n[        R                  U
;  a  Xœ-   nXÀl	        UR                  X\-   5      nO%[        R                  nS nO[        R                  nS nXÀl	        Ucv  U[        R                  LaH  [
        R                      X\-   nXä;  a!  [#        XpX!5      n[%        U5      Ul        XÔU'   OXN   nS S S 5        Ob[)        U R+                  U5      5      nOG[-        UR&                  U5       VVs/ s H   u  nnUR/                  UR0                  SS9PM"     snnUS S & XÐl        U[        R                  LaŒ  U R                  b  U R                  R                  US S& U nUba  UR2                  nUR4                  (       a3  UR6                  nUR4                   H  nU" UR                  UU5        M     UR                  nUb  Ma  U$ s  snf ! , (       d  f       Nº= fs  snnf )Nr2   T©Úmaintain_keyr   )r1   r(   rR   rQ   Ú__closure__ÚAnalyzedCodeÚgetrJ   rK   rL   Ú
_cache_keyÚNO_CACHEr   Úanon_mapÚtupleÚclosure_trackersÚ_generation_mutexr&   ÚlistÚclosure_bindparamsr%   Ú_invoke_user_fnÚzipÚ_with_valueÚvaluerO   Úbindparam_trackersÚtracker_instrumented_fn)rY   rQ   rb   r^   r1   rR   ÚclosureÚtrackerÚ
bindparamsÚparent_closure_cache_keyrn   Úgetterr   rc   ÚkeyÚ	orig_bindÚnew_bindrG   ry   s                      r>   r_   Ú#LambdaElement._retrieve_tracker_recÜ   s±  € Ø×(Ñ(ˆØÑÜ1ˆLà×&Ñ&ˆà�W‰WˆØ—.‘.ˆÜ×"Ñ"ØØØó
ˆð 24Ð3ˆÔ! Jà×ÑÑ)Ø'+×'9Ñ'9×'KÑ'KÑ$à')Ð$ð $¬:×+>Ñ+>Ò>Ü×(Ò(Ó*ˆHÜð #*×":Ò":óâ":˜ñ ˜7¨(Ö?Ù":ñóˆIô ×"Ñ"¨(Ó2Ø4Ñ@�	à)2Ô&à"×&Ñ& {Ñ'>Ó?‘ä&×/Ñ/�	Ø‘ô #×+Ñ+ˆIØˆCà!*Ôà‰;Ø¤
× 3Ñ 3Ò3Ü!×3Ó3Ø%Ñ1�CØÓ.Ü.Ø#Ð+@ó˜ô 26°jÓ1A˜Ô.Ø,/ SÒ)à*Ñ/˜÷ 4Ð3ô *¨$×*>Ñ*>¸rÓ*BÓC‘ô
 ,/Ø×*Ñ*¨Jô,ôò,Ñ'�I˜xð ×%Ñ% h§n¡nÀ4Ð%ÓHñ,òˆJ‘qˆMð Œ	àœJ×/Ñ/Ò/Ø×!Ñ!Ñ-Ø!%×!3Ñ!3×!HÑ!H�
˜2˜A�à6:ˆNØ Ñ,Ø$×)Ñ)�Ø×)×)à×3Ñ3ð ,ð $'×#9Ô#9˜ÙØ*×-Ñ-Ø3Ø&öñ $:ð "0×!=Ñ!=�ð !Ó,ð ˆ
ùòE÷0 4Õ3üós   Â;JÅ/JÇ'J/Ê
J,c                óB   • [        U R                  R                  U5      $ r]   )ÚgetattrrO   Úexpected_expr©rY   r   s     r>   Ú__getattr__ÚLambdaElement.__getattr__<  s   € Ü�t—y‘y×.Ñ.°Ó4Ð4r=   c                ó.   • U R                   R                  $ r]   )rO   Úis_sequencerX   s    r>   Ú_is_sequenceÚLambdaElement._is_sequence?  s   € à�y‰y×$Ñ$Ð$r=   c                óà   • U R                   (       aC  [        R                  R                  U R                   Vs/ s H  oR
                  PM     sn5      $ U R                  R
                  $ s  snf r]   )r‹   Ú	itertoolsÚchainÚfrom_iterablerH   Ú_select_iterable©rY   Úelements     r>   r‘   ÚLambdaElement._select_iterableC  sT   € à××Ü—?‘?×0Ñ0Ø9=¿ºÓHº¨g×)Ô)¹ÑHóð ð
 —>‘>×2Ñ2Ð2ùò	 Ió   ¹A+c                óà   • U R                   (       aC  [        R                  R                  U R                   Vs/ s H  oR
                  PM     sn5      $ U R                  R
                  $ s  snf r]   )r‹   rŽ   r�   r�   rH   Ú_from_objectsr’   s     r>   r—   ÚLambdaElement._from_objectsM  sT   € à××Ü—?‘?×0Ñ0Ø6:·n²nÓE²n¨7×&Ô&±nÑEóð ð
 —>‘>×/Ñ/Ð/ùò	 Fr•   c                ón   • U R                    Vs0 s H  oR                  UR                  _M     sn$ s  snf r]   )rJ   r   rw   )rY   Úbs     r>   Ú_param_dictÚLambdaElement._param_dictW  s,   € Ø(,×(AÒ(AÓBÒ(A 1—‘�q—w‘w’Ñ(AÑBÐBùÒBs   � 2c                ód  ^• U R                    Vs0 s H  o"R                  U_M     snm      SU4S jjnU R                  R                  (       a*  U Vs/ s H  n[        R
                  " U0 U5      PM     nnU$ [        USS5      (       a  [        R
                  " U0 U5      nU$ s  snf s  snf )Nc                óú   >• [        U [        R                  5      (       a[  U R                  T;   aK  TU R                     nU R                  (       a)  SUl        U R
                  Ul        U R                  Ul        U$ g ©NT)Ú
isinstancer   r!   r   Ú	expandingÚ	expand_opÚtype)r“   ÚkwÚbindÚbindparam_lookups      €r>   ÚreplaceÚ<LambdaElement._setup_binds_for_tracked_expr.<locals>.replace]  sc   ø€ ô ˜'¤8×#9Ñ#9×:Ñ:Ø—;‘;Ð"2Ó2Ø+¨G¯K©KÑ8�DØ×(×(Ø)-˜œØ)0×):Ñ):˜œØ$+§L¡L˜œ	Ø�Kàr=   Úis_clause_elementF)r“   ú(Optional[visitors.ExternallyTraversible]r¤   r   Úreturnrª   )rJ   r   rO   rŠ   r   Úreplacement_traverser„   )rY   Úexprrš   r§   Úsub_exprr¦   s        @r>   Ú_setup_binds_for_tracked_exprÚ+LambdaElement._setup_binds_for_tracked_exprZ  sÀ   ø€ Ø.2×.GÒ.GÓHÒ.G¨ŸE™E 1šHÑ.GÑHÐð	Ø=ð	ØEHð	à5÷	ð �9‰9× × ñ !%óâ $�Hô ×-Ò-¨h¸¸GÖDÙ $ð ð ð ˆô �TÐ.°×6Ñ6Ü×0Ò0°°r¸7ÓCˆDàˆùò1 Iùò"s   �B(Á"B-c                ó8   • U" U R                   4SU0UD6U l         g )NÚdeferred_copy_internals)rH   )rY   Úcloner²   r¤   s       r>   Ú_copy_internalsÚLambdaElement._copy_internalsu  s)   € ñ Ø�N‰Nñ
à$;ð
ð ñ
ˆ�r=   c                óv   • U R                   R                  nU R                  (       a  U R                  U5      nU$ r]   )rO   r…   rJ   r¯   ©rY   r­   s     r>   rH   ÚLambdaElement._resolved‚  s/   € à�y‰y×&Ñ&ˆà×$×$Ø×5Ñ5°dÓ;ˆDàˆr=   c                óî  • U R                   [        R                  L a  SU[        R                  '   g U R                  R                  U R
                  4U R                   -   nU R                  nUbY  UR                   [        R                  Ld   eUR                   nUR                  R                  4U-   U-   nUR                  nUb  MY  U R                  (       a  UR                  U R                  5        U$ rŸ   )
rL   rl   rm   rQ   rW   rV   rK   r   rJ   Úextend)rY   rn   r|   r   Úparentr}   s         r>   Ú_gen_cache_keyÚLambdaElement._gen_cache_key‹  sí   € Ø×!Ñ!¤Z×%8Ñ%8Ò8Ø,0ˆH”Z×(Ñ(Ñ)Øð �G‰G×ÑØ�N‰Nð
ð ×"Ñ"ñ#ˆ	ð
 ×#Ñ#ˆàÑ Ø×+Ñ+´:×3FÑ3FÒFÐFÐFà×(Ñ(ð %ð
 —‘×#Ñ#Ð%Ð(@Ñ@À9ÑLð ð ×)Ñ)ˆFð Ó ð ×$×$Ø×Ñ˜d×7Ñ7Ô8ØÐr=   c                ó   • U" 5       $ r]   r2   ©rY   rQ   Úargs      r>   rt   ÚLambdaElement._invoke_user_fn§  s	   € Ù‹tˆr=   )rO   rH   rJ   rL   rQ   r^   rN   rR   )rQ   Ú_LambdaTyperN   rM   r^   ú)Union[Type[LambdaOptions], LambdaOptions]rb   úOptional[ClauseElement])r³   r$   r²   zOptional[_CloneCallableType]r¤   r   r«   ÚNone)rQ   rP   rÀ   r   r«   r"   )!r3   r4   r5   r6   Ú__doc__Ú__visit_name__Ú_is_lambda_elementr   ÚInternalTraversalÚdp_clauseelementÚ_traverse_internalsrI   r9   rK   rZ   r,   rd   r_   r‡   Úpropertyr‹   r‘   r—   r›   r¯   r   r´   r   Úmemoized_propertyrH   r¼   rt   r<   r2   r=   r>   rE   rE   š   sV  ‡ ñð& &€NàÐð 
�h×0Ñ0×AÑAÐBðÐð 35€KÐ/Ó4à2Ó2Ø6:€MÐ3Ó:ØKÓKØ
ÓØ
6Ó6ØÓØ%Ó%ò
ð ;HØ9=ðIàðIð ðIð 8ð	Ið
  7õIò,^ò@5ð ñ%ó ð%ð ñ3ó ð3ð ñ0ó ð0òCòð: %+Ø@Dð
à!ð
ð ">ð
ð ð	
ð
 
õ
ð 
×Ññó ðò÷8r=   rE   c                  ój   ^ • \ rS rSrSr\S4       S
U 4S jjjrS rSS jr\	S4U 4S jjr
S	rU =r$ )ÚDeferredLambdaElementi«  a*  A LambdaElement where the lambda accepts arguments and is
invoked within the compile phase with special context.

This lambda doesn't normally produce its real SQL expression outside of the
compile phase.  It is passed a fixed set of initial arguments
so that it can generate a sample expression.

r2   c                ó2   >• X@l         [        TU ]	  XU5        g r]   )Úlambda_argsÚsuperrd   )rY   rQ   rN   r^   rÑ   rV   s        €r>   rd   ÚDeferredLambdaElement.__init__µ  s   ø€ ð 'ÔÜ‰Ñ˜ 4Õ(r=   c                ó    • U" U R                   6 $ r]   ©rÑ   r¿   s      r>   rt   Ú%DeferredLambdaElement._invoke_user_fn¿  s   € Ù�4×#Ñ#Ð$Ð$r=   c                ó  • [        U R                  [        5      (       d   eU R                  R                  nU" U6 n[        R
                  " U R                  U5      nU R                  U5      nU R                   H  nU" U5      nM     U$ r]   )	r    rO   r&   ry   r   ÚexpectrN   r¯   rI   )rY   rÑ   Ú
tracker_fnr­   r²   s        r>   Ú_resolve_with_argsÚ(DeferredLambdaElement._resolve_with_argsÂ  s}   € Ü˜$Ÿ)™)Ô%5×6Ñ6Ð6Ð6Ø—Y‘Y×6Ñ6ˆ
Ù˜;Ð'ˆä×Ò §	¡	¨4Ó0ˆà×1Ñ1°$Ó7ˆð0 (,×'7Ô'7Ð#Ù*¨4Ó0ŠDñ (8ð ˆr=   Nc                ó`   >• [         TU ]  UUUS9  U(       a  U =R                  U4-  sl        g g )N)r³   r²   r^   )rÒ   r´   rI   )rY   r³   r²   r¤   rV   s       €r>   r´   Ú%DeferredLambdaElement._copy_internalsæ  s?   ø€ ô 	‰ÑØØ$;Øð 	 ñ 	
ö #Ø×ÒÐ!8Ð :Ñ:Öð #r=   rÕ   )rQ   rP   rN   zType[roles.SQLRole]r^   rÃ   rÑ   zTuple[Any, ...])rÑ   r   r«   r"   )r3   r4   r5   r6   rÆ   r,   rd   rt   rÚ   r   r´   r<   Ú__classcell__)rV   s   @r>   rÏ   rÏ   «  s]   ø† ñð ;HØ')ð)àð)ð "ð)ð 8ð	)ð
 %÷)ð )ò%ô"ðJ °D÷;õ ;r=   rÏ   c                  óH  • \ rS rSrSr\(       a  \S4       SS jjr    SS jr    S           SS jjr	S r
\SS j5       r\S	 5       r\S
 5       r\S 5       r\S 5       r\S 5       r\S 5       r\S 5       r\S 5       r\S 5       r\S 5       rSS jrSrg)r?   iõ  a/  Represent a composable SQL statement as a :class:`_sql.LambdaElement`.

The :class:`_sql.StatementLambdaElement` is constructed using the
:func:`_sql.lambda_stmt` function::


    from sqlalchemy import lambda_stmt

    stmt = lambda_stmt(lambda: select(table))

Once constructed, additional criteria can be built onto the statement
by adding subsequent lambdas, which accept the existing statement
object as a single parameter::

    stmt += lambda s: s.where(table.c.col == parameter)

.. versionadded:: 1.4

.. seealso::

    :ref:`engine_lambda_caching`

Nc                ó   • g r]   r2   )rY   rQ   rN   r^   rb   s        r>   rd   ÚStatementLambdaElement.__init__  s   € ð r=   c                ó$   • U R                  U5      $ r]   )Úadd_criteria)rY   Úothers     r>   Ú__add__ÚStatementLambdaElement.__add__  s   € ð × Ñ  Ó'Ð'r=   c           	     ór   • U R                   [        UUU R                   R                  UUS9-   n[        XUS9$ )a€  Add new criteria to this :class:`_sql.StatementLambdaElement`.

E.g.::

    >>> def my_stmt(parameter):
    ...     stmt = lambda_stmt(
    ...         lambda: select(table.c.x, table.c.y),
    ...     )
    ...     stmt = stmt.add_criteria(lambda: table.c.x > parameter)
    ...     return stmt

The :meth:`_sql.StatementLambdaElement.add_criteria` method is
equivalent to using the Python addition operator to add a new
lambda, except that additional arguments may be added including
``track_closure_values`` and ``track_on``::

    >>> def my_stmt(self, foo):
    ...     stmt = lambda_stmt(
    ...         lambda: select(func.max(foo.x, foo.y)),
    ...         track_closure_variables=False,
    ...     )
    ...     stmt = stmt.add_criteria(lambda: self.where_criteria, track_on=[self])
    ...     return stmt

See :func:`_sql.lambda_stmt` for a description of the parameters
accepted.

)r7   r8   r:   r/   r;   )rK   r^   )r^   Údictr:   ÚLinkedLambdaElement)rY   rä   r7   r/   r8   r;   r^   s          r>   rã   Ú#StatementLambdaElement.add_criteria  sB   € ðJ �y‰yœ4Ø+Ø$;Ø&*§i¡i×&IÑ&IØØ1ñ
ñ 
ˆô # 5À4ÑHÐHr=   c                ó  • [         (       a+  [        U R                  R                  [        5      (       d   eU R                  R                  R
                  (       a  UR                  XU5      $ [        R                  " U 5      er]   )	r   r    rO   r…   r"   Úsupports_executionÚ_execute_clauseelementr   ÚObjectNotExecutableError©rY   Ú
connectionÚdistilled_paramsÚexecution_optionss       r>   Ú_execute_on_connectionÚ-StatementLambdaElement._execute_on_connectionN  se   € ÷ Š=Ü˜dŸi™i×5Ñ5´}×EÑEÐEÐEØ�9‰9×"Ñ"×5×5Ø×4Ñ4ØÐ(9óð ô ×.Ò.¨tÓ4Ð4r=   c                ó   • U R                   $ r]   )Ú_rec_expected_exprrX   s    r>   Ú_proxiedÚStatementLambdaElement._proxiedZ  s   € à×&Ñ&Ð&r=   c                ó.   • U R                   R                  $ r]   )r÷   Ú_with_optionsrX   s    r>   rú   Ú$StatementLambdaElement._with_options^  s   € à�}‰}×*Ñ*Ð*r=   c                ó.   • U R                   R                  $ r]   )r÷   Ú_effective_plugin_targetrX   s    r>   rý   Ú/StatementLambdaElement._effective_plugin_targetb  s   € à�}‰}×5Ñ5Ð5r=   c                ó.   • U R                   R                  $ r]   )r÷   Ú_execution_optionsrX   s    r>   r   Ú)StatementLambdaElement._execution_optionsf  s   € à�}‰}×/Ñ/Ð/r=   c                ó.   • U R                   R                  $ r]   )r÷   Ú_all_selected_columnsrX   s    r>   r  Ú,StatementLambdaElement._all_selected_columnsj  s   € à�}‰}×2Ñ2Ð2r=   c                ó.   • U R                   R                  $ r]   )r÷   Ú	is_selectrX   s    r>   r  Ú StatementLambdaElement.is_selectn  ó   € à�}‰}×&Ñ&Ð&r=   c                ó.   • U R                   R                  $ r]   )r÷   Ú	is_updaterX   s    r>   r
  Ú StatementLambdaElement.is_updater  r  r=   c                ó.   • U R                   R                  $ r]   )r÷   Ú	is_insertrX   s    r>   r  Ú StatementLambdaElement.is_insertv  r  r=   c                ó.   • U R                   R                  $ r]   )r÷   Úis_textrX   s    r>   r  ÚStatementLambdaElement.is_textz  s   € à�}‰}×$Ñ$Ð$r=   c                ó.   • U R                   R                  $ r]   )r÷   Ú	is_deleterX   s    r>   r  Ú StatementLambdaElement.is_delete~  r  r=   c                ó.   • U R                   R                  $ r]   )r÷   Úis_dmlrX   s    r>   r  ÚStatementLambdaElement.is_dml‚  s   € à�}‰}×#Ñ#Ð#r=   c                ó4   • [        U R                  5       5      $ )zdReturn a new :class:`.StatementLambdaElement` that will run
all lambdas unconditionally each time.

)ÚNullLambdaStatementrQ   rX   s    r>   ÚspoilÚStatementLambdaElement.spoil†  s   € ô
 # 4§7¡7£9Ó-Ð-r=   r2   )rQ   Ú_StmtLambdaTyperN   rM   r^   rÃ   rb   rÄ   )rä   ú_StmtLambdaElementType[Any]r«   r?   )TNTT)rä   r  r7   Úboolr/   zOptional[Any]r8   r  r;   r  r«   r?   )r«   r   )r«   r  )r3   r4   r5   r6   rÆ   r   r,   rd   rå   rã   ró   rÌ   r÷   rú   rý   r   r  r  r
  r  r  r  r  r  r<   r2   r=   r>   r?   r?   õ  s�  † ñö0 ð ?LØ=Að	àð	ð  ð	ð <ð		ð
 $;õ	ð(Ø0ð(à	ô(ð !%Ø"&Ø(,Ø#'ð-Ià*ð-Ið ð-Ið  ð	-Ið
 "&ð-Ið !ð-Ið 
 õ-Iò^
5ð ó'ó ð'ð ñ+ó ð+ð ñ6ó ð6ð ñ0ó ð0ð ñ3ó ð3ð ñ'ó ð'ð ñ'ó ð'ð ñ'ó ð'ð ñ%ó ð%ð ñ'ó ð'ð ñ$ó ð$÷.r=   c                  óp   • \ rS rSrSrSrSrS\R                  R                  4/r
S rS rS rS	 rS
 rSrg)r  iŽ  zÜProvides the :class:`.StatementLambdaElement` API but does not
cache or analyze lambdas.

the lambdas are instead invoked immediately.

The intended use is to isolate issues that may arise when using
lambda statements.

rG   TrH   c                ó2   • Xl         UR                  U l        g r]   )rH   ra   )rY   Ú	statements     r>   rd   ÚNullLambdaStatement.__init__¡  s   € Ø"ŒØ )× :Ñ :ˆÕr=   c                ó.   • [        U R                  U5      $ r]   )r„   rH   r†   s     r>   r‡   ÚNullLambdaStatement.__getattr__¥  s   € Ü�t—~‘~ sÓ+Ð+r=   c                ó<   • U" U R                   5      n[        U5      $ r]   ©rH   r  )rY   rä   r!  s      r>   rå   ÚNullLambdaStatement.__add__¨  ó   € Ù˜$Ÿ.™.Ó)ˆ	ä" 9Ó-Ð-r=   c                ó<   • U" U R                   5      n[        U5      $ r]   r&  )rY   rä   r¤   r!  s       r>   rã   Ú NullLambdaStatement.add_criteria­  r(  r=   c                óˆ   • U R                   R                  (       a  UR                  XU5      $ [        R                  " U 5      er]   )rH   rì   rí   r   rî   rï   s       r>   ró   Ú*NullLambdaStatement._execute_on_connection²  s=   € ð �>‰>×,×,Ø×4Ñ4ØÐ(9óð ô ×.Ò.¨tÓ4Ð4r=   )ra   rH   N)r3   r4   r5   r6   rÆ   rÇ   rÈ   r   rÉ   rÊ   rË   rd   r‡   rå   rã   ró   r<   r2   r=   r>   r  r  Ž  sK   † ñð &€NàÐð 
�h×0Ñ0×AÑAÐBðÐò;ò,ò.ò
.õ
5r=   r  c                  ó@   • \ rS rSr% SrS\S'         S	S jrS rSrg)
ré   i½  zARepresent subsequent links of a :class:`.StatementLambdaElement`.r?   rK   c                ó¬   • X0l         Xl        X l        UR                  UR                  4-   U l        U R                  XU5        UR                  U l        g r]   )r^   rQ   rK   rR   rW   r_   ra   )rY   rQ   rK   r^   s       r>   rd   ÚLinkedLambdaElement.__init__Â  sK   € ð Œ	ØŒØ*Ôà(×4Ñ4¸¿¹°~ÑEˆÔØ×"Ñ" 2¨TÔ2Ø -× >Ñ >ˆÕr=   c                ó:   • U" U R                   R                  5      $ r]   )rK   rH   r¿   s      r>   rt   Ú#LinkedLambdaElement._invoke_user_fnÐ  s   € Ù�$×$Ñ$×.Ñ.Ó/Ð/r=   )ra   rQ   r^   rK   rR   N)rQ   r  rK   r?   r^   rÃ   )	r3   r4   r5   r6   rÆ   r9   rd   rt   r<   r2   r=   r>   ré   ré   ½  s1   ‡ ÙKà)Ó)ð?à'ð?ð .ð?ð 8ô	?õ0r=   ré   c                  óØ   • \ rS rSr% Sr\R                  " 5       rS\S'   \	R                  " 5       r\S 5       rS rS rS rS	 rS
 r\S 5       rS rS rS r  SS jr SS jrS rSrg)rj   iÔ  )r8   r;   rx   rp   Úbuild_py_wrappersz1weakref.WeakKeyDictionary[CodeType, AnalyzedCode]Ú_fnsc                ól  •  U R                   UR                     $ ! [         a     Of = fU R                     UR                  U R                   ;   a"  U R                   UR                     sS S S 5        $ [	        XU40 UD6=U R                   UR                  '   nUsS S S 5        $ ! , (       d  f       g = fr]   )r4  rW   ÚKeyErrorrq   rj   )ÚclsrQ   rG   Ú	lambda_kwr¤   Úanalyzeds         r>   rk   ÚAnalyzedCode.getâ  s�   € ð	à—8‘8˜BŸK™KÑ(Ð(øÜó 	Ùð	úð ×"Ó"à�{‰{˜cŸh™hÓ&Ø—x‘x §¡Ñ,÷ #Ñ"ô 0<Ø Iñ0Ø13ñ0ð ˆC�H‰H�R—[‘[Ñ! Hð ÷ #×"×"ús   ‚ ›
(§(·3B%Á4'B%Â%
B3c                ó  • [         R                  " U5      (       a  [        R                  " SU-  5      eUR                  nUR
                  =(       a    UR                  U l        UR                  nUR                  nUR                  nU=(       a    U(       + U l	        / U l
        / U l        / U l        U(       aA  U(       a  U R                  U5        U R                  U5        U(       a  U R                  U5        U R!                  XU5        g )Nz/Method %s may not be passed as a SQL expression)ÚinspectÚismethodr   ÚArgumentErrorri   r;   r:   r7   r/   r8   rx   rp   r3  Ú_init_track_onÚ_init_globalsÚ_init_closureÚ"_setup_additional_closure_trackers)rY   rQ   rG   r^   rz   r7   r/   r8   s           r>   rd   ÚAnalyzedCode.__init__õ  sç   € Ü×Ò˜B×ÑÜ×#Ò#ØAÀBÑFóð ð —.‘.ˆð ×#Ñ#×F¨×(FÑ(Fð 	Ôð ×.Ñ.ˆØ—=‘=ˆØ"&×">Ñ">Ðà'>×'OÀxÄ<ˆÔ$ð
 #%ˆÔð
 !#ˆÔà!#ˆÔæÞØ×#Ñ# HÔ-à×Ñ˜rÔ"æØ×"Ñ" 2Ô&à×/Ñ/°ÀDÕIr=   c                ób   ^ • T R                   R                  U 4S j[        U5       5       5        g )Nc              3  óJ   >#   • U  H  u  pTR                  X5      v •  M     g 7fr]   )Ú_cache_key_getter_track_on)Ú.0ÚidxÚelemrY   s      €r>   Ú	<genexpr>Ú.AnalyzedCode._init_track_on.<locals>.<genexpr>  s(   øé € ð %
â0‘	�ð ×+Ñ+¨C×6Ð6Ú0ùs   ƒ #)rp   rº   Ú	enumerate)rY   r/   s   ` r>   r?  ÚAnalyzedCode._init_track_on  s)   ø€ Ø×Ñ×$Ñ$ô %
ä& xÔ0ó%
õ 	
r=   c                ó–  • U R                   nU R                  nU R                  nUR                  R                   H‹  nXQR
                  ;  a  M  U R                  UR
                  U   5      n[        R                  " U5      (       d  MO  UR                  US 45        U(       d  Mk  UR                  U R                  U5      5        M�     g r]   )r3  rx   r;   rW   Úco_namesÚ__globals__Ú_roll_down_to_literalr   Ú_deep_is_literalÚappendÚ$_bound_parameter_getter_func_globals)rY   rQ   r3  rx   r;   ÚnameÚ_bound_values          r>   r@  ÚAnalyzedCode._init_globals"  s¥   € Ø ×2Ñ2ÐØ!×4Ñ4ÐØ!×4Ñ4Ðà—K‘K×(Ô(ˆDØŸ>™>Ó)Ùà×5Ñ5°b·n±nÀTÑ6JÓKˆLä×)Ò)¨,×7Ó7Ø!×(Ñ(¨$°¨Ô6ß%Ð%Ø&×-Ñ-Ø×AÑAÀ$ÓGöò )r=   c           	     óL  • U R                   nUR                  nU R                  nU R                  nU R                  nU R
                  n[        [        UR                  R                  U5      5       H¯  u  nu  pšU R                  U
R                  5      n[        R                  " U5      (       a=  UR                  X˜45        U(       a"  UR                  U R                  X˜5      5        My  M{  U(       d  M„  UR                  U R!                  XXŠR                  5      5        M±     g r]   )r3  ri   r;   r8   rx   rp   rL  ru   rW   Úco_freevarsrQ  Úcell_contentsr   rR  rS  Ú$_bound_parameter_getter_func_closureÚ"_cache_key_getter_closure_variable)rY   rQ   r3  rz   r;   r8   rx   rp   Úclosure_indexÚfvÚcellrV  s               r>   rA  ÚAnalyzedCode._init_closure4  s  € Ø ×2Ñ2ÐØ—.‘.ˆà!×4Ñ4ÐØ"&×">Ñ">ÐØ!×4Ñ4ÐØ×0Ñ0Ðä)2Ü�—‘×'Ñ'¨Ó1ö*
Ñ%ˆM™:˜Bð  ×5Ñ5°d×6HÑ6HÓIˆLä×)Ò)¨,×7Ñ7Ø!×(Ñ(¨"Ð)<Ô=Þ%Ø&×-Ñ-Ø×AÑAØóöñ &÷ +Ð*Ø$×+Ñ+Ø×?Ñ?Ø M×3EÑ3Eóöò)*
r=   c                óÄ   • [        U US U5      nU R                  nUR                   H6  nUR                  (       a  M  UR	                  U R                  X5      5        M8     g r]   )r&   rp   Úclosure_pywrappersÚ_sa__has_paramrS  Ú!_cache_key_getter_tracked_literal)rY   rQ   rG   r^   Úanalyzed_functionrp   Ú	pywrappers          r>   rB  Ú/AnalyzedCode._setup_additional_closure_trackersW  sa   € ô -ØØØØó	
Ðð  ×0Ñ0Ðà*×=Ô=ˆIØ×+×+Ñ+Ø ×'Ñ'Ø×:Ñ:¸2ÓIöò >r=   c                óÌ  • [        US5      nU(       a{  [        U[        R                  [        R
                  [        45      (       dG   UR                  5       n[        U[        R                  [        R
                  [        45      (       d  MG  U(       d+  [        R                  " USS9nUb   UR                  5       $ U$ U$ ! [         a     MA  f = f! [         a    Us $ f = f)NÚ__clause_element__F©Úraiseerr)Úhasattrr    r   r"   r   Ú
SchemaItemr£   ri  ÚAttributeErrorr   r<  )r7  r“   r©   Úinsps       r>   rQ  Ú"AnalyzedCode._roll_down_to_literalm  sØ   € ä# GÐ-AÓBÐæÜ Øœ(×0Ñ0´&×2CÑ2CÄTÐJ÷ñ ðØ%×8Ñ8Ó:�Gô	 !Øœ(×0Ñ0´&×2CÑ2CÄTÐJ÷ó ö !Ü×%Ò% g¸Ñ>ˆDØÑð Ø×2Ñ2Ó4Ð4ð
 ˆNàˆNøô &ó Úðûô &ó  Ø’Kð ús$   Á	C Â/C Ã
CÃCÃC#Ã"C#c                ó   ^• U4S jnU$ )zŠReturn a getter that will extend a list of bound parameters
with new entries from the ``__globals__`` collection of a particular
lambda.

c                óx   >• UR                   T   n[        R                  US5      " U R                   T   U5        g ©NÚ_extract_bound_parameters)rP  ÚobjectÚ__getattribute__)Ú
current_fnry   ÚresultÚwrapperrU  s       €r>   Úextract_parameter_valueÚRAnalyzedCode._bound_parameter_getter_func_globals.<locals>.extract_parameter_valueŽ  s;   ø€ ð .×9Ñ9¸$Ñ?ˆGÜ×#Ñ# GÐ-HÔIØ×&Ñ& tÑ,¨fõr=   r2   )rY   rU  rz  s    ` r>   rT  Ú1AnalyzedCode._bound_parameter_getter_func_globals‡  s   ø€ õ	ð 'Ð&r=   c                ó   ^• U4S jnU$ )zŠReturn a getter that will extend a list of bound parameters
with new entries from the ``__closure__`` collection of a particular
lambda.

c                ó    >• UR                   T   R                  n[        R                  US5      " U R                   T   R                  U5        g rs  )ri   rZ  ru  rv  )rw  ry   rx  ry  r]  s       €r>   rz  ÚRAnalyzedCode._bound_parameter_getter_func_closure.<locals>.extract_parameter_valueŸ  sN   ø€ ð .×9Ñ9Øñç‰mð ô ×#Ñ# GÐ-HÔIØ×&Ñ& }Ñ5×CÑCÀVõr=   r2   )rY   rU  r]  rz  s     ` r>   r[  Ú1AnalyzedCode._bound_parameter_getter_func_closure˜  s   ø€ õ	ð 'Ð&r=   c                óœ   ^• [        U[        5      (       a  U4S jnU$ [        U[        R                  5      (       a  U4S jnU$ U4S jnU$ )z‚Return a getter that will extend a cache key with new entries
from the "track_on" parameter passed to a :class:`.LambdaElement`.

c                óN   >^^• [        UU4S jUR                  T    5       5      $ )Nc              3  óH   >#   • U  H  nUR                  TT5      v •  M     g 7fr]   ©r¼   )rG  Útup_elemrn   r|   s     €€r>   rJ  ÚGAnalyzedCode._cache_key_getter_track_on.<locals>.get.<locals>.<genexpr>´  s(   øé € ð â$6˜ð ×+Ñ+¨H°j×AÐAÚ$6ùó   ƒ")ro   r/   ©rz   r^   rn   r|   rH  s     ``€r>   rk   Ú4AnalyzedCode._cache_key_getter_track_on.<locals>.get³  s&   ú€ Üõ à$(§M¡M°#Ò$6óó ð r=   c                ó@   >• UR                   T   R                  X#5      $ r]   )r/   r¼   rˆ  s       €r>   rk   r‰  »  s   ø€ Ø—}‘} SÑ)×8Ñ8¸ÓNÐNr=   c                ó"   >• UR                   T   $ r]   )r/   rˆ  s       €r>   rk   r‰  À  s   ø€ Ø—}‘} SÑ)Ð)r=   )r    ro   rl   ÚHasCacheKey)rY   rH  rI  rk   s    `  r>   rF  Ú'AnalyzedCode._cache_key_getter_track_on«  sL   ø€ ô �dœE×"Ñ"õð  ˆ
ô ˜œj×4Ñ4×5Ñ5õOð ˆ
õ*ð ˆ
r=   c                óR  ^ ^^^^^• [        U[        R                  5      (       a
  UUU4S jnU$ [        U[        R                  5      (       a  U4S jnU$ [        U[
        R                  5      (       a  UUU U4S jnU$ UnSn	[        US5      (       a9  Sn	[        USS5      (       d  UR                  5       nOO[        US5      (       a  M9  U	(       d,  [        R                  " USS9n
U
b  T R                  TTTU
SS	9$ OT R                  TTTUSS
9$ T R                  TT5        W$ )z{Return a getter that will extend a cache key with new entries
from the ``__closure__`` collection of a particular lambda.

c                ó  >• U T   R                   nT(       a  [        R                  " U5      nOMT(       aF  [        US5      (       a5  [	        USS5      (       d  UR                  5       n[        US5      (       a  M5  UR                  X#5      $ )Nri  r©   F)rZ  r   r<  rl  r„   ri  r¼   )rz   r^   rn   r|   ÚobjrH  Úuse_clause_elementÚuse_inspects        €€€r>   rk   Ú<AnalyzedCode._cache_key_getter_closure_variable.<locals>.getÕ  sw   ø€ Ø˜c‘l×0Ñ0�ÞÜ$×,Ò,¨SÓ1‘CÞ'Ü! #Ð';×<Ñ<Ü& sÐ,?À×GÑGØ"%×"8Ñ"8Ó":˜Cô " #Ð';×<Ó<ð ×)Ñ)¨(Ó?Ð?r=   c                ó6   >• U T   R                   R                  $ r]   )rZ  rW   rˆ  s       €r>   rk   r“  â  s   ø€ Ø˜s‘|×1Ñ1×:Ñ:Ð:r=   c                ó¤   >^^• U T   R                   n [        UU4S jU 5       5      $ ! [         a  nTR                  T	TUS9   S nAg S nAff = f)Nc              3  óH   >#   • U  H  nUR                  TT5      v •  M     g 7fr]   r„  )rG  rI  rn   r|   s     €€r>   rJ  ÚOAnalyzedCode._cache_key_getter_closure_variable.<locals>.get.<locals>.<genexpr>ë  s(   øé € ð !â$,˜Dð ×+Ñ+¨H°j×AÐAÚ$,ùr‡  )Úfrom_)rZ  ro   rn  Ú'_raise_for_uncacheable_closure_variable)
rz   r^   rn   r|   ÚcontentsÚaerQ   rH  rY   Úvariable_names
     ``  €€€€r>   rk   r“  ç  s^   ú€ Ø" 3™<×5Ñ5�ðÜ õ !á$,ó!ó ð øô &ó Ø×@Ñ@Ø% r°ð Aö ûðús   ”* ª
A´A
Á
AFri  Tr©   rj  )r’  )r‘  )r    rl   rŒ  ÚtypesÚFunctionTypeÚcollections_abcÚSequencerl  r„   ri  r   r<  r\  r™  )rY   rQ   rœ  rH  rZ  r‘  r’  rk   r“   r©   ro  s   ```` ``    r>   r\  Ú/AnalyzedCode._cache_key_getter_closure_variableÅ  sE  ý€ ô �m¤Z×%;Ñ%;×<Ñ<÷	@ðt ˆ
ô_ ˜¤u×'9Ñ'9×:Ñ:õ;ðZ ˆ
ôU ˜¤×'?Ñ'?×@Ñ@÷ð ðP ˆ
ð- $ˆGØ %ÐÜ˜'Ð#7×8Ñ8Ø$(Ð!Ü˜wÐ(;¸U×CÑCØ%×8Ñ8Ó:‘Gàô ˜'Ð#7×8Ó8ö %Ü!×)Ò)¨'¸EÑB�ØÑ#Ø×BÑBØ˜M¨3°À$ð Cð ð ð $ð
 ×>Ñ>Ø˜ s¨GÈð ?ð ð ð ×8Ñ8¸ÈÔKàˆ
r=   Nc                óV   • [         R                  " SU< SUR                  < S35      Ue)NzClosure variable named 'z' inside of lambda callable a   does not refer to a cacheable SQL element, and also does not appear to be serving as a SQL literal bound value based on the default SQL expression returned by the function.   This variable needs to remain outside the scope of a SQL-generating lambda so that a proper cache key may be generated from the lambda's state.  Evaluate this variable outside of the lambda, set track_on=[<elements>] to explicitly select closure elements to track, or set track_closure_variables=False to exclude closure variables from being part of the cache key.)r   ÚInvalidRequestErrorrW   )rY   rœ  rQ   r˜  s       r>   r™  Ú4AnalyzedCode._raise_for_uncacheable_closure_variable  s,   € ô ×%Ó%ó ˜bŸkœkð+ó
ð ð	r=   c                ón   • UR                   nUR                  nUR                  nU R                  XXC5      $ )ai  Return a getter that will extend a cache key with new entries
from the ``__closure__`` collection of a particular lambda.

this getter differs from _cache_key_getter_closure_variable
in that these are detected after the function is run, and PyWrapper
objects have recorded that a particular literal value is in fact
not being interpreted as a bound parameter.

)Ú_sa__to_evaluateÚ_sa__closure_indexÚ	_sa__namer\  )rY   rQ   Ú	pytrackerrI  r]  rœ  s         r>   rd  Ú.AnalyzedCode._cache_key_getter_tracked_literal$  s=   € ð ×)Ñ)ˆØ!×4Ñ4ˆØ!×+Ñ+ˆà×6Ñ6Ø˜}ó
ð 	
r=   )rx   r3  rp   r;   r8   )FFr]   )r3   r4   r5   r6   Ú	__slots__ÚweakrefÚWeakKeyDictionaryr4  r9   Ú	threadingÚRLockrq   Úclassmethodrk   rd   r?  r@  rA  rB  rQ  rT  r[  rF  r\  r™  rd  r<   r2   r=   r>   rj   rj   Ô  s£   ‡ ð€Ið 	×!Ò!Ó#ð 	Ð
;ó ð "ŸšÓ)Ðàñó ðò$%JòN
òò$!òFð, ñó ðò2'ò"'ò&ð@ !ØôJðZ (,ôõ&
r=   rj   c                  ób   • \ rS rSr% SrSrS\S'   SrS\S'   SrS	\S
'   SS jr	\
SS j5       rSrg)r%   i8  ©r­   Nú"Optional[List[BindParameter[Any]]]rs   ú%Optional[List[_BoundParameterGetter]]rx   Fr"   r­   c                ó   • Xl         g r]   r²  r·   s     r>   rd   ÚNonAnalyzedFunction.__init__B  s   € Ø�	r=   c                ó   • U R                   $ r]   r²  rX   s    r>   r…   Ú!NonAnalyzedFunction.expected_exprE  s   € à�y‰yÐr=   )r­   r"   )r«   r"   )r3   r4   r5   r6   r«  rs   r9   rx   rŠ   rd   rÌ   r…   r<   r2   r=   r>   r%   r%   8  sC   ‡ Ø€Ià=AÐÐ:ÓAØ@DÐÐ=ÓDà€Kà
Óôð óó ór=   r%   c                  óP   • \ rS rSr% SrS\S'   S\S'   S\S'   S	 rS
 rS rS r	Sr
g)r&   iJ  )
Úanalyzed_coderQ   rb  ry   r­   rx   r…   rŠ   r`   rs   r³  rs   z)Union[ClauseElement, List[ClauseElement]]r…   r´  rx   c                ó‚   • Xl         X@l        UR                  U l        U R                  U5        U R	                  X#5        g r]   )rº  rQ   rx   Ú_instrument_and_run_functionÚ_coerce_expression)rY   rº  rG   rb   rQ   s        r>   rd   ÚAnalyzedFunction.__init__\  s9   € ð +ÔØŒà"/×"BÑ"BˆÔà×)Ñ)¨.Ô9à×Ñ ÕFr=   c           	     óX  • U R                   nU R                  n/ =U l        nUR                  nU(       d   U=U l        nUR                  U5      U l        g UR                  nUR                  nU(       a?  [        UR                  R                  U5       V	V
s0 s H  u  pšXšR                  _M     nn	n
O0 nUR                  R                  5       nU Ht  u  pÞUbO  XŽ   R                  n[        UUUUU R                   R                   S9=X½'   nU(       a  UR#                  U5        MU  MW  UR                  U   n[        X=U5      XÍ'   Mv     U R%                  UUR                  R                   Vs/ s H  oÛU   PM	     snU5      =U l        nUR                  U5      U l        g s  sn
n	f s  snf )N)r]  r;   )rº  rQ   rb  r3  ry   rt   r­   r8   ri   ru   rW   rY  rZ  rP  ÚcopyÚ	PyWrapperr;   rS  Ú_rewrite_code_obj)rY   rG   rº  rQ   rb  r3  ry   r8   rz   r^  r_  Únew_closureÚnew_globalsrU  r]  rw   r¥   s                    r>   r¼  Ú-AnalyzedFunction._instrument_and_run_functionl  s¶  € Ø×*Ñ*ˆà�W‰WˆØ79Ð9ˆÔÐ"4à)×;Ñ;Ðæ ØEGÐGˆDÔ(Ð+BØ&×6Ñ6Ð7NÓOˆD�Ià&3×&KÑ&KÐ#Ø—n‘nˆGö ô %(¨¯©×(?Ñ(?ÀÔ$Iôâ$I™˜ð ×*Ñ*Ò*Ù$Ið ñ �ð
 !�ð Ÿ.™.×-Ñ-Ó/ˆKã'8Ñ#�Ø Ñ,Ø#Ñ2×@Ñ@�EÜ/8ØØØØ&3à ×.Ñ.×AÑAñ0ð �KÑ%¨ö /Ø*×1Ñ1°$Ö7ñ /ð ŸN™N¨4Ñ0�EÜ(1°"¸EÓ(B�KÓ%ñ! (9ð* ×&Ñ&ØØ35·;±;×3JÒ3JÓKÒ3J¨4 Ô&Ñ3JÑKØóðˆDÔ(Ð+Bð& '×6Ñ6Ð7NÓOˆD�IùócùòB Ls   ÂF!Å-F'
c                óî  • UR                   nU R                  nUcž  [        U[        R                  5      (       aH  U Vs/ s H-  n[        S[        R                  " UR                  UUS95      PM/     snU l	        SU l
        OD[        S[        R                  " UR                  UUS95      U l	        SU l
        OX@l	        SU l
        Ub  UR                  U l        g[        R                  U l        gs  snf )a  Run the tracker-generated expression through coercion rules.

After the user-defined lambda has been invoked to produce a statement
for reuse, run it through coercion rules to both check that it's the
correct type of object and also to coerce it to its useful form.

Nr"   )rb   TF)rK   r­   r    rŸ  r   r   r   rØ   rN   r…   rŠ   ra   r`   r   Ú
EMPTY_DICT)rY   rG   rb   rK   r­   r®   s         r>   r½  Ú#AnalyzedFunction._coerce_expression°  sð   € ð '×4Ñ4ˆØ�y‰yˆàÑ Ü˜$¤× 8Ñ 8×9Ñ9ñ %)ó
&ò %)˜ô Ø'Ü!×(Ò(Ø*×/Ñ/Ø$Ø2Gñöñ %)ñ
&�Ô"ð $(�Õ ä%)Ø#Ü×$Ò$Ø&×+Ñ+ØØ.Cñó&�Ô"ð $)�Õ à!%ÔØ$ˆDÔà Ñ,Ø#8×#IÑ#IˆDÕ ä#'§?¡?ˆDÕ ùò;
&s   ¿4C2c                óV  • [        [        U5      5      nSnU(       a:  USSR                  S U 5       5      < SSR                  S U 5       5      < S3-  nUS-  nUS	SR                  S
 U 5       5      -  -  nUS-  nU Vs0 s H  nSU-  X&   _M     nn[        XWU5        US   " 5       n[	        U5      " UR
                  X1R                  UR                  U5      n	UR                  U	l        UR                  U	l	        UR                  U	l
        UR                  U	l        U	$ s  snf )zQReturn a copy of f, with a new closure and new globals

yes it works in pypy :P

zdef make_cells():
z    (z, c              3  ó,   #   • U  H
  nS U-  v •  M     g7f©zi%dNr2   ©rG  Úis     r>   rJ  Ú5AnalyzedFunction._rewrite_code_obj.<locals>.<genexpr>é  ó   é € Ð6ªX¨˜% !ž)ªXùó   ‚z) = (c              3  ó,   #   • U  H
  nS U-  v •  M     g7f)úo%dNr2   rÌ  s     r>   rJ  rÎ  ê  rÏ  rÐ  z)
z    def closure():
z        return %s
c              3  ó,   #   • U  H
  nS U-  v •  M     g7frË  r2   rÌ  s     r>   rJ  rÎ  í  s   é € Ð1NÂXÀ°%¸!¶)ÂXùrÐ  z    return closure.__closure__rÒ  Ú
make_cells)ÚrangeÚlenÚjoinÚexecr£   rW   r3   Ú__defaults__r9   Ú__kwdefaults__rÆ   r4   )
rY   ÚfÚcell_valuesÚglobals_ÚargrangeÚcoderÍ  Úvars_rz   Úfuncs
             r>   rÂ  Ú"AnalyzedFunction._rewrite_code_objÝ  s  € ô œ˜[Ó)Ó*ˆà$ˆÞÙØ—	‘	Ñ6©XÓ6Ö6Ø—	‘	Ñ6©XÓ6Ö6ðñ ˆDð 	Ð&Ñ&ˆØÐ%¨¯	©	Ñ1NÁXÓ1NÓ(NÑNÑNˆØÐ0Ñ0ˆÙ4<Ó=²H¨q�˜‘˜K™NÒ*±HˆÐ=ÜˆT˜%Ô Ø˜Ò%Ó'ˆä�AŒwØ�J‰J˜§*¡*¨a¯n©n¸gó
ˆð  !×0Ñ0ˆÔØ×.Ñ.ˆÔØ—y‘yˆŒØŸ,™,ˆŒàˆùò >s   ÂD&)	rº  rx   rb  r…   r­   rQ   rŠ   r`   ry   N)r3   r4   r5   r6   r«  r9   rd   r¼  r½  rÂ  r<   r2   r=   r>   r&   r&   J  s6   ‡ ð€Ið ;Ó:Ø<Ó<Ø=Ó=òGò BPòH+3õZr=   r&   c                  óh   • \ rS rSrSr   SS jrS rS rS rS r	SS	 jr
S
 rS rS rS rS rSrg)rÁ  iþ  ah  A wrapper object that is injected into the ``__globals__`` and
``__closure__`` of a Python function.

When the function is instrumented with :class:`.PyWrapper` objects, it is
then invoked just once in order to set up the wrappers.  We look through
all the :class:`.PyWrapper` objects we made to find the ones that generated
a :class:`.BindParameter` object, e.g. the expression system interpreted
something as a literal.   Those positions in the globals/closure are then
ones that we will look at, each time a new lambda comes in that refers to
the same ``__code__`` object.   In this way, we keep a single version of
the SQL expression that this lambda produced, without calling upon the
Python function that created it more than once, unless its other closure
variables have changed.   The expression is then transformed to have the
new bound values embedded into it.

Nc                óv   • Xl         X l        X0l        S U l        SU l        0 U l        XPl        X@l        X`l        g )NF)	rQ   Ú_nameÚ_to_evaluateÚ_paramÚ
_has_paramÚ_bind_pathsÚ_getterÚ_closure_indexr;   )rY   rQ   rU  Úto_evaluater]  r~   r;   s          r>   rd   ÚPyWrapper.__init__  s;   € ð ŒØŒ
Ø'ÔØˆŒØˆŒØˆÔØŒØ+ÔØ"4Õr=   c                ój  • [         R                  U S5      nU" U0 UD6nU R                  (       aƒ  [        R                  " U5      (       ah  [        U[        R                  5      (       dI  [         R                  U S5      n[        R                  " SU< SU R                  R                  < S35      eU$ )Nræ  rå  zCan't invoke Python callable z+() inside of lambda expression argument at a×  ; lambda SQL constructs should not invoke functions from closure variables to produce literal values since the lambda SQL system normally extracts bound values without actually invoking the lambda or any functions within it.  Call the function outside of the lambda and assign to a local variable that is used in the lambda as a closure variable, or set track_bound_values=False if the return value of this function is used in some other way other than a SQL bound value.)ru  rv  Ú_sa_track_bound_valuesr   rR  r    rl   rŒ  r   r£  Ú_sa_fnrW   )rY   rÀ   r¤   rI  rw   rU  s         r>   Ú__call__ÚPyWrapper.__call__#  sš   € Ü×&Ñ& t¨^Ó<ˆÙ�cÐ ˜RÑ ˆà×'×'Ü×*Ò*¨5×1Ñ1ÜàÜ×&Ñ&÷ñ ô ×*Ñ*¨4°Ó9ˆDÜ×)Ó)ó ! $§+¡+×"6Ô"6ð8óð ð  ˆLr=   c                óP   • [         R                  U S5      " 5       nU" U/UQ70 UD6$ ©NÚ_py_wrapper_literal©ru  rv  ©rY   Úoprä   ÚkwargsrI  s        r>   ÚoperateÚPyWrapper.operateB  s-   € Ü×&Ñ& tÐ-BÔCÓEˆÙ�$Ð)˜Ò) &Ñ)Ð)r=   c                óJ   • [         R                  U S5      " 5       nU" X$40 UD6$ rô  rö  r÷  s        r>   Úreverse_operateÚPyWrapper.reverse_operateF  s(   € Ü×&Ñ& tÐ-BÔCÓEˆÙ�%Ñ( Ñ(Ð(r=   c                ó,  • [         R                  U S5      nUb!  UR                  USS9nUR                  U5        [         R                  U S5      R	                  5        H2  n[         R                  US5      nU" U5      nUR                  Xb5        M4     g )Nrç  Trg   ré  rê  )ru  rv  rv   rS  ÚvaluesÚ_sa__extract_bound_parameters)rY   Ústarting_pointÚresult_listÚparamrf  r~   r“   s          r>   rt  Ú#PyWrapper._extract_bound_parametersJ  sˆ   € Ü×'Ñ'¨¨hÓ7ˆØÑØ×%Ñ% nÀ4Ð%ÐHˆEØ×Ñ˜uÔ%Ü×0Ñ0°°}ÓE×LÑLÖNˆIÜ×,Ñ,¨Y¸	ÓBˆFÙ˜^Ó,ˆGØ×3Ñ3°GÖIò Or=   c                ó  • [         R                  U S5      n[         R                  U S5      nUcK  [         R                  U S5      n[        R                  " USSUUb  UR                  OS S9=U l        nSU l        UR                  USS9$ )Nrç  ræ  rå  FT)ÚrequiredÚuniqueÚ_compared_to_operatorÚ_compared_to_typerg   )ru  rv  r   r!   r£   rç  rè  rv   )rY   r­   Úoperatorr¤   r  rì  rU  s          r>   rõ  ÚPyWrapper._py_wrapper_literalT  s�   € Ü×'Ñ'¨¨hÓ7ˆÜ×-Ñ-¨d°NÓCˆØ‰=Ü×*Ñ*¨4°Ó9ˆDÜ"*×"8Ò"8ØØØØ&.Ø/3Ñ/? $§)¢)ÀTñ#ð ˆDŒK˜%ð #ˆDŒOØ× Ñ  ¸4Ð Ð@Ð@r=   c                óD   • [         R                  U S5      n[        U5      $ ©Nræ  )ru  rv  r  )rY   rì  s     r>   Ú__bool__ÚPyWrapper.__bool__c  s   € Ü×-Ñ-¨d°NÓCˆÜ�KÓ Ð r=   c                óB  • UR                  S5      (       a  [        R                  XSS  5      $ US;   a  [        R                  X5      $ UR                  S5      (       a!  [        R                  U S5      n[        X!5      $ U R	                  U[
        R                  5      $ )NÚ_sa_é   )ri  rú  rý  rõ  rV   Ú__dict__Ú__ræ  )Ú
startswithru  rv  r„   Ú_sa__add_getterr  Ú
attrgetter©rY   r   rI  s      r>   rv  ÚPyWrapper.__getattribute__g  s�   € Ø�>‰>˜&×!Ñ!Ü×*Ñ*¨4°Q°R°Ó9Ð9Øð 
ó 
ô ×*Ñ*¨4Ó5Ð5à�>‰>˜$×ÑÜ×*Ñ*¨4°Ó@ˆDÜ˜4Ó%Ð%à×'Ñ'¨¬X×-@Ñ-@ÓAÐAr=   c                óD   • [         R                  U S5      n[        U5      $ r  )ru  rv  Úiter)rY   rI  s     r>   Ú__iter__ÚPyWrapper.__iter__z  s   € Ü×&Ñ& t¨^Ó<ˆÜ�D‹zÐr=   c                óü   • [         R                  U S5      n[        US5      (       d  [        S5      e[	        U[
        5      (       a  [        R                  " S5      eU R                  U[        R                  5      $ )Nræ  Ú__getitem__zUDictionary keys / list indexes inside of a cached lambda must be Python literals only)ru  rv  rl  rn  r    rÁ  r   r£  r  r  Ú
itemgetterr  s      r>   r   ÚPyWrapper.__getitem__~  sl   € Ü×&Ñ& t¨^Ó<ˆÜ�t˜]×+Ñ+Ü  Ó/Ð/ä�cœ9×%Ñ%ä×)Ò)ð6óð ð ×#Ñ# C¬×)<Ñ)<Ó=Ð=r=   c                ó,  • [         R                  U S5      nX4nXC;   a  X4   $ U" U5      n[         R                  U S5      nU" U5      n[        R                  U5      n[        R
                  " U5      (       a  [        U R                  XUS9n	X“U'   U	$ U$ )Nré  ræ  )r~   )ru  rv  rj   rQ  r   rR  rÁ  rð  )
rY   r   Ú	getter_fnÚ
bind_pathsÚbind_path_keyr~   rI  rw   Úrolled_down_valuery  s
             r>   Ú_add_getterÚPyWrapper._add_getter‹  s–   € Ü×,Ñ,¨T°=ÓAˆ
àÐ(ˆØÓ&ØÑ,Ð,á˜3“ˆÜ×&Ñ& t¨^Ó<ˆÙ�t“ˆä(×>Ñ>¸uÓEÐä×%Ò%Ð&7×8Ñ8Ü §¡¨SÀÑGˆGØ(/�}Ñ%ØˆNàˆLr=   )	ré  rë  rê  rè  rå  rç  ræ  rQ   r;   )NNT)NN)r3   r4   r5   r6   rÆ   rd   rñ  rú  rý  rt  rõ  r  rv  r  r   r(  r<   r2   r=   r>   rÁ  rÁ  þ  sL   † ñð, ØØô5ò&ò>*ò)òJôAò!òBò&ò>õr=   rÁ  c                óB   • [         R                  " U R                  5      $ r]   )r   r<  rH   )rB   s    r>   ro  ro     s   € ä×Ò˜cŸm™mÓ,Ð,r=   )TTNTTN)rB   r  r7   r  r8   r  r/   r.   r:   r  r;   r  r1   r0   r«   r?   )HÚ
__future__r   Úcollections.abcÚabcrŸ  r<  rŽ   r  r®  r�  r   Útypingr   r   r   r   r	   r
   r   r   r   r   r   r¬  Ú r   rl   r   r   r   r   r   Úbaser   r   r   r   Ú	operatorsr   r   r   r   Úutil.typingr    r!   r"   r#   r$   r'   Ú_BoundParameterGetterÚLRUCacher(   r9   rÂ   rP   r  r)   Ú_StmtLambdaElementTyper,   rC   rE   rÏ   ÚAllowsLambdaRoler?   r  ré   rj   r%   r&   rÁ  Ú	_inspectsro  r2   r=   r>   Ú<module>r8     sD  ðö #å )Û Û Û Û Û Ý Ý Ý Ý Ý Ý !Ý Ý Ý Ý  Ý Ý Û å %Ý Ý Ý Ý Ý Ý Ý Ý Ý !Ý &Ý Ý Ý Ý !ö Ý'Ý'ÝÝ,à!Ø	ˆ#ˆsˆ(�O�UÐDÑEÐEñÐ ð !  c Ñ*Ð à+/¯=ª=¸Ó+>Ð Ð(Ó >ð �r˜3�wÑ€à˜#˜s˜(Ñ#€à˜2˜s˜7Ñ#€áˆT˜Ñ$€Ø! 2 $¨ )Ñ,Ð ô4�Gô 4ð !Ø$(Ø!%Ø&*Ø#Ø/3ðFØ	ðFàðFð "ðFð ð	Fð
  $ðFð ðFð -ðFð õFôRN�H×*Ñ*ô NôbG;˜Mô G;ôTV.Ø	×Ñ˜M¨:ôV.ôr,5˜%×0Ñ0°(×2HÑ2Hô ,5ô^0Ð0ô 0÷.a
ñ a
÷Hñ ÷$qñ qôh_�ô _ðD ×Ò�mÓ$ñ-ó %ñ-r=   