B ÞÞZ®J—aã@sžddlZddlZddlZddlZddlmZddlmZGdd„dej ƒZ Gdd„dƒZ Gdd „d ej ƒZ Gd d „d ej ƒZ d d „Zdd„ZedkršeƒdS)éN)Úsupport)Úpatchc@seZdZdd„Zdd„Zdd„Zdd„Zd d „Zd d „Zd d„Z e   e j dkd¡dd„ƒZdd„Zdd„Zdd„Zdd„Zdd„Zdd„Zdd „Zd!d"„Zd#d$„Zd%d&„Zd'd(„Zd)d*„Zd+d,„Zd-d.„Zd/d0„Zd1d2„Zd3d4„Zd5d6„Z d7d8„Z!d9d:„Z"d;d<„Z#d=S)>ÚRegressionTestscCst d¡|_dS)Nz:memory:)ÚsqliteÚconnectÚcon)Úself©r ú<sz7RegressionTests.CheckStatementReset..rzcreate table test(x)é zinsert into test(x) values (?)cSsg|] }|f‘qSr r )rrr r r r?sú zselect x from test)rrÚrangerÚ executemanyÚrollback)rÚcursorsÚir )rr ÚCheckStatementReset7s"z#RegressionTests.CheckStatementResetcCsN|j ¡}| d¡| |jddd¡| d¡| |jddd¡dS)Nz select 1 as "foo bar [datetime]"rzfoo bar [datetime]zselect 1 as "foo baz"zfoo baz)rrrÚ assertEqualZ description)rrr r r ÚCheckColumnNameWithSpacesFs    z)RegressionTests.CheckColumnNameWithSpacescCsPt d¡}g}x4tdƒD](}| ¡}| |¡| dt|ƒ¡qW| ¡dS)Nz:memory:éizselect 1 x union select )rrrrÚappendrÚstrr )rrrrrr r r Ú#CheckStatementFinalizationOnCloseDbNs  z3RegressionTests.CheckStatementFinalizationOnCloseDb)éér(zneeds sqlite 3.2.2 or newercCs€t d¡}| d¡| d¡y| d¡Wntjk rBYnX| d¡y | ¡Wn tjk rz| d¡YnXdS)Nz:memory:z3create 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 DatabaseErrorÚcommitÚOperationalErrorZfail)rrr r r ÚCheckOnConflictRollback\s     z'RegressionTests.CheckOnConflictRollbackcCs(|j d¡|j d¡|j d¡dS)zm pysqlite would crash with older SQLite versions unless a workaround is implemented. zcreate table foo(bar)zdrop table fooN)rr)rr r r Ú-CheckWorkaroundForBuggySqliteTransferBindingsks  z=RegressionTests.CheckWorkaroundForBuggySqliteTransferBindingscCs|j d¡dS)z pysqlite used to segfault with SQLite versions 3.5.x. These return NULL for "no-operation" statements ÚN)rr)rr r r ÚCheckEmptyStatementtsz#RegressionTests.CheckEmptyStatementcCshd}tjdtjd}| d¡| dtj ¡f¡| |¡| 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 fooz:memory:)rzcreate table foo(bar timestamp)zinsert into foo(bar) values (?)zdrop table foozcreate table foo(bar integer)zinsert into foo(bar) values (5)N)rrÚPARSE_DECLTYPESrÚdatetimeZnow)rZSELECTrr r r ÚCheckTypeMapUsage{s     z!RegressionTests.CheckTypeMapUsagec CsP| tj¡$}|j dttdgƒƒf¡ ¡WdQRXd}| |t |j ƒ¡dS)Nz"select 'xxx' || ? || 'yyy' colnameéúz9Could not decode to UTF-8 column 'colname' with text 'xxx) Ú assertRaisesrr*rrÚbytesÚ bytearrayÚfetchoneZassertInr%Z exception)rÚcmÚmsgr r r ÚCheckErrorMsgDecodeErrorŠs  z(RegressionTests.CheckErrorMsgDecodeErrorcCs| ttjid¡dS)z! See issue 3312. N)r3Ú TypeErrorrZregister_adapter)rr r r ÚCheckRegisterAdapter“sz$RegressionTests.CheckRegisterAdapterc sôG‡fdd„dtƒ}t d¡‰dˆ_xHdD]@}|j|d*|ˆ_| ¡ˆ_| ¡ˆ_||ƒˆ_WdQRXq*Wdˆ_dˆ_dtfdtfd tfd tfd tfg}xR|D]J\}}|j|d0|  |¡ |ˆ_WdQRX|  ˆjd¡WdQRXq¢WdS) Ncs eZdZdd„Z‡fdd„ZdS)z9RegressionTests.CheckSetIsolationLevel..CustomStrcSsdS)Nr )rr r r Úupperœsz?RegressionTests.CheckSetIsolationLevel..CustomStr.uppercs dˆ_dS)Nr-)Úisolation_level)r)rr r Ú__del__žszARegressionTests.CheckSetIsolationLevel..CustomStr.__del__N)Ú__name__Ú __module__Ú __qualname__r<r>r )rr r Ú CustomStr›srBz:memory:)r-ÚDEFERREDZ IMMEDIATEZ EXCLUSIVE)ÚlevelrCéóÚabczIMMEDIATEEXCLUSIVEõé) r%rrr=ÚsubTestÚlowerÚ capitalizer:Ú ValueErrorr3r!)rrBrDZpairsÚvalueÚexcr )rr ÚCheckSetIsolationLevel™s$     z&RegressionTests.CheckSetIsolationLevelc CspGdd„dtjƒ}t d¡}||ƒ}| tj¡| d¡ ¡WdQRX| tjd¡| ¡WdQRXdS)zd Verifies that cursor methods check whether base class __init__ was called. c@seZdZdd„ZdS)z?RegressionTests.CheckCursorConstructorCallCheck..CursorcSsdS)Nr )rrr r r Ú__init__½szHRegressionTests.CheckCursorConstructorCallCheck..Cursor.__init__N)r?r@rArPr r r r ÚCursor¼srQz:memory:z select 4+5Nz$^Base Cursor\.__init__ not called\.$) rrQrr3ÚProgrammingErrorrÚfetchallÚassertRaisesRegexr )rrQrrr r r ÚCheckCursorConstructorCallCheck·s z/RegressionTests.CheckCursorConstructorCallCheckcCs(Gdd„dtƒ}|j d|dƒf¡dS)za The Python 3.0 port of the module didn't cope with values of subclasses of str. c@s eZdZdS)z/RegressionTests.CheckStrSubclass..MyStrN)r?r@rAr r r r ÚMyStrÌsrVzselect ?rGN)r%rr)rrVr r r ÚCheckStrSubclassÈsz RegressionTests.CheckStrSubclassc Cs>Gdd„dtjƒ}|dƒ}| tj¡| ¡}WdQRXdS)zh Verifies that connection methods check whether base class __init__ was called. c@seZdZdd„ZdS)zGRegressionTests.CheckConnectionConstructorCallCheck..ConnectioncSsdS)Nr )rÚnamer r r rPÕszPRegressionTests.CheckConnectionConstructorCallCheck..Connection.__init__N)r?r@rArPr r r r Ú ConnectionÔsrYz:memory:N)rrYr3rRr)rrYrrr r r Ú#CheckConnectionConstructorCallCheckÏsz3RegressionTests.CheckConnectionConstructorCallCheckc sŠG‡fdd„dtjƒ}Gdd„dtjƒ‰|dƒ}| ¡}| d¡| ddd d g¡| d ¡| ¡| tj¡|  ¡Wd QRXd S) zœ Verifies that subclassed cursor classes are correctly registered with the connection object, too. (fetch-across-rollback problem) cseZdZ‡fdd„ZdS)z;RegressionTests.CheckCursorRegistration..Connectioncsˆ|ƒS)Nr )r)rQr r râszBRegressionTests.CheckCursorRegistration..Connection.cursorN)r?r@rArr )rQr r rYásrYc@seZdZdd„ZdS)z7RegressionTests.CheckCursorRegistration..CursorcSstj ||¡dS)N)rrQrP)rrr r r rPæsz@RegressionTests.CheckCursorRegistration..Cursor.__init__N)r?r@rArPr r r r rQåsrQz:memory:zcreate table foo(x)zinsert into foo(x) values (?))r')é)rzselect x from fooN) rrYrQrrrrr3ZInterfaceErrorrS)rrYrrr )rQr ÚCheckCursorRegistrationÜs  z'RegressionTests.CheckCursorRegistrationcCstjddd}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. z:memory:N)r=)rr)rrr r r ÚCheckAutoCommitòszRegressionTests.CheckAutoCommitcCs4|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. zcreate table foo(bar)zinsert into foo(bar) values (5)zpragma page_sizeN)rrrr6)rrÚrowr r r ÚCheckPragmaAutocommitús     z%RegressionTests.CheckPragmaAutocommitcCs| tj|jd¡dS)z} Call a connection with a non-string SQL request: check error handling of the statement constructor. rEN)r3rÚWarningr)rr r r ÚCheckConnectionCallsz#RegressionTests.CheckConnectionCallcCs"dd„}| tj|jjd|¡dS)NcSsdS)NrEr )ÚaÚbr r r Ú collation_cbsz4RegressionTests.CheckCollation..collation_cbuí²€)r3rrRrZcreate_collation)rrdr r r ÚCheckCollation szRegressionTests.CheckCollationc sft d¡}| ¡‰ˆ d¡ˆ d¡‡fdd„}| tj¡ˆ ddd„|ƒDƒ¡Wd QRXd 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. z:memory:zcreate table a (bar)zcreate table b (baz)c3sˆ dd¡dVdS)Nzinsert into a (bar) values (?))rErE)rr )rr r Úfoo!s z4RegressionTests.CheckRecursiveCursorUse..foozinsert into b (baz) values (?)css|] }|fVqdS)Nr )rrr r r ú 'sz:RegressionTests.CheckRecursiveCursorUse..N)rrrrr3rRr)rrrfr )rr ÚCheckRecursiveCursorUses    z'RegressionTests.CheckRecursiveCursorUsec CsŠtjdtjd}| ¡}| d¡| d¡| d¡| d¡dd„| ¡Dƒ}| |t d d d d d d d¡t d d d d d d d¡g¡dS)zË http://bugs.python.org/issue14720 The microsecond parsing of convert_timestamp() should pad with zeros, since the microsecond string "456" actually represents "456000". z:memory:)rzCREATE 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|] }|d‘qS)rr )rrr r r r<szKRegressionTests.CheckConvertTimestampMicrosecondPadding..iÜr[ééri@õi@âN)rrr/rrrSr!r0)rrrÚvaluesr r r Ú'CheckConvertTimestampMicrosecondPadding)s    z7RegressionTests.CheckConvertTimestampMicrosecondPaddingcCs|jttjddddS)Nz:memory:é{)r=)r3r:rr)rr r r ÚCheckInvalidIsolationLevelTypeCsz.RegressionTests.CheckInvalidIsolationLevelTypecCsRt d¡}| t|d¡| t|d¡| ¡}| t|jd¡| t|jd¡dS)Nz:memory:z select 1z select 1z select 2z select 2)rrr3rLrr)rrrr r r ÚCheckNullCharacterIs  z"RegressionTests.CheckNullCharacterc CsØt d¡}| d¡| |jd¡d}xžt| d¡ƒD]Œ\}}|j||dp| d|f¡| ¡|dkr~| |dd¡n2|dkr˜| |dd¡n|d kr°| |dd ¡|d7}Wd QRXq6W| |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. z:memory:z£ create table t(c); create table t2(c); insert into t values(0); insert into t values(1); insert into t values(2); r-rzselect c from t)rr^zinsert into t2(c) values (?)rEr(Nr'z'should have returned exactly three rows) rrZ executescriptr!r=Ú enumeraterrIr))rrZcounterrr^r r r ÚCheckCommitCursorResetRs" z&RegressionTests.CheckCommitCursorResetcCsBdd„}t d¡}t |¡}t ||¡}| |¡~~t ¡dS)zm The interpreter shouldn't crash in case Cursor.__init__() is called more than once. cWsdS)Nr )Úargsr r r Úcallbackvsz/RegressionTests.CheckBpo31770..callbackz:memory:N)rrrQÚweakrefÚrefrPrZ gc_collect)rrsrrrur r r Ú CheckBpo31770qs    zRegressionTests.CheckBpo31770c Cs | t¡ |j`WdQRXdS)N)r3ÚAttributeErrorrr=)rr r r ÚCheckDelIsolation_levelSegfaults z/RegressionTests.CheckDelIsolation_levelSegfaultN)$r?r@rAr r rrr r"r&ÚunittestZskipIfrZsqlite_version_infor+r,r.r1r9r;rOrUrWrZr\r]r_rarerhrlrnrorqrvrxr r r r r!s:      rc@s"eZdZdZddd„Zdd„ZdS)ÚUnhashableFuncNcCsd|_||_dS)Nr)ÚcallsÚ return_value)rr|r r r rP‰szUnhashableFunc.__init__cOs|jd7_|jS)NrE)r{r|)rrrÚkwargsr r r Ú__call__szUnhashableFunc.__call__)N)r?r@rAÚ__hash__rPr~r r r r rz†s rzc@s@eZdZdZdd„Zdd„Zdd„Zdd „Zd d „Zd d „Z dS)ÚUnhashableCallbacksTestCasez° https://bugs.python.org/issue34052 Registering unhashable callbacks raises TypeError, callbacks are not registered in SQLite after such registration attempt. cCst d¡|_dS)Nz:memory:)rrr)rr r r r ™sz!UnhashableCallbacksTestCase.setUpcCs|j ¡dS)N)rr )rr r r r œsz$UnhashableCallbacksTestCase.tearDownc CsLtdd}| td¡|j |d¡WdQRX|j d¡| |j¡dS)Nr)r|zunhashable typerEzSELECT 1)rzrTr:rZset_progress_handlerrÚ assertFalser{)rÚfr r r Útest_progress_handlerŸs   z1UnhashableCallbacksTestCase.test_progress_handlerc Cstd}tƒ}| td¡|j |d|¡WdQRXd|}| tj|¡|j d|¡WdQRX| |j ¡dS)NÚ func_namezunhashable typerzno such function: %sz SELECT %s()) rzrTr:rZcreate_functionrr*rrr{)rr„r‚r8r r r Ú test_func¦sz%UnhashableCallbacksTestCase.test_funcc CsLttjd}| td¡|j |¡WdQRX|j d¡| |j ¡dS)N)r|zunhashable typezSELECT 1) rzrZ SQLITE_DENYrTr:rZset_authorizerrrr{)rr‚r r r Útest_authorizer°s   z+UnhashableCallbacksTestCase.test_authorizerc CszGdd„dtƒ}d}| td¡|j |d|ddiƒ¡WdQRXd|}| tj|¡|j d |¡WdQRXdS) Nc@seZdZdZdS)z=UnhashableCallbacksTestCase.test_aggr..UnhashableTypeN)r?r@rArr r r r ÚUnhashableType¸sr‡Ú aggr_namezunhashable typerZAggrr zno such function: %sz SELECT %s())ÚtyperTr:rZcreate_aggregaterr*r)rr‡rˆr8r r r Ú test_aggr·s"z%UnhashableCallbacksTestCase.test_aggrN) r?r@rAÚ__doc__r r rƒr…r†rŠr r r r r€’s r€c@s8eZdZdZdd„Zdd„Zdd„Zdd „Zd d „Zd S) ÚRecursiveUseOfCursorsz$Recursive use of cursors not allowedcCs@tjdtjd|_|j ¡|_|j d¡|j dddg¡dS)Nz:memory:)rzcreate table test(x foo)zinsert into test(x) values (?))rf)Zbar)rrrrrrrr)rr r r r Æs    zRecursiveUseOfCursors.setUpcCs |j ¡|j ¡|`|`dS)N)rr r)rr r r r Îs  zRecursiveUseOfCursors.tearDownc sV‡fdd„}t tjd|i¡.ˆ tjˆj¡ˆj d¡WdQRXWdQRXdS)Ncsˆj ˆj¡S)N)rrPr)r)rr r ÚÕrFzBRecursiveUseOfCursors.test_recursive_cursor_init..ZINITz#select x as "x [INIT]", x from test) rÚdictrÚ convertersrTrRr8rr)rÚconvr )rr Útest_recursive_cursor_initÔs z0RecursiveUseOfCursors.test_recursive_cursor_initc sV‡fdd„}t tjd|i¡.ˆ tjˆj¡ˆj d¡WdQRXWdQRXdS)Ncs ˆj ¡S)N)rr )r)rr r rÛrFzCRecursiveUseOfCursors.test_recursive_cursor_close..ZCLOSEz$select x as "x [CLOSE]", x from test) rrŽrrrTrRr8rr)rrr )rr Útest_recursive_cursor_closeÚs z1RecursiveUseOfCursors.test_recursive_cursor_closec sdgf‡fdd„ }t tjd|i¡8ˆj d¡ˆ tjˆj¡ˆj  ¡WdQRXWdQRXdS)Ncs|rˆj ¡S| d¡S)N)rr6r$)rÚl)rr r rárFzCRecursiveUseOfCursors.test_recursive_cursor_fetch..ZITERz#select x as "x [ITER]", x from test) rrŽrrrrrTrRr8rS)rrr )rr Útest_recursive_cursor_fetchàs  z1RecursiveUseOfCursors.test_recursive_cursor_fetchN) r?r@rAr8r r r‘r’r”r r r r rŒÂs rŒcCs(t td¡}t |t t¡t t¡f¡S)NZCheck)ryZ makeSuiterZ TestSuiter€rŒ)Zregression_suiter r r Úsuiteès  r•cCst ¡}| tƒ¡dS)N)ryZTextTestRunnerÚrunr•)Zrunnerr r r Útestðsr—Ú__main__)r0ryZsqlite3rrtr—rZ unittest.mockrZTestCaserrzr€rŒr•r?r r r r Ús  g 0&