
    4hh4                         S SK r S SKrS SKrS SKJrJr  SSKJrJ	r	J
r
  SSKJr   " S S\\R                  5      r " S S	\\R                  5      r " S
 S\\R                  5      r\S:X  a  \R"                  " 5         gg)    N)TESTFNunlink   )memory_databasecx_limitwith_tracebacks)MemoryDatabaseMixinc                   D    \ rS rSrS rS rS rS rS rS r	S r
S	 rS
rg)CollationTests!   c                     U R                  [        5         U R                  R                  S S 5        S S S 5        g ! , (       d  f       g = f)Nc                     X:  X:  -
  $ N xys     E/opt/python-3.13.8/usr/lib/python3.13/test/test_sqlite3/test_hooks.py<lambda>ACollationTests.test_create_collation_not_string.<locals>.<lambda>%       !%AE9J    )assertRaises	TypeErrorconcreate_collationselfs    r    test_create_collation_not_string/CollationTests.test_create_collation_not_string#   s1    y)HH%%d,JK *))s	   =
Ac                     U R                  [        5       nU R                  R                  SS5        S S S 5        U R	                  [        WR                  5      S5        g ! , (       d  f       N4= f)NX*   zparameter must be callable)r   r   r   r   assertEqualstr	exception)r   cms     r   "test_create_collation_not_callable1CollationTests.test_create_collation_not_callable'   sN    y)RHH%%c2. *R\\*,HI *)s   A!!
A/c                 >    U R                   R                  SS 5        g )Nu   colläc                     X:  X:  -
  $ r   r   r   s     r   r   @CollationTests.test_create_collation_not_ascii.<locals>.<lambda>-   r   r   )r   r   r   s    r   test_create_collation_not_ascii.CollationTests.test_create_collation_not_ascii,   s    !!(,JKr   c                     " S S[         5      nS nU R                  R                  U" S5      U5        U R                  R                  S5      R	                  5       nU R                  US   S   S5        U R                  US   S   S	5        g )
Nc                       \ rS rSrS rSrg)CCollationTests.test_create_collation_bad_upper.<locals>.BadUpperStr0   c                     g r   r   r   s    r   upperICollationTests.test_create_collation_bad_upper.<locals>.BadUpperStr.upper1   s    r   r   N)__name__
__module____qualname____firstlineno__r4   __static_attributes__r   r   r   BadUpperStrr1   0   s    r   r;   c                     X:  X:  -
  * $ r   r   r   s     r   r   @CollationTests.test_create_collation_bad_upper.<locals>.<lambda>3   s    15 12r   mycollz
            select x from (
            select 'a' as x
            union
            select 'b' as x
            ) order by x collate mycoll
            r   br   a)r%   r   r   executefetchallr$   )r   r;   r>   results       r   test_create_collation_bad_upper.CollationTests.test_create_collation_bad_upper/   s    	# 	 3!!+h"7@!! #   	 	1s+1s+r   c                    S nU R                   R                  SU5        SnU R                   R                  U5      R                  5       nU R	                  U/ SQSS9  U R                   R                  SS 5        U R                  [        R                  5       nU R                   R                  U5      R                  5       nS S S 5        U R	                  [        WR                  5      S5        g ! , (       d  f       N4= f)Nc                     X:  X:  -
  * $ r   r   r   s     r   r>   5CollationTests.test_collation_is_used.<locals>.mycoll@   s    e&''r   r>   
            select x from (
            select 'a' as x
            union
            select 'b' as x
            union
            select 'c' as x
            ) order by x collate mycoll
            )c)r?   )r@   #the expected order was not returnedmsg"no such collation sequence: mycoll)
r   r   rA   rB   r$   r   sqliteOperationalErrorr%   r&   )r   r>   sqlrC   r'   s        r   test_collation_is_used%CollationTests.test_collation_is_used?   s    	( 	!!(F3 !!#&//1!9B 	 	D 	!!(D1v6672XX%%c*335F 8R\\*,PQ 87s   *C11
C?c                     S nU R                   R                  SU5        SnU R                   R                  U5      R                  5       nU R	                  U/ SQSS9  g )Nc                     X:  X:  -
  * S-  $ )Nl        r   r   s     r   r>   CCollationTests.test_collation_returns_large_integer.<locals>.mycollX   s    e&'%//r   r>   rI   rJ   rL   rM   r   r   rA   rB   r$   )r   r>   rR   rC   s       r   $test_collation_returns_large_integer3CollationTests.test_collation_returns_large_integerW   s_    	0 	!!(F3 !!#&//1!9B 	 	Dr   c                    U R                   nUR                  SS 5        UR                  SS 5        UR                  S5      R                  5       nU R	                  US   S   S5        U R	                  US   S   S5        g	)
zl
Register two different collation functions under the same name.
Verify that the last one is actually used.
r>   c                     X:  X:  -
  $ r   r   r   s     r   r   >CollationTests.test_collation_register_twice.<locals>.<lambda>o       QUqu4Er   c                     X:  X:  -
  * $ r   r   r   s     r   r   r]   p   s    qu6G4Hr   zi
            select x from (select 'a' as x union select 'b' as x) order by x collate mycoll
            r   r?   r   r@   NrX   )r   r   rC   s      r   test_collation_register_twice,CollationTests.test_collation_register_twicei   s~    
 hhX'EFX'HI   	 	1s+1s+r   c                 D   U R                   nUR                  SS 5        UR                  SS5        U R                  [        R                  5       nUR                  S5        SSS5        U R                  [        WR                  5      S5        g! , (       d  f       N4= f)z]
Register a collation, then deregister it. Make sure an error is raised if we try
to use it.
r>   c                     X:  X:  -
  $ r   r   r   s     r   r   :CollationTests.test_deregister_collation.<locals>.<lambda>}   r^   r   Nz?select 'a' as x union select 'b' as x order by x collate mycollrO   )	r   r   r   rP   rQ   rA   r$   r%   r&   )r   r   r'   s      r   test_deregister_collation(CollationTests.test_deregister_collationw   sy    
 hhX'EFXt,v6672KKYZ 8R\\*,PQ 87s   B
Br   N)r6   r7   r8   r9   r   r(   r-   rD   rS   rY   r`   re   r:   r   r   r   r   r   !   s0    LJ
L, R0D$,
Rr   r   c                   f    \ rS rSrS rS rS rS r\" \	SS9S 5       r
\" \	SS9S	 5       rS
 rSrg)ProgressTests   c                    ^ / mU4S jnU R                   R                  US5        U R                   R                  S5        U R                  T5        g)z;
Test that the progress handler is invoked once it is set.
c                  (   > T R                  S 5        gNr   appendprogress_callss   r   progress:ProgressTests.test_progress_handler_used.<locals>.progress       !!$'r   r   z0
            create table foo(a, b)
            N)r   set_progress_handlerrA   
assertTrue)r   rq   rp   s     @r   test_progress_handler_used(ProgressTests.test_progress_handler_used   sJ     	 	%%h2  	 	'r   c                 ,  ^ U R                   n/ mU4S jnUR                  US5        UR                  5       nUR                  S5        [	        T5      n/ mUR                  US5        UR                  S5        [	        T5      nU R                  XE5        g)z-
Test that the opcode argument is respected.
c                  (   > T R                  S 5        grl   rm   ro   s   r   rq   1ProgressTests.test_opcode_count.<locals>.progress   rs   r   r   z1
            create table foo (a, b)
               z1
            create table bar (a, b)
            N)r   rt   cursorrA   lenassertGreaterEqual)r   r   rq   cursfirst_countsecond_countrp   s         @r   test_opcode_countProgressTests.test_opcode_count   s     hh	 	  1-zz|  	 .)  1-  	 >*:r   c                     S nU R                   R                  US5        U R                   R                  5       nU R                  [        R
                  UR                  S5        g)zG
Test that returning a non-zero value stops the operation in progress.
c                      g)Nr   r   r   r   r   rq   5ProgressTests.test_cancel_operation.<locals>.progress   s    r   r   zcreate table bar (a, b)N)r   rt   r|   r   rP   rQ   rA   )r   rq   r   s      r   test_cancel_operation#ProgressTests.test_cancel_operation   sL    	%%h2xx ##LL%	'r   c                    ^ U R                   nSmU4S jnUR                  US5        UR                  SS5        UR                  S5      R                  5         U R	                  TSS5        g)zS
Test that setting the progress handler to None clears the previously set handler.
r   c                  
   > Sm gNr   r   r   )actions   r   rq   2ProgressTests.test_clear_handler.<locals>.progress   s    Fr   r   Nz&select 1 union select 2 union select 3z progress handler was not cleared)r   rt   rA   rB   r$   )r   r   rq   r   s      @r   test_clear_handler ProgressTests.test_clear_handler   sc     hh	 	  1-  q)<=FFH$FGr   bad_progress)namec                     S nU R                   R                  US5        U R                  [        R                  5         U R                   R                  S5        S S S 5        g ! , (       d  f       g = f)Nc                      SS-    g r   r   r   r   r   r   BProgressTests.test_error_in_progress_handler.<locals>.bad_progress   s	    Er   r   8
                create table foo(a, b)
                r   rt   r   rP   rQ   rA   )r   r   s     r   test_error_in_progress_handler,ProgressTests.test_error_in_progress_handler   sR    	%%lA6v667HH   877s   A$$
A2c                   ^  " S S5      mU4S jnU R                   R                  US5        U R                  [        R                  5         U R                   R                  S5        S S S 5        g ! , (       d  f       g = f)Nc                       \ rS rSrS rSrg)DProgressTests.test_error_in_progress_handler_result.<locals>.BadBool   c                     SS-    g r   r   r   s    r   __bool__MProgressTests.test_error_in_progress_handler_result.<locals>.BadBool.__bool__   s	    Ar   r   N)r6   r7   r8   r9   r   r:   r   r   r   BadBoolr      s    r   r   c                     > T " 5       $ r   r   )r   s   r   r   IProgressTests.test_error_in_progress_handler_result.<locals>.bad_progress   s    9r   r   r   r   )r   r   r   s     @r   %test_error_in_progress_handler_result3ProgressTests.test_error_in_progress_handler_result   s]    	 		%%lA6v667HH   877s   A22
B c                     SnU R                  [        U5       nU R                  R                  S SS9  S S S 5        U R	                  WR
                  [        5        g ! , (       d  f       N/= f)NzPassing keyword argument 'progress_handler' to _sqlite3.Connection.set_progress_handler\(\) is deprecated. Parameter 'progress_handler' will become positional-only in Python 3.15.c                      g r   r   r   r   r   r   BProgressTests.test_progress_handler_keyword_args.<locals>.<lambda>   s    4r   r   )progress_handlern)assertWarnsRegexDeprecationWarningr   rt   r$   filename__file__r   regexr'   s      r   "test_progress_handler_keyword_args0ProgressTests.test_progress_handler_keyword_args   sZ     	 ""#5u=HH))<1)M >h/ >=s   A
A,r   N)r6   r7   r8   r9   rv   r   r   r   r   ZeroDivisionErrorr   r   r   r:   r   r   r   rh   rh      sT    (;.'H &^< = &^<
 =

0r   rh   c                       \ rS rSr\R
                  S 5       rS rS rS r	S r
S r\" \R                  SS	9S
 5       r\" \SS	9S 5       rS rSrg)TraceCallbackTests   c              #      ^#     / mUR                  U4S j5        S v   U R                  TU5        UR                  S 5        g ! U R                  TU5        UR                  S 5        f = f7f)Nc                 &   > TR                  U 5      $ r   rm   )stmttraceds    r   r   5TraceCallbackTests.check_stmt_trace.<locals>.<lambda>   s    v}}T/Br   )set_trace_callbackr$   )r   cxexpectedr   s      @r   check_stmt_trace#TraceCallbackTests.check_stmt_trace   sa     	(F!!"BCVX.!!$' VX.!!$'s   A,A $A,%A))A,c                    ^ / mU4S jnU R                   R                  U5        U R                   R                  S5        U R                  T5        U R                  [	        S T 5       5      5        g)z9
Test that the trace callback is invoked once it is set.
c                 (   > TR                  U 5        g r   rm   	statementtraced_statementss    r   trace:TraceCallbackTests.test_trace_callback_used.<locals>.trace       $$Y/r   create table foo(a, b)c              3   ,   #    U  H
  nS U;   v   M     g7f)zcreate table fooNr   ).0r   s     r   	<genexpr>>TraceCallbackTests.test_trace_callback_used.<locals>.<genexpr>  s     UCT4.$6CTs   N)r   r   rA   ru   any)r   r   r   s     @r   test_trace_callback_used+TraceCallbackTests.test_trace_callback_used   sZ     	0##E*12)*UCTUUVr   c                    ^ U R                   n/ mU4S jnUR                  U5        UR                  S5        UR                  S5        U R                  TS5        g)zR
Test that setting the trace callback to None clears the previously set callback.
c                 (   > TR                  U 5        g r   rm   r   s    r   r   ;TraceCallbackTests.test_clear_trace_callback.<locals>.trace	  r   r   Nr   ztrace callback was not cleared)r   r   rA   assertFalse)r   r   r   r   s      @r   test_clear_trace_callback,TraceCallbackTests.test_clear_trace_callback  sT     hh	0u%t$,-*,LMr   c                 f  ^^ SmU R                   n/ mU4S jnUR                  U5        UR                  S5        UR                  ST-  5        UR                  5         U R	                  [        U4S jT 5       5      S[        T5      < SSR                  [        [        T5      5      < 35        g	)
z7
Test that the statement can contain unicode literals.
u   öäüÖÄÜß€c                 (   > TR                  U 5        g r   rm   r   s    r   r   6TraceCallbackTests.test_unicode_content.<locals>.trace  r   r   create table foo(x)z insert into foo(x) values ('%s')c              3   .   >#    U  H
  nTU;   v   M     g 7fr   r   )r   r   unicode_values     r   r   :TraceCallbackTests.test_unicode_content.<locals>.<genexpr>  s     P>OdMT1>Os   zUnicode data z garbled in trace callback: z, N)	r   r   rA   commitru   r   asciijoinmap)r   r   r   r   r   s      @@r   test_unicode_content'TraceCallbackTests.test_unicode_content  s     =hh	0u%)*6FG

P>OPP /3uFW;X1Y[	\r   c                   ^ / mU4S jnSS/nU R                  [        [        5        [        R                  " [        S S9n[        R                  " [        5      n UR                  U5        UR                  5       nUR                  US   5        UR                  S5        UR                  US   5        UR                  5         UR                  5         U R                  TU5        g ! UR                  5         UR                  5         f = f)Nc                 (   > TR                  U 5        g r   rm   r   s    r   r   =TraceCallbackTests.test_trace_callback_content.<locals>.trace$  r   r   r   zinsert into foo(x) values(1))isolation_levelr   zcreate table bar(x)r   )

addCleanupr   r   rP   connectr   r|   rA   closer$   )r   r   queriescon1con2curr   s         @r   test_trace_callback_content.TraceCallbackTests.test_trace_callback_content!  s    	0 )13'~~fd;~~f%	##E*++-CKK
#LL./KK
#JJLJJL*G4 JJLJJLs   AC) )"Dc           
      F   / SQn[        5        o R                  X!5         U   UR                  S5        UR                  SS [	        S5       5       5        S S S 5        S S S 5        S S S 5        g ! , (       d  f       N= f! , (       d  f       N(= f! , (       d  f       g = f)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   &   #    U  H  o4v   M	     g 7fr   r   )r   vs     r   r   =TraceCallbackTests.test_trace_expanded_sql.<locals>.<genexpr>C  s     :RA4s      )r   r   rA   executemanyrange)r   r   r   s      r   test_trace_expanded_sql*TraceCallbackTests.test_trace_expanded_sql7  so    
 "&;&;B&I

./8:Rq:RS  'J 'J&Is9   BB4A0BB0
A>:B
B	B
B z5Expanded SQL string exceeds the maximum string length)r   c                    Sn[         R                  n[        5        n[        X2S9 nSnSU-  nUS-   nU/nU R	                  X85         UR                  Xv45        S S S 5        U SU S3n	U R	                  X9/5         UR                  Xu45        S S S 5        S S S 5        S S S 5        g ! , (       d  f       NT= f! , (       d  f       N0= f! , (       d  f       N9= f! , (       d  f       g = f)Nzselect 1 as a where a=)categoryr@   ?')rP   SQLITE_LIMIT_LENGTHr   r   r   rA   )
r   templater   r   limok_param	bad_paramunexpanded_queryr   expanded_querys
             r    test_trace_too_much_expanded_sql3TraceCallbackTests.test_trace_too_much_expanded_sqlE  s     ,--"hr&EHc	I'#~()H&&r4

+\: 5 !)z8*A6N&&r+;<

+[9 = 'F 54 =< 'F&EsR   
C!CB)"C=B:CC)
B73C:
CC
C	C
C*zdivision by zeroc                     [        5        nUR                  S 5        UR                  S5        S S S 5        g ! , (       d  f       g = f)Nc                     SS-  $ )N   r   r   )r   s    r   r   ;TraceCallbackTests.test_trace_bad_handler.<locals>.<lambda>`  s    qsr   zselect 1)r   r   rA   )r   r   s     r   test_trace_bad_handler)TraceCallbackTests.test_trace_bad_handler]  s1    "!!"23JJz" s	   $8
Ac                     SnU R                  [        U5       nU R                  R                  S S9  S S S 5        U R	                  WR
                  [        5        g ! , (       d  f       N/= f)NzPassing keyword argument 'trace_callback' to _sqlite3.Connection.set_trace_callback\(\) is deprecated. Parameter 'trace_callback' will become positional-only in Python 3.15.c                      g r   r   r   r   r   r   <TraceCallbackTests.test_trace_keyword_args.<locals>.<lambda>l  s    tr   )trace_callback)r   r   r   r   r$   r   r   r   s      r   test_trace_keyword_args*TraceCallbackTests.test_trace_keyword_argsc  sX     	 ""#5u=HH''|'D >h/ >=s   A
A+r   N)r6   r7   r8   r9   
contextlibcontextmanagerr   r   r   r   r   r   r   rP   	DataErrorr  r   r  r  r:   r   r   r   r   r      s    ( (
WN\"5,T E:	:( &.@A# B#

0r   r   __main__)r  sqlite3rP   unittesttest.support.os_helperr   r   utilr   r   r   r	   TestCaser   rh   r   r6   mainr   r   r   <module>r     s~   .    1 < < %`R((*;*; `RFd0'):): d0NB0,h.?.? B0J zMMO r   