o
    GXîh–™  ã                   @   s4  d dl Z d dlZd dlZd dlZd dlZd dlmZmZ d dl	m
Z
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ƒZG dd„ dejƒZG dd„ dejƒZG dd„ dejƒZdd„ Zdd„ Zedkr˜eƒ  dS dS )é    N)Úcheck_disallow_instantiationÚSHORT_TIMEOUT)ÚTESTFNÚunlinkc                   @   s–   e Z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d„ Zdd„ Zdd„ Zdd„ Ze ejdkd¡dd„ ƒZdd „ Zd!S )"ÚModuleTestsc                 C   ó   |   tjddtj ¡ d S )Nz2.0zapilevel is %s, should be 2.0)ÚassertEqualÚsqliteZapilevel©Úself© r   ú</opt/python-3.10.19/usr/lib/python3.10/sqlite3/test/dbapi.pyÚtest_api_level"   ó   
ÿzModuleTests.test_api_levelc                 C   r   )Né   zthreadsafety is %d, should be 1)r   r	   Zthreadsafetyr
   r   r   r   Útest_thread_safety&   r   zModuleTests.test_thread_safetyc                 C   r   )NZqmarkz%paramstyle is '%s', should be 'qmark')r   r	   Z
paramstyler
   r   r   r   Útest_param_style*   s
   
ÿÿzModuleTests.test_param_stylec                 C   ó   |   ttjtƒd¡ d S )Nz&Warning is not a subclass of Exception)Ú
assertTrueÚ
issubclassr	   ÚWarningÚ	Exceptionr
   r   r   r   Útest_warning/   ó   ÿzModuleTests.test_warningc                 C   r   )Nz$Error is not a subclass of Exception)r   r   r	   ÚErrorr   r
   r   r   r   Ú
test_error3   r   zModuleTests.test_errorc                 C   ó   |   ttjtjƒd¡ d S )Nz)InterfaceError is not a subclass of Error)r   r   r	   ÚInterfaceErrorr   r
   r   r   r   Útest_interface_error7   ó   ÿz ModuleTests.test_interface_errorc                 C   r   )Nz(DatabaseError is not a subclass of Error)r   r   r	   ÚDatabaseErrorr   r
   r   r   r   Útest_database_error;   r   zModuleTests.test_database_errorc                 C   r   )Nz,DataError is not a subclass of DatabaseError)r   r   r	   Ú	DataErrorr    r
   r   r   r   Útest_data_error?   r   zModuleTests.test_data_errorc                 C   r   )Nz3OperationalError is not a subclass of DatabaseError)r   r   r	   ÚOperationalErrorr    r
   r   r   r   Útest_operational_errorC   r   z"ModuleTests.test_operational_errorc                 C   r   )Nz1IntegrityError is not a subclass of DatabaseError)r   r   r	   ÚIntegrityErrorr    r
   r   r   r   Útest_integrity_errorG   r   z ModuleTests.test_integrity_errorc                 C   r   )Nz0InternalError is not a subclass of DatabaseError)r   r   r	   ÚInternalErrorr    r
   r   r   r   Útest_internal_errorK   r   zModuleTests.test_internal_errorc                 C   r   )Nz3ProgrammingError is not a subclass of DatabaseError)r   r   r	   ÚProgrammingErrorr    r
   r   r   r   Útest_programming_errorO   r   z"ModuleTests.test_programming_errorc                 C   r   )Nz4NotSupportedError is not a subclass of DatabaseError)r   r   r	   ÚNotSupportedErrorr    r
   r   r   r   Útest_not_supported_errorS   s
   
ÿþz$ModuleTests.test_not_supported_errorÚdarwinz#shared cache is deprecated on macOSc              	   C   sP   dD ]#}|   t¡}t |¡ W d   ƒ n1 sw   Y  |  d|j¡ qd S )N)TFzdbapi.py)ZassertWarnsÚDeprecationWarningr	   Zenable_shared_cacheZassertInÚfilename)r   ÚenableÚcmr   r   r   Útest_shared_cache_deprecatedZ   s   ÿýz(ModuleTests.test_shared_cache_deprecatedc                 C   s    t  d¡}t| t|dƒƒƒ d S )Nú:memory:zselect 1)r	   Úconnectr   Útype©r   Úcxr   r   r   Útest_disallow_instantiationa   s   
z'ModuleTests.test_disallow_instantiationN)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   r   r!   r#   r%   r'   r)   r+   r-   ÚunittestÚskipIfÚsysÚplatformr3   r9   r   r   r   r   r   !   s"    
r   c                   @   s|   e Z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d„ Zdd„ Zdd„ Zdd„ Zdd„ ZdS )ÚConnectionTestsc                 C   s0   t  d¡| _| j ¡ }| d¡ | dd¡ d S )Nr4   z4create table test(id integer primary key, name text)ú!insert into test(name) values (?)©Úfoo)r	   r5   r8   ÚcursorÚexecute©r   Úcur   r   r   ÚsetUph   s   

zConnectionTests.setUpc                 C   ó   | j  ¡  d S ©N©r8   Úcloser
   r   r   r   ÚtearDownn   ó   zConnectionTests.tearDownc                 C   rJ   rK   ©r8   Úcommitr
   r   r   r   Útest_commitq   rO   zConnectionTests.test_commitc                 C   ó   | j  ¡  | j  ¡  dS )zV
        A commit should also work when no changes were made to the database.
        NrP   r
   r   r   r   Útest_commit_after_no_changest   ó   
z,ConnectionTests.test_commit_after_no_changesc                 C   rJ   rK   ©r8   Úrollbackr
   r   r   r   Útest_rollback{   rO   zConnectionTests.test_rollbackc                 C   rS   )zX
        A rollback should also work when no changes were made to the database.
        NrV   r
   r   r   r   Útest_rollback_after_no_changes~   rU   z.ConnectionTests.test_rollback_after_no_changesc                 C   s   | j  ¡ }d S rK   ©r8   rE   rG   r   r   r   Útest_cursor…   rO   zConnectionTests.test_cursorc                 C   s@   d}|   tj¡ t |¡}W d   ƒ d S 1 sw   Y  d S )Nz/foo/bar/bla/23534/mydb.db)ÚassertRaisesr	   r$   r5   )r   ZYOU_CANNOT_OPEN_THISÚconr   r   r   Útest_failed_openˆ   s   "ÿz ConnectionTests.test_failed_openc                 C   rJ   rK   rL   r
   r   r   r   Ú
test_close   rO   zConnectionTests.test_closec                 C   s¸   |   | jjtj¡ |   | jjtj¡ |   | jjtj¡ |   | jjtj¡ |   | jjtj¡ |   | jjtj¡ |   | jj	tj	¡ |   | jj
tj
¡ |   | jjtj¡ |   | jjtj¡ d S rK   )r   r8   r   r	   r   r   r    r"   r$   r&   r(   r*   r,   r
   r   r   r   Útest_exceptions   s   zConnectionTests.test_exceptionsc                 C   s´   t  d¡}| ¡ }|  |jd¡ | d¡ |  |jd¡ | dd¡ |  |jd¡ | ddg¡ | ¡ }|  |jd¡ | ¡  |  |jd¡ | ddg¡ | ¡ }|  |jd¡ d S )	Nr4   Fz?create table transactiontest(id integer primary key, name text)z,insert into transactiontest(name) values (?)rC   Tz-select name from transactiontest where name=?rD   )r	   r5   rE   r   Úin_transactionrF   ÚfetchonerQ   )r   r8   rH   Úrowr   r   r   Útest_in_transaction   s   

z#ConnectionTests.test_in_transactionc                 C   s8   |   t¡ d| j_W d   ƒ d S 1 sw   Y  d S )NT)r\   ÚAttributeErrorr8   ra   r
   r   r   r   Útest_in_transaction_ro¯   s   
"ÿz&ConnectionTests.test_in_transaction_roc                 C   sZ   |   tt¡ G dd„ dƒ}|ƒ }t |¡}| d¡ W d  ƒ dS 1 s&w   Y  dS )z| Checks that we can successfully connect to a database using an object that
            is PathLike, i.e. has __fspath__(). c                   @   ó   e Zd Zdd„ ZdS )z=ConnectionTests.test_open_with_path_like_object.<locals>.Pathc                 S   s   t S rK   )r   r
   r   r   r   Ú
__fspath__¸   ó   zHConnectionTests.test_open_with_path_like_object.<locals>.Path.__fspath__N)r:   r;   r<   rh   r   r   r   r   ÚPath·   ó    rj   úcreate table test(id integer)N)Ú
addCleanupr   r   r	   r5   rF   )r   rj   Úpathr8   r   r   r   Útest_open_with_path_like_object³   s   "ÿz/ConnectionTests.test_open_with_path_like_objectc              	   C   sþ   |   tt¡ t t¡}| d¡ W d   ƒ n1 sw   Y  tjdt dd}| d¡ W d   ƒ n1 s9w   Y  tjdt d dd,}|  tj¡ | d¡ W d   ƒ n1 s`w   Y  W d   ƒ d S W d   ƒ d S 1 sxw   Y  d S )Nrl   zfile:T)Zurizinsert into test(id) values(0)z?mode=rozinsert into test(id) values(1))rm   r   r   r	   r5   rF   r\   r$   r7   r   r   r   Útest_open_uri¾   s   ÿÿÿÿ"ÿzConnectionTests.test_open_uriN)r:   r;   r<   rI   rN   rR   rT   rX   rY   r[   r^   r_   r`   rd   rf   ro   rp   r   r   r   r   rA   f   s    rA   c                   @   ó   e Zd Zdd„ Zdd„ ZdS )ÚUninitialisedConnectionTestsc                 C   s   t j t j¡| _d S rK   )r	   Ú
ConnectionÚ__new__r8   r
   r   r   r   rI   Ê   ó   z"UninitialisedConnectionTests.setUpc              	      sŠ   ‡ fdd„‡ fdd„‡ fdd„‡ fdd„‡ fdd„‡ fdd„f}|D ] }ˆ j |d ˆ  tjd	|¡ W d   ƒ n1 s=w   Y  q"d S )
Nc                      ó   ˆ j jS rK   )r8   Úisolation_levelr   r
   r   r   Ú<lambda>Ï   ó    zEUninitialisedConnectionTests.test_uninit_operations.<locals>.<lambda>c                      rv   rK   )r8   Útotal_changesr   r
   r   r   rx   Ð   ry   c                      rv   rK   )r8   ra   r   r
   r   r   rx   Ñ   ry   c                      ó
   ˆ j  ¡ S rK   )r8   Ziterdumpr   r
   r   r   rx   Ò   ó   
 c                      r{   rK   rZ   r   r
   r   r   rx   Ó   r|   c                      r{   rK   rL   r   r
   r   r   rx   Ô   r|   )Úfuncz#Base Connection.__init__ not called)ÚsubTestZassertRaisesRegexr	   r*   )r   Zfuncsr}   r   r
   r   Útest_uninit_operationsÍ   s    





úþÿ€ÿz3UninitialisedConnectionTests.test_uninit_operationsN)r:   r;   r<   rI   r   r   r   r   r   rr   É   s    rr   c                   @   s¾  e Z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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'd(„ Zd)d*„ Zd+d,„ Zd-d.„ Zd/d0„ Zd1d2„ Zd3d4„ Zd5d6„ Zd7d8„ Ze  e!j"d9k d:¡d;d<„ ƒZ#d=d>„ Z$d?d@„ Z%dAdB„ Z&dCdD„ Z'dEdF„ Z(dGdH„ Z)dIdJ„ Z*dKdL„ Z+dMdN„ Z,dOdP„ Z-dQdR„ Z.dSdT„ Z/dUdV„ Z0dWdX„ Z1dYdZ„ Z2d[d\„ Z3d]d^„ Z4d_d`„ Z5dadb„ Z6dcdd„ Z7dedf„ Z8dgdh„ Z9didj„ Z:dkS )lÚCursorTestsc                 C   s6   t  d¡| _| j ¡ | _| j d¡ | j dd¡ d S )Nr4   z\create table test(id integer primary key, name text, income number, unique_test text unique)rB   rC   ©r	   r5   r8   rE   rH   rF   r
   r   r   r   rI   Þ   s   ÿzCursorTests.setUpc                 C   ó   | j  ¡  | j ¡  d S rK   ©rH   rM   r8   r
   r   r   r   rN   ç   ó   
zCursorTests.tearDownc                 C   ó   | j  d¡ d S )Núdelete from test©rH   rF   r
   r   r   r   Útest_execute_no_argsë   ó   z CursorTests.test_execute_no_argsc                 C   ó>   |   tj¡ | j d¡ W d   ƒ d S 1 sw   Y  d S )Nzselect asdf)r\   r	   r$   rH   rF   r
   r   r   r   Útest_execute_illegal_sqlî   ó   "ÿz$CursorTests.test_execute_illegal_sqlc                 C   rŠ   )Nzselect 5+4; select 4+5)r\   r	   r   rH   rF   r
   r   r   r   Útest_execute_too_much_sqlò   rŒ   z%CursorTests.test_execute_too_much_sqlc                 C   r…   )Nzselect 5+4; -- foo barr‡   r
   r   r   r   Útest_execute_too_much_sql2ö   r‰   z&CursorTests.test_execute_too_much_sql2c                 C   r…   )NzT
            select 5+4;

            /*
            foo
            */
            r‡   r
   r   r   r   Útest_execute_too_much_sql3ù   r‰   z&CursorTests.test_execute_too_much_sql3c                 C   s<   |   t¡ | j d¡ W d   ƒ d S 1 sw   Y  d S ©Né*   )r\   Ú	TypeErrorrH   rF   r
   r   r   r   Útest_execute_wrong_sql_arg  s   "ÿz&CursorTests.test_execute_wrong_sql_argc                 C   ó   | j  dd¡ d S )Núinsert into test(id) values (?))r‘   r‡   r
   r   r   r   Útest_execute_arg_int  ó   z CursorTests.test_execute_arg_intc                 C   r”   )Nú#insert into test(income) values (?))gq=
×£ˆ£@r‡   r
   r   r   r   Útest_execute_arg_float	  r—   z"CursorTests.test_execute_arg_floatc                 C   r”   )NrB   )ZHugor‡   r
   r   r   r   Útest_execute_arg_string  r—   z#CursorTests.test_execute_arg_stringc                 C   s@   | j  dd¡ | j  d| j jf¡ | j  ¡ }|  |d d¡ d S )NrB   )úHu goz select name from test where id=?r   r›   )rH   rF   Ú	lastrowidrb   r   ©r   rc   r   r   r   Ú&test_execute_arg_string_with_zero_byte  s   
z2CursorTests.test_execute_arg_string_with_zero_bytec                 C   sN   |   t¡}| j dd¡ W d   ƒ n1 sw   Y  |  t|jƒd¡ d S )Nr•   r‘   z"parameters are of unsupported type)r\   Ú
ValueErrorrH   rF   r   ÚstrÚ	exception)r   r2   r   r   r   Útest_execute_non_iterable  s   ÿz%CursorTests.test_execute_non_iterablec                 C   s@   |   tj¡ | j dd¡ W d   ƒ d S 1 sw   Y  d S )Nr•   )é   ZEgon©r\   r	   r*   rH   rF   r
   r   r   r   Útest_execute_wrong_no_of_args1  s   "ÿz*CursorTests.test_execute_wrong_no_of_args1c                 C   rŠ   ©Nr•   r¤   r
   r   r   r   Útest_execute_wrong_no_of_args2   ó   "ÿz*CursorTests.test_execute_wrong_no_of_args2c                 C   rŠ   r¦   r¤   r
   r   r   r   Útest_execute_wrong_no_of_args3%  r¨   z*CursorTests.test_execute_wrong_no_of_args3c                 C   s:   | j  d¡ | j  ddg¡ | j  ¡ }|  |d d¡ d S )Nú%insert into test(name) values ('foo')ú"select name from test where name=?rD   r   ©rH   rF   rb   r   r   r   r   r   Útest_execute_param_list*  s   
z#CursorTests.test_execute_param_listc                 C   sH   G dd„ dƒ}| j  d¡ | j  d|ƒ ¡ | j  ¡ }|  |d d¡ d S )Nc                   @   rq   )z2CursorTests.test_execute_param_sequence.<locals>.Lc                 S   ó   dS )Nr   r   r
   r   r   r   Ú__len__2  ri   z:CursorTests.test_execute_param_sequence.<locals>.L.__len__c                 S   s   |dksJ ‚dS )Nr   rD   r   ©r   Úxr   r   r   Ú__getitem__4  s   z>CursorTests.test_execute_param_sequence.<locals>.L.__getitem__N©r:   r;   r<   r¯   r²   r   r   r   r   ÚL1  ó    r´   rª   r«   r   rD   r¬   )r   r´   rc   r   r   r   Útest_execute_param_sequence0  s
   
z'CursorTests.test_execute_param_sequencec                 C   sZ   G dd„ dƒ}| j  d¡ |  t¡ | j  d|ƒ ¡ W d   ƒ d S 1 s&w   Y  d S )Nc                   @   rq   )z:CursorTests.test_execute_param_sequence_bad_len.<locals>.Lc                 S   s   dd  d S )Nr   r   r   r
   r   r   r   r¯   @  ó   zBCursorTests.test_execute_param_sequence_bad_len.<locals>.L.__len__c                 S   s   t ‚rK   )ÚAssertionError)Zslfr±   r   r   r   r²   B  ri   zFCursorTests.test_execute_param_sequence_bad_len.<locals>.L.__getitem__Nr³   r   r   r   r   r´   ?  rµ   r´   rª   r«   )rH   rF   r\   ÚZeroDivisionError)r   r´   r   r   r   Ú#test_execute_param_sequence_bad_len=  s
   "ÿz/CursorTests.test_execute_param_sequence_bad_lenc                 C   s<   | j  d¡ | j  dddi¡ | j  ¡ }|  |d d¡ d S )Nrª   ú&select name from test where name=:nameÚnamerD   r   r¬   r   r   r   r   Útest_execute_dict_mappingI  s   
z%CursorTests.test_execute_dict_mappingc                 C   sJ   G dd„ dt ƒ}| j d¡ | j d|ƒ ¡ | j ¡ }|  |d d¡ d S )Nc                   @   rg   )z8CursorTests.test_execute_dict_mapping_mapping.<locals>.Dc                 S   r®   ©NrD   r   )r   Úkeyr   r   r   Ú__missing__Q  ri   zDCursorTests.test_execute_dict_mapping_mapping.<locals>.D.__missing__N)r:   r;   r<   rÀ   r   r   r   r   ÚDP  rk   rÁ   rª   r»   r   rD   )ÚdictrH   rF   rb   r   )r   rÁ   rc   r   r   r   Ú!test_execute_dict_mapping_mappingO  s
   
z-CursorTests.test_execute_dict_mapping_mappingc                 C   óP   | j  d¡ |  tj¡ | j  dddi¡ W d   ƒ d S 1 s!w   Y  d S )Nrª   z1select name from test where name=:name and id=:idr¼   rD   ©rH   rF   r\   r	   r*   r
   r   r   r   Ú)test_execute_dict_mapping_too_little_argsY  ó   "ÿz5CursorTests.test_execute_dict_mapping_too_little_argsc                 C   sJ   | j  d¡ |  tj¡ | j  d¡ W d   ƒ d S 1 sw   Y  d S )Nrª   r»   rÅ   r
   r   r   r   Ú!test_execute_dict_mapping_no_args^  s   "ÿz-CursorTests.test_execute_dict_mapping_no_argsc                 C   rÄ   )Nrª   r«   r¼   rD   rÅ   r
   r   r   r   Ú!test_execute_dict_mapping_unnamedc  rÇ   z-CursorTests.test_execute_dict_mapping_unnamedc                 C   rJ   rK   )rH   rM   r
   r   r   r   r_   h  rO   zCursorTests.test_closec                 C   sD   | j  d¡ | j  d¡ | j  d¡ | j  d¡ |  | j jd¡ d S )Nr†   rª   zupdate test set name='bar'é   ©rH   rF   r   Úrowcountr
   r   r   r   Útest_rowcount_executek  s
   z!CursorTests.test_rowcount_executec                 C   s    | j  d¡ |  | j jd¡ dS )zÁ
        pysqlite does not know the rowcount of SELECT statements, because we
        don't fetch all rows after executing the select statement. The rowcount
        has thus to be -1.
        zselect 5 union select 6éÿÿÿÿNrË   r
   r   r   r   Útest_rowcount_selectr  s   z CursorTests.test_rowcount_selectc                 C   s2   | j  d¡ | j  dg d¢¡ |  | j jd¡ d S )Nr†   rB   ))r   )rÊ   ©é   rÑ   )rH   rF   Úexecutemanyr   rÌ   r
   r   r   r   Útest_rowcount_executemany{  s   z%CursorTests.test_rowcount_executemany)rÑ   é#   r   zRequires SQLite 3.35.0 or newerc                 C   s6   | j  d¡ |  | j  ¡ d d¡ |  | j jd¡ d S )Nz7update test set name='bar' where name='foo' returning 1r   r   )rH   rF   r   rb   rÌ   r
   r   r   r   Útest_rowcount_update_returning€  s   z*CursorTests.test_rowcount_update_returningc                 C   s0   | j  d¡ | j  d¡ | jd| jjdd d S )Nrª   rÊ   z"total changes reported wrong value)Úmsg)rH   rF   Z
assertLessr8   rz   r
   r   r   r   Útest_total_changesˆ  s   zCursorTests.test_total_changesc                 C   s"   | j  ddd„ tddƒD ƒ¡ d S )Nr˜   c                 S   s   g | ]}|f‘qS r   r   )Ú.0r±   r   r   r   Ú
<listcomp>’  s    z:CursorTests.test_execute_many_sequence.<locals>.<listcomp>éd   én   )rH   rÒ   Úranger
   r   r   r   Útest_execute_many_sequence‘  s   "z&CursorTests.test_execute_many_sequencec                 C   s"   G dd„ dƒ}| j  d|ƒ ¡ d S )Nc                   @   ó$   e Zd Zdd„ Zdd„ Zdd„ ZdS )z6CursorTests.test_execute_many_iterator.<locals>.MyIterc                 S   s
   d| _ d S ©Né   )Úvaluer
   r   r   r   Ú__init__–  s   
z?CursorTests.test_execute_many_iterator.<locals>.MyIter.__init__c                 S   s   | S rK   r   r
   r   r   r   Ú__iter__™  ri   z?CursorTests.test_execute_many_iterator.<locals>.MyIter.__iter__c                 S   s$   | j dkrt‚|  j d7  _ | j fS )Né
   r   )rá   ÚStopIterationr
   r   r   r   Ú__next__œ  s   
z?CursorTests.test_execute_many_iterator.<locals>.MyIter.__next__N)r:   r;   r<   râ   rã   ræ   r   r   r   r   ÚMyIter•  s    rç   r˜   ©rH   rÒ   )r   rç   r   r   r   Útest_execute_many_iterator”  s   z&CursorTests.test_execute_many_iteratorc                 C   s   dd„ }| j  d|ƒ ¡ d S )Nc                  s   s    t dƒD ]} | fV  qd S rß   )rÜ   )Úir   r   r   Úmygen¦  s   €
ÿz6CursorTests.test_execute_many_generator.<locals>.mygenr˜   rè   )r   rë   r   r   r   Útest_execute_many_generator¥  s   z'CursorTests.test_execute_many_generatorc                 C   s@   |   t¡ | j ddg¡ W d   ƒ d S 1 sw   Y  d S )Nr‘   rÐ   ©r\   r’   rH   rÒ   r
   r   r   r   Útest_execute_many_wrong_sql_arg¬  s   "ÿz+CursorTests.test_execute_many_wrong_sql_argc                 C   sB   |   tj¡ | j ddg¡ W d   ƒ d S 1 sw   Y  d S )Nzselect ?rÐ   )r\   r	   r*   rH   rÒ   r
   r   r   r   Útest_execute_many_select°  s   "ÿz$CursorTests.test_execute_many_selectc                 C   s>   |   t¡ | j dd¡ W d   ƒ d S 1 sw   Y  d S )Nr˜   r‘   rí   r
   r   r   r   Útest_execute_many_not_iterable´  s   "ÿz*CursorTests.test_execute_many_not_iterablec                 C   sv   | j  d¡ | j  dd¡ | j  dd¡ | j  d¡ g }| j D ]	}| |d ¡ q|  |d d¡ |  |d d	¡ d S )
Nr†   r•   )rà   )é   zselect id from test order by idr   rà   r   rñ   )rH   rF   Úappendr   )r   Zlstrc   r   r   r   Útest_fetch_iter¸  s   
zCursorTests.test_fetch_iterc                 C   s@   | j  d¡ | j  ¡ }|  |d d¡ | j  ¡ }|  |d ¡ d S )Núselect name from testr   rD   r¬   r   r   r   r   Útest_fetchoneÄ  ó
   

zCursorTests.test_fetchonec                 C   s"   | j  ¡ }| ¡ }|  |d ¡ d S rK   )r8   rE   rb   r   )r   Úcurrc   r   r   r   Útest_fetchone_no_statementË  s   
z&CursorTests.test_fetchone_no_statementc                 C   sr   |   | jjd¡ d| j_| j d¡ | j d¡ | j d¡ | j d¡ | j d¡ | j ¡ }|   t|ƒd¡ d S )Nr   rÊ   r†   z#insert into test(name) values ('A')z#insert into test(name) values ('B')z#insert into test(name) values ('C')rô   )r   rH   Z	arraysizerF   Ú	fetchmanyÚlen©r   Úresr   r   r   Útest_array_sizeÐ  s   
zCursorTests.test_array_sizec                 C   sD   | j  d¡ | j  d¡}|  t|ƒd¡ | j  d¡}|  |g ¡ d S )Nrô   rÚ   r   ©rH   rF   rù   r   rú   rû   r   r   r   Útest_fetchmanyá  s
   zCursorTests.test_fetchmanyc                 C   s.   | j  d¡ | j jdd}|  t|ƒd¡ dS )z0Checks if fetchmany works with keyword argumentsrô   rÚ   )Úsizer   Nrþ   rû   r   r   r   Útest_fetchmany_kw_argè  s   z!CursorTests.test_fetchmany_kw_argc                 C   s@   | j  d¡ | j  ¡ }|  t|ƒd¡ | j  ¡ }|  |g ¡ d S )Nrô   r   )rH   rF   Úfetchallr   rú   rû   r   r   r   Útest_fetchallî  rö   zCursorTests.test_fetchallc                 C   s   | j  g d¢¡ d S )N)rÑ   é   rà   )rH   Zsetinputsizesr
   r   r   r   Útest_setinputsizesõ  ru   zCursorTests.test_setinputsizesc                 C   r”   )Nrà   r   ©rH   Zsetoutputsizer
   r   r   r   Útest_setoutputsizeø  r—   zCursorTests.test_setoutputsizec                 C   r…   r   r  r
   r   r   r   Útest_setoutputsize_no_columnû  r‰   z(CursorTests.test_setoutputsize_no_columnc                 C   s   |   | jj| j¡ d S rK   )r   rH   Ú
connectionr8   r
   r   r   r   Útest_cursor_connectionþ  s   z"CursorTests.test_cursor_connectionc                 C   sD   |   t¡ dd„ }| j |¡}W d   ƒ d S 1 sw   Y  d S )Nc                   S   ó   d S rK   r   r   r   r   r   Úf  ó    z1CursorTests.test_wrong_cursor_callable.<locals>.f)r\   r’   r8   rE   )r   r  r÷   r   r   r   Útest_wrong_cursor_callable  s   "þz&CursorTests.test_wrong_cursor_callablec                 C   sN   G dd„ dƒ}|ƒ }|   t¡ t |¡}W d   ƒ d S 1 s w   Y  d S )Nc                   @   s   e Zd ZdS )z0CursorTests.test_cursor_wrong_class.<locals>.FooN)r:   r;   r<   r   r   r   r   ÚFoo  s    r  )r\   r’   r	   ZCursor)r   r  rD   r÷   r   r   r   Útest_cursor_wrong_class  s
   "ÿz#CursorTests.test_cursor_wrong_classc              	   C   sb   d}dD ]*}| j |d | j | |¡d¡ |  | jjd¡ W d  ƒ n1 s)w   Y  qdS )zV
        INSERT OR REPLACE and REPLACE INTO should produce the same behavior.
        z+{} INTO test(id, unique_test) VALUES (?, ?))zINSERT OR REPLACEZREPLACE©Ú	statement)r   rD   r   N)r~   rH   rF   Úformatr   rœ   )r   Úsqlr  r   r   r   Útest_last_row_id_on_replace  s   þ€ÿz'CursorTests.test_last_row_id_on_replacec                 C   s@   | j  dd¡ |  | j jd¡ | j  dd¡ |  | j jd¡ d S )Nz2insert or ignore into test(unique_test) values (?))ÚtestrÊ   )rH   rF   r   rœ   r
   r   r   r   Útest_last_row_id_on_ignore  s   þþz&CursorTests.test_last_row_id_on_ignorec              
   C   sØ   g }dD ][}d}| j d |¡dF | j | |¡|f¡ | || jjf¡ |  tj¡ | j | |¡|f¡ W d   ƒ n1 sBw   Y  | || jjf¡ W d   ƒ n1 sZw   Y  qg d¢}|  	||¡ d S )N)ÚFAILÚABORTÚROLLBACKz.INSERT OR {} INTO test(unique_test) VALUES (?)zINSERT OR {}r  )©r  rÊ   r  ©r  rÑ   r  ©r  r  r  )
r~   r  rH   rF   rò   rœ   r\   r	   r&   r   )r   Úresultsr  r  Zexpectedr   r   r   Útest_last_row_id_insert_o_r!  s   ÿû€z'CursorTests.test_last_row_id_insert_o_rN);r:   r;   r<   rI   rN   rˆ   r‹   r   rŽ   r   r“   r–   r™   rš   rž   r¢   r¥   r§   r©   r­   r¶   rº   r½   rÃ   rÆ   rÈ   rÉ   r_   rÍ   rÏ   rÓ   r=   r>   r	   Zsqlite_version_inforÕ   r×   rÝ   ré   rì   rî   rï   rð   ró   rõ   rø   rý   rÿ   r  r  r  r  r  r
  r  r  r  r  r  r   r   r   r   r€   Ý   sp    		
	ÿ
	

r€   c                   @   s\   e Z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d„ ZdS )ÚThreadTestsc                 C   ó(   t  d¡| _| j ¡ | _| j d¡ d S )Nr4   z\create table test(id integer primary key, name text, bin binary, ratio number, ts timestamp))r	   r5   r]   rE   r÷   rF   r
   r   r   r   rI   4  ó   zThreadTests.setUpc                 C   r‚   rK   )r÷   rM   r]   r
   r   r   r   rN   9  r„   zThreadTests.tearDownc                 C   óV   dd„ }g }t j|| j|dœd}| ¡  | ¡  t|ƒdkr)|  d |¡¡ d S d S )Nc                 S   óD   z|   ¡ }| d¡ W d S  tjy   Y d S    | d¡ Y d S ©Núdid not raise ProgrammingErrorúraised wrong exception)rE   rò   r	   r*   )r]   Úerrorsr÷   r   r   r   Úrun>  ó   
z(ThreadTests.test_con_cursor.<locals>.run©r]   r(  ©ÚtargetÚkwargsr   Ú
©Ú	threadingÚThreadr]   ÚstartÚjoinrú   Úfail©r   r)  r(  Útr   r   r   Útest_con_cursor=  ó   
ÿzThreadTests.test_con_cursorc                 C   r#  )Nc                 S   óD   z|   ¡  | d¡ W d S  tjy   Y d S    | d¡ Y d S r%  )rQ   rò   r	   r*   r+  r   r   r   r)  P  r*  z(ThreadTests.test_con_commit.<locals>.runr+  r,  r   r/  r0  r6  r   r   r   Útest_con_commitO  r9  zThreadTests.test_con_commitc                 C   r#  )Nc                 S   r:  r%  )rW   rò   r	   r*   r+  r   r   r   r)  b  r*  z*ThreadTests.test_con_rollback.<locals>.runr+  r,  r   r/  r0  r6  r   r   r   Útest_con_rollbacka  r9  zThreadTests.test_con_rollbackc                 C   r#  )Nc                 S   r:  r%  ©rM   rò   r	   r*   r+  r   r   r   r)  t  r*  z'ThreadTests.test_con_close.<locals>.runr+  r,  r   r/  r0  r6  r   r   r   Útest_con_closes  r9  zThreadTests.test_con_closec                 C   r#  )Nc                 S   óF   z|   d¡ | d¡ W d S  tjy   Y d S    | d¡ Y d S )Nú#insert into test(name) values ('a')r&  r'  ©rF   rò   r	   r*   ©r÷   r(  r   r   r   r)  †  ó   

z0ThreadTests.test_cur_implicit_begin.<locals>.runrB  r,  r   r/  ©r1  r2  r÷   r3  r4  rú   r5  r6  r   r   r   Útest_cur_implicit_begin…  r9  z#ThreadTests.test_cur_implicit_beginc                 C   r#  )Nc                 S   r:  r%  r=  rB  r   r   r   r)  ˜  r*  z'ThreadTests.test_cur_close.<locals>.runrB  r,  r   r/  rD  r6  r   r   r   Útest_cur_close—  r9  zThreadTests.test_cur_closec                 C   sb   dd„ }g }| j  d¡ tj|| j |dœd}| ¡  | ¡  t|ƒdkr/|  d |¡¡ d S d S )Nc                 S   r?  )Nrô   r&  r'  rA  rB  r   r   r   r)  ª  rC  z)ThreadTests.test_cur_execute.<locals>.runr@  rB  r,  r   r/  ©r÷   rF   r1  r2  r3  r4  rú   r5  r6  r   r   r   Útest_cur_execute©  s   
ÿzThreadTests.test_cur_executec                 C   sn   dd„ }g }| j  d¡ | j  d¡ tj|| j |dœd}| ¡  | ¡  t|ƒdkr5|  d |¡¡ d S d S )	Nc                 S   r$  r%  )rb   rò   r	   r*   )r÷   r(  rc   r   r   r   r)  ½  r*  z+ThreadTests.test_cur_iter_next.<locals>.runr@  rô   rB  r,  r   r/  rG  r6  r   r   r   Útest_cur_iter_next¼  s   
ÿzThreadTests.test_cur_iter_nextN)r:   r;   r<   rI   rN   r8  r;  r<  r>  rE  rF  rH  rI  r   r   r   r   r   3  s    r   c                   @   óD   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dS )ÚConstructorTestsc                 C   ó   t  ddd¡}d S )NéÔ  rä   é   )r	   ZDate©r   Údr   r   r   Ú	test_dateÑ  r—   zConstructorTests.test_datec                 C   rL  )Né   é'   rÔ   )r	   ZTime©r   r7  r   r   r   Ú	test_timeÔ  r—   zConstructorTests.test_timec                 C   s   t  dddddd¡}d S )NrM  rä   rN  rR  rS  rÔ   )r	   Z	Timestamp©r   Útsr   r   r   Útest_timestamp×  s   zConstructorTests.test_timestampc                 C   ó   t  d¡}d S r   )r	   ZDateFromTicksrO  r   r   r   Útest_date_from_ticksÚ  rO   z%ConstructorTests.test_date_from_ticksc                 C   rY  r   )r	   ZTimeFromTicksrT  r   r   r   Útest_time_from_ticksÝ  rO   z%ConstructorTests.test_time_from_ticksc                 C   rY  r   )r	   ZTimestampFromTicksrV  r   r   r   Útest_timestamp_from_ticksà  rO   z*ConstructorTests.test_timestamp_from_ticksc                 C   rY  )Ns    ')r	   ZBinary)r   Úbr   r   r   Útest_binaryã  rO   zConstructorTests.test_binaryN)
r:   r;   r<   rQ  rU  rX  rZ  r[  r\  r^  r   r   r   r   rK  Ð  s    rK  c                   @   rJ  )ÚExtensionTestsc                 C   sB   t  d¡}| ¡ }| d¡ | d¡ | ¡ d }|  |d¡ d S )Nr4   z
            -- bla bla
            /* a stupid comment */
            create table a(i);
            insert into a(i) values (5);
            zselect i from ar   rà   )r	   r5   rE   ÚexecutescriptrF   rb   r   )r   r]   r÷   rü   r   r   r   Útest_script_string_sqlç  s   


z%ExtensionTests.test_script_string_sqlc                 C   óN   t  d¡}| ¡ }|  t j¡ | d¡ W d   ƒ d S 1 s w   Y  d S )Nr4   z1create table test(x); asdf; create table test2(x)©r	   r5   rE   r\   r$   r`  ©r   r]   r÷   r   r   r   Útest_script_syntax_errorô  ó
   
"ÿz'ExtensionTests.test_script_syntax_errorc                 C   rb  )Nr4   z5create table test(sadfsadfdsa); select foo from hurz;rc  rd  r   r   r   Útest_script_error_normalú  rf  z'ExtensionTests.test_script_error_normalc                 C   s\   t  d¡}| ¡ }|  t¡}| d¡ W d   ƒ n1 sw   Y  |  t|jƒd¡ d S )Nr4   s9   create table test(foo); insert into test(foo) values (5);z script argument must be unicode.)	r	   r5   rE   r\   rŸ   r`  r   r    r¡   )r   r]   r÷   r2   r   r   r   Ú"test_cursor_executescript_as_bytes   s   
ÿz1ExtensionTests.test_cursor_executescript_as_bytesc                 C   s.   t  d¡}| d¡ ¡ d }|  |dd¡ d S )Nr4   zselect 5r   rà   z Basic test of Connection.execute)r	   r5   rF   rb   r   ©r   r]   Úresultr   r   r   Útest_connection_execute  s   
z&ExtensionTests.test_connection_executec                 C   sb   t  d¡}| d¡ | dddg¡ | d¡ ¡ }|  |d d dd	¡ |  |d
 d dd	¡ d S )Nr4   zcreate table test(foo)z insert into test(foo) values (?)rÐ   ©r  z!select foo from test order by foor   rÑ   z$Basic test of Connection.executemanyr   r  )r	   r5   rF   rÒ   r  r   ri  r   r   r   Útest_connection_executemany  s   

z*ExtensionTests.test_connection_executemanyc                 C   s8   t  d¡}| d¡ | d¡ ¡ d }|  |dd¡ d S )Nr4   z9create table test(foo); insert into test(foo) values (5);zselect foo from testr   rà   z&Basic test of Connection.executescript)r	   r5   r`  rF   rb   r   ri  r   r   r   Útest_connection_executescript  s   

z,ExtensionTests.test_connection_executescriptN)
r:   r;   r<   ra  re  rg  rh  rk  rm  rn  r   r   r   r   r_  æ  s    r_  c                   @   sT   e Z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S )ÚClosedConTestsc                 C   sL   t  d¡}| ¡  |  t j¡ | ¡ }W d   ƒ d S 1 sw   Y  d S ©Nr4   )r	   r5   rM   r\   r*   rE   rd  r   r   r   Útest_closed_con_cursor  ó
   

"ÿz%ClosedConTests.test_closed_con_cursorc                 C   óL   t  d¡}| ¡  |  t j¡ | ¡  W d   ƒ d S 1 sw   Y  d S rp  )r	   r5   rM   r\   r*   rQ   ©r   r]   r   r   r   Útest_closed_con_commit!  rr  z%ClosedConTests.test_closed_con_commitc                 C   rs  rp  )r	   r5   rM   r\   r*   rW   rt  r   r   r   Útest_closed_con_rollback'  rr  z'ClosedConTests.test_closed_con_rollbackc                 C   sV   t  d¡}| ¡ }| ¡  |  t j¡ | d¡ W d   ƒ d S 1 s$w   Y  d S )Nr4   zselect 4)r	   r5   rE   rM   r\   r*   rF   rd  r   r   r   Útest_closed_cur_execute-  s   
"ÿz&ClosedConTests.test_closed_cur_executec                 C   sZ   t  d¡}| ¡  dd„ }|  t j¡ | dd|¡ W d   ƒ d S 1 s&w   Y  d S )Nr4   c                 S   r®   ©Nr£   r   )r±   r   r   r   r  7  r  z5ClosedConTests.test_closed_create_function.<locals>.frD   r   )r	   r5   rM   r\   r*   Zcreate_function)r   r]   r  r   r   r   Útest_closed_create_function4  s   
"ÿz*ClosedConTests.test_closed_create_functionc                 C   s`   t  d¡}| ¡  G dd„ dƒ}|  t j¡ | dd|¡ W d   ƒ d S 1 s)w   Y  d S )Nr4   c                   @   rÞ   )z8ClosedConTests.test_closed_create_aggregate.<locals>.Aggc                 S   r  rK   r   r
   r   r   r   râ   ?  ri   zAClosedConTests.test_closed_create_aggregate.<locals>.Agg.__init__c                 S   r  rK   r   r°   r   r   r   ÚstepA  ri   z=ClosedConTests.test_closed_create_aggregate.<locals>.Agg.stepc                 S   r®   rx  r   r
   r   r   r   ÚfinalizeC  ri   zAClosedConTests.test_closed_create_aggregate.<locals>.Agg.finalizeN)r:   r;   r<   râ   rz  r{  r   r   r   r   ÚAgg>  s    r|  rD   r   )r	   r5   rM   r\   r*   Zcreate_aggregate)r   r]   r|  r   r   r   Útest_closed_create_aggregate;  s   
"ÿz+ClosedConTests.test_closed_create_aggregatec                 C   sV   t  d¡}| ¡  dd„ }|  t j¡ | |¡ W d   ƒ d S 1 s$w   Y  d S )Nr4   c                  W   s   t jS rK   )r	   ZDENY)Úargsr   r   r   Ú
authorizerK  s   z=ClosedConTests.test_closed_set_authorizer.<locals>.authorizer)r	   r5   rM   r\   r*   Zset_authorizer)r   r]   r  r   r   r   Útest_closed_set_authorizerH  s   
"ÿz)ClosedConTests.test_closed_set_authorizerc                 C   sX   t  d¡}| ¡  dd„ }|  t j¡ | |d¡ W d   ƒ d S 1 s%w   Y  d S )Nr4   c                   S   r  rK   r   r   r   r   r   ÚprogressS  r  zBClosedConTests.test_closed_set_progress_callback.<locals>.progressrÚ   )r	   r5   rM   r\   r*   Zset_progress_handler)r   r]   r  r   r   r   Ú!test_closed_set_progress_callbackP  s   
"ÿz0ClosedConTests.test_closed_set_progress_callbackc                 C   sJ   t  d¡}| ¡  |  t j¡ |ƒ  W d   ƒ d S 1 sw   Y  d S rp  )r	   r5   rM   r\   r*   rt  r   r   r   Útest_closed_callW  s
   
"ÿzClosedConTests.test_closed_callN)r:   r;   r<   rq  ru  rv  rw  ry  r}  r€  r‚  rƒ  r   r   r   r   ro    s    ro  c                   @   rg   )ÚClosedCurTestsc              	   C   sŽ   t  d¡}| ¡ }| ¡  dD ]5}|dv rd}n|dkr#dddgf}ng }|  t j¡ t||ƒ}||Ž  W d   ƒ n1 s?w   Y  qd S )	Nr4   )rF   rÒ   r`  r  rù   rb   )rF   r`  )zselect 4 union select 5rÒ   zinsert into foo(bar) values (?)rÐ   rl  )r	   r5   rE   rM   r\   r*   Úgetattr)r   r]   r÷   Zmethod_nameÚparamsÚmethodr   r   r   Útest_closed^  s   


þ€øzClosedCurTests.test_closedN)r:   r;   r<   rˆ  r   r   r   r   r„  ]  rk   r„  c                   @   sX   e Zd Z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S )ÚSqliteOnConflictTestszz
    Tests for SQLite's "insert on conflict" feature.

    See https://www.sqlite.org/lang_conflict.html for details.
    c                 C   r!  )Nr4   zz
          CREATE TABLE test(
            id INTEGER PRIMARY KEY, name TEXT, unique_name TEXT UNIQUE
          );
        r   r
   r   r   r   rI   w  r"  zSqliteOnConflictTests.setUpc                 C   r‚   rK   rƒ   r
   r   r   r   rN   €  r„   zSqliteOnConflictTests.tearDownc                 C   sœ   d | j _| j  ¡ | _| j d¡ | j d¡ | j d¡ |  tj¡ | j d¡ W d   ƒ n1 s3w   Y  | j  ¡  | j d¡ |  	| j 
¡ g ¡ d S )NÚBEGINú,INSERT INTO test(name) VALUES ('abort_test')ú8INSERT OR ROLLBACK INTO test(unique_name) VALUES ('foo')z"SELECT name, unique_name from test©r8   rw   rE   rH   rF   r\   r	   r&   rQ   r   r  r
   r   r   r   Ú3test_on_conflict_rollback_with_explicit_transaction„  s   ÿ
zISqliteOnConflictTests.test_on_conflict_rollback_with_explicit_transactionc                 C   s    d | j _| j  ¡ | _| j d¡ | j d¡ | j d¡ |  tj¡ | j d¡ W d   ƒ n1 s3w   Y  | j  ¡  | j d¡ |  	| j 
¡ ddg¡ d S )NrŠ  r‹  ú5INSERT OR ABORT INTO test(unique_name) VALUES ('foo')ú"SELECT name, unique_name FROM test©Z
abort_testNr¾   r  r
   r   r   r   Ú8test_on_conflict_abort_raises_with_explicit_transactions“  s   ÿ
zNSqliteOnConflictTests.test_on_conflict_abort_raises_with_explicit_transactionsc                 C   sr   | j  d¡ | j  d¡ |  tj¡ | j  d¡ W d   ƒ n1 s#w   Y  | j  d¡ |  | j  ¡ g ¡ d S )Nr‹  rŒ  r  ©rH   rF   r\   r	   r&   r   r  r
   r   r   r   Ú-test_on_conflict_rollback_without_transaction£  s   ÿzCSqliteOnConflictTests.test_on_conflict_rollback_without_transactionc                 C   sv   | j  d¡ | j  d¡ |  tj¡ | j  d¡ W d   ƒ n1 s#w   Y  | j  d¡ |  | j  ¡ ddg¡ d S )Nr‹  r  r  r‘  r¾   r“  r
   r   r   r   Ú2test_on_conflict_abort_raises_without_transactions­  s   ÿzHSqliteOnConflictTests.test_on_conflict_abort_raises_without_transactionsc                 C   sZ   | j  d¡ |  tj¡ | j  d¡ W d   ƒ n1 sw   Y  |  | j  ¡ g ¡ d S )Nz4INSERT OR FAIL INTO test(unique_name) VALUES ('foo')r“  r
   r   r   r   Útest_on_conflict_fail¸  s
   ÿz+SqliteOnConflictTests.test_on_conflict_failc                 C   s<   | j  d¡ | j  d¡ | j  d¡ |  | j  ¡ dg¡ d S )Nz6INSERT OR IGNORE INTO test(unique_name) VALUES ('foo')zSELECT unique_name FROM testrC   ©rH   rF   r   r  r
   r   r   r   Útest_on_conflict_ignore¾  ó   z-SqliteOnConflictTests.test_on_conflict_ignorec                 C   s<   | j  d¡ | j  d¡ | j  d¡ |  | j  ¡ dg¡ d S )NzFINSERT OR REPLACE INTO test(name, unique_name) VALUES ('Data!', 'foo')zUINSERT OR REPLACE INTO test(name, unique_name) VALUES ('Very different data!', 'foo')r  )zVery different data!rD   r—  r
   r   r   r   Útest_on_conflict_replaceÅ  r™  z.SqliteOnConflictTests.test_on_conflict_replaceN)r:   r;   r<   Ú__doc__rI   rN   rŽ  r’  r”  r•  r–  r˜  rš  r   r   r   r   r‰  p  s    	
r‰  c                   @   s$   e Zd Zed Zdd„ Zdd„ ZdS )ÚMultiprocessTestsg     @@c                 C   s   t tƒ d S rK   )r   r   r
   r   r   r   rN   Ð  r·   zMultiprocessTests.tearDownc              
   C   sH  dt › d| j› d}tjtjd|gddtjtjd}|  |j¡ |  	d|j
 ¡  ¡ ¡ tjt | jd	}zAz| | d
¡ W d   ƒ n1 sGw   Y  W n tjyh } z|j t|ƒ¡ W Y d }~nd }~ww |j d¡ W | ¡  n| ¡  w |  |j¡ z	|jdtd W n tjyš   | ¡  | ¡  ‚ w |  	|jd¡ d S )Nz´if 1:
            import sqlite3
            def wait():
                print("started")
                assert "database is locked" in input()

            cx = sqlite3.connect("z", timeout=aÊ  )
            cx.create_function("wait", 0, wait)
            with cx:
                cx.execute("create table t(t)")
            try:
                # execute two transactions; both will try to lock the db
                cx.executescript('''
                    -- start a transaction and wait for parent
                    begin transaction;
                    select * from t;
                    select wait();
                    rollback;

                    -- start a new transaction; would fail if parent holds lock
                    begin transaction;
                    select * from t;
                    rollback;
                ''')
            finally:
                cx.close()
        z-czutf-8r   )ÚencodingÚbufsizeÚstdinÚstdoutÚstarted)Útimeoutzinsert into t values('test')zno errorÚend)Úinputr¢  )r   ÚCONNECTION_TIMEOUTÚ
subprocessÚPopenr?   Ú
executableÚPIPErm   Úcommunicater   r   ÚreadlineÚstripr	   r5   rF   r$   rŸ  Úwriter    rM   ZassertIsNoneÚ
returncoder   ÚTimeoutExpiredÚkill)r   ZSCRIPTÚprocr8   Úexcr   r   r   Ú&test_ctx_mgr_rollback_if_commit_failedÓ  sH   úú
ûÿ€€ÿ€ýz8MultiprocessTests.test_ctx_mgr_rollback_if_commit_failedN)r:   r;   r<   r   r¥  rN   r³  r   r   r   r   rœ  Í  s    rœ  c                  C   s.   t ttttttttt	t
g} t dd„ | D ƒ¡S )Nc                 S   s   g | ]	}t  ¡  |¡‘qS r   )r=   Z
TestLoaderZloadTestsFromTestCase)rØ   r7  r   r   r   rÙ   #  s    zsuite.<locals>.<listcomp>)ro  r„  rA   rK  r€   r_  r   rœ  r‰  r   rr   r=   Z	TestSuite)Ztestsr   r   r   Úsuite  s   õÿr´  c                  C   s   t  ¡ } |  tƒ ¡ d S rK   )r=   ZTextTestRunnerr)  r´  )Zrunnerr   r   r   r  &  s   r  Ú__main__)r¦  r1  r=   Zsqlite3r	   r?   Ztest.supportr   r   Ztest.support.os_helperr   r   ZTestCaser   rA   rr   r€   r   rK  r_  ro  r„  r‰  rœ  r´  r  r:   r   r   r   r   Ú<module>   s4   Ec  X 4C]G
ÿ