a
    åze C  ã                   @   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 d dlm	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)Úsupport)Úpatchc                   @   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   ú-/usr/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   Ú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)é
   ú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   ÚCheckStatementReset8   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   ÚCheckColumnNameWithSpacesG   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   Ú#CheckStatementFinalizationOnCloseDbO   s    

z3RegressionTests.CheckStatementFinalizationOnCloseDb)é   é   r2   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   ÚCheckOnConflictRollback]   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   Ú-CheckWorkaroundForBuggySqliteTransferBindingsl   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
        Ú Nr9   r	   r   r   r   ÚCheckEmptyStatementu   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 (?)r8   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   ÚCheckTypeMapUsage|   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__rE   r   rC   r   r   ÚX   s   rI   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
   rI   r   r   rC   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)rJ   r   r4   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)rJ   Ú	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 )Nr;   ©Úisolation_levelr	   r   r   r   Ú__del__¬   s    zARegressionTests.CheckSetIsolationLevel.<locals>.CustomStr.__del__N)rF   rG   rH   rW   rZ   r   r   r   r   Ú	CustomStr©   s   r[   r   )r;   ÚDEFERREDZ	IMMEDIATEZ	EXCLUSIVE)Úlevelr\   é   r    ÚabczIMMEDIATE EXCLUSIVEõ   Ã©)r/   r   r   rY   ÚsubTestÚlowerÚ
capitalizerU   Ú
ValueErrorrJ   r*   )r
   r[   r]   Ú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   r5   r   r   r   Ú__init__Ë   s    zHRegressionTests.CheckCursorConstructorCallCheck.<locals>.Cursor.__init__N©rF   rG   rH   ri   r   r   r   r   ÚCursorÊ   s   rk   r   z
select 4+5Nz$^Base Cursor\.__init__ not called\.$)	r   rk   r   rJ   ÚProgrammingErrorr   ÚfetchallÚassertRaisesRegexr   )r
   rk   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)rF   rG   rH   r   r   r   r   ÚMyStrÚ   r    rp   zselect ?r_   N)r/   r   r   )r
   rp   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   ri   ã   s    zPRegressionTests.CheckConnectionConstructorCallCheck.<locals>.Connection.__init__Nrj   r   r   r   r   Ú
Connectionâ   s   rs   r   N)r   rs   rJ   rl   r   ©r
   rs   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	   ©rk   r   r   r   ð   s    zBRegressionTests.CheckCursorRegistration.<locals>.Connection.cursorN)rF   rG   rH   r   r   rv   r   r   rs   ï   s   rs   c                   @   s   e Zd Zdd„ ZdS )z7RegressionTests.CheckCursorRegistration.<locals>.Cursorc                 S   s   t j | |¡ d S r   )r   rk   ri   r5   r   r   r   ri   ô   s    z@RegressionTests.CheckCursorRegistration.<locals>.Cursor.__init__Nrj   r   r   r   r   rk   ó   s   rk   r   zcreate table foo(x)zinsert into foo(x) values (?)))r1   )é   )r   zselect x from fooN)
r   rs   rk   r   r   r%   r&   rJ   ZInterfaceErrorrm   rt   r   rv   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   NrX   )r   r   r5   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.
        r7   r=   zpragma page_sizeN)r   r   r   rP   )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)rJ   rU   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   í²€)rJ   r   rl   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>5  r    z:RegressionTests.CheckRecursiveCursorUse.<locals>.<genexpr>N)r   r   r   r   rJ   rl   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   J  r    zKRegressionTests.CheckConvertTimestampMicrosecondPadding.<locals>.<listcomp>iÜ  rw   é   é   r   i@õ i@â N)r   r   r>   r   r   rm   r*   r?   )r
   r   r   Úvaluesr   r   r   Ú'CheckConvertTimestampMicrosecondPadding7  s    



þz7RegressionTests.CheckConvertTimestampMicrosecondPaddingc                 C   s   | j ttjddd d S )Nr   é{   rX   )rJ   rU   r   r   r	   r   r   r   ÚCheckInvalidIsolationLevelTypeQ  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   rJ   rd   r   r   r   r   r   r   ÚCheckNullCharacterW  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);
        r;   r   zselect c from t)r(   rz   zinsert into t2(c) values (?)r^   r2   Nr1   z'should have returned exactly three rows)	r   r   Zexecutescriptr*   rY   Ú	enumerater   ra   r3   )r
   r   Zcounterr(   rz   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   rk   ÚweakrefÚrefri   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   )rJ   ÚAttributeErrorr   rY   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)rF   rG   rH   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)&rF   rG   rH   r   r   r   r   r)   r,   r0   ÚunittestZskipIfr   Zsqlite_version_infor6   r:   r<   r@   rL   rT   rV   rh   ro   rq   ru   rx   ry   r{   r|   r€   r„   rˆ   rŠ   r‹   r   r“   r•   rœ   r   r   r   r   r   "   s@   

			r   c                   @   s8   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ ZdS )ÚRecursiveUseOfCursorsz$Recursive use of cursors not allowedc                 C   s@   t jdt jd| _| j ¡ | _| j d¡ | j dddg¡ d S )Nr   r   zcreate table test(x foo)r"   )r‚   )Zbar)r   r   r   r   r   r   r   r%   r	   r   r   r   r   §  s    ÿÿzRecursiveUseOfCursors.setUpc                 C   s    | j  ¡  | j ¡  | ` | `d S r   )r   r   r   r	   r   r   r   r   ¯  s    

zRecursiveUseOfCursors.tearDownc              	      s~   ‡ fdd„}t  tjd|i¡L ˆ  tjˆ j¡ ˆ j d¡ W d   ƒ n1 sR0    Y  W d   ƒ n1 sp0    Y  d S )Nc                    s   ˆ j  ˆ j¡S r   )r   ri   r   ©r   r	   r   r   Ú<lambda>¶  r    zBRecursiveUseOfCursors.test_recursive_cursor_init.<locals>.<lambda>ZINITz#select x as "x [INIT]", x from test©	r   Údictr   Ú
convertersrn   rl   rS   r   r   ©r
   Úconvr   r	   r   Útest_recursive_cursor_initµ  s    z0RecursiveUseOfCursors.test_recursive_cursor_initc              	      s~   ‡ fdd„}t  tjd|i¡L ˆ  tjˆ j¡ ˆ j d¡ W d   ƒ n1 sR0    Y  W d   ƒ n1 sp0    Y  d S )Nc                    s
   ˆ j  ¡ S r   )r   r   rŸ   r	   r   r   r    ¼  r    zCRecursiveUseOfCursors.test_recursive_cursor_close.<locals>.<lambda>ZCLOSEz$select x as "x [CLOSE]", x from testr¡   r¤   r   r	   r   Útest_recursive_cursor_close»  s    z1RecursiveUseOfCursors.test_recursive_cursor_closec              	      sŒ   g f‡ fdd„	}t  tjd|i¡V ˆ j d¡ ˆ  tjˆ j¡ ˆ j 	¡  W d   ƒ n1 s`0    Y  W d   ƒ n1 s~0    Y  d S )Nc                    s   |rˆ j  ¡ S | d ¡S r   )r   rP   r.   )r   Úlr	   r   r   r    Â  r    zCRecursiveUseOfCursors.test_recursive_cursor_fetch.<locals>.<lambda>ZITERz#select x as "x [ITER]", x from test)
r   r¢   r   r£   r   r   rn   rl   rS   rm   r¤   r   r	   r   Útest_recursive_cursor_fetchÁ  s
    z1RecursiveUseOfCursors.test_recursive_cursor_fetchN)	rF   rG   rH   rS   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)r   Z	makeSuiter   rž   Z	TestSuite)Zregression_suiteZrecursive_cursorr   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unittest.mockr   ZTestCaser   rž   rª   rF   r   r   r   r   Ú<module>   s      &