o znho@sHdZddlZddlmZddlmZGdddeZGd d d eZdS) zGlobal database feature support policy. Provides decorators to mark tests requiring specific feature support from the target database. External dialect test suites should subclass SuiteRequirements to provide specific inclusion/exclusions. N) exclusions)utilc@s eZdZdS) RequirementsN)__name__ __module__ __qualname__r r J/usr/local/lib/python3.10/dist-packages/sqlalchemy/testing/requirements.pyrsrc@s|eZdZeddZeddZeddZeddZed d Zed d Z ed dZ eddZ eddZ eddZ eddZeddZeddZeddZeddZedd Zed!d"Zed#d$Zed%d&Zed'd(Zed)d*Zed+d,Zed-d.Zed/d0Zed1d2Zed3d4Zed5d6Zed7d8Zed9d:Z ed;d<Z!ed=d>Z"ed?d@Z#edAdBZ$edCdDZ%edEdFZ&edGdHZ'edIdJZ(edKdLZ)edMdNZ*edOdPZ+edQdRZ,edSdTZ-edUdVZ.edWdXZ/edYdZZ0ed[d\Z1ed]d^Z2ed_d`Z3edadbZ4edcddZ5ededfZ6edgdhZ7edidjZ8edkdlZ9edmdnZ:edodpZ;edqdrZedwdxZ?edydzZ@ed{d|ZAed}d~ZBeddZCeddZDeddZEeddZFeddZGeddZHeddZIeddZJeddZKeddZLeddZMeddZNeddZOeddZPeddZQeddZReddZSeddZTeddZUeddZVeddZWeddZXeddZYeddZZeddZ[eddZ\eddZ]eddZ^eddZ_eddZ`eddZaeddZbeddZcedd„ZdeddĄZeeddƄZfeddȄZgeddʄZhedd̄Ziedd΄ZjeddЄZkedd҄ZleddԄZmeddքZnedd؄ZoeddڄZpedd܄ZqeddބZreddZseddZteddZuddZveddZweddZxeddZyeddZzeddZ{eddZ|eddZ}eddZ~eddZeddZeddZeddZeddZeddZddZddZeddZed d Zd d Zd dZeddZdS(SuiteRequirementscCtS)z/target platform can emit basic CreateTable DDL.ropenselfr r r create_tablezSuiteRequirements.create_tablecCr )z-target platform can emit basic DropTable DDL.rrr r r drop_table#rzSuiteRequirements.drop_tablecCr )z*Target database must support foreign keys.rrr r r foreign_keys)rzSuiteRequirements.foreign_keyscCr )zR"target database must support ON UPDATE..CASCADE behavior in foreign keys.rrr r r on_update_cascade/z#SuiteRequirements.on_update_cascadecCr )zWtarget database must *not* support ON UPDATE..CASCADE behavior in foreign keys.rclosedrr r r non_updating_cascade6rz&SuiteRequirements.non_updating_cascadecCr Nrrr r r deferrable_fks<z SuiteRequirements.deferrable_fksctfddS)NcsjjpjjSr)renabledrr rr r Fsz?SuiteRequirements.on_update_or_deferrable_fks..ronly_ifrr rr on_update_or_deferrable_fks@s z-SuiteRequirements.on_update_or_deferrable_fkscCr )z;Target database must support self-referential foreign keys.rrr r r self_referential_foreign_keysJrz/SuiteRequirements.self_referential_foreign_keyscCr )z=Target database must support the DDL phrases for FOREIGN KEY.rrr r r foreign_key_ddlPrz!SuiteRequirements.foreign_key_ddlcCr )z3target database must support names for constraints.rrr r r named_constraintsVrz#SuiteRequirements.named_constraintscCr )z(Target database must support subqueries.rrr r r subqueries\rzSuiteRequirements.subqueriescCr )zRtarget database can render OFFSET, or an equivalent, in a SELECT. rrr r r offsetbzSuiteRequirements.offsetcCr )zWtarget database can render LIMIT and/or OFFSET using a bound parameter rrr r r bound_limit_offsetjr)z$SuiteRequirements.bound_limit_offsetcCr )ztarget database can render LIMIT and/or OFFSET with a complete SQL expression, such as one that uses the addition operator. parameter rrr r r sql_expression_limit_offsetrz-SuiteRequirements.sql_expression_limit_offsetcCr )zTarget database must support parenthesized SELECT in UNION when LIMIT/OFFSET is specifically present. E.g. (SELECT ...) UNION (SELECT ..) This is known to fail on SQLite. rrr r r /parens_in_union_contained_select_w_limit_offset{ zASuiteRequirements.parens_in_union_contained_select_w_limit_offsetcCr )alTarget database must support parenthesized SELECT in UNION when OFFSET/LIMIT is specifically not present. E.g. (SELECT ... LIMIT ..) UNION (SELECT .. OFFSET ..) This is known to fail on SQLite. It also fails on Oracle because without LIMIT/OFFSET, there is currently no step that creates an additional subquery. rrr r r 0parens_in_union_contained_select_wo_limit_offsets zBSuiteRequirements.parens_in_union_contained_select_wo_limit_offsetcCr )z;Target database must support boolean expressions as columnsrrr r r boolean_col_expressionsrz)SuiteRequirements.boolean_col_expressionscCr )z5Target database allows boolean columns to store NULL.rrr r r nullable_booleansrz#SuiteRequirements.nullable_booleanscCr )z,Target backends that support nulls ordering.rrr r r nullsorderingrzSuiteRequirements.nullsorderingcCr )ztarget database/driver supports bound parameters as column expressions without being in the context of a typed column. rrr r r standalone_bindsr)z"SuiteRequirements.standalone_bindscCr )ztarget database/driver supports bound parameters with NULL in the WHERE clause, in situations where it has to be typed. rrr r r !standalone_null_binds_whereclauser)z3SuiteRequirements.standalone_null_binds_whereclausecCr )z5Target database must support INTERSECT or equivalent.rrr r r intersectzSuiteRequirements.intersectcCr )z?Target database must support EXCEPT or equivalent (i.e. MINUS).rrr r r except_r6zSuiteRequirements.except_cCr )z.Target database must support window functions.rrr r r window_functionsr6z"SuiteRequirements.window_functionscCr )zTarget database supports CTEsrrr r r ctesrzSuiteRequirements.ctescCr )ztarget database supports CTES that ride on top of a normal UPDATE or DELETE statement which refers to the CTE in a correlated subquery. rrr r r ctes_with_update_deleter,z)SuiteRequirements.ctes_with_update_deletecCr )z}target database supports CTES which consist of INSERT, UPDATE or DELETE *within* the CTE, e.g. WITH x AS (UPDATE....)rrr r r ctes_on_dmlrzSuiteRequirements.ctes_on_dmlcCr )z~target platform generates new surrogate integer primary key values when insert() is executed, excluding the pk column.rrr r r autoincrement_insertrz&SuiteRequirements.autoincrement_insertcCr )a#target platform will allow cursor.fetchone() to proceed after a COMMIT. Typically this refers to an INSERT statement with RETURNING which is invoked within "autocommit". If the row can be returned after the autocommit, then this rule can be open. rrr r r fetch_rows_post_commits z(SuiteRequirements.fetch_rows_post_commitcCr )ztarget platform supports SQL expressions in GROUP BY e.g. SELECT x + y AS somelabel FROM table GROUP BY x + y rrr r r group_by_complex_expressionr.z-SuiteRequirements.group_by_complex_expressioncCtdddS)NcS |jjj Sr)dbdialectsupports_sane_rowcountconfigr r r r  z1SuiteRequirements.sane_rowcount..z&driver doesn't support 'sane' rowcountrskip_ifrr r r sane_rowcountzSuiteRequirements.sane_rowcountcCr?)NcSr@r)rArBsupports_sane_multi_rowcountrDr r r r rFz7SuiteRequirements.sane_multi_rowcount..z;driver %(driver)s %(doesnt_support)s 'sane' multi row countrfails_ifrr r r sane_multi_rowcountrJz%SuiteRequirements.sane_multi_rowcountcCr?)NcSr@r)rArB supports_sane_rowcount_returningrDr r r r sz=SuiteRequirements.sane_rowcount_w_returning..z;driver doesn't support 'sane' rowcount when returning is onrLrr r r sane_rowcount_w_returning sz+SuiteRequirements.sane_rowcount_w_returningcCr?)zatarget platform supports INSERT with no values, i.e. INSERT DEFAULT VALUES or equivalent.cSs|jjjp |jjjSr)rArBsupports_empty_insertsupports_default_valuesrDr r r r  z1SuiteRequirements.empty_inserts..zempty inserts not supportedr!rr r r empty_insertsszSuiteRequirements.empty_insertscCr )z.target platform supports INSERT from a SELECT.rrr r r insert_from_selectrz$SuiteRequirements.insert_from_selectcCr?)z#target platform supports RETURNING.cS |jjjSr)rArBimplicit_returningrDr r r r ) z-SuiteRequirements.returning..z)%(database)s %(does_support)s 'returning'r!rr r r returning$szSuiteRequirements.returningcCr )zZTarget platform supports the syntax "(x, y) IN ((x1, y1), (x2, y2), ...)" rrr r r tuple_in-r)zSuiteRequirements.tuple_incCr )zwtarget platform supports a SELECT statement that has the same name repeated more than once in the columns list.rrr r r %duplicate_names_in_cursor_description5rz7SuiteRequirements.duplicate_names_in_cursor_descriptioncCr?)z[Target database must have 'denormalized', i.e. UPPERCASE as case insensitive names.cSr@r)rArBrequires_name_normalizerDr r r r BrFz6SuiteRequirements.denormalized_names..z,Backend does not require denormalized names.rGrr r r denormalized_names<z$SuiteRequirements.denormalized_namescCr?)zTtarget database must support multiple VALUES clauses in an INSERT statement.cSr@r)rArBsupports_multivalues_insertrDr r r r LrFz7SuiteRequirements.multivalues_inserts..z*Backend does not support multirow inserts.rGrr r r multivalues_insertsFr^z%SuiteRequirements.multivalues_insertscCr )zw"target dialect implements the executioncontext.get_lastrowid() method without reliance on RETURNING. rrr r r implements_get_lastrowidPr)z*SuiteRequirements.implements_get_lastrowidcCr )a="target dialect retrieves cursor.lastrowid, or fetches from a database-side function after an insert() construct executes, within the get_lastrowid() method. Only dialects that "pre-execute", or need RETURNING to get last inserted id, would return closed/fail/skip for this. rrr r r emulated_lastrowidXr.z$SuiteRequirements.emulated_lastrowidcCr )z^"target platform includes a 'lastrowid' accessor on the DBAPI cursor object. rrr r r dbapi_lastrowiddr)z!SuiteRequirements.dbapi_lastrowidcCr )z#Target database must support VIEWs.rrr r r viewslrzSuiteRequirements.viewscCr )zXTarget database must support external schemas, and have one named 'test_schema'.rrr r r schemasrrzSuiteRequirements.schemascCr )zLtarget system must support reflection of inter-schema foreign keys rrr r r cross_schema_fk_reflectionyrz,SuiteRequirements.cross_schema_fk_reflectioncCr )ztarget system has a strong concept of 'default' schema that can be referred to implicitly. basically, PostgreSQL. rrr r r implicit_default_schemaz)SuiteRequirements.implicit_default_schemacCtddgdS)z0Target dialect must support server side cursors.cSrVr)rArBsupports_server_side_cursorsrDr r r r rXz7SuiteRequirements.server_side_cursors..zno server side cursors supportr!rr r r server_side_cursorsz%SuiteRequirements.server_side_cursorscCri)z'Target database must support SEQUENCEs.cSrVr)rArBsupports_sequencesrDr r r r rXz-SuiteRequirements.sequences..zno sequence supportr!rr r r sequencesrlzSuiteRequirements.sequencescCri)zgTarget database supports sequences, but also optionally as a means of generating new PK values.cSs|jjjo |jjjSr)rArBrmsequences_optionalrDr r r r rSz6SuiteRequirements.sequences_optional..z.no sequence support, or sequences not optionalr!rr r r ros z$SuiteRequirements.sequences_optionalcCr rrrr r r reflects_pk_namesrz#SuiteRequirements.reflects_pk_namescCr rrrr r r table_reflectionrz"SuiteRequirements.table_reflectioncCr rrrr r r comment_reflectionrz$SuiteRequirements.comment_reflectioncC|jS)ztarget database must support retrieval of the columns in a view, similarly to how a table is inspected. This does not include the full CREATE VIEW definition. rdrr r r view_column_reflectionsz(SuiteRequirements.view_column_reflectioncCrs)zTtarget database must support inspection of the full CREATE VIEW definition. rtrr r r view_reflectionsz!SuiteRequirements.view_reflectioncCrsr)rerr r r schema_reflectionsz#SuiteRequirements.schema_reflectioncCr rrrr r r !primary_key_constraint_reflectionrz3SuiteRequirements.primary_key_constraint_reflectioncCr rrrr r r !foreign_key_constraint_reflectionrz3SuiteRequirements.foreign_key_constraint_reflectioncCr rrrr r r 1foreign_key_constraint_option_reflection_ondeleterzCSuiteRequirements.foreign_key_constraint_option_reflection_ondeletecCr rrrr r r 1foreign_key_constraint_option_reflection_onupdaterzCSuiteRequirements.foreign_key_constraint_option_reflection_onupdatecCr rrrr r r temp_table_reflectionrz'SuiteRequirements.temp_table_reflectioncCr )z8target dialect supports listing of temporary table namesrrr r r temp_table_namesr6z"SuiteRequirements.temp_table_namescCr )z)target database supports temporary tablesrrr r r temporary_tablesr6z"SuiteRequirements.temporary_tablescCr )z(target database supports temporary viewsrrr r r temporary_viewsr6z!SuiteRequirements.temporary_viewscCr rrrr r r index_reflectionrz"SuiteRequirements.index_reflectioncCr )z>target database supports CREATE INDEX against SQL expressions.rrr r r indexes_with_expressionsr6z*SuiteRequirements.indexes_with_expressionscCr )z8target dialect supports reflection of unique constraintsrrr r r unique_constraint_reflectionr6z.SuiteRequirements.unique_constraint_reflectioncCr )z7target dialect supports reflection of check constraintsrrr r r check_constraint_reflectionr6z-SuiteRequirements.check_constraint_reflectioncCr )ztarget dialect raises IntegrityError when reporting an INSERT with a primary key violation. (hint: it should) rrr r r $duplicate_key_raises_integrity_errorr)z6SuiteRequirements.duplicate_key_raises_integrity_errorcCr )z3Target database must support VARCHAR with no lengthrrr r r unbounded_varcharrz#SuiteRequirements.unbounded_varcharcCr )zTarget database/dialect must support Python unicode objects with non-ASCII characters represented, delivered as bound parameters as well as in result rows. rrr r r unicode_data r,zSuiteRequirements.unicode_datacCr )zRTarget driver must support some degree of non-ascii symbol names. rrr r r unicode_ddlrzSuiteRequirements.unicode_ddlcCr )ztarget dialect supports rendering of a date, time, or datetime as a literal string, e.g. via the TypeEngine.literal_processor() method. rrr r r datetime_literalsr,z#SuiteRequirements.datetime_literalscCr )zUtarget dialect supports representation of Python datetime.datetime() objects.rrr r r datetime&rzSuiteRequirements.datetimecCr )zftarget dialect supports representation of Python datetime.datetime() with microsecond objects.rrr r r datetime_microseconds-rz'SuiteRequirements.datetime_microsecondscCr )ztarget dialect supports representation of Python datetime.datetime() with microsecond objects but only if TIMESTAMP is used.rrr r r timestamp_microseconds4rz(SuiteRequirements.timestamp_microsecondscCr zutarget dialect supports representation of Python datetime.datetime() objects with historic (pre 1970) values.rrr r r datetime_historic;rz#SuiteRequirements.datetime_historiccCr )zQtarget dialect supports representation of Python datetime.date() objects.rrr r r dateBrzSuiteRequirements.datecCr )zPtarget dialect accepts a datetime object as the target of a date column.rrr r r date_coerces_from_datetimeIrz,SuiteRequirements.date_coerces_from_datetimecCr rrrr r r date_historicPrzSuiteRequirements.date_historiccCr )zQtarget dialect supports representation of Python datetime.time() objects.rrr r r timeWrzSuiteRequirements.timecCr )zbtarget dialect supports representation of Python datetime.time() with microsecond objects.rrr r r time_microseconds^rz#SuiteRequirements.time_microsecondscCr )zttarget database/driver can allow BLOB/BINARY fields to be compared against a bound parameter value. rrr r r binary_comparisonser)z$SuiteRequirements.binary_comparisonscCr )a!target backend supports simple binary literals, e.g. an expression like:: SELECT CAST('foo' AS BINARY) Where ``BINARY`` is the type emitted from :class:`.LargeBinary`, e.g. it could be ``BLOB`` or similar. Basically fails on Oracle. rrr r r binary_literalsmz!SuiteRequirements.binary_literalscCr )z:target dialect supports 'AUTOCOMMIT' as an isolation_levelrrr r r autocommit}r6zSuiteRequirements.autocommitcCr )z.target platform implements a native JSON type.rrr r r json_typerzSuiteRequirements.json_typecCrs)zO"target platform supports numeric array indexes within a JSON structure)rrr r r json_array_indexessz$SuiteRequirements.json_array_indexescCr rrrr r r (json_index_supplementary_unicode_elementrz:SuiteRequirements.json_index_supplementary_unicode_elementcCr )zRtarget backend has general support for moderately high-precision numerics.rrr r r precision_numerics_generalrz,SuiteRequirements.precision_numerics_generalcCr )zbtarget backend supports Decimal() objects using E notation to represent very small values.rrr r r "precision_numerics_enotation_smallrz4SuiteRequirements.precision_numerics_enotation_smallcCr )zbtarget backend supports Decimal() objects using E notation to represent very large values.rrr r r "precision_numerics_enotation_largerz4SuiteRequirements.precision_numerics_enotation_largecCr )ztarget backend supports values with many digits on both sides, such as 319438950232418390.273596, 87673.594069654243 rrr r r *precision_numerics_many_significant_digitsr)z.checkrG)rrr rr order_by_collationhs  z$SuiteRequirements.order_by_collationcCstr)rrrEr r r rssz(SuiteRequirements.get_order_by_collationcCr )zUTarget driver must support non-ASCII characters being passed at all. rrr r r unicode_connectionsvrz%SuiteRequirements.unicode_connectionscCr )zTarget driver must raise a DBAPI-level exception, such as InterfaceError, when the underlying connection has been closed and the execute() method is called. rrr r r graceful_disconnects}r)z&SuiteRequirements.graceful_disconnectscCr )zU Target must support simultaneous, independent database connections. rrr r r independent_connectionsrz)SuiteRequirements.independent_connectionscCr )z9Catchall for a large variety of MySQL on Windows failuresrrr r r skip_mysql_on_windowsr6z'SuiteRequirements.skip_mysql_on_windowscCstddS)aTest environment must allow ad-hoc engine/connection creation. DBs that scale poorly for many connections, even when closed, i.e. Oracle, may use the "--low-connections" option which flags this requirement as not present. cS|jjSr)optionslow_connectionsrDr r r r z2SuiteRequirements.ad_hoc_engines..rGrr r r ad_hoc_enginess z SuiteRequirements.ad_hoc_enginescC tdS)Ntiming_intensiver requires_tagrr r r r z"SuiteRequirements.timing_intensivecCr)Nmemory_intensiverrr r r rrz"SuiteRequirements.memory_intensivecCr?)zMark tests that use threading and mock at the same time - stability issues have been observed with coverage + python 3.3 cSstjo|jjSr)rpy3kr has_coveragerDr r r r sz7SuiteRequirements.threading_with_mock..z%Stability issues with coverage + py3krGrr r r threading_with_mocksz%SuiteRequirements.threading_with_mockcCr?)NcSs tjdkSN)sys version_infor r r r r rXz+SuiteRequirements.python2..z Python version 2.xx is required.rGrr r r python2rJzSuiteRequirements.python2cCr?)NcSs tjdkSrrr r r r r rXz+SuiteRequirements.python3..z Python version 3.xx is required.rGrr r r python3zSuiteRequirements.python3cCr?)NcSstjSr)rcpythonr r r r r sz+SuiteRequirements.cpython..zcPython interpreter neededr!rr r r rrzSuiteRequirements.cpythoncs ddlmtfdddS)Nrpicklecstj r jdkp tjdkS)NcPickle)rr)rpypyrrrr rr r r s z5SuiteRequirements.non_broken_pickle..z.Needs cPickle+cPython or newer Python 3 pickle)sqlalchemy.utilrrr"rr rr non_broken_pickles  z#SuiteRequirements.non_broken_picklecCrs)ztarget platform must remove all cycles unconditionally when gc.collect() is called, as well as clean out unreferenced subclasses. )rrr r r predictable_gcsz SuiteRequirements.predictable_gccCr?)zTest should be skipped if coverage is enabled. This is to block tests that exercise libraries that seem to be sensitive to coverage, such as PostgreSQL notice logging. cSrr)rrrDr r r r rz/SuiteRequirements.no_coverage..z(Issues observed when coverage is enabledrGrr r r no_coverageszSuiteRequirements.no_coveragecCdSNFr rr r r _has_mysql_on_windowsz'SuiteRequirements._has_mysql_on_windowscCrrr rr r r _has_mysql_fully_case_sensitiverz1SuiteRequirements._has_mysql_fully_case_sensitivecr)Nc Sr) _has_sqliter rr r r rXz*SuiteRequirements.sqlite..rGrr rr sqliteszSuiteRequirements.sqlitecstfdddS)Ncrr)_has_cextensionsr rr r r rXz/SuiteRequirements.cextensions..zC extensions not installedrGrr rr cextensionss zSuiteRequirements.cextensionscCs0ddlm}z|dWdStyYdSw)Nr) create_enginez sqlite://TF) sqlalchemyr ImportError)rrr r r rs  zSuiteRequirements._has_sqlitecCs,z ddlm}m}WdStyYdSw)Nr) cresultproxy cprocessorsTF)rrrr)rrrr r r rs  z"SuiteRequirements._has_cextensionscCr rrrr r r computed_columnsrz"SuiteRequirements.computed_columnsN)rrr propertyrrrrrrr#r$r%r&r'r(r*r+r-r/r0r1r2r3r4r5r7r8r9r:r;r<r=r>rIrNrPrTrUrYrZr[r]r`rarbrcrdrerfrgrkrnrorprqrrrurvrwrxryrzr{r|r}r~rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr r r r r s                                                                                                                                   r )__doc__rrrobjectrr r r r r s