a
    	¼3jè<  ã                   @   sh   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 G dd„ dejƒZ	dd„ Z
dd„ Zed	krdeƒ  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=d>„ Z$d?d@„ Z%dAS )BÚRegressionTestsc                 C   s   t  d¡| _d S )Nú:memory:)ÚsqliteÚconnectÚcon©Úself© r
   úS/www/server/python_manager/versions/3.9.10/lib/python3.9/sqlite3/test/regression.pyÚsetUp    s    zRegressionTests.setUpc                 C   s   | j  ¡  d S ©N)r   Úcloser   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   sP   t jdt jd}z(| j ¡ }| d¡ W | ¡  | ¡  n| ¡  | ¡  0 d S )Nr   ©Z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¡ tdƒD ]"}|d  d	d
d„ tdƒD ƒ¡ q:tdƒD ]}||  d| d ¡ qfˆ  ¡  d S )Nr   é   )Zcached_statementsc                    s   g | ]}ˆ   ¡ ‘qS r
   )r   ©Ú.0Úx©r   r
   r   Ú
<listcomp>:   ó    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   ú zselect x from test)r   r   Úranger   ÚexecutemanyÚrollback)r	   ÚcursorsÚir
   r   r   ÚCheckStatementReset5   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 bar [datetime]zselect 1 as "foo baz"zfoo baz)r   r   r   ÚassertEqualÚdescriptionr   r
   r
   r   ÚCheckColumnNameWithSpacesD   s
    


z)RegressionTests.CheckColumnNameWithSpacesc                 C   sL   t  d¡}g }tdƒD ](}| ¡ }| |¡ | dt|ƒ ¡ q| ¡  d S )Nr   éi   zselect 1 x union select )r   r   r!   r   Úappendr   Ústrr   )r	   r   r$   r%   r   r
   r
   r   Ú#CheckStatementFinalizationOnCloseDbL   s    

z3RegressionTests.CheckStatementFinalizationOnCloseDb)é   é   r/   zneeds sqlite 3.2.2 or newerc                 C   s|   t  d¡}| d¡ | d¡ z| d¡ W n t jy@   Y n0 | d¡ z| ¡  W n t jyv   |  d¡ Y n0 d S )Nr   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   ÚCheckOnConflictRollbackZ   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.
        úcreate table foo(bar)údrop table fooN©r   r   r   r
   r
   r   Ú-CheckWorkaroundForBuggySqliteTransferBindingsi   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
        Ú Nr6   r   r
   r
   r   ÚCheckEmptyStatementr   s    z#RegressionTests.CheckEmptyStatementc                 C   sp   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 foor   r   zcreate table foo(bar timestamp)zinsert into foo(bar) values (?)r5   zcreate table foo(bar integer)úinsert into foo(bar) values (5)N)r   r   ÚPARSE_DECLTYPESr   ÚdatetimeZnowr   )r	   ZSELECTr   r
   r
   r   ÚCheckTypeMapUsagey   s    



z!RegressionTests.CheckTypeMapUsagec                    sp   G ‡ fdd„dƒ}|ƒ dg‰ t jdt jd}| d¡ |  t¡ | dˆ ¡ W d   ƒ n1 sb0    Y  d S )Nc                       s   e Zd Z‡ fdd„ZdS )z0RegressionTests.CheckBindMutatingList.<locals>.Xc                    s   ˆ   ¡  dS )Nz...)Úclear)r	   Úprotocol©Ú
parametersr
   r   Ú__conform__‹   s    z<RegressionTests.CheckBindMutatingList.<locals>.X.__conform__N)Ú__name__Ú
__module__Ú__qualname__rB   r
   r@   r
   r   ÚXŠ   s   rF   r   r   r   z$create table foo(bar X, baz integer)z'insert into foo(bar, baz) values (?, ?))r   r   r;   r   ÚassertRaisesÚ
IndexError)r	   rF   r   r
   r@   r   ÚCheckBindMutatingListˆ   s    

z%RegressionTests.CheckBindMutatingListc                 C   sd   |   tj¡.}| j dttdgƒƒf¡ ¡  W d   ƒ n1 s@0    Y  d}|  |t	|j
ƒ¡ d S )Nz"select 'xxx' || ? || 'yyy' colnameéú   z9Could not decode to UTF-8 column 'colname' with text 'xxx)rG   r   r1   r   r   ÚbytesÚ	bytearrayÚfetchoneZ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)rG   Ú	TypeErrorr   Zregister_adapterr   r
   r
   r   ÚCheckRegisterAdapterž   s    z$RegressionTests.CheckRegisterAdapterc              
      s*  G ‡ fdd„dt ƒ}t d¡‰ d ˆ _dD ]T}| j|d4 |ˆ _| ¡ ˆ _| ¡ ˆ _||ƒˆ _W d   ƒ q(1 sr0    Y  q(d ˆ _dˆ _dtfdtfd	tfd
tfdtfg}|D ]t\}}| j|dN |  	|¡ |ˆ _W d   ƒ n1 sì0    Y  |  
ˆ jd¡ W d   ƒ q°1 s0    Y  q°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 r   r
   r   r
   r
   r   Úupper§   s    z?RegressionTests.CheckSetIsolationLevel.<locals>.CustomStr.upperc                    s
   dˆ _ d S )Nr8   ©Úisolation_levelr   r   r
   r   Ú__del__©   s    zARegressionTests.CheckSetIsolationLevel.<locals>.CustomStr.__del__N)rC   rD   rE   rT   rW   r
   r   r
   r   Ú	CustomStr¦   s   rX   r   )r8   ÚDEFERREDZ	IMMEDIATEZ	EXCLUSIVE)ÚlevelrY   é   r   ÚabczIMMEDIATE EXCLUSIVEõ   Ã©)r,   r   r   rV   ÚsubTestÚlowerÚ
capitalizerR   Ú
ValueErrorrG   r'   )r	   rX   rZ   ÚpairsÚvalueÚexcr
   r   r   ÚCheckSetIsolationLevel¤   s&    


*þ$z&RegressionTests.CheckSetIsolationLevelc                 C   s˜   G dd„ dt jƒ}t  d¡}||ƒ}|  t j¡ | d¡ ¡  W d  ƒ n1 sT0    Y  |  t jd¡ | ¡  W d  ƒ n1 sŠ0    Y  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 r   r
   r2   r
   r
   r   Ú__init__È   s    zHRegressionTests.CheckCursorConstructorCallCheck.<locals>.Cursor.__init__N©rC   rD   rE   rf   r
   r
   r
   r   ÚCursorÇ   s   rh   r   z
select 4+5Nz$^Base Cursor\.__init__ not called\.$)	r   rh   r   rG   ÚProgrammingErrorr   ÚfetchallZassertRaisesRegexr   )r	   rh   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)rC   rD   rE   r
   r
   r
   r   ÚMyStr×   r   rl   zselect ?r\   N)r,   r   r   )r	   rl   r
   r
   r   ÚCheckStrSubclassÓ   s    z RegressionTests.CheckStrSubclassc                 C   sR   G dd„ dt jƒ}|dƒ}|  t j¡ | ¡ }W d  ƒ n1 sD0    Y  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 r   r
   )r	   Únamer
   r
   r   rf   à   s    zPRegressionTests.CheckConnectionConstructorCallCheck.<locals>.Connection.__init__Nrg   r
   r
   r
   r   Ú
Connectionß   s   ro   r   N)r   ro   rG   ri   r   ©r	   ro   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g d¢¡ | d	¡ | ¡  |  t j¡ | 	¡  W d
  ƒ n1 sŽ0    Y  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 r   r
   r   ©rh   r
   r   r   í   s    zBRegressionTests.CheckCursorRegistration.<locals>.Connection.cursorN)rC   rD   rE   r   r
   rr   r
   r   ro   ì   s   ro   c                   @   s   e Zd Zdd„ ZdS )z7RegressionTests.CheckCursorRegistration.<locals>.Cursorc                 S   s   t j | |¡ d S r   )r   rh   rf   r2   r
   r
   r   rf   ñ   s    z@RegressionTests.CheckCursorRegistration.<locals>.Cursor.__init__Nrg   r
   r
   r
   r   rh   ð   s   rh   r   zcreate table foo(x)zinsert into foo(x) values (?)))r.   )é   )r   zselect x from fooN)
r   ro   rh   r   r   r"   r#   rG   ZInterfaceErrorrj   rp   r
   rr   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.
        r   NrU   )r   r   r2   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.
        r4   r:   zpragma page_sizeN)r   r   r   rM   )r	   r   Úrowr
   r
   r   ÚCheckPragmaAutocommit  s
    



z%RegressionTests.CheckPragmaAutocommitc                 C   s   |   t| jd¡ dS )z}
        Call a connection with a non-string SQL request: check error handling
        of the statement constructor.
        r[   N)rG   rR   r   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 )Nr[   r
   )ÚaÚbr
   r
   r   Úcollation_cb  s    z4RegressionTests.CheckCollation.<locals>.collation_cbu   í²€)rG   r   ri   r   Zcreate_collation)r	   r{   r
   r
   r   ÚCheckCollation  s    þzRegressionTests.CheckCollationc                    sz   t  d¡}| ¡ ‰ ˆ  d¡ ˆ  d¡ ‡ fdd„}|  t j¡( ˆ  ddd„ |ƒ D ƒ¡ W d	  ƒ n1 sl0    Y  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.
        r   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 (?))r[   r[   )r   r
   ©r   r
   r   Úfoo,  s    z4RegressionTests.CheckRecursiveCursorUse.<locals>.foozinsert into b (baz) values (?)c                 s   s   | ]}|fV  qd S r   r
   )r   r%   r
   r
   r   Ú	<genexpr>2  r   z:RegressionTests.CheckRecursiveCursorUse.<locals>.<genexpr>N)r   r   r   r   rG   ri   r"   )r	   r   r~   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".
        r   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   G  r   zKRegressionTests.CheckConvertTimestampMicrosecondPadding.<locals>.<listcomp>iÜ  rs   é   é   r   i@õ i@â N)r   r   r;   r   r   rj   r'   r<   )r	   r   r   Úvaluesr
   r
   r   Ú'CheckConvertTimestampMicrosecondPadding4  s    



þz7RegressionTests.CheckConvertTimestampMicrosecondPaddingc                 C   s   | j ttjddd d S )Nr   é{   rU   )rG   rR   r   r   r   r
   r
   r   ÚCheckInvalidIsolationLevelTypeN  s    ÿz.RegressionTests.CheckInvalidIsolationLevelTypec                 C   sR   t  d¡}|  t|d¡ |  t|d¡ | ¡ }|  t|jd¡ |  t|jd¡ d S )Nr   z	 select 1z	select 1 z
  select 2z	select 2 )r   r   rG   ra   r   r   r   r
   r
   r   ÚCheckNullCharacterT  s    
z"RegressionTests.CheckNullCharacterc              	   C   sè   t  d¡}| d¡ |  |jd¡ d}t| d¡ƒD ] \}}| j||dz | d|f¡ | ¡  |dkr||  |d d¡ n2|dkr–|  |d d¡ n|d	kr®|  |d d	¡ |d7 }W d
  ƒ q41 sÊ0    Y  q4|  |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.
        r   z£
        create table t(c);
        create table t2(c);
        insert into t values(0);
        insert into t values(1);
        insert into t values(2);
        r8   r   zselect c from t)r%   rv   zinsert into t2(c) values (?)r[   r/   Nr.   z'should have returned exactly three rows)	r   r   Zexecutescriptr'   rV   Ú	enumerater   r^   r0   )r	   r   Zcounterr%   rv   r
   r
   r   ÚCheckCommitCursorReset]  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 r   r
   )Úargsr
   r
   r   Úcallback  s    z/RegressionTests.CheckBpo31770.<locals>.callbackr   N)r   r   rh   ÚweakrefÚrefrf   r   Ú
gc_collect)r	   r‹   r   r   r   r
   r
   r   ÚCheckBpo31770|  s    


zRegressionTests.CheckBpo31770c                 C   s4   |   t¡ | j`W d   ƒ n1 s&0    Y  d S r   )rG   ÚAttributeErrorr   rV   r   r
   r
   r   ÚCheckDelIsolation_levelSegfaultŒ  s    z/RegressionTests.CheckDelIsolation_levelSegfaultc                 C   sf   G dd„ dƒ}| j jtj| j jdd| j jfD ]2}|ƒ }||jƒ ||jƒ | j  d¡ |d ƒ q.d S )Nc                   @   s   e Zd Zdd„ ZdS )z.RegressionTests.CheckBpo37347.<locals>.Printerc                 W   s   t jS r   )r   Z	SQLITE_OK)r	   rŠ   r
   r
   r   Úlog’  s    z2RegressionTests.CheckBpo37347.<locals>.Printer.logN)rC   rD   rE   r’   r
   r
   r
   r   ÚPrinter‘  s   r“   r[   )Únzselect 1)r   Zset_trace_callbackÚ	functoolsÚpartialZset_progress_handlerZset_authorizerr’   r   )r	   r“   ÚmethodZprinter_instancer
   r
   r   ÚCheckBpo37347  s    þ

zRegressionTests.CheckBpo37347N)&rC   rD   rE   r   r   r   r   r&   r)   r-   ÚunittestZskipIfr   Zsqlite_version_infor3   r7   r9   r=   rI   rQ   rS   re   rk   rm   rq   rt   ru   rw   rx   r|   r€   r„   r†   r‡   r‰   r   r‘   r˜   r
   r
   r
   r   r      s@   

			r   c                  C   s   t  td¡} t  | f¡S )NZCheck)r™   Z	makeSuiter   Z	TestSuite)Zregression_suiter
   r
   r   Úsuite   s    ÿrš   c                  C   s   t  ¡ } |  tƒ ¡ d S r   )r™   ZTextTestRunnerÚrunrš   )Zrunnerr
   r
   r   Útest¦  s    rœ   Ú__main__)r<   r™   Zsqlite3r   rŒ   r•   rœ   r   ZTestCaser   rš   rC   r
   r
   r
   r   Ú<module>   s      