B
    ͦZ^@                 @   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   A/work/yifan.wang/lscsoft/opt/python37/lib/python3.7/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 qW 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}xt|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