U
    h^                     @   s  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! G d d! d!ej"Z#G d"d# d#ej"Z$G d$d% d%ej%Z&G d&d' d'ej"Z'G d(d) d)ej%Z(G d*d+ d+ej"Z)G d,d- d-ej"Z*G d.d/ d/ej+e*Z,G d0d1 d1ej"Z-G d2d3 d3ej%Z.dS )4    N   )testing   )assert_raises)config)engines)eq_)fixtures)is_not_none)is_true)mock)ne_)provide_metadata)expect_raises)expect_raises_message)requirements) set_default_schema_on_connection)Column)Table   )	bindparam)dialects)event)exc)Integer)literal_column)select)String)Compiled)inspect_getfullargspecc                   @   s   e Zd ZdZdd ZdS )PingTestTc              	   C   s0   t j }tt jj|jj W 5 Q R X d S N)r   dbconnectr   dialectZdo_ping
connectiondbapi_connection)selfconn r)   I/tmp/pip-unpacked-wheel-y9ln43lq/sqlalchemy/testing/suite/test_dialect.pytest_do_ping,   s    zPingTest.test_do_pingN)__name__
__module____qualname____backend__r+   r)   r)   r)   r*   r    )   s   r    c                   @   s:   e Zd ZdZdd Zejee ddd Zdd Z	d	S )
ArgSignatureTesta  test that all visit_XYZ() in :class:`_sql.Compiler` subclasses have
    ``**kw``, for #8988.

    This test uses runtime code inspection.   Does not need to be a
    ``__backend__`` test as it only needs to run once provided all target
    dialects have been imported.

    For third party dialects, the suite would be run with that third
    party as a "--dburi", which means its compiler classes will have been
    imported by the time this test runs.

    c                  c   sR   t jD ]} | dstd|   qtg}|rN|d}||  |V  q*d S )N_zsqlalchemy.dialects.%sr   )	r   __all__
startswith	importlibimport_moduler   popextend__subclasses__)dstackclsr)   r)   r*   _all_subclassesA   s    


z ArgSignatureTest._all_subclasses)paramsc                 c   s   |j V  d S r!   )param)r'   requestr)   r)   r*   all_subclassesM   s    zArgSignatureTest.all_subclassesc                 C   sL   |}|j D ]<}|dr
t||}t|}t|jd|j d| d q
d S )NZvisit_zCompiler visit method .z:() does not accommodate for **kw in its argument signature)__dict__r3   getattrr   r
   varkwr,   )r'   r@   r;   kmethZinspr)   r)   r*    test_all_visit_methods_accept_kwQ   s    


z1ArgSignatureTest.test_all_visit_methods_accept_kwN)
r,   r-   r.   __doc__r<   r   fixturelistr@   rG   r)   r)   r)   r*   r0   3   s
   
r0   c                   @   s:   e Zd ZdZdZdZedd Zej	dd Z
dd	 Zd
S )ExceptionTestzTest basic exception wrapping.

    DBAPIs vary a lot in exception behavior so to actually anticipate
    specific exceptions from real round trips, we need to be conservative.

    eachTc              	   C   s(   t d|tdtdddtdtd d S )N	manual_pkidTFprimary_keyZautoincrementdata2   r   r   r   r   r;   metadatar)   r)   r*   define_tablesl   s    zExceptionTest.define_tablesc              	   C   sd   t j P}| }|| jj ddd tt	j
|j| jj ddd |  W 5 Q R X d S )Nr   d1rN   rQ   )r   r"   r#   beginexecutetablesrM   insertr   r   ZIntegrityErrorrollback)r'   r(   transr)   r)   r*   test_integrity_erroru   s    
 
z"ExceptionTest.test_integrity_errorc                 C   s   t j v}z|ttd ds(tW nB tjk
rl } z"t	|}t	|j
t	|ks\tW 5 d }~X Y nX t|t	s|tW 5 Q R X d S )Nu   méilF)r   r"   r#   rZ   r   r   AssertionErrorr   
DBAPIErrorstrorig
isinstance)r'   r(   errerr_strr)   r)   r*   test_exception_with_non_ascii   s    (z+ExceptionTest.test_exception_with_non_asciiN)r,   r-   r.   rH   run_deletesr/   classmethodrV   r   Z$duplicate_key_raises_integrity_errorr_   rg   r)   r)   r)   r*   rK   `   s   

rK   c                   @   sl   e Zd ZdZdZdd Zdd Zdd Zd	d
 Ze	j
jdd Ze	j
je	j
jdd Ze	j
jdd ZdS )IsolationLevelTestTisolation_levelc                 C   sF   t t}|d }|d }t|d|g}|r8| S td d S )Ndefault	supported
AUTOCOMMITz(no non-default isolation level available)r   get_isolation_levelsr   set
differencer6   Z	skip_test)r'   levelsrm   rn   sr)   r)   r*    _get_non_default_isolation_level   s    
z3IsolationLevelTest._get_non_default_isolation_levelc                 C   s   t tjjjttd  d S )Nrm   )r   r   r"   r$   Zdefault_isolation_levelr   rp   )r'   r)   r)   r*   test_default_isolation_level   s    z/IsolationLevelTest.test_default_isolation_levelc              	   C   sl   |   }tj P}| }t|| |j|d t| | |j	|j
j t| | W 5 Q R X d S )Nrk   )ru   r   r"   r#   get_isolation_levelr   execution_optionsr   r$   reset_isolation_levelr%   r&   )r'   Znon_defaultr(   existingr)   r)   r*    test_non_default_isolation_level   s    
z3IsolationLevelTest.test_non_default_isolation_levelc              
   C   s   t t}|d }t|dgD ]z}tj >}|j|d t|	 | |
 }|  t|	 | W 5 Q R X tj }t|	 |d  W 5 Q R X q"d S )Nrn   ro   rk   rm   )r   rp   r   rq   rr   r"   r#   rx   r   rw   rY   r]   )r'   rs   Z
all_levelslevelr(   r^   r)   r)   r*   test_all_levels   s    
z"IsolationLevelTest.test_all_levelsc              
   C   sJ   |}t tjdd|jjdttd f  |j	dd W 5 Q R X dS )z4test for the new get_isolation_level_values() methodNInvalid value '%s' for isolation_level. Valid isolation levels for '%s' are %sFOO, rn   rk   N)
r   r   ArgumentErrorr$   namejoinr   rp   r   rx   )r'   connection_no_transr%   r)   r)   r*   #test_invalid_level_execution_option   s    z6IsolationLevelTest.test_invalid_level_execution_optionc              
   C   sR   |t ddd}ttjdd|jjdtt	d f  |
  W 5 Q R X dS )ztest for the new get_isolation_level_values() method
        and support for the dialect-level 'isolation_level' parameter.

        r   rk   optionsr~   r   rn   N)dictr   r   r   r$   r   r   r   rp   r   r#   )r'   testing_engineengr)   r)   r*   test_invalid_level_engine_param   s    z2IsolationLevelTest.test_invalid_level_engine_paramc              	   C   s   t t}|d }tt|d |dgd }|d|id}| }t| | W 5 Q R X |  }|j	|d t| | W 5 Q R X | }t| | W 5 Q R X d S )Nrm   rn   ro   r   rl   r   rk   )
r   rp   r   sortedrq   rr   r#   r   rw   rx   )r'   r   rs   rm   rn   er(   r)   r)   r*   %test_dialect_user_setting_is_restored  s    



z8IsolationLevelTest.test_dialect_user_setting_is_restoredN)r,   r-   r.   r/   __requires__ru   rv   r{   r}   r   requiresZget_isolation_level_valuesr   Z#dialect_level_isolation_level_paramr    independent_readonly_connectionsr   r)   r)   r)   r*   rj      s   
rj   c                   @   s   e Zd ZdZdZdZedd ZdddZd	d
 Z	dd Z
dd Zejjeddddgedddgdd Zejjedddgdd ZdS )AutocommitIsolationTestrL   )
autocommitTc              	   C   s,   t d|tdtdddtdtddd d S )	N
some_tablerN   TFrO   rQ   rR   )Ztest_needs_acidrS   rT   r)   r)   r*   rV     s    z%AutocommitIsolationTest.define_tablesFc              	   C   s   |r| j jj|dd |  | }|| j j ddd |  t|	t
| j jjj|rfdnd  |  |  || j j  W 5 Q R X d S )NT)Z
checkfirstr   z	some datarX   )r[   r   createcommitrY   rZ   r\   r]   r   scalarr   crN   delete)r'   r(   r   ensure_tabler^   r)   r)   r*   _test_conn_autocommits)  s     
 

z.AutocommitIsolationTest._test_conn_autocommitsc                 C   s<   |}|j dd}| |d |j|jj | |d d S )Nro   rk   TF)rx   r   r$   ry   r%   r&   )r'   r   r(   c2r)   r)   r*   test_autocommit_on=  s
    z*AutocommitIsolationTest.test_autocommit_onc                 C   s   |}|  |d d S )NF)r   r'   r   r(   r)   r)   r*   test_autocommit_offF  s    z+AutocommitIsolationTest.test_autocommit_offc                 C   sB   |}|j dd}| |d |j ttd d | |d d S )Nro   rk   Trm   F)rx   r   r   rp   r   r   r)   r)   r*   .test_turn_autocommit_off_via_default_iso_levelJ  s    zFAutocommitIsolationTest.test_turn_autocommit_off_via_default_iso_levelautocommit_settingfalseengineoptionblock_rollbackc              	   C   s   i }t |rd|d< |jr"d|d< ||d}| }|jrF|jdd | j||jpV|jdd tjj|j	d|j	j
d	}|  W 5 Q R X |js|st|jt g nt|jg  d S )
NTskip_autocommit_rollbackro   rl   r   rk   )r   r]   )wraps)boolr   r#   r   rx   r   r   patchobjectr%   r]   closer   r   Z
mock_callscall)r'   r   r   r   kwr   r(   Zcheck_rollbackr)   r)   r*   test_autocommit_blockX  s0    

  
z-AutocommitIsolationTest.test_autocommit_blockuse_dialect_settingc              	   C   s   |r|ddid}n| j dd}tt}|d }| }| |d W 5 Q R X | }|j |d | |d W 5 Q R X | }| |d W 5 Q R X dS )	ztest #10147rl   ro   r   rk   rm   TFN)rx   r   rp   r   r#   r   )r'   r   r   r   rs   rm   r(   r)   r)   r*   #test_dialect_autocommit_is_restoredw  s    



z;AutocommitIsolationTest.test_dialect_autocommit_is_restoredN)F)r,   r-   r.   rh   r   r/   ri   rV   r   r   r   r   r   r   r   Z	variationr   r   r   r)   r)   r)   r*   r     s    
	
	r   c                   @   s   e Zd Zedd ZdS )EscapingTestc              	   C   s   | j }td|tdtd}|tj tj }||	 t
dd ||	 t
dd t|t|jj|jjtdkd t|t|jj|jjtdkd W 5 Q R X d	S )
z|test that the DBAPI accommodates for escaped / nonescaped
        percent signs in a way that matches the compiler

        trQ   rR   zsome % value)rQ   zsome %% other valuez'some % value'z'some %% other value'N)rU   r   r   r   r   r   r"   rY   rZ   r\   r   r   r   r   r   rQ   wherer   )r'   mr   r(   r)   r)   r*   test_percent_sign_round_trip  s,    	z)EscapingTest.test_percent_sign_round_tripN)r,   r-   r.   r   r   r)   r)   r)   r*   r     s   r   c                   @   s4   e Zd ZdZdZdd Zdd Zdd Zd	d
 ZdS ) WeCanSetDefaultSchemaWEventsTestT)Zdefault_schema_name_switchc              	   C   s8   t jjj}t }|  W 5 Q R X t|jj| d S r!   )r   r"   r$   default_schema_namer   r   r#   r   )r'   r   r   r)   r)   r*   test_control_case  s
    


z2WeCanSetDefaultSchemaWEventsTest.test_control_casec              	   C   sd   t jjj}t }t|ddd }| }|j	|}t
|t j W 5 Q R X t
|jj| d S )Nr#   c                 S   s   t t| tj d S r!   r   r   test_schemar&   Zconnection_recordr)   r)   r*   
on_connect  s
      zMWeCanSetDefaultSchemaWEventsTest.test_wont_work_wo_insert.<locals>.on_connect)r   r"   r$   r   r   r   r   listens_forr#   _get_default_schema_namer   r   )r'   r   r   r   r(   what_it_should_ber)   r)   r*   test_wont_work_wo_insert  s    



z9WeCanSetDefaultSchemaWEventsTest.test_wont_work_wo_insertc              	   C   s`   t  }tj|ddddd }| }|j|}t|tj	 W 5 Q R X t|jj
tj	 d S )Nr#   Tr\   c                 S   s   t t| tj d S r!   r   r   r)   r)   r*   r     s
      zRWeCanSetDefaultSchemaWEventsTest.test_schema_change_on_connect.<locals>.on_connect)r   r   r   r   r#   r$   r   r   r   r   r   )r'   r   r   r(   r   r)   r)   r*   test_schema_change_on_connect  s    

z>WeCanSetDefaultSchemaWEventsTest.test_schema_change_on_connectc              	   C   s   t  }tj|ddddd }| F}| }|j|}t|t	j
 |  |j|}t|t	j
 W 5 Q R X t|jjt	j
 d S )Nr#   Tr   c                 W   s   t t| tj d S r!   r   )r&   argr)   r)   r*   r     s
      z\WeCanSetDefaultSchemaWEventsTest.test_schema_change_works_w_transactions.<locals>.on_connect)r   r   r   r   r#   rY   r$   r   r   r   r   r]   r   )r'   r   r   r(   r^   r   r)   r)   r*   'test_schema_change_works_w_transactions  s    

zHWeCanSetDefaultSchemaWEventsTest.test_schema_change_works_w_transactionsN)	r,   r-   r.   r/   r   r   r   r   r   r)   r)   r)   r*   r     s   	r   c                   @   s   e Zd ZdS )&FutureWeCanSetDefaultSchemaWEventsTestN)r,   r-   r.   r)   r)   r)   r*   r     s   r   c                   @   s   e Zd ZdZejdddddddd	d
ddddddddddddddZeejj	dd Z
ejdd Zedd Zedd  Zd!S )"DifficultParametersTestT)Zboring)zper cent)z
per % cent)z%percent)zpar(ens))zpercent%(ens)yah)zcol:ons)Z_starts_with_underscore)zdot.s)zmore :: %colons%)_name)Z___name)z[BracketsAndCase])Z	42numbers)zpercent%signs)z
has spaces)z	/slashes/)zmore/slashes)zq?marks)Z1param)z1col:on	paramname)argnamesc              	   C   s   |}t d|tdtddt|tddd}|| || dd|d	i t|j	| 
|j	| d	k}t||d	 t|j	| 
|j	| t|k}|||d	i }t|j| d	 t|j	| 
|j	| d	d
g}||  d S )Nr   rN   T)rP   rR   F)Znullabler   z	some namezsome other_name)r   r   r   r   r   rZ   r\   valuesr   r   r   r   r   r   first_mappingin_)r'   r   r%   rU   r   r   stmtrowr)   r)   r*   !test_round_trip_same_named_column  s$    
"z9DifficultParametersTest.test_round_trip_same_named_columnc              
   c   sv   t d|tdttdtdtdtd}|| || dddd	d
ddd	dddd	dddd	g |V  d S )Nmytablemyidr   rR   descr   aZa_desc)r   r   r   r   bZb_descr   r   Zc_desc   r9   Zd_desc)r   r   r   r   r   rZ   r\   )r'   rU   r%   r   r)   r)   r*   multirow_fixtureB  s"    




	z(DifficultParametersTest.multirow_fixturec                 C   sD   |}t |jj|jjt|ddk}|||di}t|d d S )Nxvaluer   r   )r   r   r   r   r   r   r   r   r'   r   r%   r   Ztbl1r   resr)   r)   r*    test_standalone_bindparam_escapeY  s    z8DifficultParametersTest.test_standalone_bindparam_escapec                 C   s`   |}t |jj|jjt|ddgd|jj}|||ddgi	 }t
|ddg d S )Nr   r   r   r9   r   r   )r   r   r   r   r   r   r   Zorder_byZscalarsallr   r   r)   r)   r*   *test_standalone_bindparam_escape_expandingd  s    zBDifficultParametersTest.test_standalone_bindparam_escape_expandingN)r,   r-   r.   r/   r   combinationsZtough_parametersr   r   Zunusual_column_name_charactersr   rI   r   r   r   r)   r)   r)   r*   r     sD   &


r   c                   @   s^   e Zd ZdZdZedd Zejdd Z	dd Z
d	d
 Zdd Zdd Zdd Zdd ZdS )ReturningGuardsTestz=test that the various 'returning' flags are set appropriatelyTc              	   C   s(   t d|tdtdddtdtd d S )Nr   rN   TFrO   rQ   rR   rS   rT   r)   r)   r*   rV   x  s    z!ReturningGuardsTest.define_tablesc                    s   | j j fdd}|S )Nc              
      s  |  jj} |r|spttjd jj d jj d0  	| |dddi|dddi|d	dd
ig W 5 Q R X n> 	| |dddi|dddi|d	dd
ig}t
| dddg nT|sttj  	| |dddi W 5 Q R X n$ 	| |dddi}t
| dg d S )NzDialect z\+zW with current server capabilities does not support .*RETURNING when executemany is usedr   rQ   rW   r   d2r   d3)r   )r   )r   )Z	returningr   rN   r   r   ZStatementErrorr$   r   ZdriverrZ   r   r   r   ra   )r   ZexecutemanyZid_param_nameZexpect_successresultr%   r   r)   r*   go  sB    


	


 
 
z(ReturningGuardsTest.run_stmt.<locals>.go)r[   r   )r'   r%   r   r)   r   r*   run_stmt  s    /zReturningGuardsTest.run_stmtc                 C   s&   | j j}| }||dd|jj d S )NFrN   )r[   r   r\   r$   Zinsert_returningr'   r%   r   r   r   r)   r)   r*   test_insert_single  s    z&ReturningGuardsTest.test_insert_singlec                 C   s&   | j j}| }||dd|jj d S )NTrN   )r[   r   r\   r$   Zinsert_executemany_returningr   r)   r)   r*   test_insert_many  s       z$ReturningGuardsTest.test_insert_manyc                 C   s`   | j j}|| dddddddddg | |jjtdk}||d	d|j	j
 d S 
Nr   rW   rX   r   r   r   r   b_idF)r[   r   rZ   r\   updater   r   rN   r   r$   Zupdate_returningr   r)   r)   r*   test_update_single  s    	z&ReturningGuardsTest.test_update_singlec                 C   s`   | j j}|| dddddddddg | |jjtdk}||d	d|j	j
 d S 
Nr   rW   rX   r   r   r   r   r   T)r[   r   rZ   r\   r   r   r   rN   r   r$   Zupdate_executemany_returningr   r)   r)   r*   test_update_many  s    	   z$ReturningGuardsTest.test_update_manyc                 C   s`   | j j}|| dddddddddg | |jjtdk}||d	d|j	j
 d S r   )r[   r   rZ   r\   r   r   r   rN   r   r$   Zdelete_returningr   r)   r)   r*   test_delete_single  s    	z&ReturningGuardsTest.test_delete_singlec                 C   s`   | j j}|| dddddddddg | |jjtdk}||d	d|j	j
 d S r   )r[   r   rZ   r\   r   r   r   rN   r   r$   Zdelete_executemany_returningr   r)   r)   r*   test_delete_many  s    	   z$ReturningGuardsTest.test_delete_manyN)r,   r-   r.   rH   r/   ri   rV   r   rI   r   r   r   r   r   r   r   r)   r)   r)   r*   r   s  s   

4	r   )/r4    r   r   r   r   r   r	   r
   r   r   r   r   Z
assertionsr   r   r   Z	provisionr   Zschemar   r   r   r   r   r   r   r   r   r   Zsql.compilerr   utilr   ZTestBaser    r0   Z
TablesTestrK   rj   r   r   r   ZFutureEngineMixinr   r   r   r)   r)   r)   r*   <module>
   sR   
-8 |!C
 u