o =?hC@sddlZddlZddlZddlZddlZddlmZddlm Z Gdddej Z Gdddej Z dd Z d d Zed krCedSdS) N)support)patchc@s eZdZddZddZddZddZd d Zd d Zd dZ ddZ ddZ ddZ ddZ ddZddZddZddZdd Zd!d"Zd#d$Zd%d&Zd'd(Zd)d*Zd+d,Zd-d.Zd/d0Zd1d2Zd3d4Zd5d6Zd7d8Zd9d:Zd;d<Z d=d>Z!d?d@Z"dAS)BRegressionTestscCstd|_dS)N:memory:)sqliteconnectconselfr >/opt/alt/python310/lib64/python3.10/sqlite3/test/regression.pysetUp"szRegressionTests.setUpcCs|jdSN)rcloser r r r tearDown%szRegressionTests.tearDowncCs|j}|ddS)Nzpragma user_version)rcursorexecuter curr r r test_pragma_user_version(s z(RegressionTests.test_pragma_user_versioncCsNtjdtjd}z|j}|dW||dS||w)NrZ detect_typeszpragma schema_version)rrPARSE_COLNAMESrrrrr rrr r r test_pragma_schema_version-s    z*RegressionTests.test_pragma_schema_versioncstjdddfddtdD}|ddtdD]}|dd d dtdDqtdD] }||d |d q3dS) Nr)Zcached_statementscsg|]}qSr )r.0xrr r <z8RegressionTests.test_statement_reset..rzcreate table test(x) insert into test(x) values (?)cSsg|]}|fqSr r rr r r r?s zselect x from test)rrranger executemanyrollback)r cursorsir rr test_statement_reset7s    z$RegressionTests.test_statement_resetcCsN|j}|d||jddd|d||jddddS)Nz select 1 as "foo bar [datetime]"rzfoo bar [datetime]zselect 1 as "foo baz"zfoo baz)rrr assertEqual descriptionrr r r test_column_name_with_spacesFs   z,RegressionTests.test_column_name_with_spacescCsLtd}g}tdD]}|}|||dt|q |dS)Nrizselect 1 x union select )rrr$rappendrstrr)r rr'r(rr r r 'test_statement_finalization_on_close_dbNs    z7RegressionTests.test_statement_finalization_on_close_dbcCs|td}|d|dz|dWn tjy Ynw|dz|WdStjy=|dYdSw)Nrz3create table foo(x, unique(x) on conflict rollback)zinsert into foo(x) values (1)zinsert into foo(x) values (2)z1pysqlite knew nothing about the implicit ROLLBACK)rrrZ DatabaseErrorcommitOperationalErrorZfailr rr r r test_on_conflict_rollback\s    z)RegressionTests.test_on_conflict_rollbackcCs(|jd|jd|jddS)zm pysqlite would crash with older SQLite versions unless a workaround is implemented. create table foo(bar)drop table fooNrrr r r r 2test_workaround_for_buggy_sqlite_transfer_bindingsjs  zBRegressionTests.test_workaround_for_buggy_sqlite_transfer_bindingscCs|jddS)z pysqlite used to segfault with SQLite versions 3.5.x. These return NULL for "no-operation" statements Nr7r r r r test_empty_statementssz$RegressionTests.test_empty_statementcCspd}tjdtjd}|d|dtjf|||d|d|d||d S) z pysqlite until 2.4.1 did not rebuild the row_cast_map when recompiling a statement. This test exhibits the problem. zselect * from foorrzcreate table foo(bar timestamp)zinsert into foo(bar) values (?)r6zcreate table foo(bar integer)insert into foo(bar) values (5)N)rrPARSE_DECLTYPESrdatetimeZnowr)r ZSELECTrr r r test_type_map_usagezs    z#RegressionTests.test_type_map_usagecsrGfddd}|dgtjdtjd}|d|t|dWddS1s2wYdS)NceZdZfddZdS)z2RegressionTests.test_bind_mutating_list..Xcs dS)Nz...)clear)r ZprotocolZ parametersr r __conform__sz>RegressionTests.test_bind_mutating_list..X.__conform__N)__name__ __module__ __qualname__rBr rAr r XrFrrrz$create table foo(bar X, baz integer)z'insert into foo(bar, baz) values (?, ?))rrr<r assertRaises IndexError)r rFrr rAr test_bind_mutating_lists   "z'RegressionTests.test_bind_mutating_listcCsd|tj}|jdttdgfWdn1s wYd}||t |j dS)Nz"select 'xxx' || ? || 'yyy' colnamez9Could not decode to UTF-8 column 'colname' with text 'xxx) rHrr2rrbytes bytearrayfetchoneZassertInr/Z exception)r cmmsgr r r test_error_msg_decode_errorsz+RegressionTests.test_error_msg_decode_errorcCs|ttjiddS)z! See issue 3312. N)rH TypeErrorrZregister_adapterr r r r test_register_adaptersz%RegressionTests.test_register_adapterc s(Gfdddt}tdd_dD]*}|j|d|_|_|_||_Wdn1s9wYqd_d_dtfdtfd tfd tfd tfg}|D]9\}}|j|d'| | |_Wdn1svwY| jdWdn1swYqXdS) Ncs eZdZddZfddZdS)z;RegressionTests.test_set_isolation_level..CustomStrcSdSrr r r r r upperzARegressionTests.test_set_isolation_level..CustomStr.uppercs d_dS)Nr9isolation_levelr rr r __del__s zCRegressionTests.test_set_isolation_level..CustomStr.__del__N)rCrDrErUrYr rr r CustomStrsrZr)r9DEFERREDZ IMMEDIATEZ EXCLUSIVE)levelr[abczIMMEDIATEEXCLUSIVEé) r/rrrXsubTestlower capitalizerR ValueErrorrHr*)r rZr\Zpairsvalueexcr rr test_set_isolation_levels2       z(RegressionTests.test_set_isolation_levelcCsGdddtj}td}||}|tj|dWdn1s*wY|tjd |WddS1sFwYdS)zd Verifies that cursor methods check whether base class __init__ was called. c@eZdZddZdS)zBRegressionTests.test_cursor_constructor_call_check..CursorcSrTrr r3r r r __init__rVzKRegressionTests.test_cursor_constructor_call_check..Cursor.__init__NrCrDrErir r r r Cursor rkrz select 4+5Nz$^Base Cursor\.__init__ not called\.$) rrkrrHProgrammingErrorrfetchallassertRaisesRegexr)r rkrrr r r "test_cursor_constructor_call_checks  "z2RegressionTests.test_cursor_constructor_call_checkcCs(Gdddt}|jd|dfdS)za The Python 3.0 port of the module didn't cope with values of subclasses of str. c@s eZdZdS)z0RegressionTests.test_str_subclass..MyStrN)rCrDrEr r r r MyStrs rqzselect ?r_N)r/rr)r rqr r r test_str_subclasssz!RegressionTests.test_str_subclasscCsTGdddtj}|d}|tj |}WddS1s#wYdS)zh Verifies that connection methods check whether base class __init__ was called. c@rh)zJRegressionTests.test_connection_constructor_call_check..ConnectioncSrTrr )r namer r r rirVzSRegressionTests.test_connection_constructor_call_check..Connection.__init__Nrjr r r r ConnectionrlrtrN)rrtrHrmrr rtrrr r r &test_connection_constructor_call_checks  "z6RegressionTests.test_connection_constructor_call_checkcsGfdddtj}Gdddtj|d}|}|d|dgd|d ||tj | Wd d S1sHwYd S) z Verifies that subclassed cursor classes are correctly registered with the connection object, too. (fetch-across-rollback problem) cr?)z.Connectioncs|Srr r rkr r rszCRegressionTests.test_cursor_registration..Connection.cursorN)rCrDrErr rwr r rtrGrtc@rh)z8RegressionTests.test_cursor_registration..CursorcSstj||dSr)rrkrir3r r r riszARegressionTests.test_cursor_registration..Cursor.__init__Nrjr r r r rkrlrkrzcreate table foo(x)zinsert into foo(x) values (?)))))rzselect x from fooN) rrtrkrrr%r&rHZInterfaceErrorrnrur rwr test_cursor_registrations   "z(RegressionTests.test_cursor_registrationcCstjddd}dS)z Verifies that creating a connection in autocommit mode works. 2.5.3 introduced a regression so that these could no longer be created. rNrW)rrr3r r r test_auto_commitsz RegressionTests.test_auto_commitcCs4|j}|d|d|d|}dS)z Verifies that running a PRAGMA statement that does an autocommit does work. This did not work in 2.5.3/2.5.4. r5r;zpragma page_sizeN)rrrrN)r rrowr r r test_pragma_autocommits     z&RegressionTests.test_pragma_autocommitcCs|t|jddS)z} Call a connection with a non-string SQL request: check error handling of the statement constructor. r]N)rHrRrr r r r test_connection_callsz$RegressionTests.test_connection_callcCs"dd}|tj|jjd|dS)NcSsdS)Nr]r )abr r r collation_cbrVz4RegressionTests.test_collation..collation_cbu)rHrrmrZcreate_collation)r rr r r test_collationszRegressionTests.test_collationcs|td}|ddfdd}|tjddd|DWd d S1s7wYd S) z http://bugs.python.org/issue10811 Recursively using a cursor, such as when reusing it from a generator led to segfaults. Now we catch recursive cursor usage and raise a ProgrammingError. rzcreate table a (bar)zcreate table b (baz)c3sdddVdS)Nzinsert into a (bar) values (?))r]r])rr rr r foo-s  z6RegressionTests.test_recursive_cursor_use..foozinsert into b (baz) values (?)css|]}|fVqdSrr )rr(r r r 3sz.N)rrrrrHrmr%)r rrr rr test_recursive_cursor_use s    "z)RegressionTests.test_recursive_cursor_usec Cstjdtjd}|}|d|d|d|ddd|D}||td d d d d d dtd d d d d d dgdS)z http://bugs.python.org/issue14720 The microsecond parsing of convert_timestamp() should pad with zeros, since the microsecond string "456" actually represents "456000". rrzCREATE TABLE t (x TIMESTAMP)z4INSERT INTO t (x) VALUES ('2012-04-04 15:06:00.456')z:INSERT INTO t (x) VALUES ('2012-04-04 15:06:00.123456789')zSELECT * FROM tcSsg|]}|dqS)rr rr r r rHr zNRegressionTests.test_convert_timestamp_microsecond_padding..iryri@i@N)rrr<rrrnr*r=)r rrvaluesr r r *test_convert_timestamp_microsecond_padding5s     z:RegressionTests.test_convert_timestamp_microsecond_paddingcCs|jttjddddS)Nr{rW)rHrRrrr r r r !test_invalid_isolation_level_typeOs z1RegressionTests.test_invalid_isolation_level_typecCsRtd}|t|d|t|d|}|t|jd|t|jddS)Nrz select 1z select 1z select 2z select 2)rrrHrdrrrr r r test_null_characterUs z#RegressionTests.test_null_characterc Cstd}|d||jdd}t|dD]P\}}|j||d=|d|f||dkr>||ddn|dkrK||ddn |d krW||dd |d7}Wd n1sewYq||d d d S) z Connection.commit() did reset cursors, which made sqlite3 to return rows multiple times when fetched from cursors after commit. See issues 10513 and 23129 for details. rz create table t(c); create table t2(c); insert into t values(0); insert into t values(1); insert into t values(2); r9rzselect c from t)r(r|zinsert into t2(c) values (?)r]Nrxz'should have returned exactly three rows) rrZ executescriptr*rX enumeraterrar1)r rZcounterr(r|r r r test_commit_cursor_reset^s$    z(RegressionTests.test_commit_cursor_resetcCsBdd}td}t|}t||}||~~tdS)zm The interpreter shouldn't crash in case Cursor.__init__() is called more than once. cWrTrr )argsr r r callbackrVz/RegressionTests.test_bpo31770..callbackrN)rrrkweakrefrefrirZ gc_collect)r rrrrr r r test_bpo31770}s     zRegressionTests.test_bpo31770cCs6|t |j`WddS1swYdSr)rHAttributeErrorrrXr r r r !test_del_isolation_level_segfaults "z1RegressionTests.test_del_isolation_level_segfaultcCsfGddd}|jjtj|jjdd|jjfD]}|}||j||j|jd|dqdS)Nc@rh)z.RegressionTests.test_bpo37347..PrintercWstjSr)rZ SQLITE_OK)r rr r r logsz2RegressionTests.test_bpo37347..Printer.logN)rCrDrErr r r r Printerrlrr])nzselect 1)rZset_trace_callback functoolspartialZset_progress_handlerZset_authorizerrr)r rmethodZprinter_instancer r r test_bpo37347s    zRegressionTests.test_bpo37347cCs(|jd}|d}||ddS)Nz select X''rr^)rrrNr*)r rvalr r r test_return_empty_bytestrings  z,RegressionTests.test_return_empty_bytestringN)#rCrDrEr rrrr)r,r0r4r8r:r>rJrQrSrgrprrrvrzr{r}r~rrrrrrrrrrr r r r r!sB        rc@s8eZdZdZddZddZddZdd Zd d Zd S) RecursiveUseOfCursorsz$Recursive use of cursors not allowedcCs@tjdtjd|_|j|_|jd|jdddgdS)Nrrzcreate table test(x foo)r")r)Zbar)rrrrrrrr%r r r r r s  zRecursiveUseOfCursors.setUpcCs|j|jdSr)rrrr r r r rs zRecursiveUseOfCursors.tearDownc fdd}ttjd|i/tjjjdWdn1s)wYWddSWddS1sAwYdS)NcsjjSr)rrirrr r r szBRecursiveUseOfCursors.test_recursive_cursor_init..ZINITz#select x as "x [INIT]", x from test rdictr convertersrormrPrrr Zconvr r r test_recursive_cursor_init "z0RecursiveUseOfCursors.test_recursive_cursor_initc r)Ncs jSr)rrrr r r rs zCRecursiveUseOfCursors.test_recursive_cursor_close..ZCLOSEz$select x as "x [CLOSE]", x from testrrr r r test_recursive_cursor_closerz1RecursiveUseOfCursors.test_recursive_cursor_closec sgffdd }ttjd|i4jdtjj j Wdn1s0wYWddSWddS1sHwYdS)Ncs|rjS|dSr)rrNr.)rlr r r rszCRecursiveUseOfCursors.test_recursive_cursor_fetch..ZITERz#select x as "x [ITER]", x from test) rrrrrrrormrPrnrr r r test_recursive_cursor_fetchs  "z1RecursiveUseOfCursors.test_recursive_cursor_fetchN) rCrDrErPr rrrrr r r r rs rcCsttg}tdd|DS)NcSsg|] }t|qSr )unittestZ TestLoaderZloadTestsFromTestCase)rtr r r rszsuite..)rrrZ TestSuite)Ztestsr r r suites  rcCst}|tdSr)rZTextTestRunnerrunr)Zrunnerr r r testsr__main__)r=rZsqlite3rrrrrZ unittest.mockrZTestCaserrrrCr r r r s"  $