B
    2*™\eB  ã               @   s€   d dl Z d dlZd dlZd dlZd dlmZ G dd„ dejƒZG dd„ dƒZ	G dd„ dejƒZ
d	d
„ Zdd„ Zedkr|eƒ  dS )é    N)Úsupportc               @   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	e
 ejdk d¡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=S )>ÚRegressionTestsc             C   s   t  d¡| _d S )Nz:memory:)ÚsqliteÚconnectÚcon)Úself© r   úBC:\ALexclude\prg\programme\Python37\Lib\sqlite3\test\regression.pyÚsetUp   s    zRegressionTests.setUpc             C   s   | j  ¡  d S )N)r   Úclose)r   r   r   r	   ÚtearDown"   s    zRegressionTests.tearDownc             C   s   | j  ¡ }| d¡ d S )Nzpragma user_version)r   ÚcursorÚexecute)r   Úcurr   r   r	   ÚCheckPragmaUserVersion%   s    
z&RegressionTests.CheckPragmaUserVersionc             C   s@   t jdt jd}z| j ¡ }| d¡ W d | ¡  | ¡  X d S )Nz:memory:)Údetect_typeszpragma schema_version)r   r   ZPARSE_COLNAMESr   r   r   r   )r   r   r   r   r   r	   ÚCheckPragmaSchemaVersion*   s    
z(RegressionTests.CheckPragmaSchemaVersionc                s–   t jddd‰ ‡ fdd„tdƒD ƒ}|d  d¡ x.tdƒD ]"}|d  d	d
d„ tdƒD ƒ¡ q<W x&tdƒD ]}||  d| d ¡ qlW ˆ  ¡  d S )Nz:memory:é   )Zcached_statementsc                s   g | ]}ˆ   ¡ ‘qS r   )r   )Ú.0Úx)r   r   r	   ú
<listcomp>9   s    z7RegressionTests.CheckStatementReset.<locals>.<listcomp>r   zcreate table test(x)é
   zinsert into test(x) values (?)c             S   s   g | ]
}|f‘qS r   r   )r   r   r   r   r	   r   <   s    ú zselect x from test)r   r   Úranger   ÚexecutemanyÚrollback)r   ÚcursorsÚir   )r   r	   ÚCheckStatementReset4   s    "z#RegressionTests.CheckStatementResetc             C   sN   | j  ¡ }| d¡ |  |jd d d¡ | d¡ |  |jd d d¡ d S )Nz select 1 as "foo bar [datetime]"r   zfoo barzselect 1 as "foo baz"zfoo baz)r   r   r   ÚassertEqualÚdescription)r   r   r   r   r	   ÚCheckColumnNameWithSpacesC   s
    


z)RegressionTests.CheckColumnNameWithSpacesc             C   sP   t  d¡}g }x4tdƒD ](}| ¡ }| |¡ | dt|ƒ ¡ qW | ¡  d S )Nz:memory:éi   zselect 1 x union select )r   r   r   r   Úappendr   Ústrr   )r   r   r   r   r   r   r   r	   Ú#CheckStatementFinalizationOnCloseDbK   s    

z3RegressionTests.CheckStatementFinalizationOnCloseDb)é   é   r'   zneeds sqlite 3.2.2 or newerc             C   s€   t  d¡}| d¡ | d¡ y| d¡ W n t jk
rB   Y nX | d¡ y| ¡  W n  t jk
rz   |  d¡ Y nX d S )Nz:memory:z3create table foo(x, unique(x) on conflict rollback)zinsert into foo(x) values (1)zinsert into foo(x) values (2)z1pysqlite knew nothing about the implicit ROLLBACK)r   r   r   ZDatabaseErrorÚcommitÚOperationalErrorZfail)r   r   r   r   r	   ÚCheckOnConflictRollbackY   s    



z'RegressionTests.CheckOnConflictRollbackc             C   s(   | j  d¡ | j  d¡ | j  d¡ dS )zm
        pysqlite would crash with older SQLite versions unless
        a workaround is implemented.
        zcreate table foo(bar)zdrop table fooN)r   r   )r   r   r   r	   Ú-CheckWorkaroundForBuggySqliteTransferBindingsh   s    z=RegressionTests.CheckWorkaroundForBuggySqliteTransferBindingsc             C   s   | j  d¡ dS )z
        pysqlite used to segfault with SQLite versions 3.5.x. These return NULL
        for "no-operation" statements
        Ú N)r   r   )r   r   r   r	   ÚCheckEmptyStatementq   s    z#RegressionTests.CheckEmptyStatementc             C   sh   d}t jdt jd}| d¡ | dtj ¡ f¡ | |¡ | d¡ | d¡ | d¡ | |¡ d	S )
z
        pysqlite until 2.4.1 did not rebuild the row_cast_map when recompiling
        a statement. This test exhibits the problem.
        zselect * from fooz:memory:)r   zcreate table foo(bar timestamp)zinsert into foo(bar) values (?)zdrop table foozcreate table foo(bar integer)zinsert into foo(bar) values (5)N)r   r   ÚPARSE_DECLTYPESr   ÚdatetimeZnow)r   ZSELECTr   r   r   r	   ÚCheckTypeMapUsagex   s    




z!RegressionTests.CheckTypeMapUsagec          	   C   sP   |   tj¡$}| j dttdgƒƒf¡ ¡  W d Q R X d}|  |t	|j
ƒ¡ d S )Nz"select 'xxx' || ? || 'yyy' colnameéú   z9Could not decode to UTF-8 column 'colname' with text 'xxx)ÚassertRaisesr   r)   r   r   ÚbytesÚ	bytearrayÚfetchoneZassertInr$   Z	exception)r   ÚcmÚmsgr   r   r	   ÚCheckErrorMsgDecodeError‡   s
     z(RegressionTests.CheckErrorMsgDecodeErrorc             C   s   |   ttji d¡ dS )z!
        See issue 3312.
        N)r2   Ú	TypeErrorr   Zregister_adapter)r   r   r   r	   ÚCheckRegisterAdapter   s    z$RegressionTests.CheckRegisterAdapterc                sô   G ‡ fdd„dt ƒ}t d¡‰ d ˆ _xHdD ]@}| j|d* |ˆ _| ¡ ˆ _| ¡ ˆ _||ƒˆ _W d Q R X q*W d ˆ _dˆ _dtfdtfd	tfd
tfdtfg}xR|D ]J\}}| j|d0 |  	|¡ |ˆ _W d Q R X |  
ˆ jd¡ W d Q R X q¢W d S )Nc                   s    e Zd Zdd„ Z‡ fdd„ZdS )z9RegressionTests.CheckSetIsolationLevel.<locals>.CustomStrc             S   s   d S )Nr   )r   r   r   r	   Úupper™   s    z?RegressionTests.CheckSetIsolationLevel.<locals>.CustomStr.upperc                s
   dˆ _ d S )Nr,   )Úisolation_level)r   )r   r   r	   Ú__del__›   s    zARegressionTests.CheckSetIsolationLevel.<locals>.CustomStr.__del__N)Ú__name__Ú
__module__Ú__qualname__r;   r=   r   )r   r   r	   Ú	CustomStr˜   s   rA   z:memory:)r,   ÚDEFERREDZ	IMMEDIATEZ	EXCLUSIVE)ÚlevelrB   é   ó    ÚabczIMMEDIATE EXCLUSIVEõ   Ã©)r$   r   r   r<   ÚsubTestÚlowerÚ
capitalizer9   Ú
ValueErrorr2   r   )r   rA   rC   ZpairsÚvalueÚexcr   )r   r	   ÚCheckSetIsolationLevel–   s$    



z&RegressionTests.CheckSetIsolationLevelc          	   C   sp   G dd„ dt jƒ}t  d¡}||ƒ}|  t j¡ | d¡ ¡  W dQ R X |  t jd¡ | ¡  W dQ R X dS )zd
        Verifies that cursor methods check whether base class __init__ was
        called.
        c               @   s   e Zd Zdd„ ZdS )z?RegressionTests.CheckCursorConstructorCallCheck.<locals>.Cursorc             S   s   d S )Nr   )r   r   r   r   r	   Ú__init__º   s    zHRegressionTests.CheckCursorConstructorCallCheck.<locals>.Cursor.__init__N)r>   r?   r@   rO   r   r   r   r	   ÚCursor¹   s   rP   z:memory:z
select 4+5Nz$^Base Cursor\.__init__ not called\.$)	r   rP   r   r2   ÚProgrammingErrorr   ÚfetchallÚassertRaisesRegexr   )r   rP   r   r   r   r   r	   ÚCheckCursorConstructorCallCheck´   s    
z/RegressionTests.CheckCursorConstructorCallCheckc             C   s(   G dd„ dt ƒ}| j d|dƒf¡ dS )za
        The Python 3.0 port of the module didn't cope with values of subclasses of str.
        c               @   s   e Zd ZdS )z/RegressionTests.CheckStrSubclass.<locals>.MyStrN)r>   r?   r@   r   r   r   r	   ÚMyStrÉ   s    rU   zselect ?rF   N)r$   r   r   )r   rU   r   r   r	   ÚCheckStrSubclassÅ   s    z RegressionTests.CheckStrSubclassc          	   C   s>   G dd„ dt jƒ}|dƒ}|  t j¡ | ¡ }W dQ R X dS )zh
        Verifies that connection methods check whether base class __init__ was
        called.
        c               @   s   e Zd Zdd„ ZdS )zGRegressionTests.CheckConnectionConstructorCallCheck.<locals>.Connectionc             S   s   d S )Nr   )r   Únamer   r   r	   rO   Ò   s    zPRegressionTests.CheckConnectionConstructorCallCheck.<locals>.Connection.__init__N)r>   r?   r@   rO   r   r   r   r	   Ú
ConnectionÑ   s   rX   z:memory:N)r   rX   r2   rQ   r   )r   rX   r   r   r   r   r	   Ú#CheckConnectionConstructorCallCheckÌ   s    z3RegressionTests.CheckConnectionConstructorCallCheckc          	      sŠ   G ‡ fdd„dt jƒ}G dd„ dt jƒ‰ |dƒ}| ¡ }| d¡ | ddd	d
g¡ | d¡ | ¡  |  t j¡ | 	¡  W dQ R X dS )zœ
        Verifies that subclassed cursor classes are correctly registered with
        the connection object, too.  (fetch-across-rollback problem)
        c                   s   e Zd Z‡ fdd„ZdS )z;RegressionTests.CheckCursorRegistration.<locals>.Connectionc                s   ˆ | ƒS )Nr   )r   )rP   r   r	   r   ß   s    zBRegressionTests.CheckCursorRegistration.<locals>.Connection.cursorN)r>   r?   r@   r   r   )rP   r   r	   rX   Þ   s   rX   c               @   s   e Zd Zdd„ ZdS )z7RegressionTests.CheckCursorRegistration.<locals>.Cursorc             S   s   t j | |¡ d S )N)r   rP   rO   )r   r   r   r   r	   rO   ã   s    z@RegressionTests.CheckCursorRegistration.<locals>.Cursor.__init__N)r>   r?   r@   rO   r   r   r   r	   rP   â   s   rP   z:memory:zcreate table foo(x)zinsert into foo(x) values (?))r&   )é   )r   zselect x from fooN)
r   rX   rP   r   r   r   r   r2   ZInterfaceErrorrR   )r   rX   r   r   r   )rP   r	   ÚCheckCursorRegistrationÙ   s    

z'RegressionTests.CheckCursorRegistrationc             C   s   t jddd}dS )z§
        Verifies that creating a connection in autocommit mode works.
        2.5.3 introduced a regression so that these could no longer
        be created.
        z:memory:N)r<   )r   r   )r   r   r   r   r	   ÚCheckAutoCommitï   s    zRegressionTests.CheckAutoCommitc             C   s4   | j  ¡ }| d¡ | d¡ | d¡ | ¡ }dS )z‡
        Verifies that running a PRAGMA statement that does an autocommit does
        work. This did not work in 2.5.3/2.5.4.
        zcreate table foo(bar)zinsert into foo(bar) values (5)zpragma page_sizeN)r   r   r   r5   )r   r   Úrowr   r   r	   ÚCheckPragmaAutocommit÷   s
    



z%RegressionTests.CheckPragmaAutocommitc             C   s   |   tj| jd¡ dS )z}
        Call a connection with a non-string SQL request: check error handling
        of the statement constructor.
        rD   N)r2   r   ÚWarningr   )r   r   r   r	   ÚCheckConnectionCall  s    z#RegressionTests.CheckConnectionCallc             C   s"   dd„ }|   tj| jjd|¡ d S )Nc             S   s   dS )NrD   r   )ÚaÚbr   r   r	   Úcollation_cb  s    z4RegressionTests.CheckCollation.<locals>.collation_cbu   í²€)r2   r   rQ   r   Zcreate_collation)r   rc   r   r   r	   ÚCheckCollation
  s    zRegressionTests.CheckCollationc          	      sf   t  d¡}| ¡ ‰ ˆ  d¡ ˆ  d¡ ‡ fdd„}|  t j¡ ˆ  ddd„ |ƒ D ƒ¡ W d	Q R X d	S )
zÝ
        http://bugs.python.org/issue10811

        Recursively using a cursor, such as when reusing it from a generator led to segfaults.
        Now we catch recursive cursor usage and raise a ProgrammingError.
        z:memory:zcreate table a (bar)zcreate table b (baz)c               3   s   ˆ   dd¡ dV  d S )Nzinsert into a (bar) values (?))rD   rD   )r   r   )r   r   r	   Úfoo  s    z4RegressionTests.CheckRecursiveCursorUse.<locals>.foozinsert into b (baz) values (?)c             s   s   | ]}|fV  qd S )Nr   )r   r   r   r   r	   ú	<genexpr>$  s    z:RegressionTests.CheckRecursiveCursorUse.<locals>.<genexpr>N)r   r   r   r   r2   rQ   r   )r   r   re   r   )r   r	   ÚCheckRecursiveCursorUse  s    


z'RegressionTests.CheckRecursiveCursorUsec             C   sŠ   t jdt jd}| ¡ }| d¡ | d¡ | d¡ | d¡ dd„ | ¡ D ƒ}|  |t d	d
d
dddd¡t d	d
d
dddd¡g¡ dS )zË
        http://bugs.python.org/issue14720

        The microsecond parsing of convert_timestamp() should pad with zeros,
        since the microsecond string "456" actually represents "456000".
        z:memory:)r   zCREATE TABLE t (x TIMESTAMP)z4INSERT INTO t (x) VALUES ('2012-04-04 15:06:00.456')z:INSERT INTO t (x) VALUES ('2012-04-04 15:06:00.123456789')zSELECT * FROM tc             S   s   g | ]}|d  ‘qS )r   r   )r   r   r   r   r	   r   9  s    zKRegressionTests.CheckConvertTimestampMicrosecondPadding.<locals>.<listcomp>iÜ  rZ   é   é   r   i@õ i@â N)r   r   r.   r   r   rR   r   r/   )r   r   r   Úvaluesr   r   r	   Ú'CheckConvertTimestampMicrosecondPadding&  s    



z7RegressionTests.CheckConvertTimestampMicrosecondPaddingc             C   s   | j ttjddd d S )Nz:memory:é{   )r<   )r2   r9   r   r   )r   r   r   r	   ÚCheckInvalidIsolationLevelType@  s    z.RegressionTests.CheckInvalidIsolationLevelTypec             C   sR   t  d¡}|  t|d¡ |  t|d¡ | ¡ }|  t|jd¡ |  t|jd¡ d S )Nz:memory:z	 select 1z	select 1 z
  select 2z	select 2 )r   r   r2   rK   r   r   )r   r   r   r   r   r	   ÚCheckNullCharacterF  s    
z"RegressionTests.CheckNullCharacterc          
   C   sØ   t  d¡}| d¡ |  |jd¡ d}xžt| d¡ƒD ]Œ\}}| j||dp | d|f¡ | ¡  |dkr~|  |d d¡ n2|dkr˜|  |d d¡ n|d	kr°|  |d d	¡ |d7 }W d
Q R X q6W |  |dd¡ d
S )zÉ
        Connection.commit() did reset cursors, which made sqlite3
        to return rows multiple times when fetched from cursors
        after commit. See issues 10513 and 23129 for details.
        z:memory:z£
        create table t(c);
        create table t2(c);
        insert into t values(0);
        insert into t values(1);
        insert into t values(2);
        r,   r   zselect c from t)r   r]   zinsert into t2(c) values (?)rD   r'   Nr&   z'should have returned exactly three rows)	r   r   Zexecutescriptr   r<   Ú	enumerater   rH   r(   )r   r   Zcounterr   r]   r   r   r	   ÚCheckCommitCursorResetO  s"    
z&RegressionTests.CheckCommitCursorResetc             C   sB   dd„ }t  d¡}t  |¡}t ||¡}| |¡ ~~t ¡  dS )zm
        The interpreter shouldn't crash in case Cursor.__init__() is called
        more than once.
        c              W   s   d S )Nr   )Úargsr   r   r	   Úcallbacks  s    z/RegressionTests.CheckBpo31770.<locals>.callbackz:memory:N)r   r   rP   ÚweakrefÚrefrO   r   Z
gc_collect)r   rr   r   r   rt   r   r   r	   ÚCheckBpo31770n  s    


zRegressionTests.CheckBpo31770c          	   C   s    |   t¡ | j`W d Q R X d S )N)r2   ÚAttributeErrorr   r<   )r   r   r   r	   ÚCheckDelIsolation_levelSegfault~  s    z/RegressionTests.CheckDelIsolation_levelSegfaultN)$r>   r?   r@   r
   r   r   r   r   r!   r%   ÚunittestZskipIfr   Zsqlite_version_infor*   r+   r-   r0   r8   r:   rN   rT   rV   rY   r[   r\   r^   r`   rd   rg   rk   rm   rn   rp   ru   rw   r   r   r   r	   r      s:   
			r   c               @   s"   e Zd ZdZddd„Zdd„ ZdS )ÚUnhashableFuncNc             C   s   d| _ || _d S )Nr   )ÚcallsÚreturn_value)r   r{   r   r   r	   rO   †  s    zUnhashableFunc.__init__c             O   s   |  j d7  _ | jS )NrD   )rz   r{   )r   rq   Úkwargsr   r   r	   Ú__call__Š  s    zUnhashableFunc.__call__)N)r>   r?   r@   Ú__hash__rO   r}   r   r   r   r	   ry   ƒ  s   
ry   c               @   s@   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S )ÚUnhashableCallbacksTestCasez°
    https://bugs.python.org/issue34052

    Registering unhashable callbacks raises TypeError, callbacks are not
    registered in SQLite after such registration attempt.
    c             C   s   t  d¡| _d S )Nz:memory:)r   r   r   )r   r   r   r	   r
   –  s    z!UnhashableCallbacksTestCase.setUpc             C   s   | j  ¡  d S )N)r   r   )r   r   r   r	   r   ™  s    z$UnhashableCallbacksTestCase.tearDownc          	   C   sL   t dd}|  td¡ | j |d¡ W d Q R X | j d¡ |  |j¡ d S )Nr   )r{   zunhashable typerD   zSELECT 1)ry   rS   r9   r   Zset_progress_handlerr   ÚassertFalserz   )r   Úfr   r   r	   Útest_progress_handlerœ  s
    
z1UnhashableCallbacksTestCase.test_progress_handlerc          	   C   st   d}t ƒ }|  td¡ | j |d|¡ W d Q R X d| }|  tj|¡ | j d| ¡ W d Q R X |  |j	¡ d S )NÚ	func_namezunhashable typer   zno such function: %szSELECT %s())
ry   rS   r9   r   Zcreate_functionr   r)   r   r€   rz   )r   rƒ   r   r7   r   r   r	   Ú	test_func£  s    z%UnhashableCallbacksTestCase.test_funcc          	   C   sL   t tjd}|  td¡ | j |¡ W d Q R X | j d¡ |  |j	¡ d S )N)r{   zunhashable typezSELECT 1)
ry   r   ZSQLITE_DENYrS   r9   r   Zset_authorizerr   r€   rz   )r   r   r   r   r	   Útest_authorizer­  s
    z+UnhashableCallbacksTestCase.test_authorizerc          	   C   sz   G dd„ dt ƒ}d}|  td¡ | j |d|ddi ƒ¡ W d Q R X d| }|  tj|¡ | j d	| ¡ W d Q R X d S )
Nc               @   s   e Zd ZdZdS )z=UnhashableCallbacksTestCase.test_aggr.<locals>.UnhashableTypeN)r>   r?   r@   r~   r   r   r   r	   ÚUnhashableTypeµ  s   r†   Ú	aggr_namezunhashable typer   ZAggrr   zno such function: %szSELECT %s())ÚtyperS   r9   r   Zcreate_aggregater   r)   r   )r   r†   r‡   r7   r   r   r	   Ú	test_aggr´  s    "z%UnhashableCallbacksTestCase.test_aggrN)
r>   r?   r@   Ú__doc__r
   r   r‚   r„   r…   r‰   r   r   r   r	   r     s   
r   c              C   s    t  td¡} t  | t  t¡f¡S )NZCheck)rx   Z	makeSuiter   Z	TestSuiter   )Zregression_suiter   r   r	   Úsuite¿  s    r‹   c              C   s   t  ¡ } |  tƒ ¡ d S )N)rx   ZTextTestRunnerÚrunr‹   )Zrunnerr   r   r	   ÚtestÆ  s    r   Ú__main__)r/   rx   Zsqlite3r   rs   r   r   ZTestCaser   ry   r   r‹   r>   r   r   r   r	   Ú<module>   s     g0