o
    gW=                     @   sl   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r4e  dS 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	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
   M/Users/admin/.pyenv/versions/3.10.0/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   Z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>9       z8RegressionTests.test_statement_reset.<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   <   s     zselect x from test)r   r   ranger   executemanyrollback)r	   cursorsir
   r   r   test_statement_reset4   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_spacesC   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_dbK   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_rollbackY   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_bindingsg   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
         Nr4   r   r
   r
   r   test_empty_statementp   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 (?)r3   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_usagew   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__r@   r
   r?   r
   r   X       rD   r   r   r   z$create table foo(bar X, baz integer)z'insert into foo(bar, baz) values (?, ?))r   r   r9   r   assertRaises
IndexError)r	   rD   r   r
   r?   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)rF   r   r/   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)rF   	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    q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    qX1 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 )Nr6   isolation_levelr   r   r
   r   __del__   s   
zCRegressionTests.test_set_isolation_level.<locals>.CustomStr.__del__N)rA   rB   rC   rT   rX   r
   r   r
   r   	CustomStr   s    rY   r   )r6   DEFERREDZ	IMMEDIATEZ	EXCLUSIVE)levelrZ          abczIMMEDIATE EXCLUSIVE   é)r,   r   r   rW   subTestlower
capitalizerQ   
ValueErrorrF   r'   )r	   rY   r[   pairsvalueexcr
   r   r   test_set_isolation_level   s.   


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   rS   r   r
   r0   r
   r
   r   __init__   rU   zKRegressionTests.test_cursor_constructor_call_check.<locals>.Cursor.__init__NrA   rB   rC   ri   r
   r
   r
   r   Cursor       rk   r   z
select 4+5Nz$^Base Cursor\.__init__ not called\.$)	r   rk   r   rF   ProgrammingErrorr   fetchallZassertRaisesRegexr   )r	   rk   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)rA   rB   rC   r
   r
   r
   r   MyStr   s    rp   zselect ?r^   N)r,   r   r   )r	   rp   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                   @   rh   )zJRegressionTests.test_connection_constructor_call_check.<locals>.Connectionc                 S   rS   r   r
   )r	   namer
   r
   r   ri      rU   zSRegressionTests.test_connection_constructor_call_check.<locals>.Connection.__init__Nrj   r
   r
   r
   r   
Connection   rl   rs   r   N)r   rs   rF   rm   r   r	   rs   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   rk   r
   r   r      s   zCRegressionTests.test_cursor_registration.<locals>.Connection.cursorN)rA   rB   rC   r   r
   rv   r
   r   rs      rE   rs   c                   @   rh   )z8RegressionTests.test_cursor_registration.<locals>.Cursorc                 S   s   t j| | d S r   )r   rk   ri   r0   r
   r
   r   ri      s   zARegressionTests.test_cursor_registration.<locals>.Cursor.__init__Nrj   r
   r
   r
   r   rk      rl   rk   r   zcreate table foo(x)zinsert into foo(x) values (?)))   )   )r   zselect x from fooN)
r   rs   rk   r   r   r"   r#   rF   ZInterfaceErrorrn   rt   r
   rv   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   NrV   )r   r   r0   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.
        r2   r8   zpragma page_sizeN)r   r   r   rL   )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)rF   rQ   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  rU   z4RegressionTests.test_collation.<locals>.collation_cbu   )rF   r   rm   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>0  s    z<RegressionTests.test_recursive_cursor_use.<locals>.<genexpr>N)r   r   r   r   rF   rm   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   E  r   zNRegressionTests.test_convert_timestamp_microsecond_padding.<locals>.<listcomp>i  rx         r   i@ i@ N)r   r   r9   r   r   rn   r'   r:   )r	   r   r   valuesr
   r
   r   *test_convert_timestamp_microsecond_padding2  s   




z:RegressionTests.test_convert_timestamp_microsecond_paddingc                 C   s   | j ttjddd d S )Nr   {   rV   )rF   rQ   r   r   r   r
   r
   r   !test_invalid_isolation_level_typeL  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   rF   rc   r   r   r   r
   r
   r   test_null_characterR  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
   q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);
        r6   r   zselect c from t)r%   r{   zinsert into t2(c) values (?)r\      Nrw   z'should have returned exactly three rows)	r   r   Zexecutescriptr'   rW   	enumerater   r`   r.   )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   rS   r   r
   )argsr
   r
   r   callback  rU   z/RegressionTests.test_bpo31770.<locals>.callbackr   N)r   r   rk   weakrefrefri   r   
gc_collect)r	   r   r   r   r   r
   r
   r   test_bpo31770z  s   


zRegressionTests.test_bpo31770c                 C   s6   |  t | j`W d    d S 1 sw   Y  d S r   )rF   AttributeErrorr   rW   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                   @   rh   )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)rA   rB   rC   r   r
   r
   r
   r   Printer  rl   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   rL   r'   )r	   r   valr
   r
   r   test_return_empty_bytestring  s   z,RegressionTests.test_return_empty_bytestringN)#rA   rB   rC   r   r   r   r   r&   r)   r-   r1   r5   r7   r;   rH   rP   rR   rg   ro   rq   ru   ry   rz   r|   r}   r   r   r   r   r   r   r   r   r   r   r
   r
   r
   r   r      sB    
			r   c                  C   s   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   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TestCaser   r   rA   r
   r
   r
   r   <module>   s      
