U .‘c•Cã@s†ddlZddlZddlZddlZddlZddlmZddlm Z Gdd„dej ƒZ Gdd„dej ƒZ dd „Z d d „Zed kr‚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=d>„Z$d?d@„Z%dAS)BÚRegressionTestscCst d¡|_dS)Nú:memory:)ÚsqliteÚconnectÚcon©Úself©r ú=sz7RegressionTests.CheckStatementReset..rzcreate table test(x)é úinsert into test(x) values (?)cSsg|] }|f‘qSr r rr r r r@sú zselect x from test)rrÚrangerÚ executemanyÚrollback)r ÚcursorsÚir rr ÚCheckStatementReset8s   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 descriptionrr r r ÚCheckColumnNameWithSpacesGs    z)RegressionTests.CheckColumnNameWithSpacescCsLt d¡}g}tdƒD](}| ¡}| |¡| dt|ƒ¡q| ¡dS)Nréizselect 1 x union select )rrr#rÚappendrÚstrr)r rr&r'rr r r Ú#CheckStatementFinalizationOnCloseDbOs   z3RegressionTests.CheckStatementFinalizationOnCloseDb)éér0zneeds sqlite 3.2.2 or newercCs€t d¡}| d¡| d¡z| d¡Wntjk rBYnX| d¡z | ¡Wn tjk rz| d¡YnXdS)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 DatabaseErrorÚcommitÚOperationalErrorZfail©r rr 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. úcreate table foo(bar)údrop table fooN©rrr r r r Ú-CheckWorkaroundForBuggySqliteTransferBindingsls  z=RegressionTests.CheckWorkaroundForBuggySqliteTransferBindingscCs|j d¡dS)z pysqlite used to segfault with SQLite versions 3.5.x. These return NULL for "no-operation" statements ÚNr7r r r r ÚCheckEmptyStatementusz#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 foorrzcreate table foo(bar timestamp)zinsert into foo(bar) values (?)r6zcreate table foo(bar integer)úinsert into foo(bar) values (5)N)rrÚPARSE_DECLTYPESrÚdatetimeZnow)r ZSELECTrr r r ÚCheckTypeMapUsage|s     z!RegressionTests.CheckTypeMapUsagec s\G‡fdd„dƒ}|ƒdg‰tjdtjd}| d¡| t¡| dˆ¡W5QRXdS)NcseZdZ‡fdd„ZdS)z0RegressionTests.CheckBindMutatingList..Xcs ˆ ¡dS)Nz...)Úclear)r Zprotocol©Z parametersr r Ú __conform__Žsz.X.__conform__N)Ú__name__Ú __module__Ú __qualname__rAr r@r r ÚXsrErrrz$create table foo(bar X, baz integer)z'insert into foo(bar, baz) values (?, ?))rrr<rÚ assertRaisesÚ IndexError)r rErr r@r ÚCheckBindMutatingList‹s    z%RegressionTests.CheckBindMutatingListc CsP| tj¡$}|j dttdgƒƒf¡ ¡W5QRXd}| |t |j ƒ¡dS)Nz"select 'xxx' || ? || 'yyy' colnameéúz9Could not decode to UTF-8 column 'colname' with text 'xxx) rFrr2rrÚbytesÚ bytearrayÚfetchoneZassertInr-Z exception)r ÚcmÚmsgr r r ÚCheckErrorMsgDecodeError˜s ÿz(RegressionTests.CheckErrorMsgDecodeErrorcCs| ttjid¡dS)z! See issue 3312. N)rFÚ TypeErrorrZregister_adapterr r r r ÚCheckRegisterAdapter¡sz$RegressionTests.CheckRegisterAdapterc sìG‡fdd„dtƒ}t d¡‰dˆ_dD]@}|j|d*|ˆ_| ¡ˆ_| ¡ˆ_||ƒˆ_W5QRXq(dˆ_dˆ_dtfdtfd tfd tfd tfg}|D]J\}}|j|d0|  |¡ |ˆ_W5QRX|  ˆjd¡W5QRXqœdS) Ncs eZdZdd„Z‡fdd„ZdS)z9RegressionTests.CheckSetIsolationLevel..CustomStrcSsdSrr r r r r Úupperªsz?RegressionTests.CheckSetIsolationLevel..CustomStr.uppercs dˆ_dS)Nr9©Úisolation_levelr rr r Ú__del__¬szARegressionTests.CheckSetIsolationLevel..CustomStr.__del__N)rBrCrDrRrUr rr r Ú CustomStr©srVr)r9ÚDEFERREDZ IMMEDIATEZ EXCLUSIVE)ÚlevelrWéóÚabczIMMEDIATEEXCLUSIVEõé) r-rrrTÚsubTestÚlowerÚ capitalizerPÚ ValueErrorrFr))r rVrXZpairsÚvalueÚexcr rr ÚCheckSetIsolationLevel§s,   þ  z&RegressionTests.CheckSetIsolationLevelc CspGdd„dtjƒ}t d¡}||ƒ}| tj¡| d¡ ¡W5QRX| tjd¡| ¡W5QRXdS)zd Verifies that cursor methods check whether base class __init__ was called. c@seZdZdd„ZdS)z?RegressionTests.CheckCursorConstructorCallCheck..CursorcSsdSrr r3r r r Ú__init__ËszHRegressionTests.CheckCursorConstructorCallCheck..Cursor.__init__N©rBrCrDrdr r r r ÚCursorÊsrfrz select 4+5z$^Base Cursor\.__init__ not called\.$N) rrfrrFÚProgrammingErrorrÚfetchallÚassertRaisesRegexr)r rfrrr 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)rBrCrDr r r r ÚMyStrÚsrkzselect ?r[N)r-rr)r rkr r r ÚCheckStrSubclassÖsz RegressionTests.CheckStrSubclassc Cs>Gdd„dtjƒ}|dƒ}| tj¡| ¡}W5QRXdS)zh Verifies that connection methods check whether base class __init__ was called. c@seZdZdd„ZdS)zGRegressionTests.CheckConnectionConstructorCallCheck..ConnectioncSsdSrr )r Únamer r r rdãszPRegressionTests.CheckConnectionConstructorCallCheck..Connection.__init__Nrer r r r Ú ConnectionâsrnrN)rrnrFrgr©r rnrrr r r Ú#CheckConnectionConstructorCallCheckÝsz3RegressionTests.CheckConnectionConstructorCallCheckc sŠG‡fdd„dtjƒ}Gdd„dtjƒ‰|dƒ}| ¡}| d¡| ddd d g¡| d ¡| ¡| tj¡|  ¡W5QRXd 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ˆ|ƒSrr r ©rfr r rðszBRegressionTests.CheckCursorRegistration..Connection.cursorN)rBrCrDrr rqr r rnïsrnc@seZdZdd„ZdS)z7RegressionTests.CheckCursorRegistration..CursorcSstj ||¡dSr)rrfrdr3r r r rdôsz@RegressionTests.CheckCursorRegistration..Cursor.__init__Nrer r r r rfósrfrzcreate table foo(x)zinsert into foo(x) values (?))r/)é)rzselect x from fooN) rrnrfrrr$r%rFZInterfaceErrorrhror 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. rNrS)rrr3r r r ÚCheckAutoCommitszRegressionTests.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. r5r;zpragma page_sizeN)rrrrL)r rÚrowr r r ÚCheckPragmaAutocommits     z%RegressionTests.CheckPragmaAutocommitcCs| tj|jd¡dS)z} Call a connection with a non-string SQL request: check error handling of the statement constructor. rYN)rFrÚWarningrr r r r ÚCheckConnectionCallsz#RegressionTests.CheckConnectionCallcCs"dd„}| tj|jjd|¡dS)NcSsdS)NrYr )ÚaÚbr r r Ú collation_cbsz4RegressionTests.CheckCollation..collation_cbuí²€)rFrrgrZcreate_collation)r r{r r r ÚCheckCollations þzRegressionTests.CheckCollationc sft d¡}| ¡‰ˆ d¡ˆ d¡‡fdd„}| tj¡ˆ ddd„|ƒDƒ¡W5QRXd 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)c3sˆ dd¡dVdS)Nzinsert into a (bar) values (?))rYrY)rr ©rr r Úfoo/s z4RegressionTests.CheckRecursiveCursorUse..foozinsert into b (baz) values (?)css|] }|fVqdSrr )rr'r r r Ú 5sz:RegressionTests.CheckRecursiveCursorUse..N)rrrrrFrgr$)r rr~r r}r ÚCheckRecursiveCursorUse"s    ÿ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". 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|] }|d‘qS)rr rr r r rJszKRegressionTests.CheckConvertTimestampMicrosecondPadding..iÜrrééri@õi@âN)rrr<rrrhr)r=)r rrÚvaluesr r r Ú'CheckConvertTimestampMicrosecondPadding7s    þz7RegressionTests.CheckConvertTimestampMicrosecondPaddingcCs|jttjddddS)Nré{rS)rFrPrrr r r r ÚCheckInvalidIsolationLevelTypeQs ÿz.RegressionTests.CheckInvalidIsolationLevelTypecCsRt d¡}| t|d¡| t|d¡| ¡}| t|jd¡| t|jd¡dS)Nrz select 1z select 1z select 2z select 2)rrrFr`rrrr r r ÚCheckNullCharacterWs  z"RegressionTests.CheckNullCharacterc CsÔt d¡}| d¡| |jd¡d}t| d¡ƒD]Œ\}}|j||dp| d|f¡| ¡|dkr|| |dd¡n2|dkr–| |dd¡n|d kr®| |dd ¡|d7}W5QRXq4| |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'ruzinsert into t2(c) values (?)rYr0r/z'should have returned exactly three rowsN) rrZ executescriptr)rTÚ enumeraterr]r1)r rZcounterr'rur r r ÚCheckCommitCursorReset`s   z&RegressionTests.CheckCommitCursorResetcCsBdd„}t d¡}t |¡}t ||¡}| |¡~~t ¡dS)zm The interpreter shouldn't crash in case Cursor.__init__() is called more than once. cWsdSrr )Úargsr r r Úcallback„sz/RegressionTests.CheckBpo31770..callbackrN)rrrfÚweakrefÚrefrdrZ gc_collect)r r‹rrrr r r Ú CheckBpo31770s    zRegressionTests.CheckBpo31770c Cs | t¡ |j`W5QRXdSr)rFÚAttributeErrorrrTr r r r ÚCheckDelIsolation_levelSegfaults z/RegressionTests.CheckDelIsolation_levelSegfaultcCsfGdd„dƒ}|jjtj|jjdd|jjfD]2}|ƒ}||jƒ||jƒ|j d¡|dƒq.dS)Nc@seZdZdd„ZdS)z.RegressionTests.CheckBpo37347..PrintercWstjSr)rZ SQLITE_OK)r rŠr r r Úlog•sz2RegressionTests.CheckBpo37347..Printer.logN)rBrCrDr‘r r r r ÚPrinter”sr’rY)Únzselect 1)rZset_trace_callbackÚ functoolsÚpartialZset_progress_handlerZset_authorizerr‘r)r r’ÚmethodZprinter_instancer r r Ú CheckBpo37347“sþ   zRegressionTests.CheckBpo37347N)&rBrCrDr rrrr(r*r.ÚunittestZskipIfrZsqlite_version_infor4r8r:r>rHrOrQrcrjrlrprsrtrvrxr|r€r„r†r‡r‰rŽrr—r r r r r"s@        rc@s8eZdZdZdd„Zdd„Zdd„Zdd „Zd d „Zd S) ÚRecursiveUseOfCursorsz$Recursive use of cursors not allowedcCs@tjdtjd|_|j ¡|_|j d¡|j dddg¡dS)Nrrzcreate table test(x foo)r!)r~)Zbar)rrrrrrrr$r r r r r §sÿ  ÿzRecursiveUseOfCursors.setUpcCs |j ¡|j ¡|`|`dSr)rrrr r r r r¯s  zRecursiveUseOfCursors.tearDownc sV‡fdd„}t tjd|i¡.ˆ tjˆj¡ˆj d¡W5QRXW5QRXdS)Ncsˆj ˆj¡Sr)rrdr©rr r r Ú¶rZzBRecursiveUseOfCursors.test_recursive_cursor_init..ZINITz#select x as "x [INIT]", x from test© rÚdictrÚ convertersrirgrNrr©r Zconvr r r Útest_recursive_cursor_initµs z0RecursiveUseOfCursors.test_recursive_cursor_initc sV‡fdd„}t tjd|i¡.ˆ tjˆj¡ˆj d¡W5QRXW5QRXdS)Ncs ˆj ¡Sr)rrršr r r r›¼rZzCRecursiveUseOfCursors.test_recursive_cursor_close..ZCLOSEz$select x as "x [CLOSE]", x from testrœrŸr r r Útest_recursive_cursor_close»s z1RecursiveUseOfCursors.test_recursive_cursor_closec sdgf‡fdd„ }t tjd|i¡8ˆj d¡ˆ tjˆj¡ˆj  ¡W5QRXW5QRXdS)Ncs|rˆj ¡S| d¡Sr)rrLr,)rÚlr r r r›ÂrZzCRecursiveUseOfCursors.test_recursive_cursor_fetch..ZITERz#select x as "x [ITER]", x from test) rrrržrrrirgrNrhrŸr r r Útest_recursive_cursor_fetchÁs  z1RecursiveUseOfCursors.test_recursive_cursor_fetchN) rBrCrDrNr rr r¡r£r r r r r™£s r™cCs$t td¡}t t¡}t ||f¡S)NZCheck)r˜Z makeSuiterr™Z TestSuite)Zregression_suiteZrecursive_cursorr r r ÚsuiteÉs   þr¤cCst ¡}| tƒ¡dSr)r˜ZTextTestRunnerÚrunr¤)Zrunnerr r r ÚtestÑsr¦Ú__main__)r=r˜Zsqlite3rrŒr”r¦rZ unittest.mockrZTestCaserr™r¤rBr r r r Ús  &