
    <e2                         d dl Z d dlZd dlZd dlmZmZ d dlmZm	Z	 d dl
mZ  G d dej                  Z G d dej                  Z G d	 d
ej                  Zedk    r ej                     dS dS )    N)TESTFNunlink)memory_databasecx_limit)with_tracebacksc                   >    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	S )
CollationTestsc                     t          j        d          }|                     t                    5  |                    d d            d d d            d S # 1 swxY w Y   d S )N:memory:c                     | |k    | |k     z
  S N xys     3/usr/lib/python3.11/test/test_sqlite3/test_hooks.py<lambda>zACollationTests.test_create_collation_not_string.<locals>.<lambda>%       QUq1u4E     )sqliteconnectassertRaises	TypeErrorcreate_collationselfcons     r    test_create_collation_not_stringz/CollationTests.test_create_collation_not_string"   s    nZ((y)) 	G 	G  'E'EFFF	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	Gs   AAAc                    t          j        d          }|                     t                    5 }|                    dd           d d d            n# 1 swxY w Y   |                     t          |j                  d           d S )Nr   X*   zparameter must be callable)r   r   r   r   r   assertEqualstr	exceptionr   r   cms      r   "test_create_collation_not_callablez1CollationTests.test_create_collation_not_callable'   s    nZ((y)) 	*R  b)))	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	*R\**,HIIIIIs   AAAc                 \    t          j        d          }|                    dd            d S )Nr   u   colläc                     | |k    | |k     z
  S r   r   r   s     r   r   z@CollationTests.test_create_collation_not_ascii.<locals>.<lambda>/   r   r   )r   r   r   r   s     r   test_create_collation_not_asciiz.CollationTests.test_create_collation_not_ascii-   s1    nZ((X'E'EFFFFFr   c                 n    G d dt                     }t          j        d          }d }|                     |d          |           |                    d                                          }|                     |d         d         d           |                     |d	         d         d
           d S )Nc                       e Zd Zd ZdS )CCollationTests.test_create_collation_bad_upper.<locals>.BadUpperStrc                     d S r   r   r   s    r   upperzICollationTests.test_create_collation_bad_upper.<locals>.BadUpperStr.upper3   s    tr   N)__name__
__module____qualname__r0   r   r   r   BadUpperStrr-   2   s#            r   r4   r   c                     | |k    | |k     z
   S r   r   r   s     r   r   z@CollationTests.test_create_collation_bad_upper.<locals>.<lambda>6   s    Q1q5 12 r   mycollz
            select x from (
            select 'a' as x
            union
            select 'b' as x
            ) order by x collate mycoll
            r   b   a)r#   r   r   r   executefetchallr"   )r   r4   r   r6   results        r   test_create_collation_bad_upperz.CollationTests.test_create_collation_bad_upper1   s    	 	 	 	 	# 	 	 	 nZ((22[[22F;;;     	 	1s+++1s+++++r   c                    d }t          j        d          }|                    d|           d}|                    |                                          }|                     |g dd           |                    dd            |                     t           j                  5 }|                    |                                          }d d d            n# 1 swxY w Y   |                     t          |j	                  d           d S )	Nc                     | |k    | |k     z
   S r   r   r   s     r   r6   z5CollationTests.test_collation_is_used.<locals>.mycollC   s    !eA&''r   r   r6   
            select x from (
            select 'a' as x
            union
            select 'b' as x
            union
            select 'c' as x
            ) order by x collate mycoll
            )c)r7   )r9   #the expected order was not returnedmsg"no such collation sequence: mycoll)
r   r   r   r:   r;   r"   r   OperationalErrorr#   r$   )r   r6   r   sqlr<   r&   s         r   test_collation_is_usedz%CollationTests.test_collation_is_usedB   sQ   	( 	( 	( nZ((Xv... S!!**,,!9!9!9B 	 	D 	D 	D 	Xt,,,v677 	12[[%%..00F	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1R\**,PQQQQQs   &(CC!Cc                     d }t          j        d          }|                    d|           d}|                    |                                          }|                     |g dd           d S )Nc                 $    | |k    | |k     z
   dz  S )Nl        r   r   s     r   r6   zCCollationTests.test_collation_returns_large_integer.<locals>.mycoll\   s    !eA&'%//r   r   r6   r@   rA   rC   rD   r   r   r   r:   r;   r"   )r   r6   r   rH   r<   s        r   $test_collation_returns_large_integerz3CollationTests.test_collation_returns_large_integer[   s    	0 	0 	0 nZ((Xv... S!!**,,!9!9!9B 	 	D 	D 	D 	D 	Dr   c                 `   t          j        d          }|                    dd            |                    dd            |                    d                                          }|                     |d         d         d           |                     |d         d         d	           d
S )z
        Register two different collation functions under the same name.
        Verify that the last one is actually used.
        r   r6   c                     | |k    | |k     z
  S r   r   r   s     r   r   z>CollationTests.test_collation_register_twice.<locals>.<lambda>t   r   r   c                     | |k    | |k     z
   S r   r   r   s     r   r   z>CollationTests.test_collation_register_twice.<locals>.<lambda>u   s    q1uQ6G4H r   zi
            select x from (select 'a' as x union select 'b' as x) order by x collate mycoll
            r   r7   r8   r9   NrL   )r   r   r<   s      r   test_collation_register_twicez,CollationTests.test_collation_register_twicen   s    
 nZ((X'E'EFFFX'H'HIII    	 	1s+++1s+++++r   c                 p   t          j        d          }|                    dd            |                    dd           |                     t           j                  5 }|                    d           ddd           n# 1 swxY w Y   |                     t          |j                  d           dS )zu
        Register a collation, then deregister it. Make sure an error is raised if we try
        to use it.
        r   r6   c                     | |k    | |k     z
  S r   r   r   s     r   r   z:CollationTests.test_deregister_collation.<locals>.<lambda>   r   r   Nz?select 'a' as x union select 'b' as x order by x collate mycollrF   )	r   r   r   r   rG   r:   r"   r#   r$   r%   s      r   test_deregister_collationz(CollationTests.test_deregister_collation|   s    
 nZ((X'E'EFFFXt,,,v677 	[2KKYZZZ	[ 	[ 	[ 	[ 	[ 	[ 	[ 	[ 	[ 	[ 	[ 	[ 	[ 	[ 	[R\**,PQQQQQs   !BB
BN)r1   r2   r3   r   r'   r*   r=   rI   rM   rQ   rT   r   r   r   r	   r	   !   s        G G G
J J JG G G, , ,"R R R2D D D&, , ,
R 
R 
R 
R 
Rr   r	   c                   ~    e Zd Zd Zd Zd Zd Z eed          d             Z	 eed          d             Z
d	S )
ProgressTestsc                     t          j        d          }g fd}|                    |d           |                    d           |                                dS )zK
        Test that the progress handler is invoked once it is set.
        r   c                  2                          d            dS Nr   appendprogress_callss   r   progressz:ProgressTests.test_progress_handler_used.<locals>.progress       !!$'''1r   r8   z0
            create table foo(a, b)
            N)r   r   set_progress_handlerr:   
assertTrue)r   r   r^   r]   s      @r   test_progress_handler_usedz(ProgressTests.test_progress_handler_used   s     nZ((	 	 	 	 	 	  1---  	 	 	 	'''''r   c                 ~   t          j        d          }g fd}|                    |d           |                                }|                    d           t                    }g |                    |d           |                    d           t                    }|                     ||           dS )z=
        Test that the opcode argument is respected.
        r   c                  2                          d            dS rY   rZ   r\   s   r   r^   z1ProgressTests.test_opcode_count.<locals>.progress   r_   r   r8   z1
            create table foo (a, b)
               z1
            create table bar (a, b)
            N)r   r   r`   cursorr:   lenassertGreaterEqual)r   r   r^   cursfirst_countsecond_countr]   s         @r   test_opcode_countzProgressTests.test_opcode_count   s     nZ((	 	 	 	 	 	  1---zz||  	 	 	 .))  1---  	 	 	 >**\:::::r   c                     t          j        d          }d }|                    |d           |                                }|                     t           j        |j        d           dS )zW
        Test that returning a non-zero value stops the operation in progress.
        r   c                      dS )Nr8   r   r   r   r   r^   z5ProgressTests.test_cancel_operation.<locals>.progress   s    1r   r8   zcreate table bar (a, b)N)r   r   r`   rf   r   rG   r:   )r   r   r^   ri   s       r   test_cancel_operationz#ProgressTests.test_cancel_operation   su     nZ((	 	 	  1---zz||#L%	' 	' 	' 	' 	'r   c                    t          j        d          }dfd}|                    |d           |                    dd           |                    d                                           |                     dd           dS )zc
        Test that setting the progress handler to None clears the previously set handler.
        r   r   c                      d dS Nr8   r   r   )actions   r   r^   z2ProgressTests.test_clear_handler.<locals>.progress   s    F1r   r8   Nz&select 1 union select 2 union select 3z progress handler was not cleared)r   r   r`   r:   r;   r"   )r   r   r^   rs   s      @r   test_clear_handlerz ProgressTests.test_clear_handler   s     nZ((	 	 	 	 	 	  1---  q)))<==FFHHH$FGGGGGr   bad_progress)namec                     t          j        d          }d }|                    |d           |                     t           j                  5  |                    d           d d d            d S # 1 swxY w Y   d S )Nr   c                      ddz   d S rr   r   r   r   r   ru   zBProgressTests.test_error_in_progress_handler.<locals>.bad_progress   s    EEEEr   r8   8
                create table foo(a, b)
                r   r   r`   r   rG   r:   )r   r   ru   s      r   test_error_in_progress_handlerz,ProgressTests.test_error_in_progress_handler   s    nZ((	 	 	  q111v677 	 	KK    	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   A00A47A4c                    t          j        d          } G d d          fd}|                    |d           |                     t           j                  5  |                    d           d d d            d S # 1 swxY w Y   d S )Nr   c                       e Zd Zd ZdS )DProgressTests.test_error_in_progress_handler_result.<locals>.BadBoolc                     ddz   d S rr   r   r/   s    r   __bool__zMProgressTests.test_error_in_progress_handler_result.<locals>.BadBool.__bool__   s    Ar   N)r1   r2   r3   r   r   r   r   BadBoolr~      s#            r   r   c                                    S r   r   )r   s   r   ru   zIProgressTests.test_error_in_progress_handler_result.<locals>.bad_progress   s    799r   r8   ry   rz   )r   r   ru   r   s      @r   %test_error_in_progress_handler_resultz3ProgressTests.test_error_in_progress_handler_result   s    nZ((	 	 	 	 	 	 	 		 	 	 	 	  q111v677 	 	KK    	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   B  BBN)r1   r2   r3   rb   rl   ro   rt   r   ZeroDivisionErrorr{   r   r   r   r   rV   rV      s        ( ( (; ; ;.' ' 'H H H _&^<<<  =< _&^<<<  =<  r   rV   c                       e Zd Zej        d             Zd Zd Zd Zd Z	d Z
 eej        d          d	             Z eed
          d             ZdS )TraceCallbackTestsc              #      K   	 g |                     fd           d V  |                     |           |                     d            d S # |                     |           |                     d            w xY w)Nc                 .                         |           S r   rZ   )stmttraceds    r   r   z5TraceCallbackTests.check_stmt_trace.<locals>.<lambda>   s    v}}T/B/B r   )set_trace_callbackr"   )r   cxexpectedr   s      @r   check_stmt_tracez#TraceCallbackTests.check_stmt_trace   s      	(F!!"B"B"B"BCCCEEEVX...!!$''''' VX...!!$''''s   A -A=c                    t          j        d          }g fd}|                    |           |                    d           |                                |                     t          d D                                  dS )zI
        Test that the trace callback is invoked once it is set.
        r   c                 2                         |            d S r   rZ   	statementtraced_statementss    r   tracez:TraceCallbackTests.test_trace_callback_used.<locals>.trace       $$Y/////r   create table foo(a, b)c              3      K   | ]}d |v V  	dS )zcreate table fooNr   ).0r   s     r   	<genexpr>z>TraceCallbackTests.test_trace_callback_used.<locals>.<genexpr>   s(      UU4.$6UUUUUUr   N)r   r   r   r:   ra   anyr   r   r   r   s      @r   test_trace_callback_usedz+TraceCallbackTests.test_trace_callback_used   s     nZ((	0 	0 	0 	0 	0u%%%,---)***UUCTUUUUUVVVVVr   c                     t          j        d          }g fd}|                    |           |                    d           |                    d           |                     d           dS )zb
        Test that setting the trace callback to None clears the previously set callback.
        r   c                 2                         |            d S r   rZ   r   s    r   r   z;TraceCallbackTests.test_clear_trace_callback.<locals>.trace  r   r   Nr   ztrace callback was not cleared)r   r   r   r:   assertFalser   s      @r   test_clear_trace_callbackz,TraceCallbackTests.test_clear_trace_callback   s     nZ((	0 	0 	0 	0 	0u%%%t$$$,---*,LMMMMMr   c                    dt          j        d          }g fd}|                    |           |                    d           |                    dz             |                                 |                     t          fdD                       dt                    dd	                    t          t                                         d
S )zG
        Test that the statement can contain unicode literals.
        u   öäüÖÄÜß€r   c                 2                         |            d S r   rZ   r   s    r   r   z6TraceCallbackTests.test_unicode_content.<locals>.trace  r   r   create table foo(x)z insert into foo(x) values ('%s')c              3       K   | ]}|v V  	d S r   r   )r   r   unicode_values     r   r   z:TraceCallbackTests.test_unicode_content.<locals>.<genexpr>  s(      PPdMT1PPPPPPr   zUnicode data z garbled in trace callback: z, N)
r   r   r   r:   commitra   r   asciijoinmap)r   r   r   r   r   s      @@r   test_unicode_contentz'TraceCallbackTests.test_unicode_content  s     =nZ((	0 	0 	0 	0 	0u%%%)***6FGGG

PPPP>OPPPPPP ////3uFW;X;X1Y1Y1Y[	\ 	\ 	\ 	\ 	\r   c                    g fd}ddg}|                      t          t                     t          j        t          d           }t          j        t                    }	 |                    |           |                                }|                    |d                    |                    d           |                    |d                    |                                 |                                 n-# |                                 |                                 w xY w| 	                    |           d S )Nc                 2                         |            d S r   rZ   r   s    r   r   z=TraceCallbackTests.test_trace_callback_content.<locals>.trace  r   r   r   zinsert into foo(x) values(1))isolation_levelr   zcreate table bar(x)r8   )

addCleanupr   r   r   r   r   rf   r:   closer"   )r   r   queriescon1con2curr   s         @r   test_trace_callback_contentz.TraceCallbackTests.test_trace_callback_content  s(   	0 	0 	0 	0 	0 )13'''~fd;;;~f%%	##E***++--CKK
###LL.///KK
###JJLLLJJLLLL JJLLLJJLLLL*G44444s   "A4C? ?*D)c           
      p   g d}t                      5 }|                     ||          5  |5  |                    d           |                    dd t	          d          D                        d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   d d d            d S # 1 swxY w Y   d S )N)create table t(t)zBEGIN zinsert into t values(0)zinsert into t values(1)zinsert into t values(2)COMMITr   zinsert into t values(?)c              3      K   | ]}|fV  d S r   r   )r   vs     r   r   z=TraceCallbackTests.test_trace_expanded_sql.<locals>.<genexpr>>  s$      :R:RAA4:R:R:R:R:R:Rr      )r   r   r:   executemanyrange)r   r   r   s      r   test_trace_expanded_sqlz*TraceCallbackTests.test_trace_expanded_sql2  s   
 
 
  	T"d&;&;B&I&I 	T 	T T T

.///8:R:Rq:R:R:RSSST T T T T T T T T T T T T T T	T 	T 	T 	T 	T 	T 	T 	T 	T 	T 	T 	T 	T 	T 	T 	T 	T 	T 	T 	T 	T 	T 	T 	T 	T 	T 	T 	T 	T 	T 	T 	T 	TsX   B+BAA<0B<B  BB BB+B	B+B	B++B/2B/z5Expanded SQL string exceeds the maximum string length)regexc                 *   d}t           j        }t                      5 }t          ||          5 }d}d|z  }|dz   }|g}t           j        dk     rg }|                     ||          5  |                    ||f           d d d            n# 1 swxY w Y   | d| d}	|                     ||	g          5  |                    ||f           d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   d d d            d S # 1 swxY w Y   d S )Nzselect 1 as a where a=)categoryr9   ?)r      r   ')r   SQLITE_LIMIT_LENGTHr   r   sqlite_version_infor   r:   )
r   templater   r   limok_param	bad_paramunexpanded_queryr   expanded_querys
             r    test_trace_too_much_expanded_sqlz3TraceCallbackTests.test_trace_too_much_expanded_sql@  s4    ,- 	:"hrH&E&E&E 	:Hc	I'#~()H)J66&&r844 ; ;

+i\:::; ; ; ; ; ; ; ; ; ; ; ; ; ; ; !)668666N&&rN+;<< : :

+h[999: : : : : : : : : : : : : : :	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	:s|   D8C0'B?C0BC0B"C05CC0CC0 C!C0$D0C4	4D7C4	8DDDzdivision by zeroc                     t                      5 }|                    d            |                    d           d d d            d S # 1 swxY w Y   d S )Nc                     ddz  S )N   r   r   )r   s    r   r   z;TraceCallbackTests.test_trace_bad_handler.<locals>.<lambda>]  s
    qs r   zselect 1)r   r   r:   )r   r   s     r   test_trace_bad_handlerz)TraceCallbackTests.test_trace_bad_handlerZ  s     	#"!!"2"2333JJz"""	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	#s   ,AAAN)r1   r2   r3   
contextlibcontextmanagerr   r   r   r   r   r   r   r   	DataErrorr   r   r   r   r   r   r   r      s        ( ( (W W WN N N\ \ \"5 5 5,T T T _E  : :	 :, _&.@AAA# # BA# # #r   r   __main__)r   sqlite3r   unittesttest.support.os_helperr   r   test.test_sqlite3.test_dbapir   r   $test.test_sqlite3.test_userfunctionsr   TestCaser	   rV   r   r1   mainr   r   r   <module>r      s:  .          1 1 1 1 1 1 1 1 B B B B B B B B @ @ @ @ @ @eR eR eR eR eRX& eR eR eRN[ [ [ [ [H% [ [ [|x# x# x# x# x#* x# x# x#v zHMOOOOO r   