o
    y¬´\çÅ  ã                   @   s  d Z ddl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 e dejejB ¡Ze dejejB ¡ZG dd„ dejƒZG dd„ deƒZG dd„ dejƒZee_dS )a  Default implementations of per-dialect sqlalchemy.engine classes.

These are semi-private implementation classes which are only of importance
to database dialect authors; dialects will usually use the classes here
as the base class for their own corresponding classes.

é    Né   )Ú
interfaces)Ú
reflection)Úresulté   )Úevent)Úexc)Úpool)Ú
processors)Útypes)Úutil)Úcompiler)Ú
expression)Úschemaz-\s*(?:UPDATE|INSERT|CREATE|DELETE|DROP|ALTER)z	\s*SELECTc                   @   sv  e Zd ZdZejZejZej	Z
ejZdZdZdZdZeZdZdZdZdZdZdZdZdZdZdZdZdZe  de !d¡fdej"fde !d	¡fd
e !d	¡fdej"fdej"fdej"fdej#fg¡Z$dZ%ej&rmdZ'dZ(dZ)dZ*ndZ'dZ(dZ)dZ*dZ+dZ,dZ-dZ.dZ/i Z0dZ1dZ2dZ3dZ4dZ5dZ6dZ7	 dZ8dZ9e  ¡ Z:	 										dYdd„Z;ej<dd„ ƒZ=e>dd„ ƒZ?e>dd„ ƒZ@eAdd „ ƒZBd!d"„ ZCd#d$„ ZDdZd%d&„ZEd'd(„ ZFd)d*„ ZGd+d,„ ZHdZd-d.„ZId/d0„ ZJd1d2„ ZKd3d4„ ZLd5d6„ ZMd7d8„ ZNd9d:„ ZOd;d<„ ZPd=d>„ ZQd?d@„ ZRdAdB„ ZSej<dCdD„ ƒZTdEdF„ ZUdGdH„ ZVdIdJ„ ZWdKdL„ ZXdMdN„ ZYdZdOdP„ZZdZdQdR„Z[dZdSdT„Z\dUdV„ Z]dWdX„ Z^dS )[ÚDefaultDialectz!Default implementation of DialectTFr   Úconvert_unicodeÚforceÚpool_timeoutÚechoÚdebugÚ	echo_poolÚpool_recycleÚ	pool_sizeÚmax_overflowÚpool_threadlocalNÚuse_encodingÚdefaulti'  Únamed© úutf-8Ústaticc                 K   sn  t | ddƒst d| j ¡ || _|| _d| _d | _|| _|d ur%|| _	n| jd ur0| jj	| _	n| j
| _	|d ur;|| _| j	dv | _|  | ¡| _|  | ¡| _|d urT|| _|d ur[|| _|| _|	| _|	dkrid| _n|	dv rvd| _|	dk| _nt d	¡‚|
rŒ|
| jkrŒt d
|
| jf ¡‚|
| _| jdkr›t |¡| _n| jd ur§t | j¡| _t | j¡| _t | j¡| _ d S )NÚported_sqla_06Tz2The %s dialect is not yet ported to the 0.6 formatF)ÚqmarkÚformatÚnumericr    )ÚdynamicÚdynamic_warnr&   z?empty_in_strategy may be 'static', 'dynamic', or 'dynamic_warn'zQLabel length of %d is greater than this dialect's maximum identifier length of %dr   )!Úgetattrr   ÚwarnÚnamer   ÚencodingÚ
positionalÚ_ischemaÚdbapiÚ
paramstyleÚdefault_paramstyleÚimplicit_returningÚpreparerÚidentifier_preparerÚtype_compilerÚsupports_right_nested_joinsÚsupports_native_booleanÚcase_sensitiveÚempty_in_strategyÚ_use_static_inÚ_warn_on_empty_inr   ÚArgumentErrorÚmax_identifier_lengthÚlabel_lengthÚdescription_encodingr
   Úto_unicode_processor_factoryÚ_description_decoderÚcodecsÚ
getencoderÚ_encoderÚ_decoder)Úselfr   r*   r.   r-   r0   r4   r6   r5   r7   r<   Úkwargsr   r   úK/var/www/html/env/lib/python3.10/site-packages/sqlalchemy/engine/default.pyÚ__init__º   sl   ÿÿ
ÿþÿ
ÿÿ
ÿÿzDefaultDialect.__init__c                 C   s   t  ¡ S ©N)ÚweakrefÚWeakKeyDictionary©rD   r   r   rF   Ú_type_memos  ó   zDefaultDialect._type_memosc                 C   s   | j d | j S )Nú+)r)   ÚdriverrK   r   r   rF   Údialect_description  s   z"DefaultDialect.dialect_descriptionc                 C   s   | j S rH   )Úsupports_sane_rowcountrK   r   r   rF   Ú supports_sane_rowcount_returning  s   z/DefaultDialect.supports_sane_rowcount_returningc                 C   s   t | dtjƒS )NÚ	poolclass)r'   r	   Ú	QueuePool)ÚclsÚurlr   r   rF   Úget_pool_class  ó   zDefaultDialect.get_pool_classc                 C   s¼   z|   |¡| _W n ty   d | _Y nw z|  |¡| _W n ty)   d | _Y nw z	|  |j¡| _W n ty?   d | _Y nw |  |¡| _	| j
d urV|  |¡rVd  | _| _
|  |j¡ d S rH   )Ú_get_server_version_infoÚserver_version_infoÚNotImplementedErrorÚ_get_default_schema_nameÚdefault_schema_nameÚget_isolation_levelÚ
connectionÚdefault_isolation_levelÚ_check_unicode_returnsÚreturns_unicode_stringsr=   Ú_check_unicode_descriptionr?   Údo_rollback)rD   r_   r   r   rF   Ú
initialize  s6   
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿzDefaultDialect.initializec                 C   ó   dS )aš  return a callable which sets up a newly created DBAPI connection.

        This is used to set dialect-wide per-connection options such as
        isolation modes, unicode modes, etc.

        If a callable is returned, it will be assembled into a pool listener
        that receives the direct DBAPI connection, with all wrappers removed.

        If None is returned, no listener will be generated.

        Nr   rK   r   r   rF   Ú
on_connect3  s   zDefaultDialect.on_connectc                    sª   t jr
ˆjs
t j‰ nt j‰ ˆjrˆ ¡ ‰ni ‰‡ ‡‡‡fdd„‰t t 	d¡t
 d¡¡t t 	d¡t
 d¡¡g}|r>||7 }‡fdd„|D ƒ}| dd	g¡rPd
S |dhkS )Nc              
      sŒ   ˆ t  | g¡jˆd�ƒ}zˆj ¡ }ˆ ||ˆ¡ | ¡ }| ¡  W n tj	y= } zt
 d| ¡ W Y d }~dS d }~ww t|d t
jƒS )N©Údialectz2Exception attempting to detect unicode returns: %rFr   )r   ÚselectÚcompiler_   ÚcursorÚ_cursor_executeÚfetchoneÚcloser   Ú
DBAPIErrorr   r(   Ú
isinstanceÚ	text_type)ÚtestÚ	statementrl   ÚrowÚde)Úcast_tor_   Ú
parametersrD   r   rF   Úcheck_unicodeL  s$   ÿ
ÿÿ€ù	z<DefaultDialect._check_unicode_returns.<locals>.check_unicodez'test plain returns'é<   z'test unicode returns'c                    s   h | ]}ˆ |ƒ’qS r   r   )Ú.0rs   )ry   r   rF   Ú	<setcomp>q  s    z8DefaultDialect._check_unicode_returns.<locals>.<setcomp>TFÚconditional)r   Úpy2kÚsupports_unicode_statementsÚbinary_typerr   r+   Úexecute_sequence_formatr   ÚcastÚliteral_columnÚsqltypesÚVARCHARÚUnicodeÚ
issuperset)rD   r_   Úadditional_testsÚtestsÚresultsr   )rw   ry   r_   rx   rD   rF   ra   A  s,   
þþø
z%DefaultDialect._check_unicode_returnsc                 C   sz   t jr
| js
t j}nt j}|j ¡ }z%| |t 	t 
d¡ d¡g¡j| d�ƒ¡ t|jd d t jƒW | ¡  S | ¡  w )Nz'x'Ú
some_labelrh   r   )r   r~   r   r€   rr   r_   rl   Úexecuter   rj   rƒ   Úlabelrk   rq   Údescriptionro   )rD   r_   rw   rl   r   r   rF   rc   x  s    
ÿþÿÿz)DefaultDialect._check_unicode_descriptionc                 C   s   t  || j¡S )a)  Provide a database-specific :class:`.TypeEngine` object, given
        the generic object which comes from the types module.

        This method looks for a dictionary called
        ``colspecs`` as a class or instance-level variable,
        and passes on to :func:`.types.adapt_type`.

        )r„   Ú
adapt_typeÚcolspecs)rD   Útypeobjr   r   rF   Útype_descriptor�  s   	zDefaultDialect.type_descriptorc                 K   s"   t j |¡}|j|||fi |¤ŽS rH   )r   Ú	InspectorÚfrom_engineÚreflecttable)rD   r_   ÚtableÚinclude_columnsÚexclude_columnsÚoptsÚinspr   r   rF   r•   š  s   ÿÿzDefaultDialect.reflecttablec                 K   s   d| j ||fd|i|¤ŽiS )z�Compatibility method, adapts the result of get_primary_keys()
        for those dialects which don't implement get_pk_constraint().

        Úconstrained_columnsr   )Úget_primary_keys)rD   ÚconnÚ
table_namer   Úkwr   r   rF   Úget_pk_constraint¢  s   ÿÿÿÿz DefaultDialect.get_pk_constraintc                 C   s&   t |ƒ| jkrt d|| jf ¡‚d S )Nz7Identifier '%s' exceeds maximum length of %d characters)Úlenr;   r   ÚIdentifierError)rD   Úidentr   r   rF   Úvalidate_identifier­  s   ÿÿÿz"DefaultDialect.validate_identifierc                 O   s   | j j|i |¤ŽS rH   )r-   Úconnect)rD   ÚcargsÚcparamsr   r   rF   r¥   ´  s   zDefaultDialect.connectc                 C   s   |  ¡ }| |j¡ g |gS rH   )Útranslate_connect_argsÚupdateÚquery)rD   rV   r™   r   r   rF   Úcreate_connect_args·  s   z"DefaultDialect.create_connect_argsc                    sf   d|v r|d ‰t  |d¡‡‡fdd„ƒ}d|v r1t |d ¡‰ ˆ |_t  |d¡‡ fdd„ƒ}d S d S )NÚisolation_levelÚengine_connectc                    s   |s
ˆ  | ˆ ¡ d S d S rH   )Ú_set_connection_isolation©r_   Úbranch)r¬   rD   r   rF   Úset_isolationÀ  s   ÿzBDefaultDialect.set_engine_execution_options.<locals>.set_isolationÚschema_translate_mapc                    s
   ˆ | _ d S rH   )Úschema_for_objectr¯   )Úgetterr   rF   Úset_schema_translate_mapÉ  ó   
zMDefaultDialect.set_engine_execution_options.<locals>.set_schema_translate_map)r   Úlistens_forr   Ú_schema_getterr³   )rD   Úenginer™   r±   rµ   r   )r´   r¬   rD   rF   Úset_engine_execution_options¼  s   

ûz+DefaultDialect.set_engine_execution_optionsc                 C   s<   d|v r|   ||d ¡ d|v rt |d ¡}||_d S d S )Nr¬   r²   )r®   r   r¸   r³   )rD   r_   r™   r´   r   r   rF   Ú set_connection_execution_optionsÍ  s   
þz/DefaultDialect.set_connection_execution_optionsc                 C   s6   |  ¡ r	t d¡ |  |j|¡ |jjj | j¡ d S )Nz²Connection is already established with a Transaction; setting isolation_level may implicitly rollback or commit the existing transaction, or have no effect until next transaction)	Úin_transactionr   r(   Úset_isolation_levelr_   Ú_connection_recordÚfinalize_callbackÚappendÚreset_isolation_level)rD   r_   Úlevelr   r   rF   r®   Õ  s   ÿ
ÿz(DefaultDialect._set_connection_isolationc                 C   ó   d S rH   r   ©rD   Údbapi_connectionr   r   rF   Údo_beginâ  ó   zDefaultDialect.do_beginc                 C   ó   |  ¡  d S rH   )ÚrollbackrÄ   r   r   rF   rd   å  ó   zDefaultDialect.do_rollbackc                 C   rÈ   rH   )ÚcommitrÄ   r   r   rF   Ú	do_commitè  rÊ   zDefaultDialect.do_commitc                 C   rÈ   rH   )ro   rÄ   r   r   rF   Údo_closeë  rÊ   zDefaultDialect.do_closec                 C   s   t t dg¡j| d�ƒS )Nr   rh   )Ústrr   rj   rk   rK   r   r   rF   Ú_dialect_specific_select_oneî  s   z+DefaultDialect._dialect_specific_select_onec              
   C   sp   d }z|  ¡ }z| | j¡ W | ¡  W dS | ¡  w  | jjy7 } z|  |||¡r2W Y d }~dS ‚ d }~ww )NFT)rl   rŒ   rÏ   ro   r-   ÚErrorÚis_disconnect)rD   rÅ   rl   Úerrr   r   rF   Údo_pingò  s   

ù€üzDefaultDialect.do_pingc                 C   s   dt  ddd ¡ S )z¼Create a random two-phase transaction ID.

        This id will be passed to do_begin_twophase(), do_rollback_twophase(),
        do_commit_twophase().  Its format is unspecified.
        z	_sa_%032xr   r   é€   )ÚrandomÚrandintrK   r   r   rF   Ú
create_xid  s   zDefaultDialect.create_xidc                 C   ó   |  t |¡¡ d S rH   )rŒ   r   ÚSavepointClause©rD   r_   r)   r   r   rF   Údo_savepoint  ó   zDefaultDialect.do_savepointc                 C   rØ   rH   )rŒ   r   ÚRollbackToSavepointClauserÚ   r   r   rF   Údo_rollback_to_savepoint  rÜ   z'DefaultDialect.do_rollback_to_savepointc                 C   rØ   rH   )rŒ   r   ÚReleaseSavepointClauserÚ   r   r   rF   Údo_release_savepoint  rÜ   z#DefaultDialect.do_release_savepointc                 C   ó   |  ||¡ d S rH   )Úexecutemany©rD   rl   rt   rx   Úcontextr   r   rF   Údo_executemany  ó   zDefaultDialect.do_executemanyc                 C   rá   rH   ©rŒ   rã   r   r   rF   Ú
do_execute  ræ   zDefaultDialect.do_executec                 C   s   |  |¡ d S rH   rç   )rD   rl   rt   rä   r   r   rF   Údo_execute_no_params  ó   z#DefaultDialect.do_execute_no_paramsc                 C   rf   )NFr   )rD   Úer_   rl   r   r   rF   rÑ     rÇ   zDefaultDialect.is_disconnectc                 C   s   |   || j¡ d S rH   )r½   r`   )rD   Ú
dbapi_connr   r   rF   rÁ      s   z$DefaultDialect.reset_isolation_level)
Fr   NNNNTNr    NrH   )_Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   ÚSQLCompilerÚstatement_compilerÚDDLCompilerÚddl_compilerÚGenericTypeCompilerr3   ÚIdentifierPreparerr1   Úsupports_alterÚsupports_commentsÚinline_commentsÚdefault_sequence_baseÚtupler�   Úsupports_viewsÚsupports_sequencesÚsequences_optionalÚ"preexecute_autoincrement_sequencesÚpostfetch_lastrowidr0   r4   Úcte_follows_insertÚsupports_native_enumr5   Ú#non_native_boolean_check_constraintÚsupports_simple_order_by_labelr   ÚimmutabledictÚbool_or_strÚasintÚasboolÚengine_config_typesÚsupports_native_decimalÚpy3kr   Úsupports_unicode_bindsrb   r=   r)   r;   Úmax_index_name_lengthrQ   Úsupports_sane_multi_rowcountr�   r/   Úsupports_default_valuesÚsupports_empty_insertÚsupports_multivalues_insertÚsupports_server_side_cursorsrZ   Úconstruct_argumentsÚrequires_name_normalizeÚreflection_optionsÚdbapi_exception_translation_maprG   Úmemoized_propertyrL   ÚpropertyrP   rR   ÚclassmethodrW   re   rg   ra   rc   r’   r•   r    r¤   r¥   r«   rº   r»   r®   rÆ   rd   rÌ   rÍ   rÏ   rÓ   r×   rÛ   rÞ   rà   rå   rè   ré   rÑ   rÁ   r   r   r   rF   r   *   sÜ    øÿ)

õJ




7

	


r   c                   @   s<   e Zd ZejZejZejZ	ej
ZdZdZdZdZdZdZdS )ÚStrCompileDialectTFN)rí   rî   rï   r   ÚStrSQLCompilerrò   ró   rô   ÚStrSQLTypeCompilerr3   rö   r1   rý   rþ   rÿ   r0   r5   r  r   r   r   rF   r  '  s    r  c                   @   sÄ  e Zd ZdZdZdZdZdZdZdZ	dZ
dZdZdZdZdZdZe ¡ Zedd„ ƒZedd„ ƒZdd„ Zed	d
„ ƒZedd„ ƒZejdd„ ƒZejdd„ ƒZejdd„ ƒZejdd„ ƒZejdd„ ƒZejdd„ ƒZ dd„ Z!e"dd„ ƒZ#dd„ Z$dd „ Z%d!d"„ Z&d#d$„ Z'd%d&„ Z(d'd(„ Z)d)d*„ Z*d+d,„ Z+d-d.„ Z,d/d0„ Z-e"d1d2„ ƒZ.d3d4„ Z/d5d6„ Z0d7d8„ Z1d9d:„ Z2d;d<„ Z3d=d>„ Z4d?d@„ Z5	dPdAdB„Z6dCdD„ Z7dZ8	 dQdFdG„Z9dHdI„ Z:dJdK„ Z;dLdM„ Z<dNdO„ Z=dS )RÚDefaultExecutionContextFNc                 C   sÀ   |   | ¡}||_||_|j|_| |_}d|_|j|_|jr+t|jƒ|_|j 	|j¡ |j
s>t |¡|_| |j¡d |_n	t |¡ |_|_| ¡ |_g |_|jrZ| ¡ g|_|S i g|_|S )z8Initialize execution context for a DDLElement construct.Tr   )Ú__new__Úroot_connectionÚ_dbapi_connectionri   ÚcompiledÚisddlÚexecution_optionsÚ_execution_optionsÚdictr©   r   r   rr   Úunicode_statementrB   rt   Úcreate_cursorrl   Úcompiled_parametersr+   r�   rx   )rU   ri   r_   rÅ   Úcompiled_ddlrD   r!  r   r   rF   Ú	_init_ddlM  s*   


þz!DefaultExecutionContext._init_ddlc                    s8  |   | ¡}||_||_|j|_ˆ |_ˆ jsJ ‚ˆ j |j¡|_ˆ j	ˆ j
ˆ jf|_t ˆ ¡|_ˆjs;|j |jj¡|_n|j|_ˆ j|_ˆ j|_ˆ j|_ˆ j|_|sXˆ  ¡ g|_n‡ fdd„t|ƒD ƒ|_t|ƒdk|_| ¡ |_|jsy|jsy|jrŽd|_ t!ˆ jj"ƒ|_#t!ˆ j$o‹ˆ jj" ƒ|_%|jj&s–|jj'r¢|jrž| (¡  n| )¡  ˆ j*‰ˆ j+r¯| ,ˆ ˆ¡}nˆ j-r¶|jj.}g }ˆ j-rè|jD ](‰g }|D ]}	|	ˆv rÖ| /ˆ|	 ˆ|	 ƒ¡ qÄ| /ˆ|	 ¡ qÄ| /ˆ 0|¡¡ q¾n,ˆj }
|jD ]$‰|
�rt1‡‡‡fdd„ˆD ƒƒ}nt1‡‡fdd„ˆD ƒƒ}| /|¡ qïˆ 0|¡|_2|S )z6Initialize execution context for a Compiled construct.c                    s   g | ]\}}ˆ j ||d �‘qS ))Ú_group_number)Úconstruct_params)r{   ÚgrpÚm)r!  r   rF   Ú
<listcomp>™  s    ÿÿz:DefaultExecutionContext._init_compiled.<locals>.<listcomp>r   Tc                 3   s>   � | ]}ˆ  |¡d  |ˆv rˆ| ˆ | ƒnˆ | fV  qdS )r   N©rB   ©r{   Úkey)Úcompiled_paramsri   r
   r   rF   Ú	<genexpr>È  s   € ûÿü
ÿz9DefaultExecutionContext._init_compiled.<locals>.<genexpr>c                 3   s4   � | ]}||ˆv rˆ| ˆ | ƒnˆ | fV  qd S rH   r   r1  )r3  r
   r   rF   r4  Ò  s   € ûÿü
ÿ)3r  r  r   ri   r!  Úcan_executer#  Úunionr$  Ú_result_columnsÚ_ordered_columnsÚ_textual_ordered_columnsÚresult_column_structr   rr   r&  r   Úencoder*   rt   ÚisinsertÚisupdateÚisdeleteÚisplaintextÚis_textr,  r(  Ú	enumerater¡   râ   r'  rl   Úis_crudÚboolÚ
_returningÚ_is_explicit_returningÚ	returningÚ_is_implicit_returningÚinsert_prefetchÚupdate_prefetchÚ_process_executemany_defaultsÚ_process_executesingle_defaultsÚ_bind_processorsÚcontains_expanding_parametersÚ_expand_in_parametersr+   ÚpositiontuprÀ   r�   r%  rx   )rU   ri   r_   rÅ   r!  rx   rD   rO  Úparamr2  r;  r   )r!  r3  ri   r
   rF   Ú_init_compiledn  s†   

ÿýÿ
þ
ÿ

ù	

ù
ù
z&DefaultExecutionContext._init_compiledc           	         sÀ  ˆj rt d¡‚ˆjjrˆjjrtdƒ‚i ˆ_ˆjd }|jr"g }nd}i ‰i }|jr/ˆjj	nˆjj
D ]›‰ ˆjj
ˆ  }|jrÆˆ ˆv rG|ˆ  ‰nU| ˆ ¡}|sSt d¡‚t|d ttfƒr~‡ fdd„t|dƒD ƒ ‰|ˆ < d	 ‡‡fd
d„t|ƒD ƒ¡ˆˆ < n‡ fdd„t|dƒD ƒ ‰|ˆ < d	 ‡fdd„ˆD ƒ¡ˆˆ < | ˆ¡ ˆ ‡ ‡fdd„ˆD ƒ¡ |jr»| dd„ ˆD ƒ¡ dd„ ˆD ƒˆjˆ < q3|jrÎ| ˆ ¡ q3‡fdd„}t d|ˆj¡ˆ_|S )zšhandle special 'expanding' parameters, IN tuples that are rendered
        on a per-parameter basis for an otherwise fixed SQL statement string.

        z7'expanding' parameters can't be used with executemany()zQ'expanding' bind parameters not supported with 'numeric' paramstyle at this time.r   NzM'expanding' parameters with an empty list not supported until SQLAlchemy 1.3.c                    s6   g | ]\}}t |d ƒD ]\}}dˆ ||f |f‘qqS )r   z%s_%s_%s)rA  )r{   ÚiÚtuple_elementÚjÚvalue©r)   r   rF   r/    s    ýþÿzADefaultExecutionContext._expand_in_parameters.<locals>.<listcomp>r   ú, c                 3   s:   � | ]\‰ ‰d d  ‡ ‡‡‡fdd„tˆƒD ƒ¡ V  qdS )z(%s)rW  c                 3   s8   � | ]\}}ˆj jd ˆˆ tˆƒ |  d i V  qdS )r)   r   N)r!  Úbindtemplater¡   )r{   rT  rU  )rR  rD   Ú	to_updaterS  r   rF   r4    s   € úÿþÿÿ
ÿzJDefaultExecutionContext._expand_in_parameters.<locals>.<genexpr>.<genexpr>N)ÚjoinrA  ©r{   )rD   rY  )rR  rS  rF   r4    s   € öùÿ
ÿz@DefaultExecutionContext._expand_in_parameters.<locals>.<genexpr>c                    s    g | ]\}}d ˆ |f |f‘qS )z%s_%sr   )r{   rR  rU  rV  r   rF   r/  )  s    ÿÿc                 3   s$   � | ]\}}ˆ j jd |i V  qdS )r)   N)r!  rX  ©r{   r2  rU  rK   r   rF   r4  -  s
   € ÿ
ÿc                 3   s(   � | ]\}}ˆ ˆv r|ˆˆ  fV  qd S rH   r   r\  )r)   r
   r   rF   r4  3  s   € 
þýc                 s   s   � | ]\}}|V  qd S rH   r   )r{   r)   rU  r   r   rF   r4  9  s   € c                 S   s   g | ]\}}|‘qS r   r   )r{   Ú
expand_keyrU  r   r   rF   r/  :  s    ÿc                    s   ˆ |   d¡ S )Nr   )Úgroup)r.  )Úreplacement_expressionsr   rF   Úprocess_expanding@  rê   zHDefaultExecutionContext._expand_in_parameters.<locals>.process_expandingz\[EXPANDING_(\S+)\])râ   r   ÚInvalidRequestErrorr!  r+   Ú_numeric_bindsr[   Ú_expanded_parametersr(  rO  ÚbindsÚ	expandingÚpoprq   rû   ÚlistrA  rZ  r©   ÚextendrÀ   ÚreÚsubrt   )	rD   r!  r
   r3  rO  Úto_update_setsÚ	parameterÚvaluesr`  r   )r)   r
   r_  rD   rY  rF   rN  â  st   ÿÿ

ÿý

ÿ
þõ
þþ
þÿ
€ÿz-DefaultExecutionContext._expand_in_parametersc                    s  |   | ¡}||_||_|j|_d|_|j|_|s(|jjr#ˆ  ¡ g|_	n7i g|_	n2t
|d ˆ jƒr4||_	n&t
|d tƒrPˆ jrB||_	n‡ fdd„|D ƒpMi g|_	n
‡ fdd„|D ƒ|_	t|ƒdk|_ˆ jsvt
|tjƒrv||_ˆ  |¡d |_n| |_|_| ¡ |_|S )z8Initialize execution context for a string SQL statement.Tr   c                    s    g | ]‰ ‡ ‡fd d„ˆ D ƒ‘qS )c                    s    i | ]}ˆ  |¡d  ˆ | “qS )r   r0  )r{   Úk)Údri   r   rF   Ú
<dictcomp>c  s     zFDefaultExecutionContext._init_statement.<locals>.<listcomp>.<dictcomp>r   r[  rh   )ro  rF   r/  b  ó    ÿÿz;DefaultExecutionContext._init_statement.<locals>.<listcomp>c                    s   g | ]}ˆ   |¡‘qS r   )r�   )r{   Úprh   r   rF   r/  g  s    
ÿr   )r  r  r   ri   r@  r$  r#  r+   r�   rx   rq   r%  r   r¡   râ   r   rr   r&  rB   rt   r'  rl   )rU   ri   r_   rÅ   rt   rx   rD   r   rh   rF   Ú_init_statementH  s@   


þý
ÿÿ
z'DefaultExecutionContext._init_statementc                 C   s4   |   | ¡}||_||_|j|_|j|_| ¡ |_|S )z;Initialize execution context for a ColumnDefault construct.)r  r  r   ri   r$  r#  r'  rl   )rU   ri   r_   rÅ   rD   r   r   rF   Ú_init_defaultx  s   

z%DefaultExecutionContext._init_defaultc                 C   ó   | j jS rH   )r  r¹   rK   r   r   rF   r¹   „  rM   zDefaultExecutionContext.enginec                 C   ru  rH   )r!  Ú	postfetchrK   r   r   rF   Úpostfetch_colsˆ  rM   z&DefaultExecutionContext.postfetch_colsc                 C   s    | j r| jjS | jr| jjS dS )Nr   )r<  r!  rH  r=  rI  rK   r   r   rF   Úprefetch_colsŒ  s
   z%DefaultExecutionContext.prefetch_colsc                 C   s   | j j d S rH   )r!  rF  rK   r   r   rF   Úreturning_cols•  s   z&DefaultExecutionContext.returning_colsc                 C   s   | j  dd¡S )NÚno_parametersF)r#  ÚgetrK   r   r   rF   rz  ™  rX   z%DefaultExecutionContext.no_parametersc                 C   s<   | j  d| j r| jrtjpd¡}|tju r|  | j¡S |S )NÚ
autocommitF)r#  r{  r!  rt   r   ÚPARSE_AUTOCOMMITÚshould_autocommit_textr&  )rD   r|  r   r   rF   Úshould_autocommit�  s   ÿþû
z)DefaultExecutionContext.should_autocommitc                 C   s–   | j }t|tjƒr| jjs| j |¡d }| jjr| j ¡ }ni }|j	| j
||| d� | j
 ¡ d }|durI| | j| j
jd d ¡}|rI||ƒS |S )a  Execute a string statement on the current cursor, returning a
        scalar result.

        Used to fire off sequences, default phrases, and "select lastrowid"
        types of statements individually or in the context of a parent INSERT
        or UPDATE statement.

        r   )rä   Nr   )r  rq   r   rr   ri   r   rB   r+   r�   rm   rl   rn   Ú_cached_result_processorrŽ   )rD   ÚstmtÚtype_r�   Údefault_paramsÚrÚprocr   r   rF   Ú_execute_scalar¬  s$   

ÿþÿz'DefaultExecutionContext._execute_scalarc                 C   s
   | j  ¡ S rH   )r  Ú_branchrK   r   r   rF   r_   Í  r¶   z"DefaultExecutionContext.connectionc                 C   s
   t  |¡S rH   )ÚAUTOCOMMIT_REGEXPÚmatch)rD   rt   r   r   rF   r~  Ñ  s   
z.DefaultExecutionContext.should_autocommit_textc                 C   sx   | j jsdS | j jr3| j dd¡o0| jrt| jjtj	ƒp0| j p't| jjtj
ƒo0| jo0t | j¡}|S | j dd¡}|S )NFÚstream_resultsT)ri   r  Úserver_side_cursorsr#  r{  r!  rq   rt   r   Ú
SelectableÚ
TextClauseÚSERVER_SIDE_CURSOR_REr‰  )rD   Úuse_server_sider   r   rF   Ú_use_server_side_cursorÔ  s2   ÿ
ÿÿ
ÿþú
ðüÿz/DefaultExecutionContext._use_server_side_cursorc                 C   s&   |   ¡ rd| _|  ¡ S d| _| j ¡ S )NTF)r�  Ú_is_server_sideÚcreate_server_side_cursorr   rl   rK   r   r   rF   r'  ô  s
   
z%DefaultExecutionContext.create_cursorc                 C   s   t ƒ ‚rH   )r[   rK   r   r   rF   r’  ü  s   z1DefaultExecutionContext.create_server_side_cursorc                 C   rÃ   rH   r   rK   r   r   rF   Úpre_execÿ  rÇ   z DefaultExecutionContext.pre_execc                 C   rÃ   rH   r   rK   r   r   rF   Ú	post_exec  rÇ   z!DefaultExecutionContext.post_execc                 C   s   |  | j|¡S )zÚReturn a 'result processor' for a given type as present in
        cursor.description.

        This has a default implementation that dialects can override
        for context-sensitive result type handling.

        )r€  ri   )rD   r‚  ÚcolnameÚcoltyper   r   rF   Úget_result_processor  s   z,DefaultExecutionContext.get_result_processorc                 C   ru  )aï  return self.cursor.lastrowid, or equivalent, after an INSERT.

        This may involve calling special cursor functions,
        issuing a new SELECT on the cursor (or a new one),
        or returning a stored value that was
        calculated within post_exec().

        This function will only be called for dialects
        which support "implicit" primary key generation,
        keep preexecute_autoincrement_sequences set to False,
        and when no explicit id value was bound to the
        statement.

        The function is called once, directly after
        post_exec() and before the transaction is committed
        or ResultProxy is generated.   If the post_exec()
        method assigns a value to `self._lastrowid`, the
        value is used in place of calling get_lastrowid().

        Note that this method is *not* equivalent to the
        ``lastrowid`` method on ``ResultProxy``, which is a
        direct proxy to the DBAPI ``lastrowid`` accessor
        in all cases.

        )rl   Ú	lastrowidrK   r   r   rF   Úget_lastrowid  s   z%DefaultExecutionContext.get_lastrowidc                 C   rÃ   rH   r   )rD   rë   r   r   rF   Úhandle_dbapi_exception+  rÇ   z.DefaultExecutionContext.handle_dbapi_exceptionc                 C   s   | j rt | ¡S t | ¡S rH   )r‘  r   ÚBufferedRowResultProxyÚResultProxyrK   r   r   rF   Úget_result_proxy.  s   

z(DefaultExecutionContext.get_result_proxyc                 C   ru  rH   )rl   ÚrowcountrK   r   r   rF   rž  4  rM   z DefaultExecutionContext.rowcountc                 C   ru  rH   )ri   rQ   rK   r   r   rF   rQ   8  ó   z.DefaultExecutionContext.supports_sane_rowcountc                 C   ru  rH   )ri   r  rK   r   r   rF   r  ;  rŸ  z4DefaultExecutionContext.supports_sane_multi_rowcountc                 C   sØ   | j r| js| js| jjs| jjr|  ¡  n| js|  ¡  |  	¡ }| j rH| jr<| 
¡ }|| _|  |¡ | ¡  d |_|S | jsF| ¡  d |_|S | jr^| jr^| 
¡ }|| _| ¡  d |_|S |jd u rj|j | ¡  |S rH   )r<  râ   rG  r!  Úinlineri   r   Ú_setup_ins_pk_from_lastrowidÚ_setup_ins_pk_from_emptyr�  rn   Úreturned_defaultsÚ%_setup_ins_pk_from_implicit_returningÚ_soft_closeÚ	_metadatarE  r=  rž  )rD   r   ru   r   r   rF   Ú_setup_crud_result_proxy>  sB   ÿþý

ñô
úz0DefaultExecutionContext._setup_crud_result_proxyc                    sš   | j jd ‰| j jj}| jd ‰|  ¡ ‰ˆd ur?|j‰ ˆ d ur/ˆ j | j	d ¡}|d ur/|ˆƒ‰‡ ‡‡‡fdd„|j
D ƒ| _d S ‡‡fdd„|j
D ƒ| _d S )Nr   r   c                    s(   g | ]}|ˆ u r
ˆnˆ  ˆ|ƒd ¡‘qS rH   ©r{  ©r{   Úc©Úautoinc_colr3  Ú
key_getterr˜  r   rF   r/  t  s    þÿýzHDefaultExecutionContext._setup_ins_pk_from_lastrowid.<locals>.<listcomp>c                    ó   g | ]
}ˆ   ˆ|ƒd ¡‘qS rH   r¨  r©  ©r3  r­  r   rF   r/  }  s    ÿÿ)r!  Ú_key_getters_for_crud_columnrt   r–   r(  r™  Ú_autoincrement_columnÚtyper€  ri   Úprimary_keyÚinserted_primary_key)rD   r–   r…  r   r«  rF   r¡  e  s$   

ÿü	þz4DefaultExecutionContext._setup_ins_pk_from_lastrowidc                    s<   | j jd ‰| j jj}| jd ‰ ‡ ‡fdd„|jD ƒ| _d S )Nr   r   c                    r®  rH   r¨  r©  r¯  r   rF   r/  †  s    ÿzDDefaultExecutionContext._setup_ins_pk_from_empty.<locals>.<listcomp>)r!  r°  rt   r–   r(  r³  r´  )rD   r–   r   r¯  rF   r¢  ‚  s   

ÿz0DefaultExecutionContext._setup_ins_pk_from_emptyc                    s\   ˆd u r	d | _ d S | jjd ‰| jjj}| jd ‰ ‡fdd„‡ ‡fdd„|jD ƒD ƒ| _ d S )Nr   r   c                    s$   g | ]\}}|d u rˆ | n|‘qS rH   r   )r{   ÚcolrU  )ru   r   rF   r/  ’  s    ÿÿzQDefaultExecutionContext._setup_ins_pk_from_implicit_returning.<locals>.<listcomp>c                    s    g | ]}|ˆ   ˆ|ƒd ¡f‘qS rH   r¨  )r{   rµ  r¯  r   rF   r/  ”  rq  )r´  r!  r°  rt   r–   r(  r³  )rD   ru   r–   r   )r3  r­  ru   rF   r¤  Š  s   


þþz=DefaultExecutionContext._setup_ins_pk_from_implicit_returningc                 C   s   | j s| jot| jjƒS rH   )r<  r=  rC  r!  rv  rK   r   r   rF   Úlastrow_has_defaultsš  s   ÿz,DefaultExecutionContext.lastrow_has_defaultsc              
      sB  t | jdƒsdS i }| jjD ]5}|j | j¡}t|ƒ}| | jj¡‰ ˆ dur?|r0ˆ |vr?||vr?|r:ˆ |v s:||v r?ˆ ||< qd||< q| jjrV| jj	 
|| j| j| j| ¡ | jjr²g }| jjD ]*}	| jj|	 }| |d¡‰ ˆ durŠ|	| jv r…| ˆ gt| j|	 ƒ ¡ q`| ˆ ¡ q`z	| jj|Ž  W dS  ty± }
 z| j |
ddd| ¡ W Y d}
~
dS d}
~
ww i }| jj ¡ D ];\}}	| |d¡‰ ˆ durõ|rÐ| |	|	¡}	| jjsÜ| j |	¡d }	|	| jv rñ| ‡ fdd„| j|	 D ƒ¡ qºˆ ||	< qºz| jjdi |¤Ž W dS  t�y  }
 z| j |
ddd| ¡ W Y d}
~
dS d}
~
ww )a&  Given a cursor and ClauseParameters, call the appropriate
        style of ``setinputsizes()`` on the cursor, using DB-API types
        from the bind parameter's ``TypeEngine`` objects.

        This method only called by those dialects which require it,
        currently cx_oracle.

        Ú
bind_namesNr   c                 3   s   � | ]}|ˆ fV  qd S rH   r   )r{   r]  ©Údbtyper   rF   r4  é  s
   € ÿ
ÿz:DefaultExecutionContext.set_input_sizes.<locals>.<genexpr>r   )Úhasattrr!  r·  r²  Ú_unwrapped_dialect_implri   Úget_dbapi_typer-   Ú_has_eventsÚdispatchÚdo_setinputsizesrl   rt   rx   r+   rO  rd  r{  rc  rh  r¡   rÀ   ÚsetinputsizesÚBaseExceptionr  Ú_handle_dbapi_exceptionÚitemsr  rB   r©   )rD   Ú	translateÚinclude_typesÚexclude_typesÚ
inputsizesÚ	bindparamÚdialect_implÚdialect_impl_clsÚpositional_inputsizesr2  rë   Úkeyword_inputsizesr   r¸  rF   Úset_input_sizesŸ  s€   þý

ÿ
ÿ
€
ÿ€ÿ

þ€
ÿ€ÿz'DefaultExecutionContext.set_input_sizesc                 C   s|   |j r	|  ||¡S |jr|| _| | ¡S |jr;| j}|js%t 	|j|¡}n|j}t 
|g¡j|d�}| |di ¡ ¡ S |jS )N)Úbindr   )Úis_sequenceÚfire_sequenceÚis_callableÚcurrent_columnÚargÚis_clause_elementr_   Ú_arg_is_typedr   Útype_coercerj   rk   Ú_execute_compiledÚscalar)rD   Úcolumnr   r‚  r�   Údefault_argrª  r   r   rF   Ú_exec_defaultö  s   
z%DefaultExecutionContext._exec_defaultTc                    sª   z| j ‰| j}W n ty   t d¡‚w |rS| jrS| jjjrS|j	r1|j
d ‰ |jjˆ|j i}n
|jˆ|j i}d‰ | jjjd  ¡ }| ‡ ‡fdd„|D ƒ¡ |S ˆS )aF  Return a dictionary of parameters applied to the current row.

        This method can only be used in the context of a user-defined default
        generation function, e.g. as described at
        :ref:`context_default_functions`. When invoked, a dictionary is
        returned which includes entries for each column/value pair that is part
        of the INSERT or UPDATE statement. The keys of the dictionary will be
        the key value of each :class:`.Column`, which is usually synonymous
        with the name.

        :param isolate_multiinsert_groups=True: indicates that multi-valued
         INSERT constructs created using :meth:`.Insert.values` should be
         handled by returning only the subset of parameters that are local
         to the current column default invocation.   When ``False``, the
         raw parameters of the statement are returned including the
         naming convention used in the case of multi-valued INSERT.

        .. versionadded:: 1.2  added
           :meth:`.DefaultExecutionContext.get_current_parameters`
           which provides more functionality over the existing
           :attr:`.DefaultExecutionContext.current_parameters`
           attribute.

        .. seealso::

            :attr:`.DefaultExecutionContext.current_parameters`

            :ref:`context_default_functions`

        zdget_current_parameters() can only be invoked in the context of a Python side column default functionr   r   c                 3   s$   � | ]}|ˆd |ˆ f  fV  qdS )z%s_m%dNr   r1  ©Úindexrx   r   rF   r4  T  s   € 
ÿzADefaultExecutionContext.get_current_parameters.<locals>.<genexpr>)Úcurrent_parametersrÒ  ÚAttributeErrorr   ra  r<  r!  rt   Ú_has_multi_parametersÚ_is_multiparam_columnrÝ  Úoriginalr2  rx   Úkeysr©   )rD   Úisolate_multiinsert_groupsrÙ  ro  rã  r   rÜ  rF   Úget_current_parameters!  s2   
ÿÿÿþý
ÿz.DefaultExecutionContext.get_current_parametersc                 C   ó    |j d u rd S |  ||j |j¡S rH   )r   rÛ  r²  ©rD   rÙ  r   r   rF   Úget_insert_default[  ó   
z*DefaultExecutionContext.get_insert_defaultc                 C   ræ  rH   )ÚonupdaterÛ  r²  rç  r   r   rF   Úget_update_defaulta  ré  z*DefaultExecutionContext.get_update_defaultc                 C   sö   | j jd }i }| j j}| j j}|D ]}|jr!|jjr!|jj||< q|D ]}|jr3|jjr3|jj||< q$| jD ]?}|| _	|D ]}||v rI|| }n|  
|¡}|d urX||||ƒ< q>|D ]}||v rf|| }n|  |¡}|d uru||||ƒ< q[q7| `	d S )Nr   )r!  r°  rH  rI  r   Ú	is_scalarrÓ  rê  r(  rÞ  rè  rë  )rD   r­  Úscalar_defaultsrH  rI  rª  rP  Úvalr   r   rF   rJ  g  s<   €€


€

€úz5DefaultExecutionContext._process_executemany_defaultsc                 C   sœ   | j jd }| jd  | _}| j jD ]!}|jr$|jjs$|jjr$|jj}n|  	|¡}|d ur3||||ƒ< q| j j
D ]}|  |¡}|d urI||||ƒ< q8| `d S )Nr   r   )r!  r°  r(  rÞ  rH  r   rÏ  rì  rÓ  rè  rI  rë  )rD   r­  r(  rª  rî  r   r   rF   rK  Œ  s"   þ

€
€z7DefaultExecutionContext._process_executesingle_defaults)NNN)T)>rí   rî   rï   r<  r=  r>  rB  r@  r"  râ   r!  rt   r:  r£  rG  rE  Ú_translate_colnamer   r  rc  r  r*  rQ  rN  rs  rt  r  r¹   rw  rx  ry  rz  r  r†  r  r_   r~  r�  r'  r’  r“  r”  r—  r™  rš  r�  rž  rQ   r  r§  r¡  r¢  r¤  r¶  rÍ  rÛ  rÞ  rå  rè  rë  rJ  rK  r   r   r   rF   r  8  sŠ    
 
sf
/






!
 

'
ÿW
:%r  )rð   r@   rÕ   ri  rI   Ú r   r   r   r   r   r	   r
   r   r„   r   Úsqlr   r   r   rk   ÚIÚUNICODErˆ  rŽ  ÚDialectr   r  ÚExecutionContextr  Úexecution_ctx_clsr   r   r   rF   Ú<module>   sF   ÿ          
q