o ­=?h–™ã@s4ddlZddlZddlZddlZddlZddlmZmZddl m Z m Z Gdd„dej ƒZ Gdd„dej ƒZGdd „d ej ƒZGd d „d ej ƒZGd d „d ej ƒZGdd„dej ƒZGdd„dej ƒZGdd„dej ƒZGdd„dej ƒZGdd„dej ƒZGdd„dej ƒZdd„Zdd„Zedkr˜eƒdSdS)éN)Úcheck_disallow_instantiationÚ SHORT_TIMEOUT)ÚTESTFNÚunlinkc@s–eZdZdd„Zdd„Zdd„Zdd„Zd d „Zd d „Zd d„Z dd„Z dd„Z dd„Z dd„Z dd„Zdd„Ze ejdkd¡dd„ƒZdd „Zd!S)"Ú ModuleTestscCó| tjddtj¡dS)Nz2.0zapilevel is %s, should be 2.0)Ú assertEqualÚsqliteZapilevel©Úself©r ú9/opt/alt/python310/lib64/python3.10/sqlite3/test/dbapi.pyÚtest_api_level"ó ÿzModuleTests.test_api_levelcCr)Nézthreadsafety is %d, should be 1)rr Z threadsafetyr r r r Útest_thread_safety&rzModuleTests.test_thread_safetycCr)NZqmarkz%paramstyle is '%s', should be 'qmark')rr Z paramstyler r r r Útest_param_style*s ÿÿzModuleTests.test_param_stylecCó| ttjtƒd¡dS)Nz&Warning is not a subclass of Exception)Ú assertTrueÚ issubclassr ÚWarningÚ Exceptionr r r r Ú test_warning/óÿzModuleTests.test_warningcCr)Nz$Error is not a subclass of Exception)rrr ÚErrorrr r r r Ú test_error3rzModuleTests.test_errorcCó| ttjtjƒd¡dS)Nz)InterfaceError is not a subclass of Error)rrr ÚInterfaceErrorrr r r r Útest_interface_error7óÿz ModuleTests.test_interface_errorcCr)Nz(DatabaseError is not a subclass of Error)rrr Ú DatabaseErrorrr r r r Útest_database_error;rzModuleTests.test_database_errorcCr)Nz,DataError is not a subclass of DatabaseError)rrr Ú DataErrorr r r r r Útest_data_error?rzModuleTests.test_data_errorcCr)Nz3OperationalError is not a subclass of DatabaseError)rrr ÚOperationalErrorr r r r r Útest_operational_errorCrz"ModuleTests.test_operational_errorcCr)Nz1IntegrityError is not a subclass of DatabaseError)rrr ÚIntegrityErrorr r r r r Útest_integrity_errorGrz ModuleTests.test_integrity_errorcCr)Nz0InternalError is not a subclass of DatabaseError)rrr Ú InternalErrorr r r r r Útest_internal_errorKrzModuleTests.test_internal_errorcCr)Nz3ProgrammingError is not a subclass of DatabaseError)rrr ÚProgrammingErrorr r r r r Útest_programming_errorOrz"ModuleTests.test_programming_errorcCr)Nz4NotSupportedError is not a subclass of DatabaseError)rrr ÚNotSupportedErrorr r r r r Útest_not_supported_errorSs ÿþz$ModuleTests.test_not_supported_errorÚdarwinz#shared cache is deprecated on macOSc CsPdD]#}| t¡ }t |¡Wdƒn1swY| d|j¡qdS)N)TFzdbapi.py)Z assertWarnsÚDeprecationWarningr Zenable_shared_cacheZassertInÚfilename)r ZenableÚcmr r r Útest_shared_cache_deprecatedZs   ÿýz(ModuleTests.test_shared_cache_deprecatedcCs t d¡}t|t|dƒƒƒdS)Nú:memory:zselect 1)r ÚconnectrÚtype©r Úcxr r r Útest_disallow_instantiationas z'ModuleTests.test_disallow_instantiationN)Ú__name__Ú __module__Ú __qualname__rrrrrrr!r#r%r'r)r+r-ÚunittestÚskipIfÚsysÚplatformr2r8r r r r r!s"  rc@s|eZdZdd„Zdd„Zdd„Zdd„Zd d „Zd d „Zd d„Z dd„Z dd„Z dd„Z dd„Z dd„Zdd„Zdd„ZdS)ÚConnectionTestscCs0t d¡|_|j ¡}| d¡| dd¡dS)Nr3z4create table test(id integer primary key, name text)ú!insert into test(name) values (?)©Úfoo)r r4r7ÚcursorÚexecute©r Úcur r r ÚsetUphs   zConnectionTests.setUpcCó|j ¡dS©N©r7Úcloser r r r ÚtearDownnózConnectionTests.tearDowncCrIrJ©r7Úcommitr r r r Ú test_commitqrNzConnectionTests.test_commitcCó|j ¡|j ¡dS)zV A commit should also work when no changes were made to the database. NrOr r r r Útest_commit_after_no_changestó z,ConnectionTests.test_commit_after_no_changescCrIrJ©r7Úrollbackr r r r Ú test_rollback{rNzConnectionTests.test_rollbackcCrR)zX A rollback should also work when no changes were made to the database. NrUr r r r Útest_rollback_after_no_changes~rTz.ConnectionTests.test_rollback_after_no_changescCs|j ¡}dSrJ©r7rDrFr r r Ú test_cursor…rNzConnectionTests.test_cursorcCs@d}| tj¡t |¡}WdƒdS1swYdS)Nz/foo/bar/bla/23534/mydb.db)Ú assertRaisesr r$r4)r ZYOU_CANNOT_OPEN_THISÚconr r r Útest_failed_openˆs "ÿz ConnectionTests.test_failed_opencCrIrJrKr r r r Ú test_closerNzConnectionTests.test_closecCs¸| |jjtj¡| |jjtj¡| |jjtj¡| |jjtj¡| |jjtj¡| |jjtj¡| |jj tj ¡| |jj tj ¡| |jj tj ¡| |jj tj ¡dSrJ) rr7rr rrr r"r$r&r(r*r,r r r r Útest_exceptionsszConnectionTests.test_exceptionscCs´t d¡}| ¡}| |jd¡| d¡| |jd¡| dd¡| |jd¡| ddg¡| ¡}| |jd¡| ¡| |jd¡| ddg¡| ¡}| |jd¡dS) Nr3Fz?create table transactiontest(id integer primary key, name text)z,insert into transactiontest(name) values (?)rBTz-select name from transactiontest where name=?rC)r r4rDrÚin_transactionrEÚfetchonerP)r r7rGÚrowr r r Útest_in_transactions   z#ConnectionTests.test_in_transactioncCs8| t¡ d|j_WdƒdS1swYdS)NT)r[ÚAttributeErrorr7r`r r r r Útest_in_transaction_ro¯s  "ÿz&ConnectionTests.test_in_transaction_rocCsZ| tt¡Gdd„dƒ}|ƒ}t |¡}| d¡WdƒdS1s&wYdS)z| Checks that we can successfully connect to a database using an object that is PathLike, i.e. has __fspath__(). c@óeZdZdd„ZdS)z=ConnectionTests.test_open_with_path_like_object..PathcSstSrJ)rr r r r Ú __fspath__¸ózHConnectionTests.test_open_with_path_like_object..Path.__fspath__N)r9r:r;rgr r r r ÚPath·ó riúcreate table test(id integer)N)Ú addCleanuprrr r4rE)r riÚpathr7r r r Útest_open_with_path_like_object³s   "ÿz/ConnectionTests.test_open_with_path_like_objectc Csþ| tt¡t t¡ }| d¡Wdƒn1swYtjdtdd }| d¡Wdƒn1s9wYtjdtddd,}| tj¡ | d¡Wdƒn1s`wYWdƒdSWdƒdS1sxwYdS)Nrkzfile:T)Zurizinsert into test(id) values(0)z?mode=rozinsert into test(id) values(1))rlrrr r4rEr[r$r6r r r Ú test_open_uri¾s   ÿ ÿ ÿÿ"ÿzConnectionTests.test_open_uriN)r9r:r;rHrMrQrSrWrXrZr]r^r_rcrernror r r r r@fs  r@c@óeZdZdd„Zdd„ZdS)ÚUninitialisedConnectionTestscCstj tj¡|_dSrJ)r Z ConnectionÚ__new__r7r r r r rHÊóz"UninitialisedConnectionTests.setUpc sЇfdd„‡fdd„‡fdd„‡fdd„‡fdd„‡fdd„f}|D] }ˆj|dˆ tjd |¡Wdƒn1s=wYq"dS) NcóˆjjSrJ)r7Úisolation_levelr r r r ÚÏózEUninitialisedConnectionTests.test_uninit_operations..crtrJ)r7Ú total_changesr r r r rvÐrwcrtrJ)r7r`r r r r rvÑrwcó ˆj ¡SrJ)r7Ziterdumpr r r r rvÒó cryrJrYr r r r rvÓrzcryrJrKr r r r rvÔrz)Úfuncz#Base Connection.__init__ not called)ÚsubTestZassertRaisesRegexr r*)r Zfuncsr{r r r Útest_uninit_operationsÍs      úþÿ€ÿz3UninitialisedConnectionTests.test_uninit_operationsN)r9r:r;rHr}r r r r rqÉs rqc@s¾eZdZdd„Zdd„Zdd„Zdd„Zd d „Zd d „Zd d„Z dd„Z dd„Z dd„Z dd„Z dd„Zdd„Zdd„Zdd„Zdd „Zd!d"„Zd#d$„Zd%d&„Zd'd(„Zd)d*„Zd+d,„Zd-d.„Zd/d0„Zd1d2„Zd3d4„Zd5d6„Zd7d8„Ze  e!j"d9kd:¡d;d<„ƒZ#d=d>„Z$d?d@„Z%dAdB„Z&dCdD„Z'dEdF„Z(dGdH„Z)dIdJ„Z*dKdL„Z+dMdN„Z,dOdP„Z-dQdR„Z.dSdT„Z/dUdV„Z0dWdX„Z1dYdZ„Z2d[d\„Z3d]d^„Z4d_d`„Z5dadb„Z6dcdd„Z7dedf„Z8dgdh„Z9didj„Z:dkS)lÚ CursorTestscCs6t d¡|_|j ¡|_|j d¡|j dd¡dS)Nr3z\create table test(id integer primary key, name text, income number, unique_test text unique)rArB©r r4r7rDrGrEr r r r rHÞs  ÿzCursorTests.setUpcCó|j ¡|j ¡dSrJ©rGrLr7r r r r rMçó zCursorTests.tearDowncCó|j d¡dS)Núdelete from test©rGrEr r r r Útest_execute_no_argsëóz CursorTests.test_execute_no_argscCó>| tj¡|j d¡WdƒdS1swYdS)Nz select asdf)r[r r$rGrEr r r r Útest_execute_illegal_sqlîó"ÿz$CursorTests.test_execute_illegal_sqlcCrˆ)Nzselect 5+4; select 4+5)r[r rrGrEr r r r Útest_execute_too_much_sqlòrŠz%CursorTests.test_execute_too_much_sqlcCrƒ)Nzselect 5+4; -- foo barr…r r r r Útest_execute_too_much_sql2ör‡z&CursorTests.test_execute_too_much_sql2cCrƒ)NzT select 5+4; /* foo */ r…r r r r Útest_execute_too_much_sql3ùr‡z&CursorTests.test_execute_too_much_sql3cCs<| t¡|j d¡WdƒdS1swYdS©Né*)r[Ú TypeErrorrGrEr r r r Útest_execute_wrong_sql_args "ÿz&CursorTests.test_execute_wrong_sql_argcCó|j dd¡dS)Núinsert into test(id) values (?))rr…r r r r Útest_execute_arg_intóz CursorTests.test_execute_arg_intcCr’)Nú#insert into test(income) values (?))gq= ×£ˆ£@r…r r r r Útest_execute_arg_float r•z"CursorTests.test_execute_arg_floatcCr’)NrA)ZHugor…r r r r Útest_execute_arg_string r•z#CursorTests.test_execute_arg_stringcCs@|j dd¡|j d|jjf¡|j ¡}| |dd¡dS)NrA)úHugoz select name from test where id=?rr™)rGrEÚ lastrowidrar©r rbr r r Ú&test_execute_arg_string_with_zero_bytes z2CursorTests.test_execute_arg_string_with_zero_bytecCsN| t¡}|j dd¡Wdƒn1swY| t|jƒd¡dS)Nr“rz"parameters are of unsupported type)r[Ú ValueErrorrGrErÚstrÚ exception)r r1r r r Útest_execute_non_iterables ÿz%CursorTests.test_execute_non_iterablecCs@| tj¡|j dd¡WdƒdS1swYdS)Nr“)éZEgon©r[r r*rGrEr r r r Útest_execute_wrong_no_of_args1s"ÿz*CursorTests.test_execute_wrong_no_of_args1cCrˆ©Nr“r¢r r r r Útest_execute_wrong_no_of_args2 ó"ÿz*CursorTests.test_execute_wrong_no_of_args2cCrˆr¤r¢r r r r Útest_execute_wrong_no_of_args3%r¦z*CursorTests.test_execute_wrong_no_of_args3cCs:|j d¡|j ddg¡|j ¡}| |dd¡dS)Nú%insert into test(name) values ('foo')ú"select name from test where name=?rCr©rGrErarr›r r r Útest_execute_param_list*s  z#CursorTests.test_execute_param_listcCsHGdd„dƒ}|j d¡|j d|ƒ¡|j ¡}| |dd¡dS)Nc@rp)z2CursorTests.test_execute_param_sequence..LcSódS)Nrr r r r r Ú__len__2rhz:CursorTests.test_execute_param_sequence..L.__len__cSs|dksJ‚dS)NrrCr ©r Úxr r r Ú __getitem__4s z>CursorTests.test_execute_param_sequence..L.__getitem__N©r9r:r;r­r°r r r r ÚL1ó r²r¨r©rrCrª)r r²rbr r r Útest_execute_param_sequence0s   z'CursorTests.test_execute_param_sequencecCsZGdd„dƒ}|j d¡| t¡|j d|ƒ¡WdƒdS1s&wYdS)Nc@rp)z:CursorTests.test_execute_param_sequence_bad_len..LcSs dddS)Nrrr r r r r r­@ó zBCursorTests.test_execute_param_sequence_bad_len..L.__len__cSst‚rJ)ÚAssertionError)Zslfr¯r r r r°BrhzFCursorTests.test_execute_param_sequence_bad_len..L.__getitem__Nr±r r r r r²?r³r²r¨r©)rGrEr[ÚZeroDivisionError)r r²r r r Ú#test_execute_param_sequence_bad_len=s   "ÿz/CursorTests.test_execute_param_sequence_bad_lencCs<|j d¡|j dddi¡|j ¡}| |dd¡dS)Nr¨ú&select name from test where name=:nameÚnamerCrrªr›r r r Útest_execute_dict_mappingIs  z%CursorTests.test_execute_dict_mappingcCsJGdd„dtƒ}|j d¡|j d|ƒ¡|j ¡}| |dd¡dS)Nc@rf)z8CursorTests.test_execute_dict_mapping_mapping..DcSr¬©NrCr )r Úkeyr r r Ú __missing__QrhzDCursorTests.test_execute_dict_mapping_mapping..D.__missing__N)r9r:r;r¾r r r r ÚDPrjr¿r¨r¹rrC)ÚdictrGrErar)r r¿rbr r r Ú!test_execute_dict_mapping_mappingOs   z-CursorTests.test_execute_dict_mapping_mappingcCóP|j d¡| tj¡|j dddi¡WdƒdS1s!wYdS)Nr¨z1select name from test where name=:name and id=:idrºrC©rGrEr[r r*r r r r Ú)test_execute_dict_mapping_too_little_argsYó "ÿz5CursorTests.test_execute_dict_mapping_too_little_argscCsJ|j d¡| tj¡|j d¡WdƒdS1swYdS)Nr¨r¹rÃr r r r Ú!test_execute_dict_mapping_no_args^s "ÿz-CursorTests.test_execute_dict_mapping_no_argscCrÂ)Nr¨r©rºrCrÃr r r r Ú!test_execute_dict_mapping_unnamedcrÅz-CursorTests.test_execute_dict_mapping_unnamedcCrIrJ)rGrLr r r r r^hrNzCursorTests.test_closecCsD|j d¡|j d¡|j d¡|j d¡| |jjd¡dS)Nr„r¨zupdate test set name='bar'é©rGrErÚrowcountr r r r Útest_rowcount_executeks    z!CursorTests.test_rowcount_executecCs |j d¡| |jjd¡dS)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. zselect 5 union select 6éÿÿÿÿNrÉr r r r Útest_rowcount_selectrs z CursorTests.test_rowcount_selectcCs2|j d¡|j dgd¢¡| |jjd¡dS)Nr„rA))r)rÈ©érÏ)rGrEÚ executemanyrrÊr r r r Útest_rowcount_executemany{s z%CursorTests.test_rowcount_executemany)rÏé#rzRequires SQLite 3.35.0 or newercCs6|j d¡| |j ¡dd¡| |jjd¡dS)Nz7update test set name='bar' where name='foo' returning 1rr)rGrErrarÊr r r r Útest_rowcount_update_returning€s z*CursorTests.test_rowcount_update_returningcCs0|j d¡|j d¡|jd|jjdddS)Nr¨rÈz"total changes reported wrong value)Úmsg)rGrEZ assertLessr7rxr r r r Útest_total_changesˆs  zCursorTests.test_total_changescCs"|j ddd„tddƒDƒ¡dS)Nr–cSsg|]}|f‘qSr r )Ú.0r¯r r r Ú ’sz:CursorTests.test_execute_many_sequence..édén)rGrÐÚranger r r r Útest_execute_many_sequence‘s"z&CursorTests.test_execute_many_sequencecCs"Gdd„dƒ}|j d|ƒ¡dS)Nc@ó$eZdZdd„Zdd„Zdd„ZdS)z6CursorTests.test_execute_many_iterator..MyItercSs d|_dS©Né)Úvaluer r r r Ú__init__–s z?CursorTests.test_execute_many_iterator..MyIter.__init__cSs|SrJr r r r r Ú__iter__™rhz?CursorTests.test_execute_many_iterator..MyIter.__iter__cSs$|jdkrt‚|jd7_|jfS)Né r)rßÚ StopIterationr r r r Ú__next__œs z?CursorTests.test_execute_many_iterator..MyIter.__next__N)r9r:r;ràrárär r r r ÚMyIter•s rår–©rGrÐ)r rår r r Útest_execute_many_iterator”sz&CursorTests.test_execute_many_iteratorcCsdd„}|j d|ƒ¡dS)NcsstdƒD]}|fVqdSrÝ)rÚ)Úir r r Úmygen¦s€  ÿz6CursorTests.test_execute_many_generator..mygenr–ræ)r rér r r Útest_execute_many_generator¥sz'CursorTests.test_execute_many_generatorcCs@| t¡|j ddg¡WdƒdS1swYdS)NrrΩr[rrGrÐr r r r Útest_execute_many_wrong_sql_arg¬s "ÿz+CursorTests.test_execute_many_wrong_sql_argcCsB| tj¡|j ddg¡WdƒdS1swYdS)Nzselect ?rÎ)r[r r*rGrÐr r r r Útest_execute_many_select°s"ÿz$CursorTests.test_execute_many_selectcCs>| t¡|j dd¡WdƒdS1swYdS)Nr–rrër r r r Útest_execute_many_not_iterable´s "ÿz*CursorTests.test_execute_many_not_iterablecCsv|j d¡|j dd¡|j dd¡|j d¡g}|jD] }| |d¡q| |dd¡| |dd ¡dS) Nr„r“)rÞ)ézselect id from test order by idrrÞrrï)rGrEÚappendr)r Zlstrbr r r Útest_fetch_iter¸s   zCursorTests.test_fetch_itercCs@|j d¡|j ¡}| |dd¡|j ¡}| |d¡dS)Núselect name from testrrCrªr›r r r Ú test_fetchoneÄó   zCursorTests.test_fetchonecCs"|j ¡}| ¡}| |d¡dSrJ)r7rDrar)r Úcurrbr r r Útest_fetchone_no_statementËs z&CursorTests.test_fetchone_no_statementcCsr| |jjd¡d|j_|j d¡|j d¡|j d¡|j d¡|j d¡|j ¡}| t|ƒd¡dS)NrrÈr„z#insert into test(name) values ('A')z#insert into test(name) values ('B')z#insert into test(name) values ('C')rò)rrGZ arraysizerEÚ fetchmanyÚlen©r Úresr r r Útest_array_sizeÐs      zCursorTests.test_array_sizecCsD|j d¡|j d¡}| t|ƒd¡|j d¡}| |g¡dS)NròrØr©rGrEr÷rrørùr r r Útest_fetchmanyás   zCursorTests.test_fetchmanycCs.|j d¡|jjdd}| t|ƒd¡dS)z0Checks if fetchmany works with keyword argumentsròrØ)ÚsizerNrürùr r r Útest_fetchmany_kw_argès z!CursorTests.test_fetchmany_kw_argcCs@|j d¡|j ¡}| t|ƒd¡|j ¡}| |g¡dS)Nròr)rGrEÚfetchallrrørùr r r Ú test_fetchallîrôzCursorTests.test_fetchallcCs|j gd¢¡dS)N)rÏérÞ)rGZ setinputsizesr r r r Útest_setinputsizesõrszCursorTests.test_setinputsizescCr’)NrÞr©rGZ setoutputsizer r r r Útest_setoutputsizeør•zCursorTests.test_setoutputsizecCrƒrŽrr r r r Útest_setoutputsize_no_columnûr‡z(CursorTests.test_setoutputsize_no_columncCs| |jj|j¡dSrJ)rrGZ connectionr7r r r r Útest_cursor_connectionþsz"CursorTests.test_cursor_connectioncCsD| t¡dd„}|j |¡}WdƒdS1swYdS)NcSódSrJr r r r r Úfóz1CursorTests.test_wrong_cursor_callable..f)r[rr7rD)r r rõr r r Útest_wrong_cursor_callables "þz&CursorTests.test_wrong_cursor_callablecCsNGdd„dƒ}|ƒ}| t¡t |¡}WdƒdS1s wYdS)Nc@s eZdZdS)z0CursorTests.test_cursor_wrong_class..FooN)r9r:r;r r r r ÚFoos r )r[rr ZCursor)r r rCrõr r r Útest_cursor_wrong_classs   "ÿz#CursorTests.test_cursor_wrong_classc Csbd}dD]*}|j|d|j | |¡d¡| |jjd¡Wdƒn1s)wYqdS)zV INSERT OR REPLACE and REPLACE INTO should produce the same behavior. z+{} INTO test(id, unique_test) VALUES (?, ?))zINSERT OR REPLACEZREPLACE©Ú statement)rrCrN)r|rGrEÚformatrrš)r Úsqlrr r r Útest_last_row_id_on_replace sþ€ÿz'CursorTests.test_last_row_id_on_replacecCs@|j dd¡| |jjd¡|j dd¡| |jjd¡dS)Nz2insert or ignore into test(unique_test) values (?))ÚtestrÈ)rGrErršr r r r Útest_last_row_id_on_ignoresþþz&CursorTests.test_last_row_id_on_ignorec CsØg}dD][}d}|jd |¡dF|j | |¡|f¡| ||jjf¡| tj¡|j | |¡|f¡Wdƒn1sBwY| ||jjf¡Wdƒn1sZwYqgd¢}|  ||¡dS)N)ÚFAILÚABORTÚROLLBACKz.INSERT OR {} INTO test(unique_test) VALUES (?)z INSERT OR {}r)©rrÈr©rrÏr©rrr) r|rrGrErðršr[r r&r)r ZresultsrrZexpectedr r r Útest_last_row_id_insert_o_r!sÿû€z'CursorTests.test_last_row_id_insert_o_rN);r9r:r;rHrMr†r‰r‹rŒrr‘r”r—r˜rœr r£r¥r§r«r´r¸r»rÁrÄrÆrÇr^rËrÍrÑr<r=r Zsqlite_version_inforÓrÕrÛrçrêrìrírîrñrórörûrýrÿrrrrrr r rrrr r r r r~Ýsp      ÿ    r~c@s\eZdZdd„Zdd„Zdd„Zdd„Zd d „Zd d „Zd d„Z dd„Z dd„Z dd„Z dS)Ú ThreadTestscCó(t d¡|_|j ¡|_|j d¡dS)Nr3z\create table test(id integer primary key, name text, bin binary, ratio number, ts timestamp))r r4r\rDrõrEr r r r rH4ó  zThreadTests.setUpcCr€rJ)rõrLr\r r r r rM9r‚zThreadTests.tearDowncCóVdd„}g}tj||j|dœd}| ¡| ¡t|ƒdkr)| d |¡¡dSdS)NcSóDz | ¡}| d¡WdStjyYdS| d¡YdS©Núdid not raise ProgrammingErrorúraised wrong exception)rDrðr r*)r\Úerrorsrõr r r Úrun>ó z(ThreadTests.test_con_cursor..run©r\r$©ÚtargetÚkwargsrÚ ©Ú threadingÚThreadr\ÚstartÚjoinrøÚfail©r r%r$Útr r r Útest_con_cursor=ó  ÿzThreadTests.test_con_cursorcCr)NcSóDz | ¡| d¡WdStjyYdS| d¡YdSr!)rPrðr r*r'r r r r%Pr&z(ThreadTests.test_con_commit..runr'r(rr+r,r2r r r Útest_con_commitOr5zThreadTests.test_con_commitcCr)NcSr6r!)rVrðr r*r'r r r r%br&z*ThreadTests.test_con_rollback..runr'r(rr+r,r2r r r Útest_con_rollbackar5zThreadTests.test_con_rollbackcCr)NcSr6r!©rLrðr r*r'r r r r%tr&z'ThreadTests.test_con_close..runr'r(rr+r,r2r r r Útest_con_closesr5zThreadTests.test_con_closecCr)NcSóFz | d¡| d¡WdStjyYdS| d¡YdS)Nú#insert into test(name) values ('a')r"r#©rErðr r*©rõr$r r r r%†ó  z0ThreadTests.test_cur_implicit_begin..runr>r(rr+©r-r.rõr/r0rør1r2r r r Útest_cur_implicit_begin…r5z#ThreadTests.test_cur_implicit_begincCr)NcSr6r!r9r>r r r r%˜r&z'ThreadTests.test_cur_close..runr>r(rr+r@r2r r r Útest_cur_close—r5zThreadTests.test_cur_closecCsbdd„}g}|j d¡tj||j|dœd}| ¡| ¡t|ƒdkr/| d |¡¡dSdS)NcSr;)Nròr"r#r=r>r r r r%ªr?z)ThreadTests.test_cur_execute..runr<r>r(rr+©rõrEr-r.r/r0rør1r2r r r Útest_cur_execute©s  ÿzThreadTests.test_cur_executecCsndd„}g}|j d¡|j d¡tj||j|dœd}| ¡| ¡t|ƒdkr5| d |¡¡dSdS) NcSr r!)rarðr r*)rõr$rbr r r r%½r&z+ThreadTests.test_cur_iter_next..runr<ròr>r(rr+rCr2r r r Útest_cur_iter_next¼s   ÿzThreadTests.test_cur_iter_nextN) r9r:r;rHrMr4r7r8r:rArBrDrEr r r r r3s rc@óDeZdZdd„Zdd„Zdd„Zdd„Zd d „Zd d „Zd d„Z dS)ÚConstructorTestscCót ddd¡}dS)NéÔrâé)r ZDate©r Údr r r Ú test_dateÑr•zConstructorTests.test_datecCrH)Né é'rÒ)r ZTime©r r3r r r Ú test_timeÔr•zConstructorTests.test_timecCst dddddd¡}dS)NrIrârJrNrOrÒ)r Z Timestamp©r Ztsr r r Útest_timestamp×szConstructorTests.test_timestampcCót d¡}dSrŽ)r Z DateFromTicksrKr r r Útest_date_from_ticksÚrNz%ConstructorTests.test_date_from_tickscCrTrŽ)r Z TimeFromTicksrPr r r Útest_time_from_ticksÝrNz%ConstructorTests.test_time_from_tickscCrTrŽ)r ZTimestampFromTicksrRr r r Útest_timestamp_from_ticksàrNz*ConstructorTests.test_timestamp_from_tickscCrT)Ns')r ZBinary)r Úbr r r Ú test_binaryãrNzConstructorTests.test_binaryN) r9r:r;rMrQrSrUrVrWrYr r r r rGÐs rGc@rF)ÚExtensionTestscCsBt d¡}| ¡}| d¡| d¡| ¡d}| |d¡dS)Nr3z -- bla bla /* a stupid comment */ create table a(i); insert into a(i) values (5); zselect i from arrÞ)r r4rDÚ executescriptrErar)r r\rõrúr r r Útest_script_string_sqlçs    z%ExtensionTests.test_script_string_sqlcCóNt d¡}| ¡}| tj¡| d¡WdƒdS1s wYdS)Nr3z1create table test(x); asdf; create table test2(x)©r r4rDr[r$r[©r r\rõr r r Útest_script_syntax_errorôó  "ÿz'ExtensionTests.test_script_syntax_errorcCr])Nr3z5create table test(sadfsadfdsa); select foo from hurz;r^r_r r r Útest_script_error_normalúraz'ExtensionTests.test_script_error_normalcCs\t d¡}| ¡}| t¡ }| d¡Wdƒn1swY| t|jƒd¡dS)Nr3s9create table test(foo); insert into test(foo) values (5);z script argument must be unicode.) r r4rDr[rr[rržrŸ)r r\rõr1r r r Ú"test_cursor_executescript_as_bytess   ÿz1ExtensionTests.test_cursor_executescript_as_bytescCs.t d¡}| d¡ ¡d}| |dd¡dS)Nr3zselect 5rrÞz Basic test of Connection.execute)r r4rErar©r r\Úresultr r r Útest_connection_executes z&ExtensionTests.test_connection_executecCsbt d¡}| d¡| dddg¡| d¡ ¡}| |dddd ¡| |d dd d ¡dS) Nr3zcreate table test(foo)z insert into test(foo) values (?)rΩrz!select foo from test order by foorrÏz$Basic test of Connection.executemanyrr)r r4rErÐrrrdr r r Útest_connection_executemany s  z*ExtensionTests.test_connection_executemanycCs8t d¡}| d¡| d¡ ¡d}| |dd¡dS)Nr3z9create table test(foo); insert into test(foo) values (5);zselect foo from testrrÞz&Basic test of Connection.executescript)r r4r[rErarrdr r r Útest_connection_executescripts  z,ExtensionTests.test_connection_executescriptN) r9r:r;r\r`rbrcrfrhrir r r r rZæs  rZc@sTeZdZdd„Zdd„Zdd„Zdd„Zd d „Zd d „Zd d„Z dd„Z dd„Z dS)ÚClosedConTestscCsLt d¡}| ¡| tj¡ | ¡}WdƒdS1swYdS©Nr3)r r4rLr[r*rDr_r r r Útest_closed_con_cursoró  "ÿz%ClosedConTests.test_closed_con_cursorcCóLt d¡}| ¡| tj¡ | ¡WdƒdS1swYdSrk)r r4rLr[r*rP©r r\r r r Útest_closed_con_commit!rmz%ClosedConTests.test_closed_con_commitcCrnrk)r r4rLr[r*rVror r r Útest_closed_con_rollback'rmz'ClosedConTests.test_closed_con_rollbackcCsVt d¡}| ¡}| ¡| tj¡| d¡WdƒdS1s$wYdS)Nr3zselect 4)r r4rDrLr[r*rEr_r r r Útest_closed_cur_execute-s  "ÿz&ClosedConTests.test_closed_cur_executecCsZt d¡}| ¡dd„}| tj¡| dd|¡WdƒdS1s&wYdS)Nr3cSr¬©Nr¡r )r¯r r r r 7r z5ClosedConTests.test_closed_create_function..frCr)r r4rLr[r*Zcreate_function)r r\r r r r Útest_closed_create_function4s "ÿz*ClosedConTests.test_closed_create_functioncCs`t d¡}| ¡Gdd„dƒ}| tj¡| dd|¡WdƒdS1s)wYdS)Nr3c@rÜ)z8ClosedConTests.test_closed_create_aggregate..AggcSrrJr r r r r rà?rhzAClosedConTests.test_closed_create_aggregate..Agg.__init__cSrrJr r®r r r ÚstepArhz=ClosedConTests.test_closed_create_aggregate..Agg.stepcSr¬rsr r r r r ÚfinalizeCrhzAClosedConTests.test_closed_create_aggregate..Agg.finalizeN)r9r:r;ràrurvr r r r ÚAgg>s rwrCr)r r4rLr[r*Zcreate_aggregate)r r\rwr r r Útest_closed_create_aggregate;s "ÿz+ClosedConTests.test_closed_create_aggregatecCsVt d¡}| ¡dd„}| tj¡| |¡WdƒdS1s$wYdS)Nr3cWstjSrJ)r ZDENY)Úargsr r r Ú authorizerKsz=ClosedConTests.test_closed_set_authorizer..authorizer)r r4rLr[r*Zset_authorizer)r r\rzr r r Útest_closed_set_authorizerHs  "ÿz)ClosedConTests.test_closed_set_authorizercCsXt d¡}| ¡dd„}| tj¡| |d¡WdƒdS1s%wYdS)Nr3cSrrJr r r r r ÚprogressSr zBClosedConTests.test_closed_set_progress_callback..progressrØ)r r4rLr[r*Zset_progress_handler)r r\r|r r r Ú!test_closed_set_progress_callbackPs "ÿz0ClosedConTests.test_closed_set_progress_callbackcCsJt d¡}| ¡| tj¡ |ƒWdƒdS1swYdSrk)r r4rLr[r*ror r r Útest_closed_callWs "ÿzClosedConTests.test_closed_callN) r9r:r;rlrprqrrrtrxr{r}r~r r r r rjs  rjc@rf)ÚClosedCurTestsc CsŽt d¡}| ¡}| ¡dD]5}|dvrd}n |dkr#dddgf}ng}| tj¡t||ƒ}||ŽWdƒn1s?wYqdS) Nr3)rErÐr[rr÷ra)rEr[)zselect 4 union select 5rÐzinsert into foo(bar) values (?)rÎrg)r r4rDrLr[r*Úgetattr)r r\rõZ method_nameÚparamsÚmethodr r r Ú test_closed^s   þ€øzClosedCurTests.test_closedN)r9r:r;rƒr r r r r]rjrc@sXeZdZdZdd„Zdd„Zdd„Zdd „Zd d „Zd d „Z dd„Z dd„Z dd„Z dS)ÚSqliteOnConflictTestszz Tests for SQLite's "insert on conflict" feature. See https://www.sqlite.org/lang_conflict.html for details. cCr)Nr3zz CREATE TABLE test( id INTEGER PRIMARY KEY, name TEXT, unique_name TEXT UNIQUE ); rr r r r rHwrzSqliteOnConflictTests.setUpcCr€rJrr r r r rM€r‚zSqliteOnConflictTests.tearDowncCsœd|j_|j ¡|_|j d¡|j d¡|j d¡| tj¡|j d¡Wdƒn1s3wY|j ¡|j d¡|  |j  ¡g¡dS)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© r7rurDrGrEr[r r&rPrrr r r r Ú3test_on_conflict_rollback_with_explicit_transaction„s    ÿ  zISqliteOnConflictTests.test_on_conflict_rollback_with_explicit_transactioncCs d|j_|j ¡|_|j d¡|j d¡|j d¡| tj¡|j d¡Wdƒn1s3wY|j ¡|j d¡|  |j  ¡ddg¡dS)Nr…r†ú5INSERT OR ABORT INTO test(unique_name) VALUES ('foo')ú"SELECT name, unique_name FROM test©Z abort_testNr¼rˆr r r r Ú8test_on_conflict_abort_raises_with_explicit_transactions“s    ÿ  zNSqliteOnConflictTests.test_on_conflict_abort_raises_with_explicit_transactionscCsr|j d¡|j d¡| tj¡|j d¡Wdƒn1s#wY|j d¡| |j ¡g¡dS)Nr†r‡r‹©rGrEr[r r&rrr r r r Ú-test_on_conflict_rollback_without_transaction£s  ÿ zCSqliteOnConflictTests.test_on_conflict_rollback_without_transactioncCsv|j d¡|j d¡| tj¡|j d¡Wdƒn1s#wY|j d¡| |j ¡ddg¡dS)Nr†rŠr‹rŒr¼rŽr r r r Ú2test_on_conflict_abort_raises_without_transactions­s  ÿ zHSqliteOnConflictTests.test_on_conflict_abort_raises_without_transactionscCsZ|j d¡| tj¡|j d¡Wdƒn1swY| |j ¡g¡dS)Nz4INSERT OR FAIL INTO test(unique_name) VALUES ('foo')rŽr r r r Útest_on_conflict_fail¸s ÿz+SqliteOnConflictTests.test_on_conflict_failcCs<|j d¡|j d¡|j d¡| |j ¡dg¡dS)Nz6INSERT OR IGNORE INTO test(unique_name) VALUES ('foo')zSELECT unique_name FROM testrB©rGrErrr r r r Útest_on_conflict_ignore¾ó   z-SqliteOnConflictTests.test_on_conflict_ignorecCs<|j d¡|j d¡|j d¡| |j ¡dg¡dS)NzFINSERT OR REPLACE INTO test(name, unique_name) VALUES ('Data!', 'foo')zUINSERT OR REPLACE INTO test(name, unique_name) VALUES ('Very different data!', 'foo')r‹)zVery different data!rCr’r r r r Útest_on_conflict_replaceÅr”z.SqliteOnConflictTests.test_on_conflict_replaceN) r9r:r;Ú__doc__rHrMr‰rrrr‘r“r•r r r r r„ps    r„c@s$eZdZedZdd„Zdd„ZdS)ÚMultiprocessTestsg@@cCs ttƒdSrJ)rrr r r r rMÐrµzMultiprocessTests.tearDownc CsHdt›d|j›d}tjtjd|gddtjtjd}| |j¡|  d|j   ¡  ¡¡t jt|jd }zAz| | d ¡Wdƒn1sGwYWnt jyh}z|j t|ƒ¡WYd}~n d}~ww|j d ¡W| ¡n| ¡w| |j¡z |jd td Wntjyš| ¡| ¡‚w|  |jd¡dS)Nz´if 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-czutf-8r)ÚencodingÚbufsizeÚstdinÚstdoutZstarted)Útimeoutzinsert into t values('test')zno errorÚend)Úinputrœ)rÚCONNECTION_TIMEOUTÚ subprocessÚPopenr>Ú executableÚPIPErlZ communicaterr›ÚreadlineÚstripr r4rEr$ršÚwriteržrLZ assertIsNoneÚ returncoderZTimeoutExpiredÚkill)r ZSCRIPTÚprocr7Úexcr r r Ú&test_ctx_mgr_rollback_if_commit_failedÓsHúú û  ÿ€€ÿ € ýz8MultiprocessTests.test_ctx_mgr_rollback_if_commit_failedN)r9r:r;rrŸrMr«r r r r r—Ís r—c Cs.tttttttttt t g }t   dd„|Dƒ¡S)NcSsg|] }t ¡ |¡‘qSr )r<Z TestLoaderZloadTestsFromTestCase)rÖr3r r r r×#szsuite..) rjrr@rGr~rZrr—r„rrqr<Z TestSuite)Ztestsr r r Úsuitesõ ÿr¬cCst ¡}| tƒ¡dSrJ)r<ZTextTestRunnerr%r¬)Zrunnerr r r r&srÚ__main__)r r-r<Zsqlite3r r>Z test.supportrrZtest.support.os_helperrrZTestCaserr@rqr~rrGrZrjrr„r—r¬rr9r r r r Ús4EcX4C]G ÿ