a
    åzeþ˜  ã                   @   s&  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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 )é    N)ÚSHORT_TIMEOUTÚTESTFNÚunlinkc                   @   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d„ Zdd„ Zdd„ Zdd„ ZdS )ÚModuleTestsc                 C   s   |   tjddtj ¡ d S )Nz2.0zapilevel is %s, should be 2.0)ÚassertEqualÚsqliteZapilevel©Úself© r
   ú(/usr/lib/python3.9/sqlite3/test/dbapi.pyÚCheckAPILevel"   s    
ÿzModuleTests.CheckAPILevelc                 C   s   |   tjddtj ¡ d S )Né   zthreadsafety is %d, should be 1)r   r   Zthreadsafetyr   r
   r
   r   ÚCheckThreadSafety&   s    
ÿzModuleTests.CheckThreadSafetyc                 C   s   |   tjddtj ¡ d S )NZqmarkz%paramstyle is '%s', should be 'qmark')r   r   Z
paramstyler   r
   r
   r   ÚCheckParamStyle*   s
    
ÿÿzModuleTests.CheckParamStylec                 C   s   |   ttjtƒd¡ d S )Nz&Warning is not a subclass of Exception)Ú
assertTrueÚ
issubclassr   ÚWarningÚ	Exceptionr   r
   r
   r   ÚCheckWarning/   s    ÿzModuleTests.CheckWarningc                 C   s   |   ttjtƒd¡ d S )Nz$Error is not a subclass of Exception)r   r   r   ÚErrorr   r   r
   r
   r   Ú
CheckError3   s    ÿzModuleTests.CheckErrorc                 C   s   |   ttjtjƒd¡ d S )Nz)InterfaceError is not a subclass of Error)r   r   r   ÚInterfaceErrorr   r   r
   r
   r   ÚCheckInterfaceError7   s    ÿzModuleTests.CheckInterfaceErrorc                 C   s   |   ttjtjƒd¡ d S )Nz(DatabaseError is not a subclass of Error)r   r   r   ÚDatabaseErrorr   r   r
   r
   r   ÚCheckDatabaseError;   s    ÿzModuleTests.CheckDatabaseErrorc                 C   s   |   ttjtjƒd¡ d S )Nz,DataError is not a subclass of DatabaseError)r   r   r   Ú	DataErrorr   r   r
   r
   r   ÚCheckDataError?   s    ÿzModuleTests.CheckDataErrorc                 C   s   |   ttjtjƒd¡ d S )Nz3OperationalError is not a subclass of DatabaseError)r   r   r   ÚOperationalErrorr   r   r
   r
   r   ÚCheckOperationalErrorC   s    ÿz!ModuleTests.CheckOperationalErrorc                 C   s   |   ttjtjƒd¡ d S )Nz1IntegrityError is not a subclass of DatabaseError)r   r   r   ÚIntegrityErrorr   r   r
   r
   r   ÚCheckIntegrityErrorG   s    ÿzModuleTests.CheckIntegrityErrorc                 C   s   |   ttjtjƒd¡ d S )Nz0InternalError is not a subclass of DatabaseError)r   r   r   ÚInternalErrorr   r   r
   r
   r   ÚCheckInternalErrorK   s    ÿzModuleTests.CheckInternalErrorc                 C   s   |   ttjtjƒd¡ d S )Nz3ProgrammingError is not a subclass of DatabaseError)r   r   r   ÚProgrammingErrorr   r   r
   r
   r   ÚCheckProgrammingErrorO   s    ÿz!ModuleTests.CheckProgrammingErrorc                 C   s   |   ttjtjƒd¡ d S )Nz4NotSupportedError is not a subclass of DatabaseError)r   r   r   ÚNotSupportedErrorr   r   r
   r
   r   ÚCheckNotSupportedErrorS   s
    
ÿþz"ModuleTests.CheckNotSupportedErrorN)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   r   r   r   r   r    r"   r$   r&   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e ejdkd¡dd „ ƒZd!S )"ÚConnectionTestsc                 C   s0   t  d¡| _| j ¡ }| d¡ | dd¡ d S )Nú:memory:z4create table test(id integer primary key, name text)ú!insert into test(name) values (?)©Úfoo)r   ÚconnectÚcxÚcursorÚexecute©r	   Úcur
   r
   r   ÚsetUpZ   s    

zConnectionTests.setUpc                 C   s   | j  ¡  d S ©N©r0   Úcloser   r
   r
   r   ÚtearDown`   s    zConnectionTests.tearDownc                 C   s   | j  ¡  d S r6   ©r0   Úcommitr   r
   r
   r   ÚCheckCommitc   s    zConnectionTests.CheckCommitc                 C   s   | j  ¡  | j  ¡  d S r6   r:   r   r
   r
   r   ÚCheckCommitAfterNoChangesf   s    
z)ConnectionTests.CheckCommitAfterNoChangesc                 C   s   | j  ¡  d S r6   ©r0   Úrollbackr   r
   r
   r   ÚCheckRollbackm   s    zConnectionTests.CheckRollbackc                 C   s   | j  ¡  | j  ¡  d S r6   r>   r   r
   r
   r   ÚCheckRollbackAfterNoChangesp   s    
z+ConnectionTests.CheckRollbackAfterNoChangesc                 C   s   | j  ¡ }d S r6   ©r0   r1   r3   r
   r
   r   ÚCheckCursorw   s    zConnectionTests.CheckCursorc                 C   s>   d}|   tj¡ t |¡}W d   ƒ n1 s00    Y  d S )Nz/foo/bar/bla/23534/mydb.db)ÚassertRaisesr   r   r/   )r	   ZYOU_CANNOT_OPEN_THISÚconr
   r
   r   ÚCheckFailedOpenz   s    zConnectionTests.CheckFailedOpenc                 C   s   | j  ¡  d S r6   r7   r   r
   r
   r   Ú
CheckClose   s    zConnectionTests.CheckClosec                 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 r6   )r   r0   r   r   r   r   r   r   r   r   r!   r#   r%   r   r
   r
   r   ÚCheckExceptions‚   s    zConnectionTests.CheckExceptionsc                 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 )	Nr+   Fz?create table transactiontest(id integer primary key, name text)z,insert into transactiontest(name) values (?)r-   Tz-select name from transactiontest where name=?r.   )r   r/   r1   r   Úin_transactionr2   Úfetchoner;   )r	   r0   r4   Úrowr
   r
   r   ÚCheckInTransaction   s    

z"ConnectionTests.CheckInTransactionc                 C   s6   |   t¡ d| j_W d   ƒ n1 s(0    Y  d S )NT)rD   ÚAttributeErrorr0   rI   r   r
   r
   r   ÚCheckInTransactionRO¡   s    z$ConnectionTests.CheckInTransactionROc                 C   sX   |   tt¡ G dd„ dƒ}|ƒ }t |¡}| d¡ W d   ƒ n1 sJ0    Y  d S )Nc                   @   s   e Zd Zdd„ ZdS )z9ConnectionTests.CheckOpenWithPathLikeObject.<locals>.Pathc                 S   s   t S r6   )r   r   r
   r
   r   Ú
__fspath__ª   s    zDConnectionTests.CheckOpenWithPathLikeObject.<locals>.Path.__fspath__N)r'   r(   r)   rO   r
   r
   r
   r   ÚPath©   s   rP   úcreate table test(id integer))Ú
addCleanupr   r   r   r/   r2   )r	   rP   Úpathr0   r
   r
   r   ÚCheckOpenWithPathLikeObject¥   s
    z+ConnectionTests.CheckOpenWithPathLikeObjectc              	   C   s8  t jdk rH|  t j¡ t jddd W d   ƒ n1 s:0    Y  d S |  tt¡ t  t¡}| d¡ W d   ƒ n1 s~0    Y  t jdt dd}| d¡ W d   ƒ n1 sº0    Y  t jdt d ddH}|  t j	¡ | d	¡ W d   ƒ n1 s
0    Y  W d   ƒ n1 s*0    Y  d S )
N)é   é   rV   r+   T)ZurirQ   zfile:zinsert into test(id) values(0)z?mode=rozinsert into test(id) values(1))
r   Úsqlite_version_inforD   r%   r/   rR   r   r   r2   r   )r	   r0   r
   r
   r   ÚCheckOpenUri°   s    
,((zConnectionTests.CheckOpenUri)rU   rU   r   z&needs sqlite versions older than 3.3.1c                 C   sP   |   tj¡}tjddd W d   ƒ n1 s00    Y  |  t|jƒd¡ d S )Nr+   F)Zcheck_same_threadz shared connections not available)rD   r   r%   r/   r   ÚstrÚ	exception©r	   Úcmr
   r
   r   Ú CheckSameThreadErrorOnOldVersion¾   s    ,z0ConnectionTests.CheckSameThreadErrorOnOldVersionN)r'   r(   r)   r5   r9   r<   r=   r@   rA   rC   rF   rG   rH   rL   rN   rT   rX   ÚunittestZskipIfr   rW   r]   r
   r
   r
   r   r*   X   s$   ÿr*   c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚUninitialisedConnectionTestsc                 C   s   t j t j¡| _d S r6   )r   Ú
ConnectionÚ__new__r0   r   r
   r
   r   r5   Ç   s    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   ƒ qD1 sz0    Y  qDd S )
Nc                      s   ˆ j jS r6   )r0   Úisolation_levelr
   r   r
   r   Ú<lambda>Ì   ó    zEUninitialisedConnectionTests.test_uninit_operations.<locals>.<lambda>c                      s   ˆ j jS r6   )r0   Útotal_changesr
   r   r
   r   rc   Í   rd   c                      s   ˆ j jS r6   )r0   rI   r
   r   r
   r   rc   Î   rd   c                      s
   ˆ j  ¡ S r6   )r0   Ziterdumpr
   r   r
   r   rc   Ï   rd   c                      s
   ˆ j  ¡ S r6   rB   r
   r   r
   r   rc   Ð   rd   c                      s
   ˆ j  ¡ S r6   r7   r
   r   r
   r   rc   Ñ   rd   )Úfuncz#Base Connection.__init__ not called)ÚsubTestZassertRaisesRegexr   r#   )r	   Zfuncsrf   r
   r   r   Útest_uninit_operationsÊ   s    





úþz3UninitialisedConnectionTests.test_uninit_operationsN)r'   r(   r)   r5   rh   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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d9d:„ Z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„ Z-dWdX„ Z.dYdZ„ Z/d[d\„ Z0d]d^„ Z1d_d`„ Z2dadb„ Z3dcdd„ Z4dedf„ Z5dgS )hÚCursorTestsc                 C   s6   t  d¡| _| j ¡ | _| j d¡ | j dd¡ d S )Nr+   z\create table test(id integer primary key, name text, income number, unique_test text unique)r,   r-   ©r   r/   r0   r1   r4   r2   r   r
   r
   r   r5   Û   s    ÿzCursorTests.setUpc                 C   s   | j  ¡  | j ¡  d S r6   ©r4   r8   r0   r   r
   r
   r   r9   ä   s    
zCursorTests.tearDownc                 C   s   | j  d¡ d S )Núdelete from test©r4   r2   r   r
   r
   r   ÚCheckExecuteNoArgsè   s    zCursorTests.CheckExecuteNoArgsc                 C   s<   |   tj¡ | j d¡ W d   ƒ n1 s.0    Y  d S )Nzselect asdf)rD   r   r   r4   r2   r   r
   r
   r   ÚCheckExecuteIllegalSqlë   s    z"CursorTests.CheckExecuteIllegalSqlc                 C   s<   |   tj¡ | j d¡ W d   ƒ n1 s.0    Y  d S )Nzselect 5+4; select 4+5)rD   r   r   r4   r2   r   r
   r
   r   ÚCheckExecuteTooMuchSqlï   s    z"CursorTests.CheckExecuteTooMuchSqlc                 C   s   | j  d¡ d S )Nzselect 5+4; -- foo barrm   r   r
   r
   r   ÚCheckExecuteTooMuchSql2ó   s    z#CursorTests.CheckExecuteTooMuchSql2c                 C   s   | j  d¡ d S )NzT
            select 5+4;

            /*
            foo
            */
            rm   r   r
   r
   r   ÚCheckExecuteTooMuchSql3ö   s    z#CursorTests.CheckExecuteTooMuchSql3c                 C   s:   |   t¡ | j d¡ W d   ƒ n1 s,0    Y  d S ©Né*   )rD   Ú	TypeErrorr4   r2   r   r
   r
   r   ÚCheckExecuteWrongSqlArgÿ   s    z#CursorTests.CheckExecuteWrongSqlArgc                 C   s   | j  dd¡ d S )Núinsert into test(id) values (?))rt   rm   r   r
   r
   r   ÚCheckExecuteArgInt  s    zCursorTests.CheckExecuteArgIntc                 C   s   | j  dd¡ d S )Nú#insert into test(income) values (?))gq=
×£ˆ£@rm   r   r
   r
   r   ÚCheckExecuteArgFloat  s    z CursorTests.CheckExecuteArgFloatc                 C   s   | j  dd¡ d S )Nr,   )ZHugorm   r   r
   r
   r   ÚCheckExecuteArgString	  s    z!CursorTests.CheckExecuteArgStringc                 C   s@   | j  dd¡ | j  d| j jf¡ | j  ¡ }|  |d d¡ d S )Nr,   )úHu goz select name from test where id=?r   r|   )r4   r2   Ú	lastrowidrJ   r   ©r	   rK   r
   r
   r   Ú!CheckExecuteArgStringWithZeroByte  s    
z-CursorTests.CheckExecuteArgStringWithZeroBytec                 C   sN   |   t¡}| j dd¡ W d   ƒ n1 s.0    Y  |  t|jƒd¡ d S )Nrw   rt   z"parameters are of unsupported type)rD   Ú
ValueErrorr4   r2   r   rY   rZ   r[   r
   r
   r   ÚCheckExecuteNonIterable  s    ,z#CursorTests.CheckExecuteNonIterablec                 C   s>   |   tj¡ | j dd¡ W d   ƒ n1 s00    Y  d S )Nrw   )é   ZEgon©rD   r   r#   r4   r2   r   r
   r
   r   ÚCheckExecuteWrongNoOfArgs1  s    z&CursorTests.CheckExecuteWrongNoOfArgs1c                 C   s<   |   tj¡ | j d¡ W d   ƒ n1 s.0    Y  d S ©Nrw   rƒ   r   r
   r
   r   ÚCheckExecuteWrongNoOfArgs2  s    z&CursorTests.CheckExecuteWrongNoOfArgs2c                 C   s<   |   tj¡ | j d¡ W d   ƒ n1 s.0    Y  d S r…   rƒ   r   r
   r
   r   ÚCheckExecuteWrongNoOfArgs3"  s    z&CursorTests.CheckExecuteWrongNoOfArgs3c                 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=?r.   r   ©r4   r2   rJ   r   r~   r
   r
   r   ÚCheckExecuteParamList'  s    
z!CursorTests.CheckExecuteParamListc                 C   sH   G dd„ dƒ}| j  d¡ | j  d|ƒ ¡ | j  ¡ }|  |d d¡ d S )Nc                   @   s   e Zd Zdd„ Zdd„ ZdS )z0CursorTests.CheckExecuteParamSequence.<locals>.Lc                 S   s   dS )Nr   r
   r   r
   r
   r   Ú__len__/  s    z8CursorTests.CheckExecuteParamSequence.<locals>.L.__len__c                 S   s   dS ©Nr.   r
   ©r	   Úxr
   r
   r   Ú__getitem__1  s    z<CursorTests.CheckExecuteParamSequence.<locals>.L.__getitem__N©r'   r(   r)   rŒ   r   r
   r
   r
   r   ÚL.  s   r’   rˆ   r‰   r   r.   rŠ   )r	   r’   rK   r
   r
   r   ÚCheckExecuteParamSequence-  s
    
z%CursorTests.CheckExecuteParamSequencec                 C   sX   G dd„ dƒ}| j  d¡ |  t¡  | j  d|ƒ ¡ W d   ƒ n1 sJ0    Y  d S )Nc                   @   s   e Zd Zdd„ Zdd„ ZdS )z6CursorTests.CheckExecuteParamSequenceBadLen.<locals>.Lc                 S   s   dd  d S )Nr   r   r
   r   r
   r
   r   rŒ   =  s    z>CursorTests.CheckExecuteParamSequenceBadLen.<locals>.L.__len__c                 S   s   t ‚d S r6   )ÚAssertionError)Zslfr   r
   r
   r   r   ?  s    zBCursorTests.CheckExecuteParamSequenceBadLen.<locals>.L.__getitem__Nr‘   r
   r
   r
   r   r’   <  s   r’   rˆ   r‰   )r4   r2   rD   ÚZeroDivisionError)r	   r’   r
   r
   r   ÚCheckExecuteParamSequenceBadLen:  s    z+CursorTests.CheckExecuteParamSequenceBadLenc                 C   s<   | j  d¡ | j  dddi¡ | j  ¡ }|  |d d¡ d S )Nrˆ   ú&select name from test where name=:nameÚnamer.   r   rŠ   r~   r
   r
   r   ÚCheckExecuteDictMappingF  s    
z#CursorTests.CheckExecuteDictMappingc                 C   sJ   G dd„ dt ƒ}| j d¡ | j d|ƒ ¡ | j ¡ }|  |d d¡ d S )Nc                   @   s   e Zd Zdd„ ZdS )z6CursorTests.CheckExecuteDictMapping_Mapping.<locals>.Dc                 S   s   dS r   r
   )r	   Úkeyr
   r
   r   Ú__missing__N  s    zBCursorTests.CheckExecuteDictMapping_Mapping.<locals>.D.__missing__N)r'   r(   r)   r›   r
   r
   r
   r   ÚDM  s   rœ   rˆ   r—   r   r.   )Údictr4   r2   rJ   r   )r	   rœ   rK   r
   r
   r   ÚCheckExecuteDictMapping_MappingL  s
    
z+CursorTests.CheckExecuteDictMapping_Mappingc                 C   sN   | j  d¡ |  tj¡" | j  dddi¡ W d   ƒ n1 s@0    Y  d S )Nrˆ   z1select name from test where name=:name and id=:idr˜   r.   ©r4   r2   rD   r   r#   r   r
   r
   r   Ú$CheckExecuteDictMappingTooLittleArgsV  s    z0CursorTests.CheckExecuteDictMappingTooLittleArgsc                 C   sH   | j  d¡ |  tj¡ | j  d¡ W d   ƒ n1 s:0    Y  d S )Nrˆ   r—   rŸ   r   r
   r
   r   ÚCheckExecuteDictMappingNoArgs[  s    z)CursorTests.CheckExecuteDictMappingNoArgsc                 C   sN   | j  d¡ |  tj¡" | j  dddi¡ W d   ƒ n1 s@0    Y  d S )Nrˆ   r‰   r˜   r.   rŸ   r   r
   r
   r   ÚCheckExecuteDictMappingUnnamed`  s    z*CursorTests.CheckExecuteDictMappingUnnamedc                 C   s   | j  ¡  d S r6   )r4   r8   r   r
   r
   r   rG   e  s    zCursorTests.CheckClosec                 C   sD   | j  d¡ | j  d¡ | j  d¡ | j  d¡ |  | j jd¡ d S )Nrl   rˆ   zupdate test set name='bar'é   ©r4   r2   r   Úrowcountr   r
   r
   r   ÚCheckRowcountExecuteh  s
    z CursorTests.CheckRowcountExecutec                 C   s    | j  d¡ |  | j jd¡ d S )Nzselect 5 union select 6éÿÿÿÿr¤   r   r
   r
   r   ÚCheckRowcountSelecto  s    zCursorTests.CheckRowcountSelectc                 C   s2   | j  d¡ | j  dg d¢¡ |  | j jd¡ d S )Nrl   r,   ))r   )r£   ©rU   rU   )r4   r2   Úexecutemanyr   r¥   r   r
   r
   r   ÚCheckRowcountExecutemanyx  s    z$CursorTests.CheckRowcountExecutemanyc                 C   s0   | j  d¡ | j  d¡ | jd| jjdd d S )Nrˆ   r£   z"total changes reported wrong value)Úmsg)r4   r2   Z
assertLessr0   re   r   r
   r
   r   ÚCheckTotalChanges}  s    zCursorTests.CheckTotalChangesc                 C   s"   | j  ddd„ tddƒD ƒ¡ d S )Nry   c                 S   s   g | ]
}|f‘qS r
   r
   )Ú.0r   r
   r
   r   Ú
<listcomp>‡  rd   z8CursorTests.CheckExecuteManySequence.<locals>.<listcomp>éd   én   )r4   rª   Úranger   r
   r
   r   ÚCheckExecuteManySequence†  s    z$CursorTests.CheckExecuteManySequencec                 C   s"   G dd„ dƒ}| j  d|ƒ ¡ d S )Nc                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )z4CursorTests.CheckExecuteManyIterator.<locals>.MyIterc                 S   s
   d| _ d S ©Né   )Úvaluer   r
   r
   r   Ú__init__‹  s    z=CursorTests.CheckExecuteManyIterator.<locals>.MyIter.__init__c                 S   s   | S r6   r
   r   r
   r
   r   Ú__iter__Ž  s    z=CursorTests.CheckExecuteManyIterator.<locals>.MyIter.__iter__c                 S   s*   | j dkrt‚n|  j d7  _ | j fS d S )Né
   r   )r¶   ÚStopIterationr   r
   r
   r   Ú__next__‘  s    
z=CursorTests.CheckExecuteManyIterator.<locals>.MyIter.__next__N)r'   r(   r)   r·   r¸   r»   r
   r
   r
   r   ÚMyIterŠ  s   r¼   ry   ©r4   rª   )r	   r¼   r
   r
   r   ÚCheckExecuteManyIterator‰  s    z$CursorTests.CheckExecuteManyIteratorc                 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    z4CursorTests.CheckExecuteManyGenerator.<locals>.mygenry   r½   )r	   rÀ   r
   r
   r   ÚCheckExecuteManyGeneratorš  s    z%CursorTests.CheckExecuteManyGeneratorc                 C   s>   |   t¡  | j ddg¡ W d   ƒ n1 s00    Y  d S )Nrt   r©   ©rD   ru   r4   rª   r   r
   r
   r   ÚCheckExecuteManyWrongSqlArg¡  s    z'CursorTests.CheckExecuteManyWrongSqlArgc                 C   s@   |   tj¡  | j ddg¡ W d   ƒ n1 s20    Y  d S )Nzselect ?r©   )rD   r   r#   r4   rª   r   r
   r
   r   ÚCheckExecuteManySelect¥  s    z"CursorTests.CheckExecuteManySelectc                 C   s<   |   t¡ | j dd¡ W d   ƒ n1 s.0    Y  d S )Nry   rt   rÂ   r   r
   r
   r   ÚCheckExecuteManyNotIterable©  s    z'CursorTests.CheckExecuteManyNotIterablec                 C   sv   | j  d¡ | j  dd¡ | j  dd¡ | j  d¡ g }| j D ]}| |d ¡ q>|  |d d¡ |  |d d	¡ d S )
Nrl   rw   )rµ   )é   zselect id from test order by idr   rµ   r   rÆ   )r4   r2   Úappendr   )r	   ZlstrK   r
   r
   r   ÚCheckFetchIter­  s    
zCursorTests.CheckFetchIterc                 C   s@   | j  d¡ | j  ¡ }|  |d d¡ | j  ¡ }|  |d ¡ d S )Núselect name from testr   r.   rŠ   r~   r
   r
   r   ÚCheckFetchone¹  s
    

zCursorTests.CheckFetchonec                 C   s"   | j  ¡ }| ¡ }|  |d ¡ d S r6   )r0   r1   rJ   r   )r	   ÚcurrK   r
   r
   r   ÚCheckFetchoneNoStatementÀ  s    
z$CursorTests.CheckFetchoneNoStatementc                 C   sr   |   | jjd¡ d| j_| j d¡ | j d¡ | j d¡ | j d¡ | j d¡ | j ¡ }|   t|ƒd¡ d S )Nr   r£   rl   z#insert into test(name) values ('A')z#insert into test(name) values ('B')z#insert into test(name) values ('C')rÉ   )r   r4   Z	arraysizer2   Ú	fetchmanyÚlen©r	   Úresr
   r
   r   ÚCheckArraySizeÅ  s    
zCursorTests.CheckArraySizec                 C   sD   | j  d¡ | j  d¡}|  t|ƒd¡ | j  d¡}|  |g ¡ d S )NrÉ   r°   r   ©r4   r2   rÍ   r   rÎ   rÏ   r
   r
   r   ÚCheckFetchmanyÖ  s
    zCursorTests.CheckFetchmanyc                 C   s.   | j  d¡ | j jdd}|  t|ƒd¡ d S )NrÉ   r°   )Úsizer   rÒ   rÏ   r
   r
   r   ÚCheckFetchmanyKwArgÝ  s    zCursorTests.CheckFetchmanyKwArgc                 C   s@   | j  d¡ | j  ¡ }|  t|ƒd¡ | j  ¡ }|  |g ¡ d S )NrÉ   r   )r4   r2   Úfetchallr   rÎ   rÏ   r
   r
   r   ÚCheckFetchallã  s
    

zCursorTests.CheckFetchallc                 C   s   | j  g d¢¡ d S )N)rU   é   rµ   )r4   Zsetinputsizesr   r
   r
   r   ÚCheckSetinputsizesê  s    zCursorTests.CheckSetinputsizesc                 C   s   | j  dd¡ d S )Nrµ   r   ©r4   Zsetoutputsizer   r
   r
   r   ÚCheckSetoutputsizeí  s    zCursorTests.CheckSetoutputsizec                 C   s   | j  d¡ d S rs   rÚ   r   r
   r
   r   ÚCheckSetoutputsizeNoColumnð  s    z&CursorTests.CheckSetoutputsizeNoColumnc                 C   s   |   | jj| j¡ d S r6   )r   r4   Ú
connectionr0   r   r
   r
   r   ÚCheckCursorConnectionó  s    z!CursorTests.CheckCursorConnectionc                 C   sB   |   t¡$ dd„ }| j |¡}W d   ƒ n1 s40    Y  d S )Nc                   S   s   d S r6   r
   r
   r
   r
   r   Úfù  rd   z/CursorTests.CheckWrongCursorCallable.<locals>.f)rD   ru   r0   r1   )r	   rß   rË   r
   r
   r   ÚCheckWrongCursorCallable÷  s    z$CursorTests.CheckWrongCursorCallablec                 C   sL   G dd„ dƒ}|ƒ }|   t¡ t |¡}W d   ƒ n1 s>0    Y  d S )Nc                   @   s   e Zd ZdS )z.CursorTests.CheckCursorWrongClass.<locals>.FooN)r'   r(   r)   r
   r
   r
   r   ÚFooý  rd   rá   )rD   ru   r   ZCursor)r	   rá   r.   rË   r
   r
   r   ÚCheckCursorWrongClassü  s    z!CursorTests.CheckCursorWrongClassc              	   C   sb   d}dD ]T}| j |d4 | j | |¡d¡ |  | jjd¡ W d   ƒ q1 sR0    Y  qd S )Nz+{} INTO test(id, unique_test) VALUES (?, ?))zINSERT OR REPLACEZREPLACE©Ú	statement)r   r.   r   )rg   r4   r2   Úformatr   r}   )r	   Úsqlrä   r
   r
   r   ÚCheckLastRowIDOnReplace  s
    z#CursorTests.CheckLastRowIDOnReplacec                 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£   )r4   r2   r   r}   r   r
   r
   r   ÚCheckLastRowIDOnIgnore  s    þþz"CursorTests.CheckLastRowIDOnIgnorec              
   C   sØ   g }dD ]¶}d}| j d |¡dŒ | j | |¡|f¡ | || jjf¡ |  tj¡& | j | |¡|f¡ W d   ƒ n1 s„0    Y  | || jjf¡ W d   ƒ q1 s´0    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ë   rU   rî   ©rì   rØ   rï   )
rg   rå   r4   r2   rÇ   r}   rD   r   r   r   )r	   Úresultsrä   ræ   Zexpectedr
   r
   r   ÚCheckLastRowIDInsertOR  s    42z"CursorTests.CheckLastRowIDInsertORN)6r'   r(   r)   r5   r9   rn   ro   rp   rq   rr   rv   rx   rz   r{   r   r   r„   r†   r‡   r‹   r“   r–   r™   rž   r    r¡   r¢   rG   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
   r   ri   Ú   sf   		
		

ri   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   s(   t  d¡| _| j ¡ | _| j d¡ d S )Nr+   z\create table test(id integer primary key, name text, bin binary, ratio number, ts timestamp))r   r/   rE   r1   rË   r2   r   r
   r
   r   r5   )  s    zThreadTests.setUpc                 C   s   | j  ¡  | j ¡  d S r6   )rË   r8   rE   r   r
   r
   r   r9   .  s    
zThreadTests.tearDownc                 C   sR   dd„ }g }t j|| j|dœd}| ¡  | ¡  t|ƒdkrN|  d |¡¡ d S )Nc                 S   sH   z|   ¡ }| d¡ W d S  tjy.   Y d S    | d¡ Y n0 d S ©Núdid not raise ProgrammingErrorúraised wrong exception)r1   rÇ   r   r#   )rE   ÚerrorsrË   r
   r
   r   Úrun3  s    
z'ThreadTests.CheckConCursor.<locals>.run©rE   rö   ©ÚtargetÚkwargsr   Ú
©Ú	threadingÚThreadrE   ÚstartÚjoinrÎ   Úfail©r	   r÷   rö   Útr
   r
   r   ÚCheckConCursor2  s    
zThreadTests.CheckConCursorc                 C   sR   dd„ }g }t j|| j|dœd}| ¡  | ¡  t|ƒdkrN|  d |¡¡ d S )Nc                 S   sH   z|   ¡  | d¡ W d S  tjy.   Y d S    | d¡ Y n0 d S ró   )r;   rÇ   r   r#   rø   r
   r
   r   r÷   E  s    
z'ThreadTests.CheckConCommit.<locals>.runrø   rù   r   rü   rý   r  r
   r
   r   ÚCheckConCommitD  s    
zThreadTests.CheckConCommitc                 C   sR   dd„ }g }t j|| j|dœd}| ¡  | ¡  t|ƒdkrN|  d |¡¡ d S )Nc                 S   sH   z|   ¡  | d¡ W d S  tjy.   Y d S    | d¡ Y n0 d S ró   )r?   rÇ   r   r#   rø   r
   r
   r   r÷   W  s    
z)ThreadTests.CheckConRollback.<locals>.runrø   rù   r   rü   rý   r  r
   r
   r   ÚCheckConRollbackV  s    
zThreadTests.CheckConRollbackc                 C   sR   dd„ }g }t j|| j|dœd}| ¡  | ¡  t|ƒdkrN|  d |¡¡ d S )Nc                 S   sH   z|   ¡  | d¡ W d S  tjy.   Y d S    | d¡ Y n0 d S ró   ©r8   rÇ   r   r#   rø   r
   r
   r   r÷   i  s    
z&ThreadTests.CheckConClose.<locals>.runrø   rù   r   rü   rý   r  r
   r
   r   ÚCheckConCloseh  s    
zThreadTests.CheckConClosec                 C   sR   dd„ }g }t j|| j|dœd}| ¡  | ¡  t|ƒdkrN|  d |¡¡ d S )Nc                 S   sJ   z|   d¡ | d¡ W d S  tjy0   Y d S    | d¡ Y n0 d S )Nú#insert into test(name) values ('a')rô   rõ   ©r2   rÇ   r   r#   ©rË   rö   r
   r
   r   r÷   {  s    

z.ThreadTests.CheckCurImplicitBegin.<locals>.runr  rù   r   rü   ©rþ   rÿ   rË   r   r  rÎ   r  r  r
   r
   r   ÚCheckCurImplicitBeginz  s    
z!ThreadTests.CheckCurImplicitBeginc                 C   sR   dd„ }g }t j|| j|dœd}| ¡  | ¡  t|ƒdkrN|  d |¡¡ d S )Nc                 S   sH   z|   ¡  | d¡ W d S  tjy.   Y d S    | d¡ Y n0 d S ró   r  r  r
   r
   r   r÷     s    
z&ThreadTests.CheckCurClose.<locals>.runr  rù   r   rü   r  r  r
   r
   r   ÚCheckCurCloseŒ  s    
zThreadTests.CheckCurClosec                 C   s^   dd„ }g }| j  d¡ tj|| j |dœd}| ¡  | ¡  t|ƒdkrZ|  d |¡¡ d S )Nc                 S   sJ   z|   d¡ | d¡ W d S  tjy0   Y d S    | d¡ Y n0 d S )NrÉ   rô   rõ   r  r  r
   r
   r   r÷   Ÿ  s    

z(ThreadTests.CheckCurExecute.<locals>.runr
  r  rù   r   rü   ©rË   r2   rþ   rÿ   r   r  rÎ   r  r  r
   r
   r   ÚCheckCurExecutež  s    
zThreadTests.CheckCurExecutec                 C   sj   dd„ }g }| j  d¡ | j  d¡ tj|| j |dœd}| ¡  | ¡  t|ƒdkrf|  d |¡¡ d S )	Nc                 S   sH   z|   ¡ }| d¡ W d S  tjy.   Y d S    | d¡ Y n0 d S ró   )rJ   rÇ   r   r#   )rË   rö   rK   r
   r
   r   r÷   ²  s    
z)ThreadTests.CheckCurIterNext.<locals>.runr
  rÉ   r  rù   r   rü   r  r  r
   r
   r   ÚCheckCurIterNext±  s    
zThreadTests.CheckCurIterNextN)r'   r(   r)   r5   r9   r  r  r  r	  r  r  r  r  r
   r
   r
   r   rò   (  s   rò   c                   @   sD   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   s   t  ddd¡}d S )NéÔ  r¹   é   )r   ZDate©r	   Údr
   r
   r   Ú	CheckDateÆ  s    zConstructorTests.CheckDatec                 C   s   t  ddd¡}d S )Né   é'   é#   )r   ZTime©r	   r  r
   r
   r   Ú	CheckTimeÉ  s    zConstructorTests.CheckTimec                 C   s   t  dddddd¡}d S )Nr  r¹   r  r  r  r  )r   Z	Timestamp©r	   Útsr
   r
   r   ÚCheckTimestampÌ  s    zConstructorTests.CheckTimestampc                 C   s   t  d¡}d S rs   )r   ZDateFromTicksr  r
   r
   r   ÚCheckDateFromTicksÏ  s    z#ConstructorTests.CheckDateFromTicksc                 C   s   t  d¡}d S rs   )r   ZTimeFromTicksr  r
   r
   r   ÚCheckTimeFromTicksÒ  s    z#ConstructorTests.CheckTimeFromTicksc                 C   s   t  d¡}d S rs   )r   ZTimestampFromTicksr  r
   r
   r   ÚCheckTimestampFromTicksÕ  s    z(ConstructorTests.CheckTimestampFromTicksc                 C   s   t  d¡}d S )Ns    ')r   ZBinary)r	   Úbr
   r
   r   ÚCheckBinaryØ  s    zConstructorTests.CheckBinaryN)
r'   r(   r)   r  r  r   r!  r"  r#  r%  r
   r
   r
   r   r  Å  s   r  c                   @   sD   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 )ÚExtensionTestsc                 C   sB   t  d¡}| ¡ }| d¡ | d¡ | ¡ d }|  |d¡ d S )Nr+   z
            -- bla bla
            /* a stupid comment */
            create table a(i);
            insert into a(i) values (5);
            zselect i from ar   rµ   )r   r/   r1   Úexecutescriptr2   rJ   r   )r	   rE   rË   rÐ   r
   r
   r   ÚCheckScriptStringSqlÜ  s    


z#ExtensionTests.CheckScriptStringSqlc                 C   sL   t  d¡}| ¡ }|  t j¡ | d¡ W d   ƒ n1 s>0    Y  d S )Nr+   z1create table test(x); asdf; create table test2(x)©r   r/   r1   rD   r   r'  ©r	   rE   rË   r
   r
   r   ÚCheckScriptSyntaxErroré  s    
z%ExtensionTests.CheckScriptSyntaxErrorc                 C   sL   t  d¡}| ¡ }|  t j¡ | d¡ W d   ƒ n1 s>0    Y  d S )Nr+   z5create table test(sadfsadfdsa); select foo from hurz;r)  r*  r
   r
   r   ÚCheckScriptErrorNormalï  s    
z%ExtensionTests.CheckScriptErrorNormalc                 C   s\   t  d¡}| ¡ }|  t¡}| d¡ W d   ƒ n1 s<0    Y  |  t|jƒd¡ d S )Nr+   s9   create table test(foo); insert into test(foo) values (5);z script argument must be unicode.)	r   r/   r1   rD   r€   r'  r   rY   rZ   )r	   rE   rË   r\   r
   r
   r   ÚCheckCursorExecutescriptAsBytesõ  s
    
(z.ExtensionTests.CheckCursorExecutescriptAsBytesc                 C   s.   t  d¡}| d¡ ¡ d }|  |dd¡ d S )Nr+   zselect 5r   rµ   z Basic test of Connection.execute)r   r/   r2   rJ   r   ©r	   rE   Úresultr
   r
   r   ÚCheckConnectionExecuteü  s    
z%ExtensionTests.CheckConnectionExecutec                 C   sb   t  d¡}| d¡ | dddg¡ | d¡ ¡ }|  |d d dd	¡ |  |d
 d dd	¡ d S )Nr+   zcreate table test(foo)z insert into test(foo) values (?)r©   ©rØ   z!select foo from test order by foor   rU   z$Basic test of Connection.executemanyr   rØ   )r   r/   r2   rª   rÖ   r   r.  r
   r
   r   ÚCheckConnectionExecutemany  s    

z)ExtensionTests.CheckConnectionExecutemanyc                 C   s8   t  d¡}| d¡ | d¡ ¡ d }|  |dd¡ d S )Nr+   z9create table test(foo); insert into test(foo) values (5);zselect foo from testr   rµ   z&Basic test of Connection.executescript)r   r/   r'  r2   rJ   r   r.  r
   r
   r   ÚCheckConnectionExecutescript	  s    

z+ExtensionTests.CheckConnectionExecutescriptN)
r'   r(   r)   r(  r+  r,  r-  r0  r2  r3  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   sJ   t  d¡}| ¡  |  t j¡ | ¡ }W d   ƒ n1 s<0    Y  d S ©Nr+   )r   r/   r8   rD   r#   r1   r*  r
   r
   r   ÚCheckClosedConCursor  s    
z#ClosedConTests.CheckClosedConCursorc                 C   sJ   t  d¡}| ¡  |  t j¡ | ¡  W d   ƒ n1 s<0    Y  d S r5  )r   r/   r8   rD   r#   r;   ©r	   rE   r
   r
   r   ÚCheckClosedConCommit  s    
z#ClosedConTests.CheckClosedConCommitc                 C   sJ   t  d¡}| ¡  |  t j¡ | ¡  W d   ƒ n1 s<0    Y  d S r5  )r   r/   r8   rD   r#   r?   r7  r
   r
   r   ÚCheckClosedConRollback  s    
z%ClosedConTests.CheckClosedConRollbackc                 C   sT   t  d¡}| ¡ }| ¡  |  t j¡ | d¡ W d   ƒ n1 sF0    Y  d S )Nr+   zselect 4)r   r/   r1   r8   rD   r#   r2   r*  r
   r
   r   ÚCheckClosedCurExecute"  s
    
z$ClosedConTests.CheckClosedCurExecutec                 C   sX   t  d¡}| ¡  dd„ }|  t j¡ | dd|¡ W d   ƒ n1 sJ0    Y  d S )Nr+   c                 S   s   dS ©Nr‚   r
   )r   r
   r
   r   rß   ,  rd   z3ClosedConTests.CheckClosedCreateFunction.<locals>.fr.   r   )r   r/   r8   rD   r#   Zcreate_function)r	   rE   rß   r
   r
   r   ÚCheckClosedCreateFunction)  s
    
z(ClosedConTests.CheckClosedCreateFunctionc                 C   s^   t  d¡}| ¡  G dd„ dƒ}|  t j¡ | dd|¡ W d   ƒ n1 sP0    Y  d S )Nr+   c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )z6ClosedConTests.CheckClosedCreateAggregate.<locals>.Aggc                 S   s   d S r6   r
   r   r
   r
   r   r·   4  s    z?ClosedConTests.CheckClosedCreateAggregate.<locals>.Agg.__init__c                 S   s   d S r6   r
   rŽ   r
   r
   r   Ústep6  s    z;ClosedConTests.CheckClosedCreateAggregate.<locals>.Agg.stepc                 S   s   dS r;  r
   r   r
   r
   r   Úfinalize8  s    z?ClosedConTests.CheckClosedCreateAggregate.<locals>.Agg.finalizeN)r'   r(   r)   r·   r=  r>  r
   r
   r
   r   ÚAgg3  s   r?  r.   r   )r   r/   r8   rD   r#   Zcreate_aggregate)r	   rE   r?  r
   r
   r   ÚCheckClosedCreateAggregate0  s
    
z)ClosedConTests.CheckClosedCreateAggregatec                 C   sT   t  d¡}| ¡  dd„ }|  t j¡ | |¡ W d   ƒ n1 sF0    Y  d S )Nr+   c                  W   s   t jS r6   )r   ZDENY)Úargsr
   r
   r   Ú
authorizer@  s    z;ClosedConTests.CheckClosedSetAuthorizer.<locals>.authorizer)r   r/   r8   rD   r#   Zset_authorizer)r	   rE   rB  r
   r
   r   ÚCheckClosedSetAuthorizer=  s
    
z'ClosedConTests.CheckClosedSetAuthorizerc                 C   sV   t  d¡}| ¡  dd„ }|  t j¡ | |d¡ W d   ƒ n1 sH0    Y  d S )Nr+   c                   S   s   d S r6   r
   r
   r
   r
   r   ÚprogressH  rd   z?ClosedConTests.CheckClosedSetProgressCallback.<locals>.progressr°   )r   r/   r8   rD   r#   Zset_progress_handler)r	   rE   rD  r
   r
   r   ÚCheckClosedSetProgressCallbackE  s
    
z-ClosedConTests.CheckClosedSetProgressCallbackc                 C   sH   t  d¡}| ¡  |  t j¡ |ƒ  W d   ƒ n1 s:0    Y  d S r5  )r   r/   r8   rD   r#   r7  r
   r
   r   ÚCheckClosedCallL  s    
zClosedConTests.CheckClosedCallN)r'   r(   r)   r6  r8  r9  r:  r<  r@  rC  rE  rF  r
   r
   r
   r   r4    s   r4  c                   @   s   e Zd Zdd„ ZdS )ÚClosedCurTestsc              	   C   sŽ   t  d¡}| ¡ }| ¡  dD ]j}|dv r0d}n|dkrFdddgf}ng }|  t j¡" t||ƒ}||Ž  W d   ƒ q1 s~0    Y  qd S )	Nr+   )r2   rª   r'  rÖ   rÍ   rJ   )r2   r'  )zselect 4 union select 5rª   zinsert into foo(bar) values (?)r©   r1  )r   r/   r1   r8   rD   r#   Úgetattr)r	   rE   rË   Zmethod_nameÚparamsÚmethodr
   r
   r   ÚCheckClosedS  s    

zClosedCurTests.CheckClosedN)r'   r(   r)   rK  r
   r
   r
   r   rG  R  s   rG  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 )ÚSqliteOnConflictTestsc                 C   s(   t  d¡| _| j ¡ | _| j d¡ d S )Nr+   zz
          CREATE TABLE test(
            id INTEGER PRIMARY KEY, name TEXT, unique_name TEXT UNIQUE
          );
        rj   r   r
   r
   r   r5   l  s    zSqliteOnConflictTests.setUpc                 C   s   | j  ¡  | j ¡  d S r6   rk   r   r
   r
   r   r9   u  s    
zSqliteOnConflictTests.tearDownc                 C   sœ   d | j _| j  ¡ | _| j d¡ | j d¡ | j d¡ |  tj¡ | j d¡ W d   ƒ n1 sf0    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©r0   rb   r1   r4   r2   rD   r   r   r;   r   rÖ   r   r
   r
   r   Ú.CheckOnConflictRollbackWithExplicitTransactiony  s    *
zDSqliteOnConflictTests.CheckOnConflictRollbackWithExplicitTransactionc                 C   s    d | j _| j  ¡ | _| j d¡ | j d¡ | j d¡ |  tj¡ | j d¡ W d   ƒ n1 sf0    Y  | j  ¡  | j d¡ |  	| j 
¡ ddg¡ d S )NrM  rN  ú5INSERT OR ABORT INTO test(unique_name) VALUES ('foo')ú"SELECT name, unique_name FROM test©Z
abort_testNr   rP  r   r
   r
   r   Ú2CheckOnConflictAbortRaisesWithExplicitTransactionsˆ  s    *
zHSqliteOnConflictTests.CheckOnConflictAbortRaisesWithExplicitTransactionsc                 C   sr   | j  d¡ | j  d¡ |  tj¡ | j  d¡ W d   ƒ n1 sF0    Y  | j  d¡ |  | j  ¡ g ¡ d S )NrN  rO  rS  ©r4   r2   rD   r   r   r   rÖ   r   r
   r
   r   Ú)CheckOnConflictRollbackWithoutTransaction˜  s    *z?SqliteOnConflictTests.CheckOnConflictRollbackWithoutTransactionc                 C   sv   | j  d¡ | j  d¡ |  tj¡ | j  d¡ W d   ƒ n1 sF0    Y  | j  d¡ |  | j  ¡ ddg¡ d S )NrN  rR  rS  rT  r   rV  r   r
   r
   r   Ú-CheckOnConflictAbortRaisesWithoutTransactions¢  s    *zCSqliteOnConflictTests.CheckOnConflictAbortRaisesWithoutTransactionsc                 C   sZ   | j  d¡ |  tj¡ | j  d¡ W d   ƒ n1 s:0    Y  |  | j  ¡ g ¡ d S )Nz4INSERT OR FAIL INTO test(unique_name) VALUES ('foo')rV  r   r
   r
   r   ÚCheckOnConflictFail­  s    *z)SqliteOnConflictTests.CheckOnConflictFailc                 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 testr-   ©r4   r2   r   rÖ   r   r
   r
   r   ÚCheckOnConflictIgnore³  s    z+SqliteOnConflictTests.CheckOnConflictIgnorec                 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')rS  )zVery different data!r.   rZ  r   r
   r
   r   ÚCheckOnConflictReplaceº  s    z,SqliteOnConflictTests.CheckOnConflictReplaceN)r'   r(   r)   r5   r9   rQ  rU  rW  rX  rY  r[  r\  r
   r
   r
   r   rL  e  s   	
rL  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 r6   )r   r   r   r
   r
   r   r9   Å  s    zMultiprocessTests.tearDownc              
   C   sN  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	}z‚z2| | d
¡ W d   ƒ n1 sŽ0    Y  W n6 tjyÐ } z|j t|ƒ¡ W Y d }~nd }~0 0 |j d¡ W | ¡  n
| ¡  0 |  |j¡ z|jdtd W n( tjy:   | ¡  | ¡  ‚ Y n0 |  	|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)Úinputrc  )r   ÚCONNECTION_TIMEOUTÚ
subprocessÚPopenÚsysÚ
executableÚPIPErR   Úcommunicater   ra  ÚreadlineÚstripr   r/   r2   r   r`  ÚwriterY   r8   ZassertIsNoneÚ
returncoder   ÚTimeoutExpiredÚkill)r	   ZSCRIPTÚprocr0   Úexcr
   r
   r   Ú&test_ctx_mgr_rollback_if_commit_failedÈ  s<    úú
û,&z8MultiprocessTests.test_ctx_mgr_rollback_if_commit_failedN)r'   r(   r)   r   rf  r9   ru  r
   r
   r
   r   r]  Â  s   r]  c                  C   s    t  td¡} t  td¡}t  td¡}t  td¡}t  td¡}t  td¡}t  td¡}t  t	d¡}t  t
d¡}t  t¡}	t  t¡}
t  | |||||||||	|
f¡S )NZCheck)r^   Z	makeSuiter   r*   ri   rò   r  r&  r4  rG  rL  r_   r]  Z	TestSuite)Zmodule_suiteZconnection_suiteZcursor_suiteZthread_suiteZconstructor_suiteZ	ext_suiteZclosed_con_suiteZclosed_cur_suiteZon_conflict_suiteZuninit_con_suiteZmultiproc_con_suiter
   r
   r   Úsuite	  s     

ýrv  c                  C   s   t  ¡ } |  tƒ ¡ d S r6   )r^   ZTextTestRunnerr÷   rv  )Zrunnerr
   r
   r   rè     s    rè   Ú__main__)rg  rþ   r^   Zsqlite3r   ri  Ztest.supportr   r   r   ZTestCaser   r*   r_   ri   rò   r  r&  r4  rG  rL  r]  rv  rè   r'   r
   r
   r
   r   Ú<module>   s.   7n  P 4C]G
