
    <ee                       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Z	d dl
mZmZmZmZmZmZ d dl
mZ d dlmZmZ d dlmZmZmZ d dlmZmZmZmZmZ d Ze j        ej         dfd	            Z! G d
 dej"                  Z# G d dej"                  Z$ G d dej"                  Z% ej&         e'ej(        d          d           G d dej"                              Z) G d dej"                  Z* G d dej"                  Z+ G d dej"                  Z, ej-                     G d dej"                              Z. G d dej"                  Z/ G d dej"                  Z0 G d  d!ej"                  Z1 G d" d#ej"                  Z2 G d$ d%ej"                  Z3 e             G d& d'ej"                              Z4e5d(k    r ej6                     dS dS ))    N)SHORT_TIMEOUT
bigmemtestcheck_disallow_instantiationrequires_subprocessis_emscriptenis_wasi)threading_helper)INT_MAX
ULLONG_MAX)SEEK_SETSEEK_CURSEEK_END)TESTFNTESTFN_UNDECODABLEunlinktemp_dirFakePathc                  T    t          j        dg| R i |}t          j        |          S N:memory:)sqliteconnect
contextlibclosing)argskwargscxs      3/usr/lib/python3.11/test/test_sqlite3/test_dbapi.pymemory_databaser   +   s2    	
	4T	4	4	4V	4	4Bb!!!       c              #      K   	 |                      ||          }|V  |                      ||           d S # |                      ||           w xY wN)setlimit)r   categorylimit_prevs       r   cx_limitr(   1   s[      %He,,
He$$$$$He$$$$s	   6 A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d Z ej        ej        dk    d          d             Z ej        ej        dk    d          d             Zd Zd ZdS )ModuleTestsc                 b    |                      t          j        ddt          j        z             d S )Nz2.0zapilevel is %s, should be 2.0)assertEqualr   apilevelselfs    r   test_api_levelzModuleTests.test_api_level;   s9    %86?J	L 	L 	L 	L 	Lr    c                 f    |                      t          j        h ddt          j        z             d S )N>   r         z'threadsafety is %d, should be 0, 1 or 3)assertInr   threadsafetyr.   s    r   test_thread_safetyzModuleTests.test_thread_safety?   s;    f)999?)*	+ 	+ 	+ 	+ 	+r    c                 b    |                      t          j        ddt          j        z             d S )Nqmarkz%paramstyle is '%s', should be 'qmark')r,   r   
paramstyler.   s    r   test_param_stylezModuleTests.test_param_styleD   s9    *G@*+	, 	, 	, 	, 	,r    c                 l    |                      t          t          j        t                    d           d S )Nz&Warning is not a subclass of Exception)
assertTrue
issubclassr   Warning	Exceptionr.   s    r   test_warningzModuleTests.test_warningI   s3    
6>9===	? 	? 	? 	? 	?r    c                 l    |                      t          t          j        t                    d           d S )Nz$Error is not a subclass of Exception)r<   r=   r   Errorr?   r.   s    r   
test_errorzModuleTests.test_errorM   s8    
6<;;>	@ 	@ 	@ 	@ 	@r    c                 v    |                      t          t          j        t          j                  d           d S )Nz)InterfaceError is not a subclass of Error)r<   r=   r   InterfaceErrorrB   r.   s    r   test_interface_errorz ModuleTests.test_interface_errorQ   s;    
6#8&,GGC	E 	E 	E 	E 	Er    c                 v    |                      t          t          j        t          j                  d           d S )Nz(DatabaseError is not a subclass of Error)r<   r=   r   DatabaseErrorrB   r.   s    r   test_database_errorzModuleTests.test_database_errorU   s;    
6#7FFB	D 	D 	D 	D 	Dr    c                 v    |                      t          t          j        t          j                  d           d S )Nz,DataError is not a subclass of DatabaseError)r<   r=   r   	DataErrorrH   r.   s    r   test_data_errorzModuleTests.test_data_errorY   s<    
6#3V5IJJF	H 	H 	H 	H 	Hr    c                 v    |                      t          t          j        t          j                  d           d S )Nz3OperationalError is not a subclass of DatabaseError)r<   r=   r   OperationalErrorrH   r.   s    r   test_operational_errorz"ModuleTests.test_operational_error]   <    
6#:F<PQQM	O 	O 	O 	O 	Or    c                 v    |                      t          t          j        t          j                  d           d S )Nz1IntegrityError is not a subclass of DatabaseError)r<   r=   r   IntegrityErrorrH   r.   s    r   test_integrity_errorz ModuleTests.test_integrity_errora   s<    
6#8&:NOOK	M 	M 	M 	M 	Mr    c                 v    |                      t          t          j        t          j                  d           d S )Nz0InternalError is not a subclass of DatabaseError)r<   r=   r   InternalErrorrH   r.   s    r   test_internal_errorzModuleTests.test_internal_errore   s<    
6#79MNNJ	L 	L 	L 	L 	Lr    c                 v    |                      t          t          j        t          j                  d           d S )Nz3ProgrammingError is not a subclass of DatabaseError)r<   r=   r   ProgrammingErrorrH   r.   s    r   test_programming_errorz"ModuleTests.test_programming_errori   rP   r    c                 v    |                      t          t          j        t          j                  d           d S )Nz4NotSupportedError is not a subclass of DatabaseError)r<   r=   r   NotSupportedErrorrH   r.   s    r   test_not_supported_errorz$ModuleTests.test_not_supported_errorm   sA    
6#;#)#79 9N	P 	P 	P 	P 	Pr    c                 t   g d}t           j        dk    r|ddgz  }t           j        dk    r|                    d           t           j        dk    r|                    d           |d	d
gz  }|g dz  }t           j        dk    r|g dz  }t           j        dk    r|g dz  }t           j        dk    r|g dz  }t           j        dk    r|ddgz  }t           j        dk    r|                    d           t           j        dk    r|                    d           t           j        dk    r|                    d           t           j        dk    r|                    d           t           j        dk    r|                    d           t           j        dk    r|                    d           t           j        dk    r|g dz  }t           j        d k    r|g d!z  }t           j        d"k    r|d#d$gz  }t           j        d%k    r|d&d'gz  }t           j        d(k    r|g d)z  }t           j        d*k    r|g d+z  }t           j        d,k    r|                    d-           |D ]X}|                     |.          5  |                     t          t           |                     d d d            n# 1 swxY w Y   Yd S )/N)JSQLITE_ABORTSQLITE_ALTER_TABLESQLITE_ANALYZESQLITE_ATTACHSQLITE_AUTHSQLITE_BUSYSQLITE_CANTOPENSQLITE_CONSTRAINTSQLITE_CORRUPTSQLITE_CREATE_INDEXSQLITE_CREATE_TABLESQLITE_CREATE_TEMP_INDEXSQLITE_CREATE_TEMP_TABLESQLITE_CREATE_TEMP_TRIGGERSQLITE_CREATE_TEMP_VIEWSQLITE_CREATE_TRIGGERSQLITE_CREATE_VIEWSQLITE_CREATE_VTABLESQLITE_DELETESQLITE_DENYSQLITE_DETACHSQLITE_DONESQLITE_DROP_INDEXSQLITE_DROP_TABLESQLITE_DROP_TEMP_INDEXSQLITE_DROP_TEMP_TABLESQLITE_DROP_TEMP_TRIGGERSQLITE_DROP_TEMP_VIEWSQLITE_DROP_TRIGGERSQLITE_DROP_VIEWSQLITE_DROP_VTABLESQLITE_EMPTYSQLITE_ERRORSQLITE_FORMATSQLITE_FULLSQLITE_FUNCTIONSQLITE_IGNORESQLITE_INSERTSQLITE_INTERNALSQLITE_INTERRUPTSQLITE_IOERRSQLITE_LOCKEDSQLITE_MISMATCHSQLITE_MISUSESQLITE_NOLFSSQLITE_NOMEMSQLITE_NOTADBSQLITE_NOTFOUND	SQLITE_OKSQLITE_PERMSQLITE_PRAGMASQLITE_PROTOCOLSQLITE_RANGESQLITE_READSQLITE_READONLYSQLITE_REINDEX
SQLITE_ROWSQLITE_SAVEPOINTSQLITE_SCHEMASQLITE_SELECTSQLITE_TOOBIGSQLITE_TRANSACTIONSQLITE_UPDATESQLITE_LIMIT_LENGTHSQLITE_LIMIT_SQL_LENGTHSQLITE_LIMIT_COLUMNSQLITE_LIMIT_EXPR_DEPTHSQLITE_LIMIT_COMPOUND_SELECTSQLITE_LIMIT_VDBE_OPSQLITE_LIMIT_FUNCTION_ARGSQLITE_LIMIT_ATTACHED SQLITE_LIMIT_LIKE_PATTERN_LENGTHSQLITE_LIMIT_VARIABLE_NUMBERSQLITE_LIMIT_TRIGGER_DEPTH)r3         SQLITE_NOTICESQLITE_WARNING)r3      r3   SQLITE_RECURSIVE)r3   r   r   SQLITE_LIMIT_WORKER_THREADSPARSE_DECLTYPESPARSE_COLNAMES) SQLITE_ABORT_ROLLBACKSQLITE_BUSY_RECOVERYSQLITE_CANTOPEN_FULLPATHSQLITE_CANTOPEN_ISDIRSQLITE_CANTOPEN_NOTEMPDIRSQLITE_CORRUPT_VTABSQLITE_IOERR_ACCESSSQLITE_IOERR_BLOCKEDSQLITE_IOERR_CHECKRESERVEDLOCKSQLITE_IOERR_CLOSESQLITE_IOERR_DELETESQLITE_IOERR_DELETE_NOENTSQLITE_IOERR_DIR_CLOSESQLITE_IOERR_DIR_FSYNCSQLITE_IOERR_FSTATSQLITE_IOERR_FSYNCSQLITE_IOERR_LOCKSQLITE_IOERR_NOMEMSQLITE_IOERR_RDLOCKSQLITE_IOERR_READSQLITE_IOERR_SEEKSQLITE_IOERR_SHMLOCKSQLITE_IOERR_SHMMAPSQLITE_IOERR_SHMOPENSQLITE_IOERR_SHMSIZESQLITE_IOERR_SHORT_READSQLITE_IOERR_TRUNCATESQLITE_IOERR_UNLOCKSQLITE_IOERR_WRITESQLITE_LOCKED_SHAREDCACHESQLITE_READONLY_CANTLOCKSQLITE_READONLY_RECOVERYr3   r      )
SQLITE_CONSTRAINT_CHECKSQLITE_CONSTRAINT_COMMITHOOKSQLITE_CONSTRAINT_FOREIGNKEYSQLITE_CONSTRAINT_FUNCTIONSQLITE_CONSTRAINT_NOTNULLSQLITE_CONSTRAINT_PRIMARYKEYSQLITE_CONSTRAINT_TRIGGERSQLITE_CONSTRAINT_UNIQUESQLITE_CONSTRAINT_VTABSQLITE_READONLY_ROLLBACK)SQLITE_IOERR_MMAPSQLITE_NOTICE_RECOVER_ROLLBACKSQLITE_NOTICE_RECOVER_WAL)r3   r   r   )SQLITE_BUSY_SNAPSHOTSQLITE_IOERR_GETTEMPPATHSQLITE_WARNING_AUTOINDEX)r3   r   r2   SQLITE_CANTOPEN_CONVPATHSQLITE_IOERR_CONVPATH)r3   r      SQLITE_CONSTRAINT_ROWIDSQLITE_READONLY_DBMOVEDSQLITE_AUTH_USER)r3   	   r   SQLITE_IOERR_VNODE)r3   
   r   SQLITE_IOERR_AUTH)r3      r2   SQLITE_OK_LOAD_PERMANENTLY)r3      r   )SQLITE_IOERR_BEGIN_ATOMICSQLITE_IOERR_COMMIT_ATOMICSQLITE_IOERR_ROLLBACK_ATOMIC)r3      r   )SQLITE_ERROR_MISSING_COLLSEQSQLITE_ERROR_RETRYSQLITE_READONLY_CANTINITSQLITE_READONLY_DIRECTORY)r3      r   SQLITE_CORRUPT_SEQUENCESQLITE_LOCKED_VTABr3      r   SQLITE_CANTOPEN_DIRTYWALSQLITE_ERROR_SNAPSHOT)r3      r   )SQLITE_CANTOPEN_SYMLINKSQLITE_CONSTRAINT_PINNEDSQLITE_OK_SYMLINK)r3       r   )SQLITE_BUSY_TIMEOUTSQLITE_CORRUPT_INDEXSQLITE_IOERR_DATA)r3   "   r   SQLITE_IOERR_CORRUPTFS)const)r   sqlite_version_infoappendsubTestr<   hasattr)r/   constsr	  s      r   test_module_constantsz!ModuleTests.test_module_constantsr   s   L
 L
 L
Z %33(899F%22MM,---%22MM7888$&677 !
 !
 !
 !	
D %33    F %33    F
 %22    F
 %2213JKKF%22MM3444%22MM3444%22MM,---%22MM.///%33MM-...%33MM6777%33    F
 %33    F %3302FGGF%3313JKKF%33    F
 %33    F
 %33MM2333 	8 	8EE** 8 8 6 67778 8 8 8 8 8 8 8 8 8 8 8 8 8 8	8 	8s   7)J,,J0	3J0	c                    d}t           j                            d          rt          j        }nt          j        }t                      5 }|                     t          j        |          5 }t          j	        |           d d d            n# 1 swxY w Y   |j
        }|                     |j        |           |                     |j                            d                     d d d            d S # 1 swxY w Y   d S )Nunable to open database filewinrd   )sysplatform
startswithr   r   rd   r   assertRaisesRegexrB   r   	exceptionr,   sqlite_errorcoder<   sqlite_errorname)r/   err_msgerr_codedbcmes         r   test_error_code_on_exceptionz(ModuleTests.test_error_code_on_exception4  sm   0<""5)) 	.3HH-HZZ 	N2''g>> #"r"""# # # # # # # # # # # # # # #AQ/:::OOA.99:KLLMMM	N 	N 	N 	N 	N 	N 	N 	N 	N 	N 	N 	N 	N 	N 	N 	N 	N 	Ns7   	!C2*B?C2B	C2B	AC22C69C6r   zRequires SQLite 3.7.16 or newerc                    t                      5 }|5  |                    d           d d d            n# 1 swxY w Y   d}|                     t          j        |          5 }|                    d           d d d            n# 1 swxY w Y   |j        }|                     |j        t          j                   |                     |j	        d           d d d            d S # 1 swxY w Y   d S )Nz&create table t(t integer check(t > 0))zconstraint failedzinsert into t values(-1)r   )
r   executer  r   rR   r  r,   r  r   r  )r/   conerrmsgr  excs        r   %test_extended_error_code_on_exceptionz1ModuleTests.test_extended_error_code_on_exceptionB  s     		N# F FDEEEF F F F F F F F F F F F F F F(F''(=vFF 8"67778 8 8 8 8 8 8 8 8 8 8 8 8 8 8,CS1#;= = =S13LMMM		N 		N 		N 		N 		N 		N 		N 		N 		N 		N 		N 		N 		N 		N 		N 		N 		N 		NsQ   C"4C"8	C"8	%C"!B7C"B	C"
B	A
C""C&)C&darwinz#shared cache is deprecated on macOSc                     dD ]c}|                      t                    5 }t          j        |           d d d            n# 1 swxY w Y   |                     d|j                   dd S )N)TFzdbapi.py)assertWarnsDeprecationWarningr   enable_shared_cacher4   filename)r/   enabler  s      r   test_shared_cache_deprecatedz(ModuleTests.test_shared_cache_deprecatedR  s    # 	3 	3F!!"455 3*62223 3 3 3 3 3 3 3 3 3 3 3 3 3 3MM*bk2222	3 	3s   A  A	A	c                     t          j        d          }t          | t           |d                               t          | t           j                   d S )Nr   select 1)r   r   r   typeBlobr/   r   s     r   test_disallow_instantiationz'ModuleTests.test_disallow_instantiationY  sI    ^J''$T4:+?+?@@@$T6;77777r    c                     |                      t          j        d                     |                     t          j        d                     d S )Nzselect tzcreate table t(t);)assertFalser   complete_statementr<   r.   s    r   test_complete_statementz#ModuleTests.test_complete_statement^  sE    2:>>???12FGGHHHHHr    N)__name__
__module____qualname__r0   r6   r:   r@   rC   rF   rI   rL   rO   rS   rV   rY   r\   r  r  unittestskipIfr   r
  r%  r  r  r-  r3  r7   r    r   r*   r*   :   s       L L L+ + +
, , ,
? ? ?@ @ @E E ED D DH H HO O OM M ML L LO O OP P P
@8 @8 @8DN N N X_V/:=68 8
N 
N8 8
N X_S\X-/TUU3 3 VU38 8 8
I I I I I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d Zd Zd Zd Zd Zd Zd Zd Zd ZdS )ConnectionTestsc                     t          j        d          | _        | j                                        }|                    d           |                    dd           d S )Nr   z4create table test(id integer primary key, name text)!insert into test(name) values (?)foo)r   r   r   cursorr!  r/   cus     r   setUpzConnectionTests.setUpe  sR    .,,W^^


IJJJ


6AAAAAr    c                 8    | j                                          d S r#   r   closer.   s    r   tearDownzConnectionTests.tearDownk      r    c                 8    | j                                          d S r#   r   commitr.   s    r   test_commitzConnectionTests.test_commitn  s    r    c                 j    | j                                          | j                                          dS )zV
        A commit should also work when no changes were made to the database.
        NrN  r.   s    r   test_commit_after_no_changesz,ConnectionTests.test_commit_after_no_changesq  s.     	r    c                 8    | j                                          d S r#   r   rollbackr.   s    r   test_rollbackzConnectionTests.test_rollbackx  s    r    c                 j    | j                                          | j                                          dS )zX
        A rollback should also work when no changes were made to the database.
        NrT  r.   s    r   test_rollback_after_no_changesz.ConnectionTests.test_rollback_after_no_changes{  s2     	r    c                 8    | j                                         }d S r#   r   rD  rE  s     r   test_cursorzConnectionTests.test_cursor  s    W^^r    c                     d}|                      t          j                  5  t          j        |           d d d            d S # 1 swxY w Y   d S )Nz/foo/bar/bla/23534/mydb.db)assertRaisesr   rN   r   )r/   YOU_CANNOT_OPEN_THISs     r   test_failed_openz ConnectionTests.test_failed_open  s    ;v677 	1 	1N/000	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1s   AAAc                 8    | j                                          d S r#   rI  r.   s    r   
test_closezConnectionTests.test_close  rL  r    c                 ,   d}| j                                         }|                    |          }| j                                          |                     t
          j        |j                   |                     t
          j        |j        |           |                     t
          j        |j        |g            |                     t
          j        |j	        |           |                     t
          j        | j         j        |           |                     t
          j        | j         j        |g            |                     t
          j        | j         j	        |           |                     t
          j        | j         j
        ddd            |                     t
          j        | j         j                   |                     t
          j                  5  | j         5  	 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 )Nr/  tr2   c                     | S r#   r=  xs    r   <lambda>z6ConnectionTests.test_use_after_close.<locals>.<lambda>  s    Q r    )r   rD  r!  rJ  r]  r   rX   fetchallexecutemanyexecutescriptcreate_function)r/   sqlrF  ress       r   test_use_after_closez$ConnectionTests.test_use_after_close  s;   W^^jjoo&13<@@@&12:sCCC&12>3KKK&123CSIII&147?CHHH&1'-sB	8 	8 	8&1473H#NNN&1'13;;	H 	H 	H&147>BBBv677 	 	                	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s6   H	#G1%H	1G5	5H	8G5	9H		HHc                 N   |                      | j        j        t          j                   |                      | j        j        t          j                   |                      | j        j        t          j                   |                      | j        j        t          j                   |                      | j        j        t          j                   |                      | j        j        t          j                   |                      | j        j	        t          j	                   |                      | j        j
        t          j
                   |                      | j        j        t          j                   |                      | j        j        t          j                   d S r#   )r,   r   r>   r   rB   rE   rH   rK   rN   rR   rU   rX   r[   r.   s    r   test_exceptionszConnectionTests.test_exceptions  s0   &.999555/1FGGG.0DEEE*F,<===163JKKK/1FGGG.0DEEE163JKKK2F4LMMMMMr    c                    t          j        d          }|                                }|                     |j        d           |                    d           |                     |j        d           |                    dd           |                     |j        d           |                    ddg           |                                }|                     |j        d           |                                 |                     |j        d           |                    ddg           |                                }|                     |j        d           d S )	Nr   Fz?create table transactiontest(id integer primary key, name text)z,insert into transactiontest(name) values (?)rB  Tz-select name from transactiontest where name=?rC  )r   r   rD  r,   in_transactionr!  fetchonerO  )r/   r   rF  rows       r   test_in_transactionz#ConnectionTests.test_in_transaction  s7   ^J''YY[[*E222


TUUU*E222


A8LLL*D111


BUGLLLkkmm*D111
		*E222


BUGLLLkkmm*E22222r    c                     |                      t                    5  d| j        _        d d d            d S # 1 swxY w Y   d S )NT)r]  AttributeErrorr   rr  r.   s    r   test_in_transaction_roz&ConnectionTests.test_in_transaction_ro  s    ~.. 	* 	*%)DG"	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	*s   599c           	      <   g d}|D ]}|                      |          5  |                     t          | j        |                     |                     t          t          |          t          | j        |                     d d d            n# 1 swxY w Y   d S )N)	rK   rH   rB   rR   rE   r[   rN   rX   r>   )r$  )r  r<   r  r   assertIsgetattrr   )r/   
exceptionsr$  s      r   test_connection_exceptionsz*ConnectionTests.test_connection_exceptions  s    

 

 


  	K 	KC#&& K K 5 5666gfc22GDGS4I4IJJJK K K K K K K K K K K K K K K	K 	Ks   A%BB	B	c                     t          j        d          }|                                 |                     t           j                  5  |                                 d d d            d S # 1 swxY w Y   d S r   )r   r   rJ  r]  rX   	interruptr2  s     r   test_interrupt_on_closed_dbz+ConnectionTests.test_interrupt_on_closed_db  s    ^J''



v677 	 	LLNNN	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	   A**A.1A.c                 ^    |                      | j                                                   d S r#   )assertIsNoner   r  r.   s    r   test_interruptzConnectionTests.test_interrupt  s*    $'++--.....r    c                     t          d          D ]M}| j                            d|           }|                     |                                d         |           Nd S )Ni  zselect r   )ranger   r!  r,   rs  )r/   nrF  s      r   test_drop_unused_refsz%ConnectionTests.test_drop_unused_refs  s`    s 	2 	2A1//BR[[]]1-q1111	2 	2r    c                    t           j        }| j                            |          }	 d}| j                            ||          }|                     ||           |                     | j                            |          |           d}|                     t           j        || j        j        d           | j                            ||           d S # | j                            ||           w xY w)Nr   query string is too largezselect 1 as '16')	r   r   r   getlimitr$   r,   r  rK   r!  )r/   r%   saved_limit	new_limit
prev_limitmsgs         r   test_connection_limitsz&ConnectionTests.test_connection_limits  s    1g&&x00		4I))(I>>J[*555TW--h77CCC-C""6#3S#'7?4FH H H GX{33333DGX{3333s   BC C1c                     d}d}|                      t          j        || j        j        |           |                      t          j        || j        j        |d           d S )Nz'category' is out of boundsiW  r   )r  r   rX   r   r  r$   )r/   r  cats      r   "test_connection_bad_limit_categoryz2ConnectionTests.test_connection_bad_limit_category  sj    +v6#w/	6 	6 	6v6#w/a	9 	9 	9 	9 	9r    c           	         d}d}|D ]}|                      |          5  |                     t          |          5  t          |           d d d            n# 1 swxY w Y   t                      5 }|                     t          |          5  ||_        d d d            n# 1 swxY w Y   |                     |j        d           d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   d S )NzJisolation_level string must be '', 'DEFERRED', 'IMMEDIATE', or 'EXCLUSIVE')BOGUS DEFERREIMMEDIATEXCLUSIV	DEFERREDS
IMMEDIATES
EXCLUSIVESlevelisolation_level )r  r  
ValueErrorr   r  r,   )r/   r  levelsr  r   s        r   (test_connection_init_bad_isolation_levelz8ConnectionTests.test_connection_init_bad_isolation_level  s     		
  	= 	=EE** = =++J<< ; ;#E::::; ; ; ; ; ; ; ; ; ; ; ; ; ; ;$&& ="//
C@@ 3 3-2*3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 $$R%7<<<	= = = = = = = = = = = = = = == = = = = = = = = = = = = = =	= 	=s|   C*AC*AC*A C*1CB!	C!B%%C(B%)CC*CC*CC**C.	1C.	c                    dD ]}|                      |          5  t          |          5 }|                     |j        |           d d d            n# 1 swxY w Y   t                      5 }|                     |j        d           ||_        |                     |j        |           d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   d S )N)r  DEFERRED	IMMEDIATE	EXCLUSIVENr  r  r  )r  r   r,   r  )r/   r  r   s      r   *test_connection_init_good_isolation_levelsz:ConnectionTests.test_connection_init_good_isolation_levels  s   E 	@ 	@EE** @ @$U;;; @r$$R%7???@ @ @ @ @ @ @ @ @ @ @ @ @ @ @$&& @"$$R%7<<<).B&$$R%7???@ @ @ @ @ @ @ @ @ @ @ @ @ @ @@ @ @ @ @ @ @ @ @ @ @ @ @ @ @	@ 	@sX   CACACAC->B7+C7B;;C>B;?CC	C	c                    d}t          j        |          }t          |_        t           j        |_        |                                }|                    d           |                    dd t          d          D                        |                    d           d |
                    d          D             }|                     t          d	 |D                                  |                     d
 |D             ddg           |                    |           |                    d           |                    dd dD                        d |                                D             }|                     t          d |D                                  |                     d |D             ddg           d S )Nr   zcreate table foo (bar)z insert into foo (bar) values (?)c              3   6   K   | ]}t          |          fV  d S r#   )str.0vs     r   	<genexpr>z9ConnectionTests.test_connection_reinit.<locals>.<genexpr>$  s*      44aQ	444444r       zselect bar from fooc                     g | ]}|S r=  r=  r  rs     r   
<listcomp>z:ConnectionTests.test_connection_reinit.<locals>.<listcomp>'  s    +++a+++r    r   c              3   J   K   | ]}t          |t          j                  V  d S r#   
isinstancer   Rowr  s     r   r  z9ConnectionTests.test_connection_reinit.<locals>.<genexpr>(  .      DD!Jq&*55DDDDDDr    c                     g | ]
}|d          S r   r=  r  s     r   r  z:ConnectionTests.test_connection_reinit.<locals>.<listcomp>)      ---1!A$---r       0   1c              3      K   | ]}|fV  d S r#   r=  r  s     r   r  z9ConnectionTests.test_connection_reinit.<locals>.<genexpr>.  s$      ;;;;;;;;r    )abcdc                     g | ]}|S r=  r=  r  s     r   r  z:ConnectionTests.test_connection_reinit.<locals>.<listcomp>1  s    )))a)))r    c              3   J   K   | ]}t          |t          j                  V  d S r#   r  r  s     r   r  z9ConnectionTests.test_connection_reinit.<locals>.<genexpr>2  r  r    c                     g | ]
}|d          S r  r=  r  s     r   r  z:ConnectionTests.test_connection_reinit.<locals>.<listcomp>3  r  r    23)r   r   bytestext_factoryr  row_factoryrD  r!  ri  r  	fetchmanyr<   allr,   __init__rh  )r/   r  r   rF  rowss        r   test_connection_reinitz&ConnectionTests.test_connection_reinit  s   ^BYY[[


+,,,
944588444	6 	6 	6


()))++2<<??+++DDtDDDDDEEE-----d|<<<
B


+,,,
9;;&:;;;	= 	= 	= *)2;;==)))DDtDDDDDEEE-----Sz:::::r    c                    t          j        d          }|5  |                    d           d d d            n# 1 swxY w Y   t                      5 }|                     t           j        d|j        |           |                     t           j        d|j        dd t          d          D                        d d d            d S # 1 swxY w Y   d S )Nr   create table t(t)r  #Base Connection.__init__ not calledzinsert into t values(?)c              3      K   | ]}|fV  d S r#   r=  r  s     r   r  z=ConnectionTests.test_connection_bad_reinit.<locals>.<genexpr>@  s$      #;#;QQD#;#;#;#;#;#;r    r3   )
r   r   r!  r   r  rN   r  rX   ri  r  )r/   r   r  s      r   test_connection_bad_reinitz*ConnectionTests.test_connection_bad_reinit5  sR   ^J'' 	, 	,JJ*+++	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	,ZZ 	=2""6#:#A#%;4 4 4 ""6#:#H#%>3L#;#;%((#;#;#;= = =		= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	=s    9= =A'CC
C
N)r8  r9  r:  rG  rK  rP  rR  rV  rX  r[  r_  ra  rn  rp  ru  rx  r}  r  r  r  r  r  r  r  r  r  r=  r    r   r?  r?  c  sy       B B B            1 1 1
    (N N N3 3 3$* * *K K K"  / / /2 2 2
4 4 49 9 9= = =2@ @ @; ; ;2= = = = =r    r?  c                       e Zd Zd Zd ZdS )UninitialisedConnectionTestsc                 b    t           j                            t           j                  | _        d S r#   )r   
Connection__new__r   r.   s    r   rG  z"UninitialisedConnectionTests.setUpD  s!    #++F,=>>r    c                       fd fd fd fd fd fdf}|D ]Q}                      |          5                       t          j        d|           d d d            n# 1 swxY w Y   Rd S )	Nc                       j         j        S r#   )r   r  r.   s   r   rg  zEUninitialisedConnectionTests.test_uninit_operations.<locals>.<lambda>I  s    DG+ r    c                       j         j        S r#   )r   total_changesr.   s   r   rg  zEUninitialisedConnectionTests.test_uninit_operations.<locals>.<lambda>J  s    DG) r    c                       j         j        S r#   )r   rr  r.   s   r   rg  zEUninitialisedConnectionTests.test_uninit_operations.<locals>.<lambda>K  s    DG* r    c                  6     j                                         S r#   )r   iterdumpr.   s   r   rg  zEUninitialisedConnectionTests.test_uninit_operations.<locals>.<lambda>L  s    DG$$&& r    c                  6     j                                         S r#   rZ  r.   s   r   rg  zEUninitialisedConnectionTests.test_uninit_operations.<locals>.<lambda>M  s    DGNN$$ r    c                  6     j                                         S r#   rI  r.   s   r   rg  zEUninitialisedConnectionTests.test_uninit_operations.<locals>.<lambda>N  s    DGMMOO r    )funcr  )r  r  r   rX   )r/   funcsr  s   `  r   test_uninit_operationsz3UninitialisedConnectionTests.test_uninit_operationsG  s    ++++))))****&&&&$$$$####
  	- 	-D4(( - -&&v'>'L'+- - -- - - - - - - - - - - - - - -	- 	-s   "A$$A(	+A(	N)r8  r9  r:  rG  r  r=  r    r   r  r  C  s2        ? ? ?- - - - -r    r  	serializezNeeds SQLite serialize APIc                       e Zd Zd Zd Zd Z ej        ej	        dk    d           e
ddd	          d
                         ZdS )SerializeTestsc                 *   t                      5 }|5  |                    d           d d d            n# 1 swxY w Y   |                                }|5  |                    d           d d d            n# 1 swxY w Y   d}|                     t          j        |          5  |                    d           d d d            n# 1 swxY w Y   |                    |           |                    d           d d d            d S # 1 swxY w Y   d S )Nr  zdrop table tzno such tablezselect t from t)r   r!  r  r  r   rN   deserialize)r/   r   dataregexs       r   test_serialize_deserializez)SerializeTests.test_serialize_deserializeZ  s    	*" 0 0

.///0 0 0 0 0 0 0 0 0 0 0 0 0 0 0<<>>D  + +

>***+ + + + + + + + + + + + + + +#E''(?GG . .

,---. . . . . . . . . . . . . . . NN4   JJ()))	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	*st   D4D8	D8	DA7+D7A;	;D>A;	?%D$C:DC
	
DC
	-DDDc                 h   t           t          d          d d d         ft          g ft          dft          d ff}|D ]v\  }}|                     ||          5  t	                      5 }|                     ||j        |           d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   wd S )Ns   blobr   r2   )r$  arg)BufferError
memoryview	TypeErrorr  r   r]  r  )r/   datasetr$  r  r   s        r   test_deserialize_wrong_argsz*SerializeTests.test_deserialize_wrong_argsk  sb   *W--ccc23ON	
   	@ 	@HC#3// @ @$&& @"%%c2>3???@ @ @ @ @ @ @ @ @ @ @ @ @ @ @@ @ @ @ @ @ @ @ @ @ @ @ @ @ @	@ 	@s6   B&&BB&BB&BB&&B*	-B*	c                    t                      5 }d}|                     t          j        |          5  |                    d           |                    d           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file is not a databases    zcreate table fail(f))r   r  r   rH   r  r!  )r/   r   r  s      r   !test_deserialize_corrupt_databasez0SerializeTests.test_deserialize_corrupt_databasew  s	    	3",E''(<eDD 3 3y))) 

1222	3 3 3 3 3 3 3 3 3 3 3 3 3 3 3	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3s4   #B+A)B)A-	-B0A-	1BBB        zrequires 64bit platforml            r3   F)sizememusedry_runc                     t                      5 }|                     t          d          5  |                    dt          z             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'data' is too large   b)r   r  OverflowErrorr  r  r2  s     r   $test_deserialize_too_much_data_64bitz3SerializeTests.test_deserialize_too_much_data_64bit  s      	,"''7LMM , ,td{+++, , , , , , , , , , , , , , ,	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	,s4   A-A	A-A	A-A	A--A14A1N)r8  r9  r:  r  r  r  r;  
skipUnlessr  maxsizer   r   r=  r    r   r  r  W  s        * * *"
@ 
@ 
@3 3 3 Xu,.GHHZU1e444, , 54 IH, , ,r    r  c                      e Zd ZdZd Z ej        ej        dk    d           ej        ej        dk    d           ej        e	pe
d           ej        ed          d	                                                 Zd
 Zd Zd Z ej        ej        dk    d           ej        ej        dk    d           ej        e	pe
d           ej        ed          d                                                 Zd Zd ZdS )	OpenTestszcreate table test(id integer)c                    t          t                    }|                     t          |           |                     t
          j                            |                     t          j	        t          j        |                    5 }|                     t
          j                            |                     |                    | j                   ddd           dS # 1 swxY w Y   dS )z| Checks that we can successfully connect to a database using an object that
            is PathLike, i.e. has __fspath__(). N)r   r   
addCleanupr   r5  ospathexistsr   r   r   r   r<   r!  _sqlr/   r  r   s      r   test_open_with_path_like_objectz)OpenTests.test_open_with_path_like_object  s     %%%--...t 4 455 	"OOBGNN400111JJty!!!	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	"s   AC""C&)C&win32zskipped on Windowsr&  zskipped on macOSz not supported on Emscripten/WASIz)only works if there are undecodable pathsc                    t           }|                     t          |           |                     t          j                            |                     t          j        t          j
        |                    5 }|                     t          j                            |                     |                    | j                   d d d            d S # 1 swxY w Y   d S r#   )r   r  r   r5  r  r  r	  r   r   r   r   r<   r!  r
  r  s      r   test_open_with_undecodable_pathz)OpenTests.test_open_with_undecodable_path  s    
 "%%%--...t 4 455 	"OOBGNN400111JJty!!!	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	"s   ;ACCCc                 0   t           }|                     t          |           dt          j                            t          j        |                    z   }|                     t          j	        
                    |                     t          j        t          j        |d                    5 }|                     t          j	        
                    |                     |                    | j                   d d d            d S # 1 swxY w Y   d S Nfile:Turi)r   r  r   urllibparsequoter  fsencoder5  r  r	  r   r   r   r   r<   r!  r
  r/   r  r  r   s       r   test_open_urizOpenTests.test_open_uri  s   %%%**2;t+<+<===--...s = = =>> 	""OOBGNN400111JJty!!!	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	"s   1ADDDc                    t           }|                     t          |           d|z   }|                     t          j                            |                     t          j        t          j
        |d                    5 }|                     t          j                            |                     |                    | j                   d d d            d S # 1 swxY w Y   d S r  )r   r  r   r5  r  r  r	  r   r   r   r   r<   r!  r
  r  s       r   test_open_unquoted_uriz OpenTests.test_open_unquoted_uri  s    %%%n--...s = = =>> 	""OOBGNN400111JJty!!!	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	"s   ACC #C c                    t           }|                     t          |           dt          j                            t          j        |                    z   dz   }|                     t          j	        
                    |                     |                     t          j                  5  t          j        |d           d d d            n# 1 swxY w Y   |                     t          j	        
                    |                     t          j        |                                           |                     t          j	        
                    |                     t#          j        t          j        |d                    5 }|                     t          j                  5  |                    | j                   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 )Nr  z?mode=roTr  )r   r  r   r  r  r  r  r  r5  r  r	  r]  r   rN   r   rJ  r<   r   r   r!  r
  r  s       r   test_open_uri_readonlyz OpenTests.test_open_uri_readonly  sF   %%%**2;t+<+<===
J--...v677 	* 	*N3D))))	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	*--...t""$$$t,,---s = = =>> 	&"""6#:;; & &

49%%%& & & & & & & & & & & & & & &	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	&sH   +CCC G*+GG*G	G*G	G**G.1G.c                    t           }|                     t          |           dt          j                            |          z   }|                     t          j        	                    |                     t          j        t          j        |d                    5 }|                     t          j        	                    |                     |                    | j                   d d d            d S # 1 swxY w Y   d S r  )r   r  r   r  r  r  r5  r  r  r	  r   r   r   r   r<   r!  r
  r  s       r   test_open_undecodable_uriz#OpenTests.test_open_undecodable_uri  s   
 "%%%**4000--...s = = =>> 	""OOBGNN400111JJty!!!	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	"s   AC99C= C=c                 H   fd}t           t          j        t                     t          t                     t          t          j        t                               fD ]B}d t	          j        ||                                           |                     |           Cd S )Nc                 2    | t          j        dg|R i |S r   )r   r  )databaser   r   database_args      r   factoryz4OpenTests.test_factory_database_arg.<locals>.factory  s)    #L$ZA$AAA&AAAr    )r%  )r   r  r  r   r   r   rJ  r,   )r/   r%  r#  r$  s      @r   test_factory_database_argz#OpenTests.test_factory_database_arg  s    	B 	B 	B 	B 	B
  V!4!4!&))8BK4G4G+H+HJ 	5 	5HLN8W555;;===\84444		5 	5r    c                     t          j        t          j        d                    5 }|                     t          |          t          j                   d d d            d S # 1 swxY w Y   d S )Nr   )r#  )r   r   r   r   r,   r0  r  r2  s     r   test_database_keywordzOpenTests.test_database_keyword  s    
 C C CDD 	:T"XXv'8999	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	:s   .A##A'*A'N)r8  r9  r:  r
  r  r;  r<  r  r  r   r   r  r   r  r  r  r  r   r&  r(  r=  r    r   r  r    s       *D" " " X_S\W,.BCCX_S\X-/ABBX_]-g/QRRX+-XYY" " ZY SR CB DC"" " "" " "& & &  X_S\W,.BCCX_S\X-/ABBX_]-g/QRRX+-XYY" " ZY SR CB DC"
5 
5 
5: : : : :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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j         e!j"        dk     d          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, Z0d- Z1d. Z2d/ Z3d0 Z4d1 Z5d2 Z6d3 Z7d4 Z8d5 Z9d6 Z:d7 Z;d8 Z<d9 Z=d: Z>d;S )<CursorTestsc                     t          j        d          | _        | j                                        | _        | j                            d           | j                            dd           d S )Nr   z\create table test(id integer primary key, name text, income number, unique_test text unique)rA  rB  r   r   r   rD  rF  r!  r.   s    r   rG  zCursorTests.setUp  sb    .,,'..""6	
 	
 	
 	;XFFFFFr    c                 j    | j                                          | j                                         d S r#   rF  rJ  r   r.   s    r   rK  zCursorTests.tearDown  $    r    c                 :    | j                             d           d S )Ndelete from testrF  r!  r.   s    r   test_execute_no_argsz CursorTests.test_execute_no_args  s    *+++++r    c                     |                      t          j                  5  | j                            d           d d d            d S # 1 swxY w Y   d S )Nzselect asdf)r]  r   rN   rF  r!  r.   s    r   test_execute_illegal_sqlz$CursorTests.test_execute_illegal_sql  s    v677 	+ 	+GOOM***	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+   AAAc                    d}d}|D ]}|                      |          5  |                     t          j        |          5  | j                            |           d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   d S )Nz,You can only execute one statement at a time)
zselect 1; select 2z)select 1; // c++ comments are not allowedzselect 1; *not a commentzselect 1; -*not a commentzselect 1; /* */ azselect 1; /**/azselect 1; -zselect 1; /zselect 1; -
- select 2zHselect 1;
               -- comment
               select 2
            query)r  r  r   rX   rF  r!  )r/   r  r  r9  s       r    test_execute_multiple_statementsz,CursorTests.test_execute_multiple_statements  s   <
  	+ 	+EE** + +++F,CSII + +GOOE***+ + + + + + + + + + + + + + ++ + + + + + + + + + + + + + +	+ 	+s5   !A> A'A>'A++A>.A+/A>>B	B	c                     d}|D ]J}|                      |          5  | j                            |           d d d            n# 1 swxY w Y   Kd S )N)zselect 1; -- foo barzselect 1; --zselect 1; /*zT
            select 5+4;

            /*
            foo
            */
            r8  )r  rF  r!  )r/   r  r9  s      r   #test_execute_with_appended_commentsz/CursorTests.test_execute_with_appended_comments  s    
  	' 	'EE** ' '&&&' ' ' ' ' ' ' ' ' ' ' ' ' ' '	' 	's   AA	A	c                     |                      t                    5  | j                            d           d d d            d S # 1 swxY w Y   d S N*   )r]  r  rF  r!  r.   s    r   test_execute_wrong_sql_argz&CursorTests.test_execute_wrong_sql_arg  s    y)) 	  	 GOOB	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	 s   AA
Ac                 <    | j                             dd           d S )Ninsert into test(id) values (?))r?  r2  r.   s    r   test_execute_arg_intz CursorTests.test_execute_arg_int!  s    95AAAAAr    c                 <    | j                             dd           d S )N#insert into test(income) values (?))gq=
ף@r2  r.   s    r   test_execute_arg_floatz"CursorTests.test_execute_arg_float$  s    =zJJJJJr    c                 <    | j                             dd           d S )NrA  )Hugor2  r.   s    r   test_execute_arg_stringz#CursorTests.test_execute_arg_string'  s    ;YGGGGGr    c                     | j                             dd           | j                             d| j         j        f           | j                                         }|                     |d         d           d S )NrA  )Hu goz select name from test where id=?r   rK  )rF  r!  	lastrowidrs  r,   r/   rt  s     r   &test_execute_arg_string_with_zero_bytez2CursorTests.test_execute_arg_string_with_zero_byte*  sk    ;]KKK:TW=N<PQQQg  Q,,,,,r    c                     |                      t          j                  5 }| j                            dd           d d d            n# 1 swxY w Y   |                     t          |j                  d           d S )NrB  r?  z"parameters are of unsupported type)r]  r   rX   rF  r!  r,   r  r  )r/   r  s     r   test_execute_non_iterablez%CursorTests.test_execute_non_iterable1  s    v677 	C2GOO=rBBB	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	CR\**,PQQQQQs   AAAc                     |                      t          j                  5  | j                            dd           d d d            d S # 1 swxY w Y   d S )NrB  )r   Egonr]  r   rX   rF  r!  r.   s    r   test_execute_wrong_no_of_args1z*CursorTests.test_execute_wrong_no_of_args16  s    v677 	M 	MGOO=|LLL	M 	M 	M 	M 	M 	M 	M 	M 	M 	M 	M 	M 	M 	M 	M 	M 	M 	Ms   A		AAc                     |                      t          j                  5  | j                            d           d d d            d S # 1 swxY w Y   d S NrB  rS  r.   s    r   test_execute_wrong_no_of_args2z*CursorTests.test_execute_wrong_no_of_args2;      v677 	? 	?GOO=>>>	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	?r6  c                     |                      t          j                  5  | j                            d           d d d            d S # 1 swxY w Y   d S rV  rS  r.   s    r   test_execute_wrong_no_of_args3z*CursorTests.test_execute_wrong_no_of_args3@  rX  r6  c                     | j                             d           | j                             ddg           | j                                         }|                     |d         d           d S )N%insert into test(name) values ('foo')"select name from test where name=?rC  r   rF  r!  rs  r,   rM  s     r   test_execute_param_listz#CursorTests.test_execute_param_listE  sc    ?@@@<ugFFFg  Q'''''r    c                     G d d          }| j                             d           | j                             d |                       | j                                         }|                     |d         d           d S )Nc                       e Zd Zd Zd ZdS )2CursorTests.test_execute_param_sequence.<locals>.Lc                     dS )Nr2   r=  r.   s    r   __len__z:CursorTests.test_execute_param_sequence.<locals>.L.__len__M  s    qr    c                     |dk    sJ dS )Nr   rC  r=  r/   rf  s     r   __getitem__z>CursorTests.test_execute_param_sequence.<locals>.L.__getitem__O  s    Avvvvur    Nr8  r9  r:  rd  rg  r=  r    r   Lrb  L  s2              r    ri  r\  r]  r   rC  r^  )r/   ri  rt  s      r   test_execute_param_sequencez'CursorTests.test_execute_param_sequenceK  s    	 	 	 	 	 	 	 	 	?@@@<aaccBBBg  Q'''''r    c                      G d d          }| j                             d           |                     t                    5  | j                             d |                       d d d            d S # 1 swxY w Y   d S )Nc                       e Zd Zd Zd ZdS ):CursorTests.test_execute_param_sequence_bad_len.<locals>.Lc                     ddz   d S )Nr2   r   r=  r.   s    r   rd  zBCursorTests.test_execute_param_sequence_bad_len.<locals>.L.__len__[  s    !r    c                     t           r#   )AssertionError)slfrf  s     r   rg  zFCursorTests.test_execute_param_sequence_bad_len.<locals>.L.__getitem__]  s    $$r    Nrh  r=  r    r   ri  rm  Z  s2          % % % % %r    ri  r\  r]  )rF  r!  r]  ZeroDivisionError)r/   ri  s     r   #test_execute_param_sequence_bad_lenz/CursorTests.test_execute_param_sequence_bad_lenX  s    	% 	% 	% 	% 	% 	% 	% 	% 	?@@@011 	G 	GGOO@!!##FFF	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	Gs   $A33A7:A7c                 ^   t           j        }d}t          | j        |d          5  | j                            dd           |                     t           j        |          5  | j                            dd           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too many SQL variablesr2   )r%   r&   zselect * from test where id=?r2   z(select * from test where id!=? and id!=?)r2   r   )r   r   r(   r   rF  r!  r  rN   )r/   r%   r  s      r   test_execute_too_many_paramsz(CursorTests.test_execute_too_many_paramsd  s-   6&dg::: 	( 	(GOO;TBBB''(?EE ( ( J &( ( (( ( ( ( ( ( ( ( ( ( ( ( ( ( (	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	(s5   <B""B
>B"
B	B"B	B""B&)B&c                     | j                             d           | j                             dddi           | j                                         }|                     |d         d           d S )Nr\  &select name from test where name=:namenamerC  r   r^  rM  s     r   test_execute_dict_mappingz%CursorTests.test_execute_dict_mappingm  se    ?@@@@65/RRRg  Q'''''r    c                     G d dt                     }| j                            d           | j                            d |                       | j                                        }|                     |d         d           d S )Nc                       e Zd Zd ZdS )8CursorTests.test_execute_dict_mapping_mapping.<locals>.Dc                     dS NrC  r=  )r/   keys     r   __missing__zDCursorTests.test_execute_dict_mapping_mapping.<locals>.D.__missing__u  s    ur    N)r8  r9  r:  r  r=  r    r   Dr}  t  s#            r    r  r\  rx  r   rC  )dictrF  r!  rs  r,   )r/   r  rt  s      r   !test_execute_dict_mapping_mappingz-CursorTests.test_execute_dict_mapping_mappings  s    	 	 	 	 	 	 	 	 	?@@@@!!##FFFg  Q'''''r    c                     | j                             d           |                     t          j                  5  | j                             dddi           d d d            d S # 1 swxY w Y   d S )Nr\  z1select name from test where name=:name and id=:idry  rC  rF  r!  r]  r   rX   r.   s    r   )test_execute_dict_mapping_too_little_argsz5CursorTests.test_execute_dict_mapping_too_little_args}  s    ?@@@v677 	b 	bGOOORXZ_Q`aaa	b 	b 	b 	b 	b 	b 	b 	b 	b 	b 	b 	b 	b 	b 	b 	b 	b 	b   A%%A),A)c                     | j                             d           |                     t          j                  5  | j                             d           d d d            d S # 1 swxY w Y   d S )Nr\  rx  r  r.   s    r   !test_execute_dict_mapping_no_argsz-CursorTests.test_execute_dict_mapping_no_args  s    ?@@@v677 	F 	FGOODEEE	F 	F 	F 	F 	F 	F 	F 	F 	F 	F 	F 	F 	F 	F 	F 	F 	F 	F   A""A&)A&c                     | j                             d           |                     t          j                  5  | j                             dddi           d d d            d S # 1 swxY w Y   d S )Nr\  r]  ry  rC  r  r.   s    r   !test_execute_dict_mapping_unnamedz-CursorTests.test_execute_dict_mapping_unnamed  s    ?@@@v677 	S 	SGOO@65/RRR	S 	S 	S 	S 	S 	S 	S 	S 	S 	S 	S 	S 	S 	S 	S 	S 	S 	Sr  c                 8    | j                                          d S r#   )rF  rJ  r.   s    r   ra  zCursorTests.test_close  rL  r    c                    | j                             d           | j                             d           | j                             d           | j                             d           |                     | j         j        d           d S )Nr1  r\  zupdate test set name='bar'r   rF  r!  r,   rowcountr.   s    r   test_rowcount_executez!CursorTests.test_rowcount_execute  sw    *+++?@@@?@@@4555)1-----r    c                 z    | j                             d           |                     | j         j        d           dS )z
        pysqlite does not know the rowcount of SELECT statements, because we
        don't fetch all rows after executing the select statement. The rowcount
        has thus to be -1.
        zselect 5 union select 6Nr  r.   s    r   test_rowcount_selectz CursorTests.test_rowcount_select  s:     	1222)2.....r    c                     | j                             d           | j                             dg d           |                     | j         j        d           d S )Nr1  rA  ru  )r   r3   r3   )rF  r!  ri  r,   r  r.   s    r   test_rowcount_executemanyz%CursorTests.test_rowcount_executemany  sX    *+++?ASASASTTT)1-----r    )r3   #   r   zRequires SQLite 3.35.0 or newerc                     | j                             d           |                     | j                                         d         d           |                     | j         j        d           d S )Nz7update test set name='bar' where name='foo' returning 1r   r2   )rF  r!  r,   rs  r  r.   s    r   test_rowcount_update_returningz*CursorTests.test_rowcount_update_returning  sc     	QRRR))++A.222)1-----r    c                 b   | j                             d           |                     | j         j        d           | j                             d           |                     | j         j        d           | j                             d           |                     | j         j        d           d S )NzW
            -- foo
            insert into test(name) values ('foo'), ('foo')
        r   z
            /* -- messy *r /* /* ** *- *--
            */
            /* one more */ insert into test(name) values ('messy')
        r2   z5/* bar */ update test set name='bar' where name='foo'r3   r  r.   s    r   #test_rowcount_prefixed_with_commentz/CursorTests.test_rowcount_prefixed_with_comment  s      	 	 	 	)1---  	 	 	
 	)1---OPPP)1-----r    c                 &   d}| j                             d|           |                     | j         j        d           | j                                         | j                             d           |                     | j         j        d           d S )Nr  z"insert into test(income) values(?)r3   vacuumr  )rF  ri  r,   r  r   rO  r!  )r/   r  s     r   test_rowcount_vaccuumz!CursorTests.test_rowcount_vaccuum  s    !@$GGG)1---!!!)2.....r    c                     | j                             d           | j                             d           |                     d| j        j        d           d S )Nr\  r   z"total changes reported wrong value)r  )rF  r!  
assertLessr   r  r.   s    r   test_total_changeszCursorTests.test_total_changes  sP    ?@@@?@@@4706Z[[[[[r    c                 l    | j                             dd t          dd          D                        d S )NrE  c                     g | ]}|fS r=  r=  )r  rf  s     r   r  z:CursorTests.test_execute_many_sequence.<locals>.<listcomp>  s    CbCbCbQQDCbCbCbr    d   n   )rF  ri  r  r.   s    r   test_execute_many_sequencez&CursorTests.test_execute_many_sequence  s=    ACbCbRWX[]`RaRaCbCbCbcccccr    c                 f     G d d          }| j                             d |                       d S )Nc                        e Zd Zd Zd Zd ZdS )6CursorTests.test_execute_many_iterator.<locals>.MyIterc                     d| _         d S N   )valuer.   s    r   r  z?CursorTests.test_execute_many_iterator.<locals>.MyIter.__init__  s    


r    c                     | S r#   r=  r.   s    r   __iter__z?CursorTests.test_execute_many_iterator.<locals>.MyIter.__iter__  s    r    c                 V    | j         dk    rt          | xj         dz  c_         | j         fS )Nr   r2   )r  StopIterationr.   s    r   __next__z?CursorTests.test_execute_many_iterator.<locals>.MyIter.__next__  s.    :##''JJ!OJJ J=(r    N)r8  r9  r:  r  r  r  r=  r    r   MyIterr    sA            ) ) ) ) )r    r  rE  rF  ri  )r/   r  s     r   test_execute_many_iteratorz&CursorTests.test_execute_many_iterator  sQ    	) 	) 	) 	) 	) 	) 	) 	) 	A6688LLLLLr    c                 R    d }| j                             d |                       d S )Nc               3   8   K   t          d          D ]} | fV  d S r  )r  )is    r   mygenz6CursorTests.test_execute_many_generator.<locals>.mygen  s2      1XX  d



 r    rE  r  )r/   r  s     r   test_execute_many_generatorz'CursorTests.test_execute_many_generator  s8    	 	 	 	A5577KKKKKr    c                     |                      t                    5  | j                            ddg           d d d            d S # 1 swxY w Y   d S )Nr?  r  r]  r  rF  ri  r.   s    r   test_execute_many_wrong_sql_argz+CursorTests.test_execute_many_wrong_sql_arg  s    y)) 	, 	,GTF+++	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	,s   AA	A	c                     |                      t          j                  5  | j                            ddg           d d d            d S # 1 swxY w Y   d S )Nzselect ?r  )r]  r   rX   rF  ri  r.   s    r   test_execute_many_selectz$CursorTests.test_execute_many_select  s    v677 	4 	4G
TF333	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4s   A

AAc                     |                      t                    5  | j                            dd           d d d            d S # 1 swxY w Y   d S )NrE  r?  r  r.   s    r   test_execute_many_not_iterablez*CursorTests.test_execute_many_not_iterable  s    y)) 	K 	KG ErJJJ	K 	K 	K 	K 	K 	K 	K 	K 	K 	K 	K 	K 	K 	K 	K 	K 	K 	Ks   AAAc                    | j                             d           | j                             dd           | j                             dd           | j                             d           g }| j         D ]}|                    |d                    |                     |d         d           |                     |d         d	           d S )
Nr1  rB  )r  )   zselect id from test order by idr   r  r2   r  )rF  r!  r  r,   )r/   lstrt  s      r   test_fetch_iterzCursorTests.test_fetch_iter  s    *+++94@@@94@@@9:::7 	 	CJJs1vQ###Q#####r    c                    | j                             d           | j                                         }|                     |d         d           | j                                         }|                     |d            d S )Nselect name from testr   rC  r^  rM  s     r   test_fetchonezCursorTests.test_fetchone   ss    /000g  Q'''g  d#####r    c                     | j                                         }|                                }|                     |d            d S r#   )r   rD  rs  r,   )r/   currt  s      r   test_fetchone_no_statementz&CursorTests.test_fetchone_no_statement  s<    gnnllnnd#####r    c                    |                      | j        j        d           d| j        _        | j                            d           | j                            d           | j                            d           | j                            d           | j                            d           | j                                        }|                      t          |          d           d S )Nr2   r   r1  z#insert into test(name) values ('A')z#insert into test(name) values ('B')z#insert into test(name) values ('C')r  )r,   rF  	arraysizer!  r  lenr/   rm  s     r   test_array_sizezCursorTests.test_array_size  s    *A...  	*+++=>>>=>>>=>>>/000g!!S1%%%%%r    c                    | j                             d           | j                             d          }|                     t	          |          d           | j                             d          }|                     |g            d S )Nr  r  r2   rF  r!  r  r,   r  r  s     r   test_fetchmanyzCursorTests.test_fetchmany  sy    /000g$$S1%%%g$$b!!!!!r    c                     | j                             d           | j                             d          }|                     t	          |          d           dS )z0Checks if fetchmany works with keyword argumentsr  r  )r  r2   Nr  r  s     r   test_fetchmany_kw_argz!CursorTests.test_fetchmany_kw_arg$  sQ    /000gS))S1%%%%%r    c                    | j                             d           | j                                         }|                     t	          |          d           | j                                         }|                     |g            d S )Nr  r2   )rF  r!  rh  r,   r  r  s     r   test_fetchallzCursorTests.test_fetchall*  su    /000g  S1%%%g  b!!!!!r    c                 >    | j                             g d           d S )N)r3   r  r  )rF  setinputsizesr.   s    r   test_setinputsizeszCursorTests.test_setinputsizes1  s"    iii(((((r    c                 <    | j                             dd           d S )Nr  r   rF  setoutputsizer.   s    r   test_setoutputsizezCursorTests.test_setoutputsize4  s     a#####r    c                 :    | j                             d           d S r>  r  r.   s    r   test_setoutputsize_no_columnz(CursorTests.test_setoutputsize_no_column7  s    b!!!!!r    c                 P    |                      | j        j        | j                   d S r#   )r,   rF  
connectionr   r.   s    r   test_cursor_connectionz"CursorTests.test_cursor_connection:  s%    +TW55555r    c                     |                      t                    5  d }| j                            |          }d d d            d S # 1 swxY w Y   d S )Nc                      d S r#   r=  r=  r    r   fz1CursorTests.test_wrong_cursor_callable.<locals>.f@        r    )r]  r  r   rD  )r/   r  r  s      r   test_wrong_cursor_callablez&CursorTests.test_wrong_cursor_callable>  s    y)) 	$ 	$MM'..##C	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$s   AA
A
c                      G d d          } |            }|                      t                    5  t          j        |          }d d d            d S # 1 swxY w Y   d S )Nc                       e Zd ZdS )0CursorTests.test_cursor_wrong_class.<locals>.FooNr8  r9  r:  r=  r    r   Foor  D  s          r    r  )r]  r  r   Cursor)r/   r  rC  r  s       r   test_cursor_wrong_classz#CursorTests.test_cursor_wrong_classC  s    ceey)) 	% 	%-$$C	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	%s   AAAc                    d}dD ]~}|                      |          5  | j                            |                    |          d           |                     | j        j        d           ddd           n# 1 swxY w Y   dS )zV
        INSERT OR REPLACE and REPLACE INTO should produce the same behavior.
        z+{} INTO test(id, unique_test) VALUES (?, ?))zINSERT OR REPLACEREPLACE	statement)r2   rC  r2   N)r  rF  r!  formatr,   rL  )r/   rl  r  s      r   test_last_row_id_on_replacez'CursorTests.test_last_row_id_on_replaceI  s     <9 	7 	7I	22 7 7

9 5 5zBBB  !2A6667 7 7 7 7 7 7 7 7 7 7 7 7 7 7	7 	7s   AA88A<	?A<	c                     | j                             dd           |                     | j         j        d           | j                             dd           |                     | j         j        d           d S )Nz2insert or ignore into test(unique_test) values (?))testr   )rF  r!  r,   rL  r.   s    r   test_last_row_id_on_ignorez&CursorTests.test_last_row_id_on_ignoreS  s~    @	 	 	 	*A...@	 	 	 	*A.....r    c                    g }dD ]}d}|                      d                    |                    5  | j                            |                    |          |f           |                    || j        j        f           |                     t          j                  5  | j                            |                    |          |f           d d d            n# 1 swxY w Y   |                    || j        j        f           d d d            n# 1 swxY w Y   g d}| 	                    ||           d S )N)FAILABORTROLLBACKz.INSERT OR {} INTO test(unique_test) VALUES (?)zINSERT OR {}r  )r  r   r   r  r3   r  r  r  r  )
r  r  rF  r!  r  rL  r]  r   rR   r,   )r/   resultsr  rl  expecteds        r   test_last_row_id_insert_o_rz'CursorTests.test_last_row_id_insert_o_r]  s   6 	? 	?IBC(=(=i(H(HII ? ?

9 5 5	|DDD	47+<=>>>&&v'<== I IGOOCJJy$9$9I<HHHI I I I I I I I I I I I I I I	47+<=>>>? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
 
 

 	(+++++s6   A0D#0CDC##D&C#'$DD	D	c                 (   d}| j                             |          }t          |j                  }| j                             d           | j                             |          }t          |j                  }|                     ||z
  d           d S )Nzselect * from testzalter table test add newcolr2   )rF  r!  r  descriptionr,   )r/   selectrm  	old_count	new_counts        r   test_column_countzCursorTests.test_column_countn  s    %goof%%((	5666goof%%((	Y.22222r    c                       fdt          d          D             }|D ]+}                     |                                dg           ,d S )Nc                 D    g | ]}j                             d           S )r/  )r   r!  )r  _r/   s     r   r  zCCursorTests.test_same_query_in_multiple_cursors.<locals>.<listcomp>z  s'    AAA147??:..AAAr    r3   ru  )r  r,   rh  )r/   cursorsrF  s   `  r   #test_same_query_in_multiple_cursorsz/CursorTests.test_same_query_in_multiple_cursorsy  s^    AAAAaAAA 	4 	4BR[[]]TF3333	4 	4r    N)?r8  r9  r:  rG  rK  r3  r5  r:  r<  r@  rC  rF  rI  rN  rP  rT  rW  rZ  r_  rj  rs  rv  rz  r  r  r  r  ra  r  r  r  r;  r<  r   r
  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r=  r    r   r*  r*    s       G G G  , , ,+ + ++ + +,' ' '"     B B BK K KH H H- - -R R R
M M M
? ? ?
? ? ?
( ( (( ( (
G 
G 
G( ( (( ( (( ( (b b b
F F F
S S S
  . . ./ / /. . .
 X_V/*<68 8. .8 8.. . . / / /\ \ \d d dM M M"L L L, , ,4 4 4K K K
$ 
$ 
$$ $ $$ $ $
& & &"" " "& & &" " ") ) )$ $ $" " "6 6 6$ $ $
% % %7 7 7/ / /, , ,"	3 	3 	34 4 4 4 4r    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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d Z d Z!d  Z"d! Z#d" Z$d# Z%d$ Z&d% Z'd& Z(d' Z)d( Z*d)S )*	BlobTestsc                     t          j        d          | _        | j                            d           d| _        | j                            d| j        f           | j                            ddd          | _        d S )Nr   create table test(b blob)s2   this blob data string is exactly fifty bytes long!zinsert into test(b) values (?)r  r  r2   )r   r   r   r!  r  blobopenblobr.   s    r   rG  zBlobTests.setUp  si    .,,3444I	849,GGGG$$VS!44			r    c                 j    | j                                          | j                                         d S r#   )r  rJ  r   r.   s    r   rK  zBlobTests.tearDown  s'    	r    c                 P    |                      | j        t          j                   d S r#   )assertIsInstancer  r   r1  r.   s    r   test_blob_is_a_blobzBlobTests.test_blob_is_a_blob  s"    di55555r    c                 b   | j                             d           |                     | j                                         d           | j                             dt                     |                     | j                                         d           | j                             dt
                     |                     | j                                         d           | j                             dt                     |                     | j                                         d           d S )Nr      (   )r  seekr,   tellr   r   r   r.   s    r   test_blob_seek_and_tellz!BlobTests.test_blob_seek_and_tell  s    	r))2...	r8$$$))2...	r8$$$))2...	sH%%%))2.....r    c                     d}d}d}t           | fdft           | fdft           | fdft           | fdff}|D ]M\  }}}                     |||          5                       |||           d d d            n# 1 swxY w Y   N j                            d	t
                                          t          |          5   j                            t          t                     d d d            n# 1 swxY w Y                        t          |          5   j                            t          t                     d d d            d S # 1 swxY w Y   d S )
Nzoffset out of blob rangez;'origin' should be os.SEEK_SET, os.SEEK_CUR, or os.SEEK_ENDzseek offset results in overflowc                  8     j                             d          S )N  r  r  r.   s   r   rg  z0BlobTests.test_blob_seek_error.<locals>.<lambda>  s    $)..*>*> r    c                  8     j                             d          S )Nr  r%  r.   s   r   rg  z0BlobTests.test_blob_seek_error.<locals>.<lambda>  s    $)..*=*= r    c                  :     j                             dd          S )Nr   r  r%  r.   s   r   rg  z0BlobTests.test_blob_seek_error.<locals>.<lambda>  s    49>>"b+A+A r    c                  :     j                             dd          S )Nr   r3   r%  r.   s   r   rg  z0BlobTests.test_blob_seek_error.<locals>.<lambda>  s    49>>"a+@+@ r    )r$  r  fnr2   )
r  r  r  r  r  r   r  r
   r   r   )r/   msg_oormsg_origmsg_ofr  r$  r  r)  s   `       r   test_blob_seek_errorzBlobTests.test_blob_seek_error  s1   ,P2 ">">">">?"="="="=>#A#A#A#AB#@#@#@#@A	
 $ 	5 	5LCb#3266 5 5&&sC4445 5 5 5 5 5 5 5 5 5 5 5 5 5 5 		q(#####M6:: 	. 	.INN7H---	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	.##M6:: 	. 	.INN7H---	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	.s6   A>>B	B	&C77C;>C;&EEEc                 n    | j                                         }|                     || j                   d S r#   )r  readr,   r  r/   bufs     r   test_blob_readzBlobTests.test_blob_read  s1    inndi(((((r    c                     | j                             t          | j                  dz            }|                     || j                   d S )Nr   )r  r/  r  r  r,   r0  s     r   test_blob_read_oversizedz"BlobTests.test_blob_read_oversized  s@    innS^^a/00di(((((r    c                     d}| j                             |          }|                     || j        d |                    |                     | j                                         |           d S )Nr   )r  r/  r,   r  r   )r/   r  r1  s      r   test_blob_read_advance_offsetz'BlobTests.test_blob_read_advance_offset  sb    innQdim,,,))1-----r    c                     | j                             d           |                     | j                             d          | j        dd                    d S )Nr   r  )r  r  r,   r/  r  r.   s    r   test_blob_read_at_offsetz"BlobTests.test_blob_read_at_offset  sK    	r++TYr"u-=>>>>>r    c                     | j                             d           |                     t          j                  5  | j                                         d d d            d S # 1 swxY w Y   d S )N&update test set b='aaaa' where rowid=1)r   r!  r]  r   rN   r  r/  r.   s    r    test_blob_read_error_row_changedz*BlobTests.test_blob_read_error_row_changed  s    @AAAv677 	 	INN	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   A!!A%(A%c                     d                     d          }| j                            |           | j                            d                                          }|                     |d         |           d S )Ns   new data2   select b from testr   )ljustr  writer   r!  rs  r,   r/   new_datart  s      r   test_blob_writezBlobTests.test_blob_write  si    $$R((	!!!goo233<<>>Q*****r    c                 "   d}| j                             d           | j                             |           | j                            d                                          }|                     |d         | j        d d         |z              d S )Ns   cccccccccccccccccccccccccr   r>  r   )r  r  r@  r   r!  rs  r,   r  rA  s      r   test_blob_write_at_offsetz#BlobTests.test_blob_write_at_offset  s~    	r	!!!goo233<<>>Q3B3(!:;;;;;r    c                     | j                             d           |                     | j                                         d           d S )Ns
   ddddddddddr   )r  r@  r,   r   r.   s    r   test_blob_write_advance_offsetz(BlobTests.test_blob_write_advance_offset  s>    	   ))2.....r    c                    |                      t          d          5  | j                            d           d d d            n# 1 swxY w Y   | j                            dt
                     t          | j                  }| j                            d|dz
  z             | j                            d           |                      t          d          5  | j                            d           d d d            d S # 1 swxY w Y   d S )Nzdata longer than blob  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaar      ar2   )r  r  r  r@  r  r   r  )r/   r  s     r   test_blob_write_error_lengthz&BlobTests.test_blob_write_error_length  sf   ##J0GHH 	) 	)IOOK(((	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 		q(###	NN	!%%%	##J0GHH 	" 	"IOOD!!!	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	"s#   AA
AC??DDc                     | j                             d           |                     t          j                  5  | j                            d           d d d            d S # 1 swxY w Y   d S )Nr:     aaa)r   r!  r]  r   rN   r  r@  r.   s    r   !test_blob_write_error_row_changedz+BlobTests.test_blob_write_error_row_changed  s    @AAAv677 	$ 	$IOOF###	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$r  c                    | j                             dddd          }|                     t          j        d          5  |                    d           d d d            n# 1 swxY w Y   |                                 d S )Nr  r  r2   T)readonlyrP  rM  )r   r  r  r   rN   r@  rJ  )r/   ro_blobs     r   test_blob_write_error_readonlyz(BlobTests.test_blob_write_error_readonly  s    '""63D"AA##F$;ZHH 	" 	"MM&!!!	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	"s   A!!A%(A%c                 ,   dddifdi fdi fdi ff}d}|D ]~\  }}|                      ||          5  |                     t          j        |          5   | j        j        |i | d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   d S )	N)r  r  r2   ry  notexisting)rT  r  r2   )r  rT  r2   )r  r  r   zno such)r   kwds)r  r  r   rN   r   r  )r/   r  r  r   rU  s        r   test_blob_open_errorzBlobTests.test_blob_open_error  sF   67$b)',r"	
 ! 	4 	4JD$4d33 4 4++F,CUKK 4 4$DG$d3d3334 4 4 4 4 4 4 4 4 4 4 4 4 4 44 4 4 4 4 4 4 4 4 4 4 4 4 4 4	4 	4s5   !BA1%B1A55B8A59BB	B	c                 V    |                      t          | j                  d           d S )Nr=  )r,   r  r  r.   s    r   test_blob_lengthzBlobTests.test_blob_length  s&    TY,,,,,r    c                    |                      | j        d         t          d                     |                      | j        d         t          d                     |                      | j        d         t          d                     |                      | j        d         t          d                     |                      | j        d         t          d	                     d S )
Nr  r  r  lr   or   r  !)r,   r  ordr.   s    r   test_blob_get_itemzBlobTests.test_blob_get_item  s    1s3xx0001s3xx0001s3xx0001s3xx0002C11111r    c                     t          d          | j        d<   d| j        dd          z   }| j                            d                                          d         }|                     ||           d S )Nr  r   r  r2   r>  )r]  r  r  r   r!  rs  r,   r/   r  actuals      r   test_blob_set_itemzBlobTests.test_blob_set_item  sh    3xx	!$)ABB-'!566??AA!D*****r    c                    | j                             dt                     |                     | j                                         d           t          d          | j         d<   t          d          | j         d<   | j                             dt                     d}|                     | j                                         |           d S )Nr   r    T.r  s2   This blob data string is exactly fifty bytes long.)r  r  r   r,   r/  r]  r   )r/   r  s     r   test_blob_set_item_with_offsetz(BlobTests.test_blob_set_item_with_offset  s    	q(###))3///3xx	!C	"	q(###H))844444r    c                 x   ddl m } t          d          | j        dd<   |                     | j        dd         d           t	          d          | j        dd<   |                     | j        dd         d            |dg d          | j        dd<   |                     | j        dd         d           d S )	Nr   )array   12345r  s   23456r  )r2   r   r3   r  r  s   )rh  r  r  r,   	bytearray)r/   rh  s     r   !test_blob_set_slice_buffer_objectz+BlobTests.test_blob_set_slice_buffer_object  s    #H--	!A#1Q3222"8,,	!A#1Q3222sOOO44	!A#1Q3)@AAAAAr    c                 \    d| j         d<   |                     | j         d         d           d S )N   r  )r  r,   r.   s    r   !test_blob_set_item_negative_indexz+BlobTests.test_blob_set_item_negative_index   s/    	"2,,,,,r    c                 L    |                      | j        dd         d           d S )Nr  r   s	   blob datar,   r  r.   s    r   test_blob_get_slicezBlobTests.test_blob_get_slice$  s(    1R4,77777r    c                 L    |                      | j        dd         d           d S )Nr  r    rp  r.   s    r   test_blob_get_empty_slicez#BlobTests.test_blob_get_empty_slice'  s(    1Q3-----r    c                 f    |                      | j        dd         | j        dd                    d S )Nr  )r,   r  r  r.   s    r   "test_blob_get_slice_negative_indexz,BlobTests.test_blob_get_slice_negative_index*  s2    1R4$)AbD/:::::r    c                 N    |                      | j        ddd         d           d S )Nr   r   r   s   ti lbrp  r.   s    r   test_blob_get_slice_with_skipz'BlobTests.test_blob_get_slice_with_skip-  s+    1R6*H55555r    c                     d| j         dd<   d| j        dd          z   }| j                            d                                          d         }|                     ||           d S )Nri  r   r  r>  )r  r  r   r!  rs  r,   r`  s      r   test_blob_set_slicezBlobTests.test_blob_set_slice0  sf    !	!A#dim+!566??AA!D*****r    c                 n    d| j         dd<   |                     | j         d d          | j                   d S )Nr    r   )r  r,   r  r.   s    r   test_blob_set_empty_slicez#BlobTests.test_blob_set_empty_slice6  s9    	!A#111ty11111r    c                     d| j         ddd<   | j                            d                                          d         }d| j        dd          z   }|                     ||           d S )Nri  r   r   r   r>  s
   1h2s3b4o5 )r  r   r!  rs  r  r,   )r/   ra  r  s      r   test_blob_set_slice_with_skipz'BlobTests.test_blob_set_slice_with_skip:  si    $	!Bq&!566??AA!D 49RSS>1*****r    c                    d}|                      t          |          5  | j        dd          d d d            n# 1 swxY w Y   |                      t          |          5  | j        d          d d d            n# 1 swxY w Y   |                      t          |          5  d| j        d<   d d d            d S # 1 swxY w Y   d S )Nzindices must be integersr  g      @g      ?r  r  r  r  r  )r/   r  s     r   $test_blob_mapping_invalid_index_typez.BlobTests.test_blob_mapping_invalid_index_type@  s~   (##Is33 	 	Iae	 	 	 	 	 	 	 	 	 	 	 	 	 	 	##Is33 	 	IcNN	 	 	 	 	 	 	 	 	 	 	 	 	 	 	##Is33 	" 	"!DIcN	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	"s1   :>> A::A>A> B88B<?B<c                 b   t          | j                  ddg}|D ]p}|                     |          5  |                     t          d          5  | j        |          d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   q|                     t          d          5  | j        t
                    d d d            n# 1 swxY w Y   | j                            d           |                     t          j
                  5  | j        d          d d d            d S # 1 swxY w Y   d S )Ni   i)idxzindex out of rangezcannot fit 'int'r:  r   )r  r  r  r  
IndexErrorr   r   r!  r]  r   rN   )r/   r  r  s      r   test_blob_get_item_errorz"BlobTests.test_blob_get_item_errorI  s   ty>>3- 	# 	#C#&& # #++J8LMM # #IcNN# # # # # # # # # # # # # # ## # # # # # # # # # # # # # # ##J0BCC 	" 	"Ij!!	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	@AAAv677 	 	IaLL	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	sY   A?A(A?(A,,A?/A,0A??B	B	&CC	C		D$$D(+D(c                    |                      t          d          5  d| j        d<   d d d            n# 1 swxY w Y   |                      t          d          5  d| j        d<   d d d            n# 1 swxY w Y   |                      t          d          5  t          d          | j        d<   d d d            n# 1 swxY w Y   |                      t          d          5  | j        d= d d d            n# 1 swxY w Y   |                      t          d          5  d| j        d<   d d d            n# 1 swxY w Y   |                      t
          d          5  d	| j        d<   d d d            n# 1 swxY w Y   |                      t
          d          5  d
| j        d<   d d d            n# 1 swxY w Y   |                      t
          d          5  ddz  | j        d<   d d d            d S # 1 swxY w Y   d S )Nzcannot be interpreteds   multipler   r  doesn't support.*deletionzBlob index out of ranger$  zmust be in ranger     r   A   )r  r  r  rj  r  r  r.   s    r   test_blob_set_item_errorz"BlobTests.test_blob_set_item_errorW  s   ##I/FGG 	' 	'&DIaL	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	'##I/FGG 	  	 DIaL	  	  	  	  	  	  	  	  	  	  	  	  	  	  	 ##I/FGG 	+ 	+$T??DIaL	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+##I/JKK 	 		!	 	 	 	 	 	 	 	 	 	 	 	 	 	 	##J0IJJ 	  	 DIdO	  	  	  	  	  	  	  	  	  	  	  	  	  	  	 ##J0BCC 	 	DIaL	 	 	 	 	 	 	 	 	 	 	 	 	 	 	##J0BCC 	 	DIaL	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ##J0BCC 	! 	!b5DIaL	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	!s   377A00A47A4B::B>B> 	C55C9<C9D22D69D6E//E36E3F,,F03F0G--G14G1c                    |                      t          d          5  d| j        dd<   d d d            n# 1 swxY w Y   |                      t          d          5  d| j        dd<   d d d            n# 1 swxY w Y   |                      t          d          5  | j        dd= d d d            n# 1 swxY w Y   |                      t          d          5  d| j        ddd	<   d d d            n# 1 swxY w Y   |                     t                    5  t          d
          d d d         | j        dd<   d d d            d S # 1 swxY w Y   d S )Nz
wrong sizerJ  r  r   rI  r  zstep cannot be zerori  r   s   abcder   )r  r  r  r  r  r]  r  r  r.   s    r   test_blob_set_slice_errorz#BlobTests.test_blob_set_slice_errorj  s   ##J== 	# 	#"DIadO	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	###J== 	* 	*)DIadO	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	*##I/JKK 	  	 	!B$	  	  	  	  	  	  	  	  	  	  	  	  	  	  	 ##J0EFF 	) 	) (DIa1f	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	){++ 	8 	8(2233Q37DIadO	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8sT   599A44A8;A8B11B58B5C11C58C5#EE
E
c                 ~   |                      t          d          5  | j        | j        z    d d d            n# 1 swxY w Y   |                      t          d          5  | j        dz   d d d            n# 1 swxY w Y   |                      t          d          5  d| j        v  d d d            d S # 1 swxY w Y   d S )Nzunsupported operandr  zis not iterablerJ  r  r.   s    r    test_blob_sequence_not_supportedz*BlobTests.test_blob_sequence_not_supportedv  s|   ##I/DEE 	" 	"I	!!	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	"##I/DEE 	 	IMM	 	 	 	 	 	 	 	 	 	 	 	 	 	 	##I/@AA 	 	DI	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s0   8<<A55A9<A9
B22B69B6c                    d}| j                             ddd          5 }|                    |           d d d            n# 1 swxY w Y   | j                             d                                          d         }|                     ||           |                     t          j        d          5  |	                                 d d d            d S # 1 swxY w Y   d S )Ns2   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaar  r  r2   r>  r   zclosed blob)
r   r  r@  r!  rs  r,   r  r   rX   r/  )r/   r  r  ra  s       r   test_blob_context_managerz#BlobTests.test_blob_context_manager~  sL   Wfc1-- 	JJt	 	 	 	 	 	 	 	 	 	 	 	 	 	 	!566??AA!D&&& ##F$;]KK 	 	IIKKK	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s#   AAA4CCCc                      G d dt                     }|                     |d          5  | j                            ddd          5 } |d          # 1 swxY w Y   	 d d d            d S # 1 swxY w Y   d S )Nc                       e Zd ZdS )NBlobTests.test_blob_context_manager_reraise_exceptions.<locals>.DummyExceptionNr  r=  r    r   DummyExceptionr    s        Dr    r  reraisedr  r  r2   )r?   r  r   r  )r/   r  r  s      r   ,test_blob_context_manager_reraise_exceptionsz6BlobTests.test_blob_context_manager_reraise_exceptions  s   	 	 	 	 	Y 	 	 	##NJ?? 	1 	1!!&#q11 1T$nZ0001 1 1 1 1 1 1 1 1	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1s/   A,AA	A,A	A,,A03A0c                    t                      5 }|                    d           |                    d           |                    ddd          }|                                 d}|                     t
          j        |          5  |                                 d d d            n# 1 swxY w Y   |                     t
          j        |          5  |                    d           d d d            n# 1 swxY w Y   |                     t
          j        |          5  |	                    d           d d d            n# 1 swxY w Y   |                     t
          j        |          5  |
                                 d d d            n# 1 swxY w Y   |                     t
          j        |          5  |                                 d d d            n# 1 swxY w Y   |                     t
          j        |          5  |                    d d d            d d d            n# 1 swxY w Y   |                     t
          j        |          5  t          |           d d d            n# 1 swxY w Y   |                     t
          j        |          5  |d          d d d            n# 1 swxY w Y   |                     t
          j        |          5  |dd          d d d            n# 1 swxY w Y   |                     t
          j        |          5  d|d<   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 )	Nr  z'insert into test values (zeroblob(100))r  r  r2   zCannot operate on a closed blobr    r   )r   r!  r  rJ  r  r   rX   r/  r@  r  r   	__enter____exit__r  )r/   r   r  r  s       r   test_blob_closedzBlobTests.test_blob_closed  s    	"JJ2333JJ@AAA;;vsA..DJJLLL3C''(?EE  		              ''(?EE    

3                             ''(?EE  		!              ''(?EE  		              ''(?EE ! !   ! ! ! ! ! ! ! ! ! ! ! ! ! ! !''(?EE 0 0dD$///0 0 0 0 0 0 0 0 0 0 0 0 0 0 0''(?EE  D			              ''(?EE  Q              ''(?EE  QqS		              ''(?EE  Q              3	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	sz  A8MB(M(B,	,M/B,	0#MC5)M5C9	9M<C9	=#M E6ME	M	E	
#M-FMF	MF	#M9GMG	M!G	"#MH)M)H-	-M0H-	1#MI0$M0I4	4M7I4	8#M	J0$M0J4	4M7J4	8#MK2&M2K6	6M9K6	:#ML/#M/L3	3M6L3	7MMMc                 J   t                      5 }|                    d           |                    d           |                    ddd          }|                                 |                     t
          j        d|j                   d d d            d S # 1 swxY w Y   d S )Nr  z*insert into test(b) values (zeroblob(100))r  r  r2   z#Cannot operate on a closed database)r   r!  r  rJ  r  r   rX   r/  )r/   r   r  s      r   test_blob_closed_db_readz"BlobTests.test_blob_closed_db_read  s     	."JJ2333JJCDDD;;vsA..DHHJJJ""6#:#H#'9. . .	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	.s   A<BBBc                     t                      5 }d}|                    d           |                    d|f           |                    dd|           d d d            d S # 1 swxY w Y   d S )Nr  zcreate table t(t blob)z/insert into t(rowid, t) values (?, zeroblob(1))rc  )r   r!  r  )r/   r   rowids      r   test_blob_32bit_rowidzBlobTests.test_blob_32bit_rowid  s     	)"EJJ/000JJH5(SSSKKS%(((		) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	)s   AA""A&)A&N)+r8  r9  r:  rG  rK  r  r!  r-  r2  r4  r6  r8  r;  rC  rE  rG  rK  rN  rR  rV  rX  r^  rb  rf  rk  rn  rq  rs  rv  rx  rz  r|  r~  r  r  r  r  r  r  r  r  r  r  r=  r    r   r  r    so       5 5 5  6 6 6/ / /. . .,) ) )) ) ). . .? ? ?  
+ + +< < </ / /	" 	" 	"$ $ $
  4 4 4- - -2 2 2+ + +5 5 5	B 	B 	B- - -8 8 8. . .; ; ;6 6 6+ + +2 2 2+ + +" " "  ! ! !&
8 
8 
8  	 	 	1 1 1  :. . .) ) ) ) )r    r  c                   f    e Zd Zd Zd Zej        d             Zd Zd Z	ej        d             Z
dS )ThreadTestsc                     t          j        d          | _        | j                                        | _        | j                            d           | j                            d           d S )Nr   z$create table test(name text, b blob)z,insert into test values('blob', zeroblob(1)))r   r   r"  rD  r  r!  r.   s    r   rG  zThreadTests.setUp  sZ    >*--8??$$?@@@GHHHHHr    c                 j    | j                                          | j                                         d S r#   )r  rJ  r"  r.   s    r   rK  zThreadTests.tearDown  s,    r    c                     fd}g }t          j        |d|i          }|                                 |                                 |r*|                     d                    |                     d S d S )Nc                     	  i  |                      d           d S # t          j        $ r Y d S  |                      d           Y d S xY w)Nzdid not raise ProgrammingErrorzraised wrong exception)r  r   rX   )errr   r)  rU  s    r   runz"ThreadTests._run_test.<locals>.run  sw    5D!D!!!

;<<<<<*   5

3444444s   " AAr  targetr   
)	threadingThreadstartjoinfail)r/   r)  r   rU  r  r  rc  s    ```   r   	_run_testzThreadTests._run_test  s    	5 	5 	5 	5 	5 	5 	5 C===					 	&IIdiinn%%%%%	& 	&r    c                      fd fd fd fd fd fd fd fd fd	 fd
g
}t          t          j        d          r0|                     fd           |                     fd           t          j        dk    r|                     fd           |D ]E}                     |          5                       |           d d d            n# 1 swxY w Y   Fd S )Nc                  6     j                                         S r#   )r"  rD  r.   s   r   rg  z:ThreadTests.test_check_connection_thread.<locals>.<lambda>      DHOO%% r    c                  6     j                                         S r#   )r"  rO  r.   s   r   rg  z:ThreadTests.test_check_connection_thread.<locals>.<lambda>  r  r    c                  6     j                                         S r#   )r"  rU  r.   s   r   rg  z:ThreadTests.test_check_connection_thread.<locals>.<lambda>      DH%%'' r    c                  6     j                                         S r#   )r"  rJ  r.   s   r   rg  z:ThreadTests.test_check_connection_thread.<locals>.<lambda>      DHNN$$ r    c                  8     j                             d           S r#   )r"  set_trace_callbackr.   s   r   rg  z:ThreadTests.test_check_connection_thread.<locals>.<lambda>  s    DH//55 r    c                  8     j                             d           S r#   )r"  set_authorizerr.   s   r   rg  z:ThreadTests.test_check_connection_thread.<locals>.<lambda>  s    DH++D11 r    c                  :     j                             dd           S r  )r"  create_collationr.   s   r   rg  z:ThreadTests.test_check_connection_thread.<locals>.<lambda>  s    DH--eT:: r    c                  N     j                             t          j        d          S )Nr  )r"  r$   r   r   r.   s   r   rg  z:ThreadTests.test_check_connection_thread.<locals>.<lambda>  s    DH%%f&@"EE r    c                  L     j                             t          j                  S r#   )r"  r  r   r   r.   s   r   rg  z:ThreadTests.test_check_connection_thread.<locals>.<lambda>  s    DH%%f&@AA r    c                  <     j                             ddd          S )Nr  r  r2   )r"  r  r.   s   r   rg  z:ThreadTests.test_check_connection_thread.<locals>.<lambda>  s    DH%%fc155 r    r  c                  6     j                                         S r#   )r"  r  r.   s   r   rg  z:ThreadTests.test_check_connection_thread.<locals>.<lambda>  s    tx1133 r    c                  8     j                             d          S )Nr    )r"  r  r.   s   r   rg  z:ThreadTests.test_check_connection_thread.<locals>.<lambda>  s    tx33C88 r    r   c                  <     j                             ddd           S )NrC  r   )r"  create_window_functionr.   s   r   rg  z:ThreadTests.test_check_connection_thread.<locals>.<lambda>  s    tx>>uaNN r    r)  )r  r   r  r  r
  r  r  r/   fnsr)  s   `  r   test_check_connection_threadz(ThreadTests.test_check_connection_thread  s   %%%%%%%%''''$$$$55551111::::EEEEAAAA5555
 6$k22 	:JJ3333444JJ8888999%33JJNNNNOOO 	# 	#B$$ # #r"""# # # # # # # # # # # # # # #	# 	#s   8CC	!C	c                       fd fd fd fdg}|D ]E}                      |          5                       |           d d d            n# 1 swxY w Y   Fd S )Nc                  8     j                             d          S )Nz"insert into test(name) values('a')r  r!  r.   s   r   rg  z6ThreadTests.test_check_cursor_thread.<locals>.<lambda>  s    DH$$%IJJ r    c                  6     j                                         S r#   )r  rJ  r.   s   r   rg  z6ThreadTests.test_check_cursor_thread.<locals>.<lambda>  r  r    c                  8     j                             d          S )Nr  r  r.   s   r   rg  z6ThreadTests.test_check_cursor_thread.<locals>.<lambda>  s    DH$$%<== r    c                  6     j                                         S r#   )r  rs  r.   s   r   rg  z6ThreadTests.test_check_cursor_thread.<locals>.<lambda>  r  r    r  )r  r  r  s   `  r   test_check_cursor_threadz$ThreadTests.test_check_cursor_thread  s    JJJJ$$$$====''''	
  	# 	#B$$ # #r"""# # # # # # # # # # # # # # #	# 	#s   AA	A	c                 ,   d }t          j        dd          }g }t          j        |||d          }|                                 |                                 |                     t          |          dd                    |                     d S )	Nc                     	 |                      d           d S # t          j        $ r |                    d           Y d S w xY w)Nr/  zmulti-threading not allowed)r!  r   rB   r  r"  r  s     r   r  z4ThreadTests.test_dont_check_same_thread.<locals>.run  sX    :J'''''< : : :

8999999:s    $A Ar   F)check_same_threadr  r  r   r  )r   r   r  r  r  r  r,   r  )r/   r  r"  r  rc  s        r   test_dont_check_same_threadz'ThreadTests.test_dont_check_same_thread  s    	: 	: 	: nZ5AAACC0H0HIII					S1diinn55555r    N)r8  r9  r:  rG  rK  r	   reap_threadsr  r  r  r  r=  r    r   r  r    s        I I I   "& & #"&"# # #.	# 	# 	# "6 6 #"6 6 6r    r  c                   8    e Zd Zd Zd Zd Zd Zd Zd Zd Z	dS )	ConstructorTestsc                 2    t          j        ddd          }d S )N  r      )r   Dater/   r  s     r   	test_datezConstructorTests.test_date  s    Kb"%%r    c                 2    t          j        ddd          }d S )N   '   r  )r   Timer/   rc  s     r   	test_timezConstructorTests.test_time  s    KB##r    c                 8    t          j        dddddd          }d S )Nr  r   r  r  r  r  )r   	Timestampr/   tss     r   test_timestampzConstructorTests.test_timestamp  s     dBBB77r    c                 .    t          j        d          }d S r>  )r   DateFromTicksr  s     r   test_date_from_ticksz%ConstructorTests.test_date_from_ticks       $$r    c                 .    t          j        d          }d S r>  )r   TimeFromTicksr  s     r   test_time_from_ticksz%ConstructorTests.test_time_from_ticks  r  r    c                 .    t          j        d          }d S r>  )r   TimestampFromTicksr  s     r   test_timestamp_from_ticksz*ConstructorTests.test_timestamp_from_ticks"  s    &r**r    c                 .    t          j        d          }d S )Ns    ')r   Binary)r/   r  s     r   test_binaryzConstructorTests.test_binary%  s    M&!!r    N)
r8  r9  r:  r  r  r  r  r  r  r  r=  r    r   r  r    s}        & & &$ $ $8 8 8% % %% % %+ + +" " " " "r    r  c                   P    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S )ExtensionTestsc                 
   t          j        d          }|                                }|                    d           |                    d           |                                d         }|                     |d           d S )Nr   z
            -- bla bla
            /* a stupid comment */
            create table a(i);
            insert into a(i) values (5);
            zselect i from ar   r  )r   r   rD  rj  r!  rs  r,   )r/   r"  r  rm  s       r   test_script_string_sqlz%ExtensionTests.test_script_string_sql)  s~    nZ((jjll  	 	 	 	%&&&llnnQa     r    c                     t          j        d          }|                                }|                     t           j                  5  |                    d           d d d            d S # 1 swxY w Y   d S )Nr   z1create table test(x); asdf; create table test2(x)r   r   rD  r]  rN   rj  r/   r"  r  s      r   test_script_syntax_errorz'ExtensionTests.test_script_syntax_error6  s    nZ((jjllv677 	S 	SQRRR	S 	S 	S 	S 	S 	S 	S 	S 	S 	S 	S 	S 	S 	S 	S 	S 	S 	S   A++A/2A/c                     t          j        d          }|                                }|                     t           j                  5  |                    d           d d d            d S # 1 swxY w Y   d S )Nr   z5create table test(sadfsadfdsa); select foo from hurz;r  r  s      r   test_script_error_normalz'ExtensionTests.test_script_error_normal<  s    nZ((jjllv677 	W 	WUVVV	W 	W 	W 	W 	W 	W 	W 	W 	W 	W 	W 	W 	W 	W 	W 	W 	W 	Wr   c                     t          j        d          }|                                }|                     t                    5  |                    d           d d d            d S # 1 swxY w Y   d S )Nr   s9   create table test(foo); insert into test(foo) values (5);)r   r   rD  r]  r  rj  r  s      r   "test_cursor_executescript_as_bytesz1ExtensionTests.test_cursor_executescript_as_bytesB  s    nZ((jjlly)) 	\ 	\Z[[[	\ 	\ 	\ 	\ 	\ 	\ 	\ 	\ 	\ 	\ 	\ 	\ 	\ 	\ 	\ 	\ 	\ 	\   A&&A*-A*c                     t          j        d          }|                                }|                     t                    5  |                    d           d d d            d S # 1 swxY w Y   d S )Nr   zb
                create table a(i); 
                insert into a(i) values (5);
                )r   r   rD  r]  r  rj  r  s      r   .test_cursor_executescript_with_null_charactersz=ExtensionTests.test_cursor_executescript_with_null_charactersH  s    nZ((jjllz** 	 	    	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	r  c                     t          j        d          }|                                }|                     t                    5  |                    d           d d d            d S # 1 swxY w Y   d S )Nr   ue   
                create table a(s);
                insert into a(s) values ('');
                )r   r   rD  r]  UnicodeEncodeErrorrj  r  s      r   )test_cursor_executescript_with_surrogatesz8ExtensionTests.test_cursor_executescript_with_surrogatesQ  s    nZ((jjll122 	 	    	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	r  c           	         d}t                      5 }t          |          5 }|                    d                    |                     |                     t
          j        |          5  |                    d                    |dz                        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 )Nr  zselect 'almost too large'zselect 'too large'r2   )r   r(   rj  r?  r  r   rK   )r/   r  r   lims       r   *test_cursor_executescript_too_large_scriptz9ExtensionTests.test_cursor_executescript_too_large_scriptZ  s   ) 	D"hrll 	Dc8>>sCCDDD''(8#>> D D  !5!;!;CE!B!BCCCD D D D D D D D D D D D D D D	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	DsY   CA	B9*,B"B9"B&&B9)B&*B9-C9B=	=C B=	CCCc                     t          j        d          }|                    d           |                     |j                   |                    d           |                     |j                   d S )Nr   beginr/  )r   r   r!  r<   rr  rj  r5  r/   r"  s     r   $test_cursor_executescript_tx_controlz3ExtensionTests.test_cursor_executescript_tx_controla  si    nZ((G*+++*%%%+,,,,,r    c                     t          j        d          }|                    d                                          d         }|                     |dd           d S )Nr   zselect 5r   r  z Basic test of Connection.execute)r   r   r!  rs  r,   r/   r"  results      r   test_connection_executez&ExtensionTests.test_connection_executeh  sR    nZ((Z((1133A6$FGGGGGr    c                 b   t          j        d          }|                    d           |                    dddg           |                    d                                          }|                     |d         d         dd	           |                     |d
         d         dd	           d S )Nr   zcreate table test(foo)z insert into test(foo) values (?)r  r  z!select foo from test order by foor   r3   z$Basic test of Connection.executemanyr2   r  )r   r   r!  ri  rh  r,   r  s      r   test_connection_executemanyz*ExtensionTests.test_connection_executemanym  s    nZ((,---:T4LIII@AAJJLL1q*PQQQ1q*PQQQQQr    c                     t          j        d          }|                    d           |                    d                                          d         }|                     |dd           d S )Nr   z9create table test(foo); insert into test(foo) values (5);zselect foo from testr   r  z&Basic test of Connection.executescript)r   r   rj  r!  rs  r,   r  s      r   test_connection_executescriptz,ExtensionTests.test_connection_executescriptu  sh    nZ((UVVV344==??B$LMMMMMr    N)r8  r9  r:  r  r  r  r  r  r
  r  r  r  r  r  r=  r    r   r  r  (  s        ! ! !S S SW W W\ \ \    D D D- - -H H H
R R RN N N N Nr    r  c                   D    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
S )ClosedConTestsc                     t          j        d          }|                                 |                     t           j                  5  |                                }d d d            d S # 1 swxY w Y   d S r   )r   r   rJ  r]  rX   rD  r  s      r   test_closed_con_cursorz%ClosedConTests.test_closed_con_cursor|  s    nZ((		v677 	 	**,,C	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	r  c                     t          j        d          }|                                 |                     t           j                  5  |                                 d d d            d S # 1 swxY w Y   d S r   )r   r   rJ  r]  rX   rO  r  s     r   test_closed_con_commitz%ClosedConTests.test_closed_con_commit  s    nZ((		v677 	 	JJLLL	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	r  c                     t          j        d          }|                                 |                     t           j                  5  |                                 d d d            d S # 1 swxY w Y   d S r   )r   r   rJ  r]  rX   rU  r  s     r   test_closed_con_rollbackz'ClosedConTests.test_closed_con_rollback  s    nZ((		v677 	 	LLNNN	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	r  c                    t          j        d          }|                                }|                                 |                     t           j                  5  |                    d           d d d            d S # 1 swxY w Y   d S )Nr   zselect 4)r   r   rD  rJ  r]  rX   r!  r  s      r   test_closed_cur_executez&ClosedConTests.test_closed_cur_execute  s    nZ((jjll		v677 	$ 	$KK
###	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$s   A??BBc                     t          j        d          }|                                 d }|                     t           j                  5  |                    dd|           d d d            d S # 1 swxY w Y   d S )Nr   c                     dS Nr   r=  re  s    r   r  z5ClosedConTests.test_closed_create_function.<locals>.f  s    r    rC  r2   )r   r   rJ  r]  rX   rk  )r/   r"  r  s      r   test_closed_create_functionz*ClosedConTests.test_closed_create_function  s    nZ((		v677 	- 	-q!,,,	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	-s   A00A47A4c                    t          j        d          }|                                  G d d          }|                     t           j                  5  |                    dd|           d d d            d S # 1 swxY w Y   d S )Nr   c                        e Zd Zd Zd Zd ZdS )8ClosedConTests.test_closed_create_aggregate.<locals>.Aggc                     d S r#   r=  r.   s    r   r  zAClosedConTests.test_closed_create_aggregate.<locals>.Agg.__init__      r    c                     d S r#   r=  rf  s     r   stepz=ClosedConTests.test_closed_create_aggregate.<locals>.Agg.step  r-  r    c                     dS r'  r=  r.   s    r   finalizezAClosedConTests.test_closed_create_aggregate.<locals>.Agg.finalize  s    rr    N)r8  r9  r:  r  r/  r1  r=  r    r   Aggr+    sA                r    r2  rC  r2   )r   r   rJ  r]  rX   create_aggregate)r/   r"  r2  s      r   test_closed_create_aggregatez+ClosedConTests.test_closed_create_aggregate  s    nZ((			 	 	 	 	 	 	 	 v677 	0 	0  3///	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0s   A::A>A>c                     t          j        d          }|                                 d }|                     t           j                  5  |                    |           d d d            d S # 1 swxY w Y   d S )Nr   c                      t           j        S r#   )r   DENY)r   s    r   
authorizerz=ClosedConTests.test_closed_set_authorizer.<locals>.authorizer  s
    ;r    )r   r   rJ  r]  rX   r  )r/   r"  r8  s      r   test_closed_set_authorizerz)ClosedConTests.test_closed_set_authorizer  s    nZ((			 	 	v677 	+ 	+z***	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+s   A..A25A2c                     t          j        d          }|                                 d }|                     t           j                  5  |                    |d           d d d            d S # 1 swxY w Y   d S )Nr   c                      d S r#   r=  r=  r    r   progresszBClosedConTests.test_closed_set_progress_callback.<locals>.progress  r  r    r  )r   r   rJ  r]  rX   set_progress_handler)r/   r"  r<  s      r   !test_closed_set_progress_callbackz0ClosedConTests.test_closed_set_progress_callback  s    nZ((		v677 	4 	4$$Xs333	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4s   A//A36A3c                     t          j        d          }|                                 |                     t           j                  5   |             d d d            d S # 1 swxY w Y   d S r   )r   r   rJ  r]  rX   r  s     r   test_closed_callzClosedConTests.test_closed_call  s    nZ((		v677 	 	CEEE	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   A  A$'A$N)r8  r9  r:  r  r   r"  r$  r(  r4  r9  r>  r@  r=  r    r   r  r  {  s              $ $ $- - -0 0 0+ + +4 4 4    r    r  c                       e Zd Zd ZdS )ClosedCurTestsc                 L   t          j        d          }|                                }|                                 dD ]d}|dv rd}n|dk    rdddgf}ng }|                     t           j                  5  t          ||          } ||  d d d            n# 1 swxY w Y   ed S )	Nr   )r!  ri  rj  rh  r  rs  )r!  rj  )zselect 4 union select 5ri  zinsert into foo(bar) values (?)r  r  )r   r   rD  rJ  r]  rX   r{  )r/   r"  r  method_nameparamsmethods         r   test_closedzClosedCurTests.test_closed  s    nZ((jjll		k 
	  
	 K:::5--;dD\J""6#:;;     k22                             
	  
	 s   6BB	B	N)r8  r9  r:  rG  r=  r    r   rB  rB    s#                 r    rB  c                   H    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S )SqliteOnConflictTestszz
    Tests for SQLite's "insert on conflict" feature.

    See https://www.sqlite.org/lang_conflict.html for details.
    c                     t          j        d          | _        | j                                        | _        | j                            d           d S )Nr   zz
          CREATE TABLE test(
            id INTEGER PRIMARY KEY, name TEXT, unique_name TEXT UNIQUE
          );
        r,  r.   s    r   rG  zSqliteOnConflictTests.setUp  sM    .,,'..""  	 	 	 	 	r    c                 j    | j                                          | j                                         d S r#   r.  r.   s    r   rK  zSqliteOnConflictTests.tearDown  r/  r    c                 X   d | j         _        | j                                         | _        | j                            d           | j                            d           | j                            d           |                     t          j                  5  | j                            d           d d d            n# 1 swxY w Y   | j                                          | j                            d           | 	                    | j        
                                g            d S )NBEGIN,INSERT INTO test(name) VALUES ('abort_test')8INSERT OR ROLLBACK INTO test(unique_name) VALUES ('foo')z"SELECT name, unique_name from testr   r  rD  rF  r!  r]  r   rR   rO  r,   rh  r.   s    r   3test_on_conflict_rollback_with_explicit_transactionzISqliteOnConflictTests.test_on_conflict_rollback_with_explicit_transaction  sB   "&'..""   FGGGRSSSv455 	X 	XGOOVWWW	X 	X 	X 	X 	X 	X 	X 	X 	X 	X 	X 	X 	X 	X 	X 	<===))++R00000   B??CCc                 \   d | j         _        | j                                         | _        | j                            d           | j                            d           | j                            d           |                     t          j                  5  | j                            d           d d d            n# 1 swxY w Y   | j                                          | j                            d           | 	                    | j        
                                ddg           d S )NrM  rN  5INSERT OR ABORT INTO test(unique_name) VALUES ('foo')"SELECT name, unique_name FROM test
abort_testNr  rP  r.   s    r   8test_on_conflict_abort_raises_with_explicit_transactionszNSqliteOnConflictTests.test_on_conflict_abort_raises_with_explicit_transactions  sH    #''..""   FGGGOPPPv455 	U 	UGOOSTTT	U 	U 	U 	U 	U 	U 	U 	U 	U 	U 	U 	U 	U 	U 	U<===))++.BN-STTTTTrR  c                    | j                             d           | j                             d           |                     t          j                  5  | j                             d           d d d            n# 1 swxY w Y   | j                             d           |                     | j                                         g            d S )NrN  rO  rU  rF  r!  r]  r   rR   r,   rh  r.   s    r   -test_on_conflict_rollback_without_transactionzCSqliteOnConflictTests.test_on_conflict_rollback_without_transaction  s    FGGGRSSSv455 	X 	XGOOVWWW	X 	X 	X 	X 	X 	X 	X 	X 	X 	X 	X 	X 	X 	X 	X<===))++R00000   A;;A?A?c                    | j                             d           | j                             d           |                     t          j                  5  | j                             d           d d d            n# 1 swxY w Y   | j                             d           |                     | j                                         ddg           d S )NrN  rT  rU  rV  r  rZ  r.   s    r   2test_on_conflict_abort_raises_without_transactionszHSqliteOnConflictTests.test_on_conflict_abort_raises_without_transactions  s    	FGGGOPPPv455 	U 	UGOOSTTT	U 	U 	U 	U 	U 	U 	U 	U 	U 	U 	U 	U 	U 	U 	U 	<===))++.BN-STTTTTr\  c                 6   | j                             d           |                     t          j                  5  | j                             d           d d d            n# 1 swxY w Y   |                     | j                                         g            d S )Nz4INSERT OR FAIL INTO test(unique_name) VALUES ('foo')rZ  r.   s    r   test_on_conflict_failz+SqliteOnConflictTests.test_on_conflict_fail  s    NOOOv455 	T 	TGOORSSS	T 	T 	T 	T 	T 	T 	T 	T 	T 	T 	T 	T 	T 	T 	T))++R00000s   A!!A%(A%c                     | j                             d           | j                             d           | j                             d           |                     | j                                         dg           d S )Nz6INSERT OR IGNORE INTO test(unique_name) VALUES ('foo')zSELECT unique_name FROM testrB  rF  r!  r,   rh  r.   s    r   test_on_conflict_ignorez-SqliteOnConflictTests.test_on_conflict_ignore  sm    PQQQPQQQ6777))++hZ88888r    c                     | j                             d           | j                             d           | j                             d           |                     | j                                         dg           d S )NzFINSERT OR REPLACE INTO test(name, unique_name) VALUES ('Data!', 'foo')zUINSERT OR REPLACE INTO test(name, unique_name) VALUES ('Very different data!', 'foo')rU  )zVery different data!rC  rb  r.   s    r   test_on_conflict_replacez.SqliteOnConflictTests.test_on_conflict_replace&  so    `aaaoppp<===))++.M-NOOOOOr    N)r8  r9  r:  __doc__rG  rK  rQ  rX  r[  r^  r`  rc  re  r=  r    r   rI  rI    s             1 1 1U U U 1 1 1	U 	U 	U1 1 19 9 9P P P P Pr    rI  c                   $    e Zd Zedz  Zd Zd ZdS )MultiprocessTestsg     @@c                 .    t          t                     d S r#   )r   r   r.   s    r   rK  zMultiprocessTests.tearDown2  s    vr    c                 (   dt            d| j         d}t          j        t          j        d|gddt          j        t          j                  }|                     |j                   | 	                    d|j
                                                                                   t          j        t           | j        	          }	 |5  |                    d
           d d d            n# 1 swxY w Y   |j                            d           nC# t          j        $ r1}|j                            t'          |                     Y d }~nd }~ww xY w|                                 n# |                                 w xY w|                     |j                   	 |                    dt.                     n<# t          j        $ r* |                                 |                                  w xY w| 	                    |j        d           d S )Nzif 1:
            import sqlite3
            def wait():
                print("started")
                assert "database is locked" in input()

            cx = sqlite3.connect("z", timeout=a  )
            cx.create_function("wait", 0, wait)
            with cx:
                cx.execute("create table t(t)")
            try:
                # execute two transactions; both will try to lock the db
                cx.executescript('''
                    -- start a transaction and wait for parent
                    begin transaction;
                    select * from t;
                    select wait();
                    rollback;

                    -- start a new transaction; would fail if parent holds lock
                    begin transaction;
                    select * from t;
                    rollback;
                ''')
            finally:
                cx.close()
        z-czutf-8r   )encodingbufsizestdinstdoutstarted)timeoutzinsert into t values('test')zno errorend)inputrp  )r   CONNECTION_TIMEOUT
subprocessPopenr  
executablePIPEr  communicater,   rn  readlinestripr   r   r!  rm  r@  rN   r  rJ  r  
returncoder   TimeoutExpiredkill)r/   SCRIPTprocr   r$  s        r   &test_ctx_mgr_rollback_if_commit_failedz8MultiprocessTests.test_ctx_mgr_rollback_if_commit_failed5  s]    $*  7;6M  : ^T6*/?
 
 
 	())) 	DK$8$8$:$:$@$@$B$BCCC^FD,CDDD	 ; ;

9:::; ; ; ; ; ; ; ; ; ; ; ; ; ; ;
 JZ(((( & 	' 	' 	'JSXX&&&&&&&&	'
 HHJJJJBHHJJJJ 	$/***	5-@@@@( 	 	 	IIKKK	 	!,,,,,s`   D 
C, D ,C00D 3C04D 7E* E!'EE* EE* *F F; ;9G4N)r8  r9  r:  r   rs  rK  r  r=  r    r   rh  rh  .  s=        &.  >- >- >- >- >-r    rh  __main__)7r   r  sqlite3r   rt  r  r  r;  urllib.parser  test.supportr   r   r   r   r   r   r	   	_testcapir
   r   r   r   r   test.support.os_helperr   r   r   r   r   r   contextmanagerr   r(   TestCaser*   r?  r  r  r  r  r  r  r*  r  requires_working_threadingr  r  r  r  rB  rI  rh  r8  mainr=  r    r   <module>r     s  .     				         



                         * ) ) ) ) ) ) ) ) ) ) ) ) ) + + + + + + + + + + Y Y Y Y Y Y Y Y Y Y Y Y Y Y" " "  8 % % % %fI fI fI fI fI(# fI fI fIR	]= ]= ]= ]= ]=h' ]= ]= ]=@- - - - -8#4 - - -( WWV.<<13 3,, ,, ,, ,, ,,X& ,, ,,3 3,,^V: V: V: V: V:! V: V: V:r[4 [4 [4 [4 [4(# [4 [4 [4|) ) ) ) )! ) ) )D
 -,..M6 M6 M6 M6 M6(# M6 M6 /.M6`" " " " "x( " " ",QN QN QN QN QNX& QN QN QNfA A A A AX& A A AF         X&      &ZP ZP ZP ZP ZPH- ZP ZP ZPz D- D- D- D- D-) D- D- D-N zHMOOOOO r    