
    dafv                        d dl Z d dlZ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	m
Z
 d dlmZmZmZ d dlmZ d9dZe j$                  d        Zd Zd Zd	 Zd
 Zd Zd Zd Zd Zd Zd Zd Z G d d      Z G d d      Z  G d d      Z! G d d      Z" G d d      Z# G d d      Z$ G d d      Z% G d  d!      Z& G d" d#      Z' G d$ d%ejP                        Z) G d& d'      Z* G d( d)e+      Z, ejZ                  ej\                  d*k  d+       G d, d-ejP                               Z/ G d. d/ejP                        Z0 G d0 d1ejP                        Z1 G d2 d3e1      Z2 G d4 d5e1      Z3 G d6 d7e1      Z4e5d8k(  r ejl                          yy):    N)Mockpatch)
bigmemtestcatch_unraisable_exception
gc_collect)cx_limitc                       fd}|S )z6Convenience decorator for testing callback tracebacks.c                 ~     rt        j                        nd t        j                          fd       }|S )Nc                     t               5 }t        | |      5   | g|i | d d d        d d d         | g|i | y # 1 sw Y   xY w# 1 sw Y   "xY wN)r   check_tracebacks)selfargskwargscm_regexexcfuncnames       ?/root/Python-3.12.4/Lib/test/test_sqlite3/test_userfunctions.pywrapperz3with_tracebacks.<locals>.decorator.<locals>.wrapper*   sk    +- 0%dBVTB 0///00 '''	0 00 0s!   AAAA	AA)recompile	functoolswraps)r   r   r   r   r   regexs   ` @r   	decoratorz"with_tracebacks.<locals>.decorator(   s7    &+E"			( 
	(      )r   r   r   r   s   ``` r   with_tracebacksr    &   s     r   c              #   L  K   t        j                  d       	 t        j                         }t	        j
                  |      5  d ddd       | j                  |j                  j                  |       |r?t        |j                  j                        }| j                  |j                  |             |r0| j                  |j                  j                  j                  |       t        j                  d       y# 1 sw Y   xY w# t        j                  d       w xY ww)z<Convenience context manager for testing callback tracebacks.TNF)sqliteenable_callback_tracebacksioStringIO
contextlibredirect_stderrassertEqual
unraisableexc_typestr	exc_valueassertIsNotNonesearchobject__name__)r   r   r   r   obj_namebufmsgs          r   r   r   7   s      %%d+1kkm'', 		 	//5bmm--.C  c!23R]]11::HE))%0	 	 	))%0s5   D$)D
 C>B!D
 (D$>DD
 
D!!D$c                       y)Nfoor   r   r   r   func_returntextr6   J       r   c                       y)N1 2r   r   r   r   func_returntextwithnullr:   L   s    r   c                       y)Nbarr   r   r   r   func_returnunicoder=   N   r7   r   c                       yN*   r   r   r   r   func_returnintrA   P   s    r   c                       y)NQ	@r   r   r   r   func_returnfloatrD   R       r   c                       y r   r   r   r   r   func_returnnullrG   T   rE   r   c                       y)N   blobr   r   r   r   func_returnblobrJ   V   s    r   c                       y)N        r   r   r   r   func_returnlonglongrM   X   r7   r   c                      ddz   y N   r   r   r   r   r   func_raiseexceptionrQ   Z   s	    aCr   c                      t         r   )MemoryErrorr   r   r   func_memoryerrorrT   \   s    
r   c                      t         r   )OverflowErrorr   r   r   func_overflowerrorrW   ^   s    
r   c                       e Zd Zd Zd Zy)
AggrNoStepc                      y r   r   r   s    r   __init__zAggrNoStep.__init__b       r   c                      yN   r   r[   s    r   finalizezAggrNoStep.finalizee   s    r   N)r0   
__module____qualname__r\   ra   r   r   r   rY   rY   a   s    r   rY   c                       e Zd Zd Zd Zy)AggrNoFinalizec                      y r   r   r[   s    r   r\   zAggrNoFinalize.__init__i   r]   r   c                      y r   r   r   xs     r   stepzAggrNoFinalize.stepl   r]   r   N)r0   rb   rc   r\   rj   r   r   r   re   re   h   s    r   re   c                       e Zd Zd Zd Zd Zy)AggrExceptionInInitc                     ddz   y rO   r   r[   s    r   r\   zAggrExceptionInInit.__init__p   	    	!r   c                      y r   r   rh   s     r   rj   zAggrExceptionInInit.steps   r]   r   c                      y r   r   r[   s    r   ra   zAggrExceptionInInit.finalizev   r]   r   Nr0   rb   rc   r\   rj   ra   r   r   r   rl   rl   o   s    r   rl   c                       e Zd Zd Zd Zd Zy)AggrExceptionInStepc                      y r   r   r[   s    r   r\   zAggrExceptionInStep.__init__z   r]   r   c                     ddz   y rO   r   rh   s     r   rj   zAggrExceptionInStep.step}   rn   r   c                      yr?   r   r[   s    r   ra   zAggrExceptionInStep.finalize   s    r   Nrq   r   r   r   rs   rs   y   s    r   rs   c                       e Zd Zd Zd Zd Zy)AggrExceptionInFinalizec                      y r   r   r[   s    r   r\   z AggrExceptionInFinalize.__init__   r]   r   c                      y r   r   rh   s     r   rj   zAggrExceptionInFinalize.step   r]   r   c                     ddz   y rO   r   r[   s    r   ra   z AggrExceptionInFinalize.finalize   rn   r   Nrq   r   r   r   rx   rx      s    r   rx   c                       e Zd Zd Zd Zd Zy)AggrCheckTypec                     d | _         y r   valr[   s    r   r\   zAggrCheckType.__init__   s	    r   c                     t         t        t        t        d       t        d}t        ||   t        |      u       | _        y N)r+   intfloatNoneblobr+   r   r   typebytesr   )r   	whichTyper   theTypes       r   rj   zAggrCheckType.step   s3    cE4: "wy)T#Y67r   c                     | j                   S r   r   r[   s    r   ra   zAggrCheckType.finalize       xxr   Nrq   r   r   r   r}   r}      s    8
r   r}   c                       e Zd Zd Zd Zd Zy)AggrCheckTypesc                     d| _         y Nr   r   r[   s    r   r\   zAggrCheckTypes.__init__   s	    r   c           	          t         t        t        t        d       t        d}|D ].  }| xj
                  t        ||   t        |      u       z  c_        0 y r   r   )r   r   valsr   r   s        r   rj   zAggrCheckTypes.step   sI    cE4: " 	=CHHGI.$s);<<H	=r   c                     | j                   S r   r   r[   s    r   ra   zAggrCheckTypes.finalize   r   r   Nrq   r   r   r   r   r      s    =r   r   c                       e Zd Zd Zd Zd Zy)AggrSumc                     d| _         y )N        r   r[   s    r   r\   zAggrSum.__init__   s	    r   c                 .    | xj                   |z  c_         y r   r   )r   r   s     r   rj   zAggrSum.step   s    Cr   c                     | j                   S r   r   r[   s    r   ra   zAggrSum.finalize   r   r   Nrq   r   r   r   r   r      s    r   r   c                       e Zd Zd Zd Zd Zy)AggrTextc                     d| _         y )N txtr[   s    r   r\   zAggrText.__init__   s	    r   c                 ,    | j                   |z   | _         y r   r   )r   r   s     r   rj   zAggrText.step   s    88c>r   c                     | j                   S r   r   r[   s    r   ra   zAggrText.finalize   r   r   Nrq   r   r   r   r   r      s    "r   r   c                      e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Z eed      d        Z eed      d        Z eed      d        Zd Zd Zd Zd Zd Z eed      d        Zd Zd Z  e!jD                  e#jH                  d k  d!      d"        Z% e!jD                  e#jH                  d k  d!      d#        Z& e!jD                  e#jH                  d k\  d$      d%        Z'd& Z(d' Z) ee      d(        Z* ee+d)d*      d+        Z, e!jZ                  e.j^                  d,kD  d-       e0d.d/d01      d2               Z1 e!jZ                  e.j^                  d,kD  d-       e0d.d3d01      d4               Z2d5 Z3y6)7FunctionTestsc                 p   t        j                  d      | _        | j                  j                  ddt               | j                  j                  ddt
               | j                  j                  ddt               | j                  j                  ddt               | j                  j                  ddt               | j                  j                  ddt               | j                  j                  d	dt               | j                  j                  d
dt               | j                  j                  ddd        | j                  j                  ddd        | j                  j                  ddt               | j                  j                  ddt               | j                  j                  ddt               | j                  j                  ddd        | j                  j                  ddd        | j                  j                  ddd        | j                  j                  d       y )N:memory:
returntextr   returntextwithnullreturnunicode	returnintreturnfloat
returnnull
returnblobreturnlonglong	returnnanc                      t        d      S )Nnan)r   r   r   r   <lambda>z%FunctionTests.setUp.<locals>.<lambda>   s
    u r   return_noncont_blobc                  $    t        d      d d d   S )NrI      )
memoryviewr   r   r   r   z%FunctionTests.setUp.<locals>.<lambda>   s    G)<SqS)A r   raiseexceptionmemoryerroroverflowerrorisblobr`   c                 "    t        | t              S r   )
isinstancer   ri   s    r   r   z%FunctionTests.setUp.<locals>.<lambda>   s    
1e8L r   isnonec                 
    | d u S r   r   r   s    r   r   z%FunctionTests.setUp.<locals>.<lambda>   s
    T	 r   spamc                      t        |       S r   )lenr   s    r   r   z%FunctionTests.setUp.<locals>.<lambda>   s
    A r   zcreate table test(t text))r"   connectconcreate_functionr6   r:   r=   rA   rD   rG   rJ   rM   rQ   rT   rW   executer[   s    r   setUpzFunctionTests.setUp   s   >>*-  q/B  !5q:QR  !5GH  a@  3CD  q/B  q/B  !116IJ  a1EF  !6!A	C  !116IJ  3CD  !5GH  1.LM  1.AB  ->?45r   c                 8    | j                   j                          y r   )r   closer[   s    r   tearDownzFunctionTests.tearDown   s    r   c                     | j                  t        j                        5  | j                  j	                  ddd        d d d        y # 1 sw Y   y xY w)Nblac                     d| z  S Nr   r   r   s    r   r   z9FunctionTests.test_func_error_on_create.<locals>.<lambda>   s
    AaC r   )assertRaisesr"   OperationalErrorr   r   r[   s    r   test_func_error_on_createz'FunctionTests.test_func_error_on_create   sE    v667 	AHH$$UD-@	A 	A 	As   AAc                 X   t         j                  }d}t        | j                  |d      5  | j                  j	                  d       | j                  t         j                  |      5  | j                  j	                  d       d d d        d d d        y # 1 sw Y   xY w# 1 sw Y   y xY w)Nztoo many arguments on functionr`   )categorylimitzselect abs(-1)zselect max(1, 2))r"   SQLITE_LIMIT_FUNCTION_ARGr   r   r   assertRaisesRegexr   )r   r   r3   s      r   test_func_too_many_argsz%FunctionTests.test_func_too_many_args   s    33.dhh; 	6HH-.''(?(?E 6  !346	6 	66 6	6 	6s#   <B 'BB B	B  B)c                     d } |       }|t               d<   | j                  j                  dd|       | j                  j                         }|j	                  d       y )Nc                      d } | S )Nc                       yr_   r   r   r   r   fz=FunctionTests.test_func_ref_count.<locals>.getfunc.<locals>.f   s    r   r   )r   s    r   getfuncz2FunctionTests.test_func_ref_count.<locals>.getfunc   s    Hr   r5   reftestr   zselect reftest())globalsr   r   cursorr   )r   r   r   curs       r   test_func_ref_countz!FunctionTests.test_func_ref_count   sO    	 I	%  Aq1hhoo&'r   c                     | j                   j                         }|j                  d       |j                         d   }| j	                  t        |      t               | j	                  |d       y )Nzselect returntext()r   r5   r   r   r   fetchoner(   r   r+   r   r   r   s      r   test_func_return_textz#FunctionTests.test_func_return_text   sS    hhoo)*llnQcC(e$r   c                     | j                   j                         }|j                  d      j                         d   }| j	                  t        |      t               | j	                  |d       y )Nzselect returntextwithnull()r   r9   r   )r   r   ress      r   $test_func_return_text_with_null_charz2FunctionTests.test_func_return_text_with_null_char   sS    hhookk78AACAFcC(h'r   c                     | j                   j                         }|j                  d       |j                         d   }| j	                  t        |      t               | j	                  |d       y )Nzselect returnunicode()r   r<   r   r   s      r   test_func_return_unicodez&FunctionTests.test_func_return_unicode   sS    hhoo,-llnQcC(e$r   c                     | j                   j                         }|j                  d       |j                         d   }| j	                  t        |      t               | j	                  |d       y )Nzselect returnint()r   r@   )r   r   r   r   r(   r   r   r   s      r   test_func_return_intz"FunctionTests.test_func_return_int   sS    hhoo()llnQcC(b!r   c                     | j                   j                         }|j                  d       |j                         d   }| j	                  t        |      t               |dk  s|dkD  r| j                  d       y y )Nzselect returnfloat()r   g&1	@gT㥛 	@zwrong value)r   r   r   r   r(   r   r   failr   s      r   test_func_return_floatz$FunctionTests.test_func_return_float  sa    hhoo*+llnQcE*;#+IIm$ &r   c                     | j                   j                         }|j                  d       |j                         d   }| j	                  t        |      t        d              | j	                  |d        y )Nzselect returnnull()r   )r   r   r   r   r(   r   r   s      r   test_func_return_nullz#FunctionTests.test_func_return_null  sW    hhoo)*llnQcDJ/d#r   c                     | j                   j                         }|j                  d       |j                         d   }| j	                  t        |      t               | j	                  |d       y )Nzselect returnblob()r   rI   )r   r   r   r   r(   r   r   r   s      r   test_func_return_blobz#FunctionTests.test_func_return_blob  sS    hhoo)*llnQcE*g&r   c                     | j                   j                         }|j                  d       |j                         d   }| j	                  |d       y )Nzselect returnlonglong()r   rL   r   r   r   r   r(   r   s      r   test_func_return_long_longz(FunctionTests.test_func_return_long_long  s?    hhoo-.llnQe$r   c                     | j                   j                         }|j                  d       | j                  |j	                         d          y )Nzselect returnnan()r   )r   r   r   assertIsNoner   r   r   s     r   test_func_return_nanz"FunctionTests.test_func_return_nan#  s8    hhoo()#,,.+,r   rQ   r   c                 ,   | j                   j                         }| j                  t        j                        5 }|j                  d       |j                          d d d        | j                  t        j                        d       y # 1 sw Y   /xY w)Nzselect raiseexception()&user-defined function raised exception
r   r   r   r"   r   r   r   r(   r+   	exceptionr   r   r   s      r   test_func_exceptionz!FunctionTests.test_func_exception(  so    hhoov667 	2KK12LLN	 	R\\*,TU	 	s   "B

BrT   c                     | j                   j                         }| j                  t              5  |j	                  d       |j                          d d d        y # 1 sw Y   y xY w)Nzselect memoryerror())r   r   r   rS   r   r   r   s     r   test_func_memory_errorz$FunctionTests.test_func_memory_error0  sK    hhoo{+ 	KK./LLN	 	 	s   "AA$rW   c                     | j                   j                         }| j                  t        j                        5  |j                  d       |j                          d d d        y # 1 sw Y   y xY w)Nzselect overflowerror())r   r   r   r"   	DataErrorr   r   r   s     r   test_func_overflow_errorz&FunctionTests.test_func_overflow_error7  sQ    hhoov//0 	KK01LLN	 	 	s   "A%%A.c                     | j                   j                         }|j                  dd       |j                         d   }| j	                  |d       y )Nzselect spam(?, ?))r`   r   r   r   r   r   s      r   test_any_argumentsz FunctionTests.test_any_arguments>  sA    hhoo'0llnQa r   c                 ~    | j                   j                  d      }| j                  |j                         d          y )Nzselect isblob(x'')r   )r   r   
assertTruer   r   s     r   test_empty_blobzFunctionTests.test_empty_blobD  s.    hh34q)*r   c                     | j                   j                  dt        d      f      }| j                  |j	                         d          y )Nzselect isnone(?)r   r   )r   r   r   r  r   r   s     r   test_nan_floatzFunctionTests.test_nan_floatH  s6    hh1E%L?Cq)*r   c                 b    d}| j                  t        || j                  j                  dd       y )Nz1Python int too large to convert to SQLite INTEGERselect spam(?))             )r   rV   r   r   )r   errs     r   test_too_large_intz FunctionTests.test_too_large_intM  s*    A}c4883C3C/	=r   c           
      ~    | j                  t        d| j                  j                  dt	        d      d d d   f       y )Nz%underlying buffer is not C-contiguousr  rI   r   )r   BufferErrorr   r   r   r[   s    r   test_non_contiguous_blobz&FunctionTests.test_non_contiguous_blobR  s9    {F#xx//1A *7 3CaC 8:	<r   zbuffer.*contiguous)r   c                     | j                  t        j                        5  | j                  j	                  d      }|j                          d d d        y # 1 sw Y   y xY w)Nzselect return_noncont_blob())r   r"   r   r   r   r   r   s     r   test_return_non_contiguous_blobz-FunctionTests.test_return_non_contiguous_blobX  sI    v667 	((""#ABCLLN	 	 	s   ,AAc                 ^    | j                  t        d| j                  j                  dd       y )Nsurrogates not allowedr  )u   )r   UnicodeEncodeErrorr   r   r[   s    r   test_param_surrogatesz#FunctionTests.test_param_surrogates^  s)    13K#xx//1A0	2r   c                    g fd}| j                   j                  dd|       dt        fdt        fdt        fdt        fdt        ft        d	      t        fd
t        fdt        fdt        fdt
        ft        t        d            t
        ft        d      t
        fd t        d       fg}|D ]2  \  }}| j                   j                  d|f      }|j                          4 | j                  |       y )Nc                 >    j                  | t        |       f       y r   )appendr   )argresultss    r   append_resultz5FunctionTests.test_func_params.<locals>.append_resulte  s    NNCc+,r   test_paramsr`   r@   r   l   {C	 l           rC   inftextr9   u   ˢqˡⁱᵗᵉrI   r   zselect test_params(?))r   r   r   r   r+   r   	bytearrayranger   r   r   r   r(   )r   r$  datasetr   _r   r#  s         @r   test_func_paramszFunctionTests.test_func_paramsc  s    	-  =A II #& #&5M5\5!SMsO.4euQx %( %(4:
  	FC((""#:SFCCLLN	 	'*r   )      r-  zRequires SQLite 3.8.3 or higherc                    t        d       }| j                  j                  dd|d       t        j                  dk  r8| j                  j                  d       | j                  |j                  d       y | j                  t        j                        5  | j                  j                  d	       d d d        y # 1 sw Y   y xY w)
Nreturn_valuenondeterministicr   Fdeterministicr-     r   z.select nondeterministic() = nondeterministic()r   z>create index t on test(t) where nondeterministic() is not null)
r   r   r   r"   sqlite_version_infor   r(   
call_countr   r   r   mocks     r   test_func_non_deterministicz)FunctionTests.test_func_non_deterministic  s    &  !3QE R%%
2HHMNT__a0""6#:#:; c  !abc c cs   B;;Cc                 |   t        d       }| j                  j                  dd|d       t        j                  dk  r8| j                  j                  d       | j                  |j                  d       y 	 | j                  j                  d	       y # t        j                  $ r | j                  d
       Y y w xY w)Nr0  r4  r   Tr3  r5  z(select deterministic() = deterministic()r`   z;create index t on test(t) where deterministic() is not nullz/Unexpected failure while creating partial index)
r   r   r   r"   r7  r   r(   r8  r   r   r9  s     r   test_func_deterministicz%FunctionTests.test_func_deterministic  s    &  !T N%%
2HHGHT__a0M  !^_** M		KLMs   8B $B;:B;zSQLite < 3.8.3 neededc                     | j                  t        j                        5  | j                  j	                  ddt
        d       d d d        y # 1 sw Y   y xY w)Nr4  r   Tr3  )r   r"   NotSupportedErrorr   r   r   r[   s    r   %test_func_deterministic_not_supportedz3FunctionTests.test_func_deterministic_not_supported  sJ    v778 	RHH$$_aD$Q	R 	R 	Rs   $AAc                     | j                  t              5  | j                  j                  ddt        d       d d d        y # 1 sw Y   y xY w)Nr4  r   T)r   	TypeErrorr   r   r   r[   s    r   $test_func_deterministic_keyword_onlyz2FunctionTests.test_func_deterministic_keyword_only  sA    y) 	DHH$$_adC	D 	D 	Ds   #AAc                     t        j                  d      }d }|j                  dd|        |d      }~~|g}|j                  |       ~~t	                y )Nr   c                      y r   r   )ts    r   md5sumz=FunctionTests.test_function_destructor_via_gc.<locals>.md5sum  s    r   md5r`   z(create table lang (name, first_appeared))r"   r   r   r!  r   )r   destrG  ri   ys        r   test_function_destructor_via_gcz-FunctionTests.test_function_destructor_via_gc  sW     ~~j)	 	UAv.;<DC	ar   c                    | j                   j                         }d}dD ]\  }| j                   j                  dd|fd       | j                  t        j
                  |      5  |j                  d       d d d        ^ y # 1 sw Y   ixY w)Nstring or blob too big)l            l        l            largeintr   c                     | S r   r   )values    r   r   z>FunctionTests.test_func_return_too_large_int.<locals>.<lambda>  s     r   zselect largeint())r   r   r   r   r"   r  r   )r   r   r3   rP  s       r   test_func_return_too_large_intz,FunctionTests.test_func_return_too_large_int  s|    hhoo&+ 	1EHH$$Z4MN''(8(8#> 1/01 1	11 1s   "A??B	r  chrc                    | j                   j                         }| j                   j                  ddt               dD ]=  }| j	                  t
        j                        5  |j                  d|f       d d d        ? y # 1 sw Y   JxY w)Npychrr`   )i  i  zselect pychr(?))r   r   r   rR  r   r"   r   r   )r   r   rP  s      r   %test_func_return_text_with_surrogatesz3FunctionTests.test_func_return_text_with_surrogates  sv    hhoo  !S1# 	9E""6#:#:; 9-x89 9	99 9s    A??B	        zrequires 64bit platformrL   r-  F)sizememusedry_runc                    | j                   j                         }dD ][  }| j                   j                  dd|fd       | j                  t        j
                        5  |j                  d       d d d        ] y # 1 sw Y   hxY w)NirL   	largetextr   c                     d| z  S )Nbr   rW  s    r   r   z?FunctionTests.test_func_return_too_large_text.<locals>.<lambda>  s
    sTz r   zselect largetext()r   r   r   r   r"   r  r   r   rW  r   s      r   test_func_return_too_large_textz-FunctionTests.test_func_return_too_large_text  sw     hhoo" 	2DHH$$[!5QR""6#3#34 2012 2	22 2   A<<B	r   c                    | j                   j                         }dD ][  }| j                   j                  dd|fd       | j                  t        j
                        5  |j                  d       d d d        ] y # 1 sw Y   hxY w)Nr[  	largeblobr   c                     d| z  S )N   br   r_  s    r   r   z?FunctionTests.test_func_return_too_large_blob.<locals>.<lambda>  s
    td{ r   zselect largeblob()r`  ra  s      r   test_func_return_too_large_blobz-FunctionTests.test_func_return_too_large_blob  sw     hhoo" 	2DHH$$[!5RS""6#3#34 2012 2	22 2rc  c                       j                   j                  dd fd       d} j                  t        j                  | j                   j
                  d       y )N	badreturnr   c                       S r   r   r[   s   r   r   z>FunctionTests.test_func_return_illegal_value.<locals>.<lambda>  s     r   r   zselect badreturn())r   r   r   r"   r   r   )r   r3   s   ` r   test_func_return_illegal_valuez,FunctionTests.test_func_return_illegal_value  sG      a>6v66#xx//1E	Gr   N)4r0   rb   rc   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    ZeroDivisionErrorr  rS   r  rV   r	  r  r  r  r  r  r  r  r  r,  unittestskipIfr"   r7  r;  r=  r@  rC  rK  rQ  r  rU  
skipUnlesssysmaxsizer   rb  rh  rl  r   r   r   r   r      s9   6.A6
(%(%"%$'%-
 &-BCV DV ['9: ; ])=> ?!++
=
< [(<= >
2
+B X__V//);=^_c `c X__V//);=^_
M `
M X__V//9<>UVR WRD" ]#1 $1 ')A5I9 J9 Xu,.GHU1e42 5 I2 Xu,.GHU1e42 5 I2Gr   r   c                   *    e Zd Zd Zd Zd Zd Zd Zy)WindowSumIntc                     d| _         y r   countr[   s    r   r\   zWindowSumInt.__init__  s	    
r   c                 .    | xj                   |z  c_         y r   rv  r   rP  s     r   rj   zWindowSumInt.step      

e
r   c                     | j                   S r   rv  r[   s    r   rP  zWindowSumInt.value      zzr   c                 .    | xj                   |z  c_         y r   rv  ry  s     r   inversezWindowSumInt.inverse  rz  r   c                     | j                   S r   rv  r[   s    r   ra   zWindowSumInt.finalize  r|  r   N)r0   rb   rc   r\   rj   rP  r~  ra   r   r   r   rt  rt    s    r   rt  c                       e Zd Zy)	BadWindowN)r0   rb   rc   r   r   r   r  r    s    r   r  )r-     r   zRequires SQLite 3.25.0 or newerc                       e Zd Zd Zd Zd Z ee      d        Z ee      d        Z	 ee
      d        Z ee
      d        Zd Zd	 Zd
 Zy)WindowFunctionTestsc                    t        j                  d      | _        | j                  j                         | _        g d}| j                  5  | j                  j                  d       | j                  j                  d|       d d d        g d| _        d| _        | j                  j                  ddt               y # 1 sw Y   ;xY w)	Nr   ))a   )r^  rP   )cr-  )dr.  )er`   zcreate table test(x, y)zinsert into test values(?, ?)))r  	   )r^     )r     )r  r  )r  r  z
            select x, %s(y) over (
                order by x rows between 1 preceding and 1 following
            ) as sum_y
            from test order by x
        sumintr`   )r"   r   r   r   r   r   executemanyexpectedquerycreate_window_functionrt  )r   valuess     r   r   zWindowFunctionTests.setUp  s    >>*-88??$
 XX 	JHH67HH  !@&I	J

 	''!\B!	J 	Js   
8B<<Cc                     | j                   j                  | j                  dz         | j                  | j                   j	                         | j
                         y )Nr  )r   r   r  r(   fetchallr  r[   s    r   test_win_sum_intz$WindowFunctionTests.test_win_sum_int  s>    h./**,dmm<r   c                 z    | j                  t        j                  | j                  j                  ddt
               y )N
shouldfailr   )r   r"   ProgrammingErrorr   r  rt  r[   s    r   test_win_error_on_createz,WindowFunctionTests.test_win_error_on_create  s,    &11((99&l	<r   c           	         dD ]  }| j                  |      5  t        j                  t        |t              5  d| }| j
                  j                  |dt               d| d}| j                  t        j                  |      5  | j                  j                  | j                  |z         | j                  j                          d d d        d d d        d d d         y # 1 sw Y   xY w# 1 sw Y    xY w# 1 sw Y   xY w)N)r\   rj   rP  r~  )methside_effectexc_r`   'z' method raised error)subTestr   r/   rt  r  r   r  r   r"   r   r   r   r  r  )r   r  r   r3   s       r   test_win_exception_in_methodz0WindowFunctionTests.test_win_exception_in_method  s    : 	,D4( ,\\,)L ,!$=DHH33D!\JdV#89C//0G0GM ,((d):;))+,	,, ,	,, ,	, ,, ,s<   !C<AC0AC$		C0C<$C-)C00C95C<<D	c                 8   t        j                  t        dt              5  d}| j                  j                  |dt               | j                  j                  | j                  |z         | j                  j                          d d d        y # 1 sw Y   y xY w)Nra   r  exception_in_finalizer`   )
r   r/   rt  r  r   r  r   r   r  r  )r   r   s     r   test_win_exception_in_finalizez2WindowFunctionTests.test_win_exception_in_finalize*  so    
 \\,
	J 	 *DHH++D!\BHHTZZ$./HH		  	  	 s   A&BBc                     G d d      } G d d      } G d d      }d|fd|fd	|ff}|D ]  \  }}| j                  ||
      5  d| }| j                  j                  |d|       | j                  t        j
                  d| d      5  | j                  j                  | j                  |z         | j                  j                          d d d        d d d         y # 1 sw Y   xY w# 1 sw Y   xY w)Nc                       e Zd Zd Zd Zd Zy)AWindowFunctionTests.test_win_missing_method.<locals>.MissingValuec                      y r   r   rh   s     r   rj   zFWindowFunctionTests.test_win_missing_method.<locals>.MissingValue.step8      tr   c                      y r   r   rh   s     r   r~  zIWindowFunctionTests.test_win_missing_method.<locals>.MissingValue.inverse9      $r   c                      yr?   r   r[   s    r   ra   zJWindowFunctionTests.test_win_missing_method.<locals>.MissingValue.finalize:      rr   N)r0   rb   rc   rj   r~  ra   r   r   r   MissingValuer  7      #&)r   r  c                       e Zd Zd Zd Zd Zy)CWindowFunctionTests.test_win_missing_method.<locals>.MissingInversec                      y r   r   rh   s     r   rj   zHWindowFunctionTests.test_win_missing_method.<locals>.MissingInverse.step=  r  r   c                      yr?   r   r[   s    r   rP  zIWindowFunctionTests.test_win_missing_method.<locals>.MissingInverse.value>      Br   c                      yr?   r   r[   s    r   ra   zLWindowFunctionTests.test_win_missing_method.<locals>.MissingInverse.finalize?  r  r   N)r0   rb   rc   rj   rP  ra   r   r   r   MissingInverser  <  r  r   r  c                       e Zd Zd Zd Zd Zy)@WindowFunctionTests.test_win_missing_method.<locals>.MissingStepc                      yr?   r   r[   s    r   rP  zFWindowFunctionTests.test_win_missing_method.<locals>.MissingStep.valueB  r  r   c                      y r   r   rh   s     r   r~  zHWindowFunctionTests.test_win_missing_method.<locals>.MissingStep.inverseC  r  r   c                      yr?   r   r[   s    r   ra   zIWindowFunctionTests.test_win_missing_method.<locals>.MissingStep.finalizeD  r  r   N)r0   rb   rc   rP  r~  ra   r   r   r   MissingStepr  A  s    &&)r   r  rj   rP  r~  )r  clsr  r`   r  z' method not defined)
r  r   r  r   r"   r   r   r   r  r  )r   r  r  r  r*  r  r  r   s           r   test_win_missing_methodz+WindowFunctionTests.test_win_missing_method5  s   	* 	*
	* 	*
	* 	* [!l#'

 ! 	(ID#4S1 (dV}//a=++F,C,C./v5I,JL (HH$$TZZ$%67HH%%'(( (	(( (( (s&   AC.AC"C."C+'C..C7	c                      G d d      }d}| j                   j                  |d|       | j                  j                  | j                  |z         | j                  j                          y )Nc                       e Zd Zd Zd Zd Zy)FWindowFunctionTests.test_win_missing_finalize.<locals>.MissingFinalizec                      y r   r   rh   s     r   rj   zKWindowFunctionTests.test_win_missing_finalize.<locals>.MissingFinalize.stepZ  r  r   c                      yr?   r   r[   s    r   rP  zLWindowFunctionTests.test_win_missing_finalize.<locals>.MissingFinalize.value[  r  r   c                      y r   r   rh   s     r   r~  zNWindowFunctionTests.test_win_missing_finalize.<locals>.MissingFinalize.inverse\  r  r   N)r0   rb   rc   rj   rP  r~  r   r   r   MissingFinalizer  Y  s    #&&r   r  missing_finalizer`   )r   r  r   r   r  r  )r   r  r   s      r   test_win_missing_finalizez-WindowFunctionTests.test_win_missing_finalizeT  sT    
	' 	'
 "''aAd*+r   c                     | j                   j                  ddd        | j                  t        j                  | j
                  j                  | j                  dz         y )Nr  r`   )r   r  r   r"   r   r   r   r  r[   s    r   test_win_clear_functionz+WindowFunctionTests.test_win_clear_functionc  sF    ''!T:&114883C3C**x/	1r   c                 R    G d dt               }| j                  D cg c]  }|d   |d   dz  f }}| j                  j                  dd|       | j                  j                  | j                  dz         | j                  | j                  j                         |       y c c}w )Nc                       e Zd Zd Zd Zy)AWindowFunctionTests.test_win_redefine_function.<locals>.Redefinedc                 4    | xj                   |dz  z  c_         y r   rv  ry  s     r   rj   zFWindowFunctionTests.test_win_redefine_function.<locals>.Redefined.stepk  s    4::#::r   c                 4    | xj                   |dz  z  c_         y r   rv  ry  s     r   r~  zIWindowFunctionTests.test_win_redefine_function.<locals>.Redefined.inversel  s    djjEAI&=jr   N)r0   rb   rc   rj   r~  r   r   r   	Redefinedr  j  s    :=r   r  r   r`   r   r  )	rt  r  r   r  r   r   r  r(   r  )r   r  vr  s       r   test_win_redefine_functionz.WindowFunctionTests.test_win_redefine_functionh  s    	> 	> -1MM:qQqT1Q46N::''!Y?h./**,h7	 ;s   B$c                      G d d      }| j                   j                  dd|       | j                  t        j                  d| j
                  j                  | j                  dz         y )Nc                       e Zd Zd Zd Zd Zy)IWindowFunctionTests.test_win_error_value_return.<locals>.ErrorValueReturnc                      y r   r   r[   s    r   r\   zRWindowFunctionTests.test_win_error_value_return.<locals>.ErrorValueReturn.__init__u  s    r   c                      y r   r   rh   s     r   rj   zNWindowFunctionTests.test_win_error_value_return.<locals>.ErrorValueReturn.stepv  r  r   c                      y)Nr  r   r[   s    r   rP  zOWindowFunctionTests.test_win_error_value_return.<locals>.ErrorValueReturn.valuew  s    Gr   N)r0   rb   rc   r\   rj   rP  r   r   r   ErrorValueReturnr  t  s    $#+r   r  err_val_retr`   rM  )r   r  r   r"   r  r   r   r  )r   r  s     r   test_win_error_value_returnz/WindowFunctionTests.test_win_error_value_returns  sW    	, 	,
 	''q:JKv//1I#xx//m1K	Mr   N)r0   rb   rc   r   r  r  r    r  r  r  AttributeErrorr  r  r  r  r  r   r   r   r  r    s    C<=<
 Y	,  	, Y     ^$( %(< ^$ %1
	8Mr   r  c                       e Zd Zd Zd Zd Z eed      d        Zd Z	 ee
d      d	        Z ee
d
      d        Z ee
d      d        Zd Zd Zd Zd Zd Zd Zd Zd Zd Zy)AggregateTestsc           
          t        j                  d      | _        | j                  j                         }|j	                  d       |j	                  ddddd t        d      f       | j                  j                  dd	t               | j                  j                  d
d	t               | j                  j                  dd	t               | j                  j                  dd	t               | j                  j                  dd	t               | j                  j                  ddt               | j                  j                  ddt               | j                  j                  dd	t               | j                  j                  dd	t               y )Nr   z
            create table test(
                t text,
                i integer,
                f float,
                n,
                b blob
                )
            z6insert into test(t, i, f, n, b) values (?, ?, ?, ?, ?)r5   rP   rC   rI   nostepr`   
nofinalizeexcInitexcStepexcFinalize	checkTyper   
checkTypesr   mysumaggtxt)r"   r   r   r   r   r   create_aggregaterY   re   rl   rs   rx   r}   r   r   r   r   s     r   r   zAggregateTests.setUp  s"   >>*-hhoo  	 	LAtT:g#68	: 	!!(Az:!!,>B!!)Q0CD!!)Q0CD!!-4KL!!+q-@!!,NC!!'1g6!!(Ax8r   c                      y r   r   r[   s    r   r   zAggregateTests.tearDown  s     	r   c                     | j                  t        j                        5  | j                  j	                  ddt
               d d d        y # 1 sw Y   y xY w)Nr   r   )r   r"   r   r   r   r   r[   s    r   test_aggr_error_on_createz(AggregateTests.test_aggr_error_on_create  sA    v667 	;HH$$UD':	; 	; 	;s   "AArY   r   c                    | j                   j                         }| j                  t        j                        5 }|j                  d       d d d        | j                  t        j                        d       y # 1 sw Y   /xY w)Nzselect nostep(t) from testz2user-defined aggregate's 'step' method not defined)	r   r   r   r"   r   r   r(   r+   r  r  s      r   test_aggr_no_stepz AggregateTests.test_aggr_no_step  sg    hhoov667 	62KK45	6R\\*M	O	6 	6s   A::Bc                     | j                   j                         }d}| j                  t        j                  |      5  |j                  d       |j                         d   }d d d        y # 1 sw Y   y xY w)Nz6user-defined aggregate's 'finalize' method not definedzselect nofinalize(t) from testr   )r   r   r   r"   r   r   r   )r   r   r3   r   s       r   test_aggr_no_finalizez$AggregateTests.test_aggr_no_finalize  s_    hhooF##F$;$;SA 	$KK89,,.#C	$ 	$ 	$s   %A++A4rl   c                 2   | j                   j                         }| j                  t        j                        5 }|j                  d       |j                         d   }d d d        | j                  t        j                        d       y # 1 sw Y   /xY w)Nzselect excInit(t) from testr   z7user-defined aggregate's '__init__' method raised errorr  r   r   r   r   s       r   test_aggr_exception_in_initz*AggregateTests.test_aggr_exception_in_init  sv    hhoov667 	$2KK56,,.#C	$ 	R\\*,ef	$ 	$   %BBrs   c                 2   | j                   j                         }| j                  t        j                        5 }|j                  d       |j                         d   }d d d        | j                  t        j                        d       y # 1 sw Y   /xY w)Nzselect excStep(t) from testr   z3user-defined aggregate's 'step' method raised errorr  r  s       r   test_aggr_exception_in_stepz*AggregateTests.test_aggr_exception_in_step  sv    hhoov667 	$2KK56,,.#C	$ 	R\\*,ab	$ 	$r  rx   c                 2   | j                   j                         }| j                  t        j                        5 }|j                  d       |j                         d   }d d d        | j                  t        j                        d       y # 1 sw Y   /xY w)Nzselect excFinalize(t) from testr   z7user-defined aggregate's 'finalize' method raised errorr  r  s       r   test_aggr_exception_in_finalizez.AggregateTests.test_aggr_exception_in_finalize  sv    hhoov667 	$2KK9:,,.#C	$ 	R\\*,ef	$ 	$r  c                     | j                   j                         }|j                  ddt               f       |j	                         d   }| j                  |d       y )Nzselect checkTypes('str', ?, ?)r5   r   r   )r   r   r   r+   r   r(   r   s      r   test_aggr_check_param_strz(AggregateTests.test_aggr_check_param_str  sG    hhoo4ucenEllnQa r   c                     | j                   j                         }|j                  dd       |j                         d   }| j	                  |d       y )Nzselect checkType('int', ?))r@   r   r`   r   r   s      r   test_aggr_check_param_intz(AggregateTests.test_aggr_check_param_int  sA    hhoo0%8llnQa r   c                     | j                   j                         }|j                  dd       |j                         d   }| j	                  |d       y )Nzselect checkTypes('int', ?, ?))r@      r   r   r   r   s      r   test_aggr_check_params_intz)AggregateTests.test_aggr_check_params_int  sA    hhoo4h?llnQa r   c                     | j                   j                         }|j                  dd       |j                         d   }| j	                  |d       y )Nzselect checkType('float', ?))rC   r   r`   r   r   s      r   test_aggr_check_param_floatz*AggregateTests.test_aggr_check_param_float  sA    hhoo2G<llnQa r   c                     | j                   j                         }|j                  dd       |j                         d   }| j	                  |d       y )Nzselect checkType('None', ?)r   r   r`   r   r   s      r   test_aggr_check_param_nonez)AggregateTests.test_aggr_check_param_none  sA    hhoo17;llnQa r   c                     | j                   j                         }|j                  dt        d      f       |j	                         d   }| j                  |d       y )Nzselect checkType('blob', ?)rI   r   r`   )r   r   r   r   r   r(   r   s      r   test_aggr_check_param_blobz)AggregateTests.test_aggr_check_param_blob  sI    hhoo1Jw4G3IJllnQa r   c                     | j                   j                         }|j                  d       |j                  dg d       |j                  d       |j	                         d   }| j                  |d       y )Nzdelete from testzinsert into test(i) values (?)))
   )   )   zselect mysum(i) from testr   <   )r   r   r   r  r   r(   r   s      r   test_aggr_check_aggr_sumz'AggregateTests.test_aggr_check_aggr_sum  s\    hhoo&'8:OP/0llnQb!r   c                     | j                   j                  d      }|j                         d   }| j                  |       y )Nz1select mysum(i) from (select 1 as i) where i == 0r   )r   r   r   r   r   s      r   test_aggr_no_matchz!AggregateTests.test_aggr_no_match  s5    hhRSllnQ#r   c                    | j                   j                         }dD ]U  }| j                  |      5  |j                  d|f       |j	                         d   }| j                  ||       d d d        W y # 1 sw Y   bxY w)N)r5   r9   r   zselect aggtxt(?) from testr   )r   r   r  r   r   r(   )r   r   r   r   s       r   test_aggr_textzAggregateTests.test_aggr_text  sz    hhoo$ 	+C#& +83&AllnQ'  c*+ +	++ +s   9A66A?	N)r0   rb   rc   r   r   r  r    r  r  r  rm  r  r  r  r  r  r  r  r  r  r  r  r  r   r   r   r  r  ~  s    92
; ^,7O 8O$ &-BCg Dg &-BCc Dc &-FGg Hg!!!!!!"
+r   r  c                   :    e Zd Zed        Zd Zd Zd Zd Zd Z	y)AuthorizerTestsc                     | t         j                  k7  rt         j                  S |dk(  s|dk(  rt         j                  S t         j                  S Nc2t2)r"   SQLITE_SELECTSQLITE_DENY	SQLITE_OKactionarg1arg2dbnamesources        r   authorizer_cbzAuthorizerTests.authorizer_cb  sA    V)))%%%4<44<%%%r   c                     t        j                  d      | _        | j                  j                  d       | j                  j	                  d       | j                  j                  | j                         y )Nr   z
            create table t1 (c1, c2);
            create table t2 (c1, c2);
            insert into t1 (c1, c2) values (1, 2);
            insert into t2 (c1, c2) values (4, 5);
            zselect c2 from t2)r"   r   r   executescriptr   set_authorizerr  r[   s    r   r   zAuthorizerTests.setUp  sV    >>*-   	 	,- 2 23r   c                      y r   r   r[   s    r   r   zAuthorizerTests.tearDown  r]   r   c                     | j                  t        j                        5 }| j                  j	                  d       d d d        | j                  dt        j                               y # 1 sw Y   /xY w)Nselect * from t2
prohibitedr   r"   DatabaseErrorr   r   assertInr+   r  r   r   s     r   test_table_accessz!AuthorizerTests.test_table_access  sW    v334 	1HH/0	1lC$56	1 	1   A**A3c                     | j                  t        j                        5 }| j                  j	                  d       d d d        | j                  dt        j                               y # 1 sw Y   /xY w)Nselect c2 from t1r&  r'  r*  s     r   test_column_accessz"AuthorizerTests.test_column_access!  sW    v334 	2HH01	2lC$56	2 	2r,  c                     | j                   j                  d        | j                   j                  d       | j                   j                  d       y )Nr%  r.  )r   r"  r   r[   s    r   test_clear_authorizerz%AuthorizerTests.test_clear_authorizer&  s:    %+,,-r   N)
r0   rb   rc   staticmethodr  r   r   r+  r/  r1  r   r   r   r  r    s-       47
7
.r   r  c                   l     e Zd Zed        Z eed       fd       Z eed       fd       Z xZ	S )AuthorizerRaiseExceptionTestsc                 t    | t         j                  k7  rt        |dk(  s|dk(  rt        t         j                  S r  )r"   r  
ValueErrorr  r  s        r   r  z+AuthorizerRaiseExceptionTests.authorizer_cb-  s5    V)))4<44<r   r  r   c                 "    t         |           y r   superr+  r   	__class__s    r   r+  z/AuthorizerRaiseExceptionTests.test_table_access5      !#r   c                 "    t         |           y r   r8  r:  s    r   r/  z0AuthorizerRaiseExceptionTests.test_column_access9  r<  r   )
r0   rb   rc   r2  r  r    r6  r+  r/  __classcell__)r;  s   @r   r4  r4  ,  sK        Zo6$ 7$ Zo6$ 7$r   r4  c                       e Zd Zed        Zy)AuthorizerIllegalTypeTestsc                 `    | t         j                  k7  ry|dk(  s|dk(  ryt         j                  S )Nr   r  r  r"   r  r  r  s        r   r  z(AuthorizerIllegalTypeTests.authorizer_cb>  s/    V)))4<44<r   Nr0   rb   rc   r2  r  r   r   r   r@  r@  =         r   r@  c                       e Zd Zed        Zy)AuthorizerLargeIntegerTestsc                 `    | t         j                  k7  ry|dk(  s|dk(  ryt         j                  S )NrV  r  r  rB  r  s        r   r  z)AuthorizerLargeIntegerTests.authorizer_cbG  s/    V)))4<44<r   NrC  r   r   r   rF  rF  F  rD  r   rF  __main__)r   r   )7r&   r   r$   r   rq  rn  sqlite3r"   unittest.mockr   r   test.supportr   r   r   test.test_sqlite3.test_dbapir   r    contextmanagerr   r6   r:   r=   rA   rD   rG   rJ   rM   rQ   rT   rW   rY   re   rl   rs   rx   r}   r   r   r   TestCaser   rt  	Exceptionr  ro  r7  r  r  r  r4  r@  rF  r0   mainr   r   r   <module>rQ     s  0   	 	 
   % K K 1" 1 1$     
 
   dGH%% dGN	  		 	 ++j824EM(++ EM4EMPA+X&& A+H'.h'' '.T$O $"    /   zHMMO r   