B
    18™\š@  ã               @   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   ú[/oak/stanford/groups/akundaje/marinovg/programs/Python-3.7.3/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   Ú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   ÚDatabaseErrorÚcommitÚOperationalErrorÚ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   ÚdatetimeÚ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ÚfetchoneÚassertInr%   Ú	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)r6   Ú	TypeErrorr   Ú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__rB   rD   r   )r   r   r	   Ú	CustomStr˜   s   rH   z:memory:)r/   ÚDEFERREDZ	IMMEDIATEZ	EXCLUSIVE)ÚlevelrI   é   ó    ÚabczIMMEDIATE EXCLUSIVEõ   Ã©)r%   r   r   rC   ÚsubTestÚlowerÚ
capitalizer?   Ú
ValueErrorr6   r    )r   rH   rJ   Ú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)rE   rF   rG   rW   r   r   r   r	   ÚCursor¹   s   rX   z:memory:z
select 4+5Nz$^Base Cursor\.__init__ not called\.$)	r   rX   r   r6   ÚProgrammingErrorr   ÚfetchallÚassertRaisesRegexr   )r   rX   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)rE   rF   rG   r   r   r   r	   ÚMyStrÉ   s    r]   zselect ?rM   N)r%   r   r   )r   r]   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	   rW   Ò   s    zPRegressionTests.CheckConnectionConstructorCallCheck.<locals>.Connection.__init__N)rE   rF   rG   rW   r   r   r   r	   Ú
ConnectionÑ   s   r`   z:memory:N)r   r`   r6   rY   r   )r   r`   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   )rX   r   r	   r   ß   s    zBRegressionTests.CheckCursorRegistration.<locals>.Connection.cursorN)rE   rF   rG   r   r   )rX   r   r	   r`   Þ   s   r`   c               @   s   e Zd Zdd„ ZdS )z7RegressionTests.CheckCursorRegistration.<locals>.Cursorc             S   s   t j | |¡ d S )N)r   rX   rW   )r   r   r   r   r	   rW   ã   s    z@RegressionTests.CheckCursorRegistration.<locals>.Cursor.__init__N)rE   rF   rG   rW   r   r   r   r	   rX   â   s   rX   z:memory:zcreate table foo(x)zinsert into foo(x) values (?))r'   )é   )r   zselect x from fooN)
r   r`   rX   r   r   r   r   r6   ÚInterfaceErrorrZ   )r   r`   r   r   r   )rX   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)rC   )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   r9   )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.
        rK   N)r6   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 )NrK   r   )ÚaÚbr   r   r	   Úcollation_cb  s    z4RegressionTests.CheckCollation.<locals>.collation_cbu   í²€)r6   r   rY   r   Úcreate_collation)r   rl   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 (?))rK   rK   )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   r6   rY   r   )r   r   ro   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Ü  rb   é   é   r   i@õ i@â N)r   r   r1   r   r   rZ   r    r2   )r   r   r   Úvaluesr   r   r	   Ú'CheckConvertTimestampMicrosecondPadding&  s    



z7RegressionTests.CheckConvertTimestampMicrosecondPaddingc             C   s   | j ttjddd d S )Nz:memory:é{   )rC   )r6   r?   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   r6   rR   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   rf   zinsert into t2(c) values (?)rK   r(   Nr'   z'should have returned exactly three rows)	r   r   Úexecutescriptr    rC   Ú	enumerater   rO   r*   )r   r   Zcounterr   rf   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   rX   ÚweakrefÚrefrW   r   Ú
gc_collect)r   r}   r   r   r   r   r   r	   ÚCheckBpo31770n  s    


zRegressionTests.CheckBpo31770c          	   C   s    |   t¡ | j`W d Q R X d S )N)r6   ÚAttributeErrorr   rC   )r   r   r   r	   ÚCheckDelIsolation_levelSegfault~  s    z/RegressionTests.CheckDelIsolation_levelSegfaultN)$rE   rF   rG   r
   r   r   r   r   r"   r&   ÚunittestÚskipIfr   Úsqlite_version_infor-   r.   r0   r4   r>   rA   rV   r\   r^   ra   rd   re   rg   ri   rn   rq   ru   rw   rx   r{   r   rƒ   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	   rW   †  s    zUnhashableFunc.__init__c             O   s   |  j d7  _ | jS )NrK   )rˆ   r‰   )r   r|   Úkwargsr   r   r	   Ú__call__Š  s    zUnhashableFunc.__call__)N)rE   rF   rG   Ú__hash__rW   r‹   r   r   r   r	   r‡   ƒ  s   
r‡   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 typerK   zSELECT 1)r‡   r[   r?   r   Úset_progress_handlerr   ÚassertFalserˆ   )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())
r‡   r[   r?   r   Úcreate_functionr   r+   r   r   rˆ   )r   r’   r   r=   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)
r‡   r   ÚSQLITE_DENYr[   r?   r   Úset_authorizerr   r   rˆ   )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)rE   rF   rG   rŒ   r   r   r   r	   ÚUnhashableTypeµ  s   r˜   Ú	aggr_namezunhashable typer   ZAggrr   zno such function: %szSELECT %s())Útyper[   r?   r   Úcreate_aggregater   r+   r   )r   r˜   r™   r=   r   r   r	   Ú	test_aggr´  s    "z%UnhashableCallbacksTestCase.test_aggrN)
rE   rF   rG   Ú__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 )NÚCheck)r„   Ú	makeSuiter   Ú	TestSuiter   )Zregression_suiter   r   r	   Úsuite¿  s    r¡   c              C   s   t  ¡ } |  tƒ ¡ d S )N)r„   ÚTextTestRunnerÚrunr¡   )Úrunnerr   r   r	   ÚtestÆ  s    r¥   Ú__main__)r2   r„   Úsqlite3r   r~   r¥   r   ÚTestCaser   r‡   r   r¡   rE   r   r   r   r	   Ú<module>   s     g0