o
    GXhC                     @   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rCe  dS 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	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-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   A/opt/python-3.10.19/usr/lib/python3.10/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   test_pragma_user_version(   s   
z(RegressionTests.test_pragma_user_versionc                 C   sN   t jdt jd}z| j }|d W |  |  d S |  |  w )Nr   Zdetect_typeszpragma schema_version)r   r   PARSE_COLNAMESr   r   r   r   r
   r   r   r   r   r   test_pragma_schema_version-   s   

z*RegressionTests.test_pragma_schema_versionc                    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  q3   d S )Nr      )Zcached_statementsc                    s   g | ]}   qS r   )r   .0xr   r   r   
<listcomp><       z8RegressionTests.test_statement_reset.<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   ?   s     zselect x from test)r   r   ranger   executemanyrollback)r
   cursorsir   r   r   test_statement_reset7   s    z$RegressionTests.test_statement_resetc                 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   test_column_name_with_spacesF   s
   


z,RegressionTests.test_column_name_with_spacesc                 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   'test_statement_finalization_on_close_dbN   s   

z7RegressionTests.test_statement_finalization_on_close_dbc                 C   s|   t d}|d |d z|d W n
 t jy    Y nw |d z|  W d S  t jy=   | d Y d S w )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   test_on_conflict_rollback\   s   



z)RegressionTests.test_on_conflict_rollbackc                 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   2test_workaround_for_buggy_sqlite_transfer_bindingsj   s   zBRegressionTests.test_workaround_for_buggy_sqlite_transfer_bindingsc                 C   s   | j d dS )z
        pysqlite used to segfault with SQLite versions 3.5.x. These return NULL
        for "no-operation" statements
         Nr7   r	   r   r   r   test_empty_statements   s   z$RegressionTests.test_empty_statementc                 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 (?)r6   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   test_type_map_usagez   s   



z#RegressionTests.test_type_map_usagec                    sr   G  fddd}| dg t jdt jd}|d | t |d  W d    d S 1 s2w   Y  d S )Nc                          e Zd Z fddZdS )z2RegressionTests.test_bind_mutating_list.<locals>.Xc                    s       dS )Nz...)clear)r
   protocolZ
parametersr   r   __conform__   s   z>RegressionTests.test_bind_mutating_list.<locals>.X.__conform__N)__name__
__module____qualname__rC   r   rB   r   r   X       rG   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
   rG   r   r   rB   r   test_bind_mutating_list   s   

"z'RegressionTests.test_bind_mutating_listc                 C   sd   |  tj}| jdttdgf  W d    n1 s w   Y  d}| |t	|j
 d S )Nz"select 'xxx' || ? || 'yyy' colname   z9Could not decode to UTF-8 column 'colname' with text 'xxx)rI   r   r2   r   r   bytes	bytearrayfetchoneZassertInr/   	exception)r
   cmmsgr   r   r   test_error_msg_decode_error   s   z+RegressionTests.test_error_msg_decode_errorc                 C   s   |  ttji d dS )z!
        See issue 3312.
        N)rI   	TypeErrorr   Zregister_adapterr	   r   r   r   test_register_adapter   s   z%RegressionTests.test_register_adapterc              
      s(  G  fdddt }td d  _dD ]*}| j|d | _|  _|  _|| _W d    n1 s9w   Y  qd  _d _dtfdtfd	tfd
tfdtfg}|D ]9\}}| j|d' | 	| | _W d    n1 svw   Y  | 
 jd W d    n1 sw   Y  qXd S )Nc                       s    e Zd Zdd Z fddZdS )z;RegressionTests.test_set_isolation_level.<locals>.CustomStrc                 S      d S r   r   r	   r   r   r   upper      zARegressionTests.test_set_isolation_level.<locals>.CustomStr.upperc                    s
   d _ d S )Nr9   isolation_levelr	   r   r   r   __del__   s   
zCRegressionTests.test_set_isolation_level.<locals>.CustomStr.__del__N)rD   rE   rF   rW   r[   r   r   r   r   	CustomStr   s    r\   r   )r9   DEFERREDZ	IMMEDIATEZ	EXCLUSIVE)levelr]          abczIMMEDIATE EXCLUSIVE   é)r/   r   r   rZ   subTestlower
capitalizerT   
ValueErrorrI   r*   )r
   r\   r^   pairsvalueexcr   r   r   test_set_isolation_level   s2   


z(RegressionTests.test_set_isolation_levelc                 C   s   G dd dt j}t d}||}| t j |d  W d   n1 s*w   Y  | t jd |  W d   dS 1 sFw   Y  dS )zd
        Verifies that cursor methods check whether base class __init__ was
        called.
        c                   @      e Zd Zdd ZdS )zBRegressionTests.test_cursor_constructor_call_check.<locals>.Cursorc                 S   rV   r   r   r3   r   r   r   __init__   rX   zKRegressionTests.test_cursor_constructor_call_check.<locals>.Cursor.__init__NrD   rE   rF   rl   r   r   r   r   Cursor       rn   r   z
select 4+5Nz$^Base Cursor\.__init__ not called\.$)	r   rn   r   rI   ProgrammingErrorr   fetchallassertRaisesRegexr   )r
   rn   r   r   r   r   r   "test_cursor_constructor_call_check   s   

"z2RegressionTests.test_cursor_constructor_call_checkc                 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 )z0RegressionTests.test_str_subclass.<locals>.MyStrN)rD   rE   rF   r   r   r   r   MyStr   s    rt   zselect ?ra   N)r/   r   r   )r
   rt   r   r   r   test_str_subclass   s   z!RegressionTests.test_str_subclassc                 C   sT   G dd dt j}|d}| t j | }W d   dS 1 s#w   Y  dS )zh
        Verifies that connection methods check whether base class __init__ was
        called.
        c                   @   rk   )zJRegressionTests.test_connection_constructor_call_check.<locals>.Connectionc                 S   rV   r   r   )r
   namer   r   r   rl      rX   zSRegressionTests.test_connection_constructor_call_check.<locals>.Connection.__init__Nrm   r   r   r   r   
Connection   ro   rw   r   N)r   rw   rI   rp   r   r
   rw   r   r   r   r   r   &test_connection_constructor_call_check   s
   
"z6RegressionTests.test_connection_constructor_call_checkc                    s   G  fdddt j}G dd dt j |d}| }|d |dg d |d	 |  | t j |	  W d
   d
S 1 sHw   Y  d
S )z
        Verifies that subclassed cursor classes are correctly registered with
        the connection object, too.  (fetch-across-rollback problem)
        c                       r?   )z<RegressionTests.test_cursor_registration.<locals>.Connectionc                    s    | S r   r   r	   rn   r   r   r      s   zCRegressionTests.test_cursor_registration.<locals>.Connection.cursorN)rD   rE   rF   r   r   rz   r   r   rw      rH   rw   c                   @   rk   )z8RegressionTests.test_cursor_registration.<locals>.Cursorc                 S   s   t j| | d S r   )r   rn   rl   r3   r   r   r   rl      s   zARegressionTests.test_cursor_registration.<locals>.Cursor.__init__Nrm   r   r   r   r   rn      ro   rn   r   zcreate table foo(x)zinsert into foo(x) values (?)))   )   )r   zselect x from fooN)
r   rw   rn   r   r   r%   r&   rI   ZInterfaceErrorrq   rx   r   rz   r   test_cursor_registration   s   


"z(RegressionTests.test_cursor_registrationc                 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   NrY   )r   r   r3   r   r   r   test_auto_commit   s   z RegressionTests.test_auto_commitc                 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.
        r5   r;   zpragma page_sizeN)r   r   r   rO   )r
   r   rowr   r   r   test_pragma_autocommit  s
   



z&RegressionTests.test_pragma_autocommitc                 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)rI   rT   r   r	   r   r   r   test_connection_call  s   z$RegressionTests.test_connection_callc                 C   s"   dd }|  tj| jjd| d S )Nc                 S   s   dS )Nr_   r   )abr   r   r   collation_cb  rX   z4RegressionTests.test_collation.<locals>.collation_cbu   )rI   r   rp   r   Zcreate_collation)r
   r   r   r   r   test_collation  s   zRegressionTests.test_collationc                    s|   t d}|   d  d  fdd}| t j  ddd | D  W d	   d	S 1 s7w   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   
z6RegressionTests.test_recursive_cursor_use.<locals>.foozinsert into b (baz) values (?)c                 s   s    | ]}|fV  qd S r   r   )r   r(   r   r   r   	<genexpr>3  s    z<RegressionTests.test_recursive_cursor_use.<locals>.<genexpr>N)r   r   r   r   rI   rp   r%   )r
   r   r   r   r   r   test_recursive_cursor_use   s   


"z)RegressionTests.test_recursive_cursor_usec                 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   H  r    zNRegressionTests.test_convert_timestamp_microsecond_padding.<locals>.<listcomp>i  r|         r   i@ i@ N)r   r   r<   r   r   rq   r*   r=   )r
   r   r   valuesr   r   r   *test_convert_timestamp_microsecond_padding5  s   




z:RegressionTests.test_convert_timestamp_microsecond_paddingc                 C   s   | j ttjddd d S )Nr   {   rY   )rI   rT   r   r   r	   r   r   r   !test_invalid_isolation_level_typeO  s   
z1RegressionTests.test_invalid_isolation_level_typec                 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   rI   rf   r   r   r   r   r   r   test_null_characterU  s   
z#RegressionTests.test_null_characterc              	   C   s   t d}|d | |jd d}t|dD ]P\}}| j||d= |d|f |  |dkr>| |d d n|dkrK| |d d n|d	krW| |d d	 |d7 }W d
   n1 sew   Y  q| |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);
        r9   r   zselect c from t)r(   r   zinsert into t2(c) values (?)r_      Nr{   z'should have returned exactly three rows)	r   r   Zexecutescriptr*   rZ   	enumerater   rc   r1   )r
   r   Zcounterr(   r   r   r   r   test_commit_cursor_reset^  s$   



z(RegressionTests.test_commit_cursor_resetc                 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   rV   r   r   )argsr   r   r   callback  rX   z/RegressionTests.test_bpo31770.<locals>.callbackr   N)r   r   rn   weakrefrefrl   r   
gc_collect)r
   r   r   r   r   r   r   r   test_bpo31770}  s   


zRegressionTests.test_bpo31770c                 C   s6   |  t | j`W d    d S 1 sw   Y  d S r   )rI   AttributeErrorr   rZ   r	   r   r   r   !test_del_isolation_level_segfault  s   "z1RegressionTests.test_del_isolation_level_segfaultc                 C   sf   G dd d}| j jtj| j jdd| j jfD ]}| }||j ||j | j d |d  qd S )Nc                   @   rk   )z.RegressionTests.test_bpo37347.<locals>.Printerc                 W   s   t jS r   )r   Z	SQLITE_OK)r
   r   r   r   r   log  s   z2RegressionTests.test_bpo37347.<locals>.Printer.logN)rD   rE   rF   r   r   r   r   r   Printer  ro   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   test_bpo37347  s   


zRegressionTests.test_bpo37347c                 C   s(   | j d}| d }| |d d S )Nz
select X''r   r`   )r   r   rO   r*   )r
   r   valr   r   r   test_return_empty_bytestring  s   z,RegressionTests.test_return_empty_bytestringN)#rD   rE   rF   r   r   r   r   r)   r,   r0   r4   r8   r:   r>   rK   rS   rU   rj   rs   ru   ry   r}   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   !   sB    
			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              	          fdd}t tjd|i/  tj j  jd W d    n1 s)w   Y  W d    d S W d    d S 1 sAw   Y  d S )Nc                    s    j  jS r   )r   rl   r   r   r	   r   r   <lambda>  s    zBRecursiveUseOfCursors.test_recursive_cursor_init.<locals>.<lambda>ZINITz#select x as "x [INIT]", x from test	r   dictr   
convertersrr   rp   rR   r   r   r
   convr   r	   r   test_recursive_cursor_init     "z0RecursiveUseOfCursors.test_recursive_cursor_initc              	      r   )Nc                    s
    j  S r   )r   r   r   r	   r   r   r     s   
 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  r   z1RecursiveUseOfCursors.test_recursive_cursor_closec              	      s   g f fdd	}t tjd|i4  jd  tj j  j	  W d    n1 s0w   Y  W d    d S W d    d S 1 sHw   Y  d S )Nc                    s   |r j  S |d S r   )r   rO   r.   )r   lr	   r   r   r     s    zCRecursiveUseOfCursors.test_recursive_cursor_fetch.<locals>.<lambda>ZITERz#select x as "x [ITER]", x from test)
r   r   r   r   r   r   rr   rp   rR   rq   r   r   r	   r   test_recursive_cursor_fetch  s   "z1RecursiveUseOfCursors.test_recursive_cursor_fetchN)	rD   rE   rF   rR   r   r   r   r   r   r   r   r   r   r     s    r   c                  C   s   t tg} tdd | D S )Nc                 S   s   g | ]	}t  |qS r   )unittestZ
TestLoaderZloadTestsFromTestCase)r   tr   r   r   r     s    zsuite.<locals>.<listcomp>)r   r   r   Z	TestSuite)Ztestsr   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   rD   r   r   r   r   <module>   s"      $	
