a XC?h 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 ú=óz7RegressionTests.CheckStatementReset..rzcreate table test(x)é úinsert into test(x) values (?)cSsg|] }|f‘qSr r rr r r r@r ú 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)éér1zneeds sqlite 3.2.2 or newercCs|t d¡}| d¡| d¡z| d¡Wntjy@Yn0| d¡z | ¡Wntjyv| d¡Yn0dS)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 ÚNr8r r r r ÚCheckEmptyStatementusz#RegressionTests.CheckEmptyStatementcCspd}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 (?)r7zcreate table foo(bar integer)úinsert into foo(bar) values (5)N)rrÚPARSE_DECLTYPESrÚdatetimeZnowr)r ZSELECTrr r r ÚCheckTypeMapUsage|s    z!RegressionTests.CheckTypeMapUsagecspG‡fdd„dƒ}|ƒdg‰tjdtjd}| d¡| t¡| dˆ¡Wdƒn1sb0YdS)NcseZdZ‡fdd„ZdS)z0RegressionTests.CheckBindMutatingList..Xcs ˆ ¡dS)Nz...)Úclear)r Zprotocol©Ú parametersr r Ú __conform__Žsz.X.__conform__N)Ú__name__Ú __module__Ú __qualname__rCr rAr r ÚXsrGrrrz$create table foo(bar X, baz integer)z'insert into foo(bar, baz) values (?, ?))rrr=rÚ assertRaisesÚ IndexError)r rGrr rAr ÚCheckBindMutatingList‹s    z%RegressionTests.CheckBindMutatingListcCsd| tj¡.}|j dttdgƒƒf¡ ¡Wdƒn1s@0Yd}| |t |j ƒ¡dS)Nz"select 'xxx' || ? || 'yyy' colnameéúz9Could not decode to UTF-8 column 'colname' with text 'xxx) rHrr3rrÚbytesÚ bytearrayÚfetchoneZassertInr.Z exception)r ÚcmÚmsgr r r ÚCheckErrorMsgDecodeError˜s ÿ&z(RegressionTests.CheckErrorMsgDecodeErrorcCs| ttjid¡dS)z! See issue 3312. N)rHÚ TypeErrorrZregister_adapterr r r r ÚCheckRegisterAdapter¡sz$RegressionTests.CheckRegisterAdapterc s*G‡fdd„dtƒ}t d¡‰dˆ_dD]T}|j|d4|ˆ_| ¡ˆ_| ¡ˆ_||ƒˆ_Wdƒq(1sr0Yq(dˆ_dˆ_dtfdtfd tfd tfd tfg}|D]t\}}|j|dN|  |¡|ˆ_Wdƒn1sì0Y|  ˆjd¡Wdƒq°1s0Yq°dS) Ncs eZdZdd„Z‡fdd„ZdS)z9RegressionTests.CheckSetIsolationLevel..CustomStrcSsdSrr r r r r Úupperªsz?RegressionTests.CheckSetIsolationLevel..CustomStr.uppercs dˆ_dS)Nr:©Úisolation_levelr rr r Ú__del__¬szARegressionTests.CheckSetIsolationLevel..CustomStr.__del__N)rDrErFrTrWr rr r Ú CustomStr©srXr)r:ÚDEFERREDZ IMMEDIATEZ EXCLUSIVE)ÚlevelrYér ÚabczIMMEDIATEEXCLUSIVEõé) r.rrrVÚsubTestÚlowerÚ capitalizerRÚ ValueErrorrHr*)r rXrZZpairsÚvalueÚexcr rr ÚCheckSetIsolationLevel§s&   * þ  $z&RegressionTests.CheckSetIsolationLevelcCs˜Gdd„dtjƒ}t d¡}||ƒ}| tj¡| d¡ ¡Wdƒn1sT0Y| tjd¡| ¡Wdƒn1sŠ0YdS)zd Verifies that cursor methods check whether base class __init__ was called. c@seZdZdd„ZdS)z?RegressionTests.CheckCursorConstructorCallCheck..CursorcSsdSrr r4r r r Ú__init__ËszHRegressionTests.CheckCursorConstructorCallCheck..Cursor.__init__N©rDrErFrer r r r ÚCursorÊsrgrz select 4+5Nz$^Base Cursor\.__init__ not called\.$) rrgrrHÚProgrammingErrorrÚfetchallÚassertRaisesRegexr)r rgrrr 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)rDrErFr r r r ÚMyStrÚr rlzselect ?r\N)r.rr)r rlr r r ÚCheckStrSubclassÖsz RegressionTests.CheckStrSubclasscCsRGdd„dtjƒ}|dƒ}| tj¡| ¡}Wdƒn1sD0YdS)zh Verifies that connection methods check whether base class __init__ was called. c@seZdZdd„ZdS)zGRegressionTests.CheckConnectionConstructorCallCheck..ConnectioncSsdSrr )r Únamer r r reãszPRegressionTests.CheckConnectionConstructorCallCheck..Connection.__init__Nrfr r r r Ú ConnectionâsrorN)rrorHrhr©r rorrr r r Ú#CheckConnectionConstructorCallCheckÝsz3RegressionTests.CheckConnectionConstructorCallCheckcsœG‡fdd„dtjƒ}Gdd„dtjƒ‰|dƒ}| ¡}| d¡| dgd¢¡| d ¡| ¡| tj¡|  ¡Wd ƒn1sŽ0Yd 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 ©rgr r rðszBRegressionTests.CheckCursorRegistration..Connection.cursorN)rDrErFrr rrr r roïsroc@seZdZdd„ZdS)z7RegressionTests.CheckCursorRegistration..CursorcSstj ||¡dSr)rrgrer4r r r reôsz@RegressionTests.CheckCursorRegistration..Cursor.__init__Nrfr r r r rgósrgrzcreate table foo(x)zinsert into foo(x) values (?)))r0)é)rzselect x from fooN) rrorgrrr%r&rHZInterfaceErrorrirpr rrr Ú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. rNrU)rrr4r 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. r6r<zpragma page_sizeN)rrrrN)r rÚrowr r r ÚCheckPragmaAutocommits     z%RegressionTests.CheckPragmaAutocommitcCs| t|jd¡dS)z} Call a connection with a non-string SQL request: check error handling of the statement constructor. r[N)rHrRrr r r r ÚCheckConnectionCallsz#RegressionTests.CheckConnectionCallcCs"dd„}| tj|jjd|¡dS)NcSsdS)Nr[r )ÚaÚbr r r Ú collation_cbsz4RegressionTests.CheckCollation..collation_cbuí²€)rHrrhrZcreate_collation)r r{r r r ÚCheckCollationsþzRegressionTests.CheckCollationcszt d¡}| ¡‰ˆ d¡ˆ d¡‡fdd„}| tj¡(ˆ ddd„|ƒDƒ¡Wd ƒn1sl0Yd 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 (?))r[r[)rr ©rr r Úfoo/s z4RegressionTests.CheckRecursiveCursorUse..foozinsert into b (baz) values (?)css|] }|fVqdSrr )rr(r r r Ú 5r z:RegressionTests.CheckRecursiveCursorUse..N)rrrrrHrhr%)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 rJr zKRegressionTests.CheckConvertTimestampMicrosecondPadding..iÜrsééri@õi@âN)rrr=rrrir*r>)r rrÚvaluesr r r Ú'CheckConvertTimestampMicrosecondPadding7s    þz7RegressionTests.CheckConvertTimestampMicrosecondPaddingcCs|jttjddddS)Nré{rU)rHrRrrr 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)rrrHrarrrr r r ÚCheckNullCharacterWs  z"RegressionTests.CheckNullCharacterc Csèt d¡}| d¡| |jd¡d}t| d¡ƒD] \}}|j||dz| d|f¡| ¡|dkr|| |dd¡n2|dkr–| |dd¡n|d kr®| |dd ¡|d7}Wd ƒq41sÊ0Yq4| |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); r:rzselect c from t)r(rvzinsert into t2(c) values (?)r[r1Nr0z'should have returned exactly three rows) rrZ executescriptr*rVÚ enumeraterr^r2)r rZcounterr(rvr 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)rrrgÚweakrefÚrefrerZ gc_collect)r r‹rrrr r r Ú CheckBpo31770s    zRegressionTests.CheckBpo31770cCs4| t¡|j`Wdƒn1s&0YdSr)rHÚAttributeErrorrrVr 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)rDrErFr‘r r r r ÚPrinter”sr’r[)Únzselect 1)rZset_trace_callbackÚ functoolsÚpartialZset_progress_handlerZset_authorizerr‘r)r r’ÚmethodZprinter_instancer r r Ú CheckBpo37347“sþ   zRegressionTests.CheckBpo37347N)&rDrErFr rrrr)r+r/ÚunittestZskipIfrZsqlite_version_infor5r9r;r?rJrQrSrdrkrmrqrtrurwrxr|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 s~‡fdd„}t tjd|i¡Lˆ tjˆj¡ˆj d¡Wdƒn1sR0YWdƒn1sp0YdS)Ncsˆj ˆj¡Sr)rrer©rr r r Ú¶r zBRecursiveUseOfCursors.test_recursive_cursor_init..ZINITz#select x as "x [INIT]", x from test© rÚdictrÚ convertersrjrhrPrr©r Zconvr r r Útest_recursive_cursor_initµs z0RecursiveUseOfCursors.test_recursive_cursor_initc s~‡fdd„}t tjd|i¡Lˆ tjˆj¡ˆj d¡Wdƒn1sR0YWdƒn1sp0YdS)Ncs ˆj ¡Sr)rrršr r r r›¼r zCRecursiveUseOfCursors.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 sŒgf‡fdd„ }t tjd|i¡Vˆj d¡ˆ tjˆj¡ˆj  ¡Wdƒn1s`0YWdƒn1s~0YdS)Ncs|rˆj ¡S| d¡Sr)rrNr-)rÚlr r r r›Âr zCRecursiveUseOfCursors.test_recursive_cursor_fetch..ZITERz#select x as "x [ITER]", x from test) rrrržrrrjrhrPrirŸr r r Útest_recursive_cursor_fetchÁs  z1RecursiveUseOfCursors.test_recursive_cursor_fetchN) rDrErFrPr 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¤rDr r r r Ús  &