L i'dZddlmZddlZddlZddlmZddlmZddlm Z dd lm Z dd lm Z dd l m Z Gd d ZGddeZy)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. ) annotationsN)asyncio) exclusionsonly_on create_engine)util) QueuePoolc eZdZy) RequirementsN)__name__ __module__ __qualname__e/mnt/ssd/data/python-lab/Trading/venv/lib/python3.12/site-packages/sqlalchemy/testing/requirements.pyrr!srrcPeZdZedZedZedZedZedZedZ edZ edZ ed Z ed Z ed Zed Zed ZedZedZedZedZedZedZedZedZedZedZedZedZedZedZedZedZ edZ!edZ"ed Z#ed!Z$ed"Z%ed#Z&ed$Z'ed%Z(ed&Z)ed'Z*ed(Z+ed)Z,ed*Z-ed+Z.ed,Z/ed-Z0ed.Z1ed/Z2ed0Z3ed1Z4ed2Z5ed3Z6ed4Z7ed5Z8ed6Z9ed7Z:ed8Z;ed9Zed<Z?ed=Z@ed>ZAed?ZBed@ZCedAZDedBZEedCZFedDZGedEZHedFZIedGZJedHZKedIZLedJZMedKZNedLZOedMZPedNZQedOZRedPZSedQZTedRZUedSZVedTZWedUZXedVZYedWZZedXZ[edYZ\edZZ]ed[Z^ed\Z_ed]Z`ed^Zaed_Zbed`ZcedaZdedbZeedcZfeddZgedeZhedfZiedgZjedhZkediZledjZmedkZnedlZoedmZpednZqedoZredpZsedqZtedrZuedsZvedtZweduZxedvZyedwZzedxZ{edyZ|edzZ}ed{Z~ed|Zed}Zed~ZedZedZedZedZedZedZedZedZedZedZedZedZedZdZedZedZedZedZedZedZedZedZedZedZedZedZedZedZedZedZedZedZedZedZedZedZedZedZedZedZedZedZedZedZedZedZedZedZedZedZedZedZedZedZedZdZedZedZedZedZedZedZedZdZedZedZedZed„ZedÄZedĄZedńZedƄZedDŽZedȄZedɄZedʄZed˄Zed̄Zed̈́Zed΄ZedτZedЄZedфZed҄ZdӄZdԄZedՄZedքZdׄZed؄ZedلZedڄZedۄZed܄Zed݄ZedބZed߄ZedZedZedZedZedZedZedZedZedZedZedZedZedZedZedZedZedZedZedZedZedZedZedZedZedZy)SuiteRequirementsc*tjS)z/target platform can emit basic CreateTable DDL.ropenselfs r create_tablezSuiteRequirements.create_table&  rc*tjS)z-target platform can emit basic DropTable DDL.rrs r drop_tablezSuiteRequirements.drop_table,rrc*tjS)z>target platform supports IF NOT EXISTS / IF EXISTS for tables.rclosedrs rtable_ddl_if_existsz%SuiteRequirements.table_ddl_if_exists2  ""rc*tjS)z?target platform supports IF NOT EXISTS / IF EXISTS for indexes.r"rs rindex_ddl_if_existsz%SuiteRequirements.index_ddl_if_exists8r%rc*tjS)z0Return databases that support the UUID datatype.r"rs ruuid_data_typez SuiteRequirements.uuid_data_type>r%rc*tjS)z*Target database must support foreign keys.rrs r foreign_keyszSuiteRequirements.foreign_keysDrrc*tjS)zKTarget database creates an index that's reflected for foreign keys.r"rs rforeign_keys_reflect_as_indexz/SuiteRequirements.foreign_keys_reflect_as_indexJ   ""rc*tjS)z=Target database reflects unique indexes as unique constrains.r"rs r*unique_index_reflect_as_unique_constraintszrsrz?SuiteRequirements.on_update_or_deferrable_fks..s*D**22+""**rronly_ifrs`ron_update_or_deferrable_fksz-SuiteRequirements.on_update_or_deferrable_fkss !! +  rc2d}tj|S)z"target database is using QueuePoolcJt|jjtSr=) isinstancedbpoolr configs rgoz(SuiteRequirements.queue_pool..gosfiinni8 8rrDrrNs r queue_poolzSuiteRequirements.queue_pools 9!!"%%rc*tjS)z;Target database must support self-referential foreign keys.rrs rself_referential_foreign_keysz/SuiteRequirements.self_referential_foreign_keysrrc*tjS)z=Target database must support the DDL phrases for FOREIGN KEY.rrs rforeign_key_ddlz!SuiteRequirements.foreign_key_ddlrrc*tjS)z3target database must support names for constraints.rrs rnamed_constraintsz#SuiteRequirements.named_constraintsrrc*tjS)z8target database must apply names to unnamed constraints.rrs rimplicitly_named_constraintsz.SuiteRequirements.implicitly_named_constraintsrrc*tjS)atarget database allows column names that have unusual characters in them, such as dots, spaces, slashes, or percent signs. The column names are as always in such a case quoted, however the DB still needs to support those characters in the name somehow. rrs runusual_column_name_charactersz0SuiteRequirements.unusual_column_name_characterss  rc*tjS)z(Target database must support subqueries.rrs r subquerieszSuiteRequirements.subqueriesrrc*tjS)zRtarget database can render OFFSET, or an equivalent, in a SELECT. rrs roffsetzSuiteRequirements.offset   rc*tjS)zWtarget database can render LIMIT and/or OFFSET using a bound parameter rrs rbound_limit_offsetz$SuiteRequirements.bound_limit_offsetr_rc*tjS)ztarget database can render LIMIT and/or OFFSET with a complete SQL expression, such as one that uses the addition operator. parameter rrs rsql_expression_limit_offsetz-SuiteRequirements.sql_expression_limit_offset  rc*tjS)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. rrs r/parens_in_union_contained_select_w_limit_offsetzASuiteRequirements.parens_in_union_contained_select_w_limit_offset  rc*tjS)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. rrs r0parens_in_union_contained_select_wo_limit_offsetzBSuiteRequirements.parens_in_union_contained_select_wo_limit_offset  rc*tjS)z;Target database must support boolean expressions as columnsr"rs rboolean_col_expressionsz)SuiteRequirements.boolean_col_expressionsr%rc*tjS)z5Target database allows boolean columns to store NULL.rrs rnullable_booleansz#SuiteRequirements.nullable_booleansrrc*tjS)z,Target backends that support nulls ordering.r"rs r nullsorderingzSuiteRequirements.nullsordering r%rc*tjS)ztarget database/driver supports bound parameters as column expressions without being in the context of a typed column. rrs rstandalone_bindsz"SuiteRequirements.standalone_bindsr9rc*tjS)ztarget database/driver supports bound parameters with NULL in the WHERE clause, in situations where it has to be typed. rrs r!standalone_null_binds_whereclausez3SuiteRequirements.standalone_null_binds_whereclauser_rc*tjS)z5Target database must support INTERSECT or equivalent.r"rs r intersectzSuiteRequirements.intersect   ""rc*tjS)z?Target database must support EXCEPT or equivalent (i.e. MINUS).r"rs rexcept_zSuiteRequirements.except_%rwrc*tjS)z.Target database must support window functions.r"rs rwindow_functionsz"SuiteRequirements.window_functions*rwrc*tjS)zTarget database supports CTEsr"rs rcteszSuiteRequirements.ctes/r%rc*tjS)ztarget database supports CTES that ride on top of a normal UPDATE or DELETE statement which refers to the CTE in a correlated subquery. r"rs rctes_with_update_deletez)SuiteRequirements.ctes_with_update_delete5  ""rc*tjS)zJtarget database supports CTES that ride on top of a VALUES clause.r"rs rctes_with_valuesz"SuiteRequirements.ctes_with_values>r.rc*tjS)z}target database supports CTES which consist of INSERT, UPDATE or DELETE *within* the CTE, e.g. WITH x AS (UPDATE....)r"rs r ctes_on_dmlzSuiteRequirements.ctes_on_dmlEr.rc*tjS)z~target platform generates new surrogate integer primary key values when insert() is executed, excluding the pk column.rrs rautoincrement_insertz&SuiteRequirements.autoincrement_insertLr9rc*tjS)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. rrs rfetch_rows_post_commitz(SuiteRequirements.fetch_rows_post_commitSs  rc*tjS)ztarget platform supports SQL expressions in GROUP BY e.g. SELECT x + y AS somelabel FROM table GROUP BY x + y rrs rgroup_by_complex_expressionz-SuiteRequirements.group_by_complex_expression`rgrc0tjddS)NcD|jjj Sr=)rJdialectsupports_sane_rowcountrLs rrCz1SuiteRequirements.sane_rowcount..osvyy00GGGrz&driver doesn't support 'sane' rowcountrskip_ifrs r sane_rowcountzSuiteRequirements.sane_rowcountls!! G 4  rc0tjddS)NcD|jjj Sr=)rJrsupports_sane_multi_rowcountrLs rrCz7SuiteRequirements.sane_multi_rowcount..vsvyy00MMMrz;driver %(driver)s %(doesnt_support)s 'sane' multi row countrfails_ifrs rsane_multi_rowcountz%SuiteRequirements.sane_multi_rowcountss"" M I  rc0tjddS)NcD|jjj Sr=)rJr supports_sane_rowcount_returningrLs rrCz=SuiteRequirements.sane_rowcount_w_returning..}s !!BBrz;driver doesn't support 'sane' rowcount when returning is onrrs rsane_rowcount_w_returningz+SuiteRequirements.sane_rowcount_w_returningzs ""  J   rc0tjddS)zatarget platform supports INSERT with no values, i.e. INSERT DEFAULT VALUES or equivalent.c|jjjxsB|jjjxs |jjjSr=)rJrsupports_empty_insertsupports_default_valuessupports_default_metavaluerLs rrCz1SuiteRequirements.empty_inserts..sI699,,BB<yy  88<yy  ;;rzempty inserts not supportedrDrs r empty_insertszSuiteRequirements.empty_insertss! !! < *   rc|jS)zvtarget platform supports INSERT with no values, i.e. INSERT DEFAULT VALUES or equivalent, within executemany())rrs rempty_inserts_executemanyz+SuiteRequirements.empty_inserts_executemanys !!!rc*tjS)z.target platform supports INSERT from a SELECT.rrs rinsert_from_selectz$SuiteRequirements.insert_from_selectrrc0tjddS)z.target platform supports DELETE ... RETURNING.cB|jjjSr=)rJrdelete_returningrLs rrCz4SuiteRequirements.delete_returning..699,,==rz4%(database)s %(does_support)s 'DELETE ... RETURNING'rDrs rrz"SuiteRequirements.delete_returning!! = B  rc0tjddS)z.target platform supports INSERT ... RETURNING.cB|jjjSr=)rJrinsert_returningrLs rrCz4SuiteRequirements.insert_returning..rrz4%(database)s %(does_support)s 'INSERT ... RETURNING'rDrs rrz"SuiteRequirements.insert_returningrrc0tjddS)z.target platform supports UPDATE ... RETURNING.cB|jjjSr=)rJrupdate_returningrLs rrCz4SuiteRequirements.update_returning..rrz4%(database)s %(does_support)s 'UPDATE ... RETURNING'rDrs rrz"SuiteRequirements.update_returningrrc0tjddS)ztarget platform supports RETURNING when INSERT is used with executemany(), e.g. multiple parameter sets, indicating as many rows come back as do parameter sets were passed. cB|jjjSr=)rJrinsert_executemany_returningrLs rrCz@SuiteRequirements.insert_executemany_returning..s699,,IIrzR%(database)s %(does_support)s 'RETURNING of multiple rows with INSERT executemany'rDrs rrz.SuiteRequirements.insert_executemany_returnings!! I 5  rc0tjddS)Nc|jjjxrB|jjjxr |jjjSr=)rJrsupports_multivalues_insertruse_insertmanyvaluesrLs rrCz4SuiteRequirements.insertmanyvalues..sI699,,HH7 !!227 !!66rz=%(database)s %(does_support)s 'insertmanyvalues functionalityrDrs rinsertmanyvaluesz"SuiteRequirements.insertmanyvaluess !! 7 L   rc*tjS)zZTarget platform supports the syntax "(x, y) IN ((x1, y1), (x2, y2), ...)" r"rs rtuple_inzSuiteRequirements.tuple_in   ""rc|jS)z%Target platform tuple IN w/ empty set)rrs rtuple_in_w_emptyz"SuiteRequirements.tuple_in_w_emptys}}rc*tjS)zwtarget platform supports a SELECT statement that has the same name repeated more than once in the columns list.rrs r%duplicate_names_in_cursor_descriptionz7SuiteRequirements.duplicate_names_in_cursor_descriptionr9rc0tjddS)z[Target database must have 'denormalized', i.e. UPPERCASE as case insensitive names.cD|jjj Sr=)rJrrequires_name_normalizerLs rrCz6SuiteRequirements.denormalized_names..svyy00HHHrz,Backend does not require denormalized names.rrs rdenormalized_namesz$SuiteRequirements.denormalized_namess !! H :  rc0tjddS)zTtarget database must support multiple VALUES clauses in an INSERT statement.cD|jjj Sr=)rJrrrLs rrCz7SuiteRequirements.multivalues_inserts..svyy00LLLrz*Backend does not support multirow inserts.rrs rmultivalues_insertsz%SuiteRequirements.multivalues_insertss !! L 8  rc*tjS)zvtarget dialect implements the executioncontext.get_lastrowid() method without reliance on RETURNING. rrs rimplements_get_lastrowidz*SuiteRequirements.implements_get_lastrowidr_rc*tjS)zLdialect includes the required pep-249 attribute ``cursor.arraysize``rrs r arraysizezSuiteRequirements.arraysizer9rc*tjS)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. r"rs remulated_lastrowidz$SuiteRequirements.emulated_lastrowid  ""rc*tjS)ztarget dialect retrieves cursor.lastrowid or an equivalent after an insert() construct executes, even if the table has a Sequence on it. r"rs r&emulated_lastrowid_even_with_sequencesz8SuiteRequirements.emulated_lastrowid_even_with_sequencesrrc*tjS)z]target platform includes a 'lastrowid' accessor on the DBAPI cursor object. r"rs rdbapi_lastrowidz!SuiteRequirements.dbapi_lastrowidrrc*tjS)z#Target database must support VIEWs.r"rs rviewszSuiteRequirements.views"r%rctdS)zXTarget database must support external schemas, and have one named 'test_schema'.cB|jjjSr=)rJrsupports_schemasrLs rrCz+SuiteRequirements.schemas..-sfii&7&7&H&Hrrrs rschemaszSuiteRequirements.schemas(s HIIrc*tjS)zJtarget system must support reflection of inter-schema foreign keysr"rs rcross_schema_fk_reflectionz,SuiteRequirements.cross_schema_fk_reflection/r%rc*tjS)aTarget supports reflection of FOREIGN KEY constraints and will return the name of the constraint that was used in the "CONSTRAINT FOREIGN KEY" DDL. MySQL prior to version 8 and MariaDB prior to version 10.5 don't support this. r"rs r&foreign_key_constraint_name_reflectionz8SuiteRequirements.foreign_key_constraint_name_reflection5rrc*tjS)ztarget system has a strong concept of 'default' schema that can be referred to implicitly. basically, PostgreSQL. r"rs rimplicit_default_schemaz)SuiteRequirements.implicit_default_schemaA  ""rc*tjS)z`target dialect implements provisioning module including set_default_schema_on_connectionr"rs rdefault_schema_name_switchz,SuiteRequirements.default_schema_name_switchKr.rc2tjdgdS)z0Target dialect must support server side cursors.cB|jjjSr=)rJrsupports_server_side_cursorsrLs rrCz7SuiteRequirements.server_side_cursors..WsFII--JJrzno server side cursors supportrDrs rserver_side_cursorsz%SuiteRequirements.server_side_cursorsRs !! J K ,  rc2tjdgdS)z'Target database must support SEQUENCEs.cB|jjjSr=)rJrsupports_sequencesrLs rrCz-SuiteRequirements.sequences..`sFII--@@rzno sequence supportrDrs r sequenceszSuiteRequirements.sequences[s !! @ A !  rc@tj|jS)zJthe opposite of "sequences", DB does not support sequences at all.)r NotPredicaterrs r no_sequenceszSuiteRequirements.no_sequencesds &&t~~66rc2tjdgdS)zgTarget database supports sequences, but also optionally as a means of generating new PK values.c|jjjxr |jjjSr=)rJrrsequences_optionalrLs rrCz6SuiteRequirements.sequences_optional..rs1vyy00CC 9II%%88rz.no sequence support, or sequences not optionalrDrs rrz$SuiteRequirements.sequences_optionalks& !!9  =   rc0tjdgS)atarget database / driver supports cursor.lastrowid as a means of retrieving the last inserted primary key value. note that if the target DB supports sequences also, this is still assumed to work. This is a new use case brought on by MariaDB 10.3. cB|jjjSr=rJrpostfetch_lastrowidrLs rrCz6SuiteRequirements.supports_lastrowid..sFII--AArrDrs rsupports_lastrowidz$SuiteRequirements.supports_lastrowidxs!! A B  rc0tjdgS)z"the opposite of supports_lastrowidcD|jjj Sr=rrLs rrCz8SuiteRequirements.no_lastrowid_support..s 1 1 E EErrDrs rno_lastrowid_supportz&SuiteRequirements.no_lastrowid_supports!! E F  rc*tjSr=r"rs rreflects_pk_namesz#SuiteRequirements.reflects_pk_namesr?rc*tjS)z8target database has general support for table reflectionrrs rtable_reflectionz"SuiteRequirements.table_reflection  rc*tjS)ztarget database supports creation and reflection of tables with no columns, or at least tables that seem to have no columns.r"rs rreflect_tables_no_columnsz+SuiteRequirements.reflect_tables_no_columnsr.rc*tjS)z_indicates if database supports comments on temp tables and the dialect can reflect themr"rs rtemp_table_comment_reflectionz/SuiteRequirements.temp_table_comment_reflectionr%rc*tjS)z:Indicates if the database support table comment reflectionr"rs rcomment_reflectionz$SuiteRequirements.comment_reflectionrwrc*tjS)z{Indicates if the database support table comment reflection in the full unicode range, including emoji etc. r"rs rcomment_reflection_full_unicodez1SuiteRequirements.comment_reflection_full_unicoder.rc*tjS)zVindicates if the database support comments on constraints and their reflectionr"rs rconstraint_comment_reflectionz/SuiteRequirements.constraint_comment_reflectionr%rc|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. rrs rview_column_reflectionz(SuiteRequirements.view_column_reflectionszzrc|jS)zStarget database must support inspection of the full CREATE VIEW definition.rrs rview_reflectionz!SuiteRequirements.view_reflectionszzrc|jSr=)rrs rschema_reflectionz#SuiteRequirements.schema_reflections ||rc*tjS)zatarget database supports schema create and dropped with 'CREATE SCHEMA' and 'DROP SCHEMA'r"rs rschema_create_deletez&SuiteRequirements.schema_create_deleter%rc*tjSr=rrs r!primary_key_constraint_reflectionz3SuiteRequirements.primary_key_constraint_reflection  rc*tjSr=rrs r!foreign_key_constraint_reflectionz3SuiteRequirements.foreign_key_constraint_reflectionrrc*tjSr=r"rs r1foreign_key_constraint_option_reflection_ondeletezCSuiteRequirements.foreign_key_constraint_option_reflection_ondeleter?rc*tjSr=r"rs r1fk_constraint_option_reflection_ondelete_restrictzCSuiteRequirements.fk_constraint_option_reflection_ondelete_restrictr?rc*tjSr=r"rs r1fk_constraint_option_reflection_ondelete_noactionzCSuiteRequirements.fk_constraint_option_reflection_ondelete_noactionr?rc*tjSr=r"rs r1foreign_key_constraint_option_reflection_onupdatezCSuiteRequirements.foreign_key_constraint_option_reflection_onupdater?rc*tjSr=r"rs r1fk_constraint_option_reflection_onupdate_restrictzCSuiteRequirements.fk_constraint_option_reflection_onupdate_restrictr?rc*tjSr=rrs rtemp_table_reflectionz'SuiteRequirements.temp_table_reflectionrrc|jSr=)rrs rtemp_table_reflect_indexesz,SuiteRequirements.temp_table_reflect_indexess)))rc*tjS)z8target dialect supports listing of temporary table namesr"rs rtemp_table_namesz"SuiteRequirements.temp_table_namesrwrc*tjS)z9target dialect supports checking a single temp table namer"rs rhas_temp_tablez SuiteRequirements.has_temp_tablerwrc*tjS)z)target database supports temporary tablesrrs rtemporary_tablesz"SuiteRequirements.temporary_tablesrrc*tjS)z(target database supports temporary viewsr"rs rtemporary_viewsz!SuiteRequirements.temporary_viewsrwrc*tjSr=rrs rindex_reflectionz"SuiteRequirements.index_reflectionrrc*tjSr=r"rs rindex_reflects_included_columnsz1SuiteRequirements.index_reflects_included_columns r?rc*tjS)z?target database supports CREATE INDEX with per-column ASC/DESC.rrs rindexes_with_ascdescz&SuiteRequirements.indexes_with_ascdescrrc*tjS)zKtarget database supports reflecting INDEX with per-column ASC/DESC.rrs rreflect_indexes_with_ascdescz.SuiteRequirements.reflect_indexes_with_ascdescrrc*tjS)zztarget database supports reflecting INDEX with per-column ASC/DESC but reflects them as expressions (like oracle).r"rs r*reflect_indexes_with_ascdesc_as_expressionztarget database supports CREATE INDEX with column order check.r"rs rindexes_check_column_orderz,SuiteRequirements.indexes_check_column_orderrwrc*tjS)z>target database supports CREATE INDEX against SQL expressions.r"rs rindexes_with_expressionsz*SuiteRequirements.indexes_with_expressions$rwrc*tjS)zLtarget database supports reflection of indexes with SQL expressions.r"rs r reflect_indexes_with_expressionsz2SuiteRequirements.reflect_indexes_with_expressions)r%rc*tjS)z8target dialect supports reflection of unique constraintsrrs runique_constraint_reflectionz.SuiteRequirements.unique_constraint_reflection/rrc*tjS)z>target dialect supports reflection of inline check constraintsr"rs r"inline_check_constraint_reflectionz4SuiteRequirements.inline_check_constraint_reflection4rwrc*tjS)z7target dialect supports reflection of check constraintsr"rs rcheck_constraint_reflectionz-SuiteRequirements.check_constraint_reflection9rwrc*tjS)ztarget dialect raises IntegrityError when reporting an INSERT with a primary key violation. (hint: it should) rrs r$duplicate_key_raises_integrity_errorz6SuiteRequirements.duplicate_key_raises_integrity_error>r_rc*tjS)z3Target database must support VARCHAR with no lengthrrs runbounded_varcharz#SuiteRequirements.unbounded_varcharFrrc*tjS)zAtarget database supports NVARCHAR and NCHAR as an actual datatyper"rs rnvarchar_typesz SuiteRequirements.nvarchar_typesLrwrc*tjS)zTarget database/dialect can receive / deliver / compare data with non-ASCII characters in plain VARCHAR, TEXT columns, without the need for special "national" datatypes like NVARCHAR or similar. rrs runicode_data_no_special_typesz/SuiteRequirements.unicode_data_no_special_typesQrdrc*tjS)zTarget database/dialect must support Python unicode objects with non-ASCII characters represented, delivered as bound parameters as well as in result rows. rrs r unicode_datazSuiteRequirements.unicode_dataZrdrc*tjS)zRTarget driver must support some degree of non-ascii symbol names. r"rs r unicode_ddlzSuiteRequirements.unicode_ddlcr.rc*tjS)z?Target driver can create tables with a name like 'some " table'rrs rsymbol_names_w_double_quotez-SuiteRequirements.symbol_names_w_double_quotejrrc*tjS)ztarget dialect supports rendering of a datetime.timedelta as a literal string, e.g. via the TypeEngine.literal_processor() method. r"rs rdatetime_intervalz#SuiteRequirements.datetime_intervalorrc*tjS)ztarget dialect supports rendering of a date, time, or datetime as a literal string, e.g. via the TypeEngine.literal_processor() method. r"rs rdatetime_literalsz#SuiteRequirements.datetime_literalswrrc*tjS)zUtarget dialect supports representation of Python datetime.datetime() objects.rrs rdatetimezSuiteRequirements.datetimer9rc*tjS)zvtarget dialect supports representation of Python datetime.datetime() with tzinfo with DateTime(timezone=True).r"rs rdatetime_timezonez#SuiteRequirements.datetime_timezoner.rc*tjS)zntarget dialect supports representation of Python datetime.time() with tzinfo with Time(timezone=True).r"rs r time_timezonezSuiteRequirements.time_timezoner.rc*tjS)ztarget dialect when given a date object will bind it such that the database server knows the object is a date, and not a plain string. rrs rdate_implicit_boundz%SuiteRequirements.date_implicit_boundrdrc*tjS)ztarget dialect when given a time object will bind it such that the database server knows the object is a time, and not a plain string. rrs rtime_implicit_boundz%SuiteRequirements.time_implicit_boundrdrc*tjS)ztarget dialect when given a datetime object will bind it such that the database server knows the object is a datetime, and not a plain string. rrs rdatetime_implicit_boundz)SuiteRequirements.datetime_implicit_boundrdrc*tjS)zftarget dialect supports representation of Python datetime.datetime() with microsecond objects.rrs rdatetime_microsecondsz'SuiteRequirements.datetime_microsecondsr9rc*tjS)ztarget dialect supports representation of Python datetime.datetime() with microsecond objects but only if TIMESTAMP is used.r"rs rtimestamp_microsecondsz(SuiteRequirements.timestamp_microsecondsr.rc|jS)atarget dialect when given a datetime object which also includes a microseconds portion when using the TIMESTAMP data type will bind it such that the database server knows the object is a datetime with microseconds, and not a plain string. )rars r%timestamp_microseconds_implicit_boundz7SuiteRequirements.timestamp_microseconds_implicit_bounds***rc*tjSzutarget dialect supports representation of Python datetime.datetime() objects with historic (pre 1970) values.r"rs rdatetime_historicz#SuiteRequirements.datetime_historicr.rc*tjS)zQtarget dialect supports representation of Python datetime.date() objects.rrs rdatezSuiteRequirements.dater9rc*tjS)zPtarget dialect accepts a datetime object as the target of a date column.rrs rdate_coerces_from_datetimez,SuiteRequirements.date_coerces_from_datetimer9rc*tjSrer"rs r date_historiczSuiteRequirements.date_historicr.rc*tjS)zQtarget dialect supports representation of Python datetime.time() objects.rrs rtimezSuiteRequirements.timer9rc*tjS)zbtarget dialect supports representation of Python datetime.time() with microsecond objects.rrs rtime_microsecondsz#SuiteRequirements.time_microsecondsr9rc*tjS)zttarget database/driver can allow BLOB/BINARY fields to be compared against a bound parameter value. rrs rbinary_comparisonsz$SuiteRequirements.binary_comparisonsr_rc*tjS)a=target backend supports simple binary literals, e.g. an expression like: .. sourcecode:: sql 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. rrs rbinary_literalsz!SuiteRequirements.binary_literals   rc*tjS)z:target dialect supports 'AUTOCOMMIT' as an isolation_levelr"rs r autocommitzSuiteRequirements.autocommit rwrc*tjS)z{target dialect supports the detect_autocommit_setting() method and uses the default implementation of do_rollback()r"rs rskip_autocommit_rollbackz*SuiteRequirements.skip_autocommit_rollbackr.rc*tjS)ztarget dialect supports general isolation level settings. Note that this requirement, when enabled, also requires that the get_isolation_levels() method be implemented. r"rs risolation_levelz!SuiteRequirements.isolation_levelrrc"|jj5} |jj|jj }|jj |dcdddS#t$r YdddywxYw#1swYyxYw)aReturn a structure of supported isolation levels for the current testing dialect. The structure indicates to the testing suite what the expected "default" isolation should be, as well as the other values that are accepted. The dictionary has two keys, "default" and "supported". The "supported" key refers to a list of all supported levels and it should include AUTOCOMMIT if the dialect supports it. If the :meth:`.DefaultRequirements.isolation_level` requirement is not open, then this method has no return value. E.g.:: >>> testing.requirements.get_isolation_levels() { "default": "READ_COMMITTED", "supported": [ "SERIALIZABLE", "READ UNCOMMITTED", "READ COMMITTED", "REPEATABLE READ", "AUTOCOMMIT" ] } )default supportedN)rJconnectrget_isolation_level_values connectiondbapi_connectiondefault_isolation_levelNotImplementedError)rrMconnr~s rget_isolation_levelsz&SuiteRequirements.get_isolation_levels"s2YY   D  LLCCOO44  $||CC!*   '       s.B/A. B. B7BBBBc2d}tj|S)ztarget dialect supports the :meth:`_engine.Dialect.get_isolation_level_values` method added in SQLAlchemy 2.0. c|jj5} |jj|jj  dddy#t $r YdddywxYw#1swYyxYw)NTF)rJrrrrrr)rMrs rrNz8SuiteRequirements.get_isolation_level_values..goPsu""$  LL;;88    +!   !   s.A-/A A- A*A-)A**A--A6rDrOs rrz,SuiteRequirements.get_isolation_level_valuesHs !!"%%rc2d}tj|S)zctest that the dialect allows the 'isolation_level' argument to be handled by DefaultDialectc t|jjd}|jjdk(S#YyxYw)NzREAD COMMITTED)r{F)r rJurlr_on_connect_isolation_level)rMes rrNzASuiteRequirements.dialect_level_isolation_level_param..gobsC !IIMM3CII99=MM s !<ArDrOs r#dialect_level_isolation_level_paramz5SuiteRequirements.dialect_level_isolation_level_param]s !!"%%rc*tjS)z.Target platform implements a native ARRAY typer"rs r array_typezSuiteRequirements.array_typeprwrc*tjS)z.target platform implements a native JSON type.r"rs r json_typezSuiteRequirements.json_typeur%rc|jS)zNtarget platform supports numeric array indexes within a JSON structure)rrs rjson_array_indexesz$SuiteRequirements.json_array_indexes{s ~~rc*tjSr=rrs r(json_index_supplementary_unicode_elementz:SuiteRequirements.json_index_supplementary_unicode_elementrrc*tjS)zBackend has a JSON_EXTRACT or similar function that returns a valid JSON string in all cases. Used to test a legacy feature and is not needed. r"rs r!legacy_unconditional_json_extractz3SuiteRequirements.legacy_unconditional_json_extractrrc*tjS)zRtarget backend has general support for moderately high-precision numerics.rrs rprecision_numerics_generalz,SuiteRequirements.precision_numerics_generalrrc*tjS)zbtarget backend supports Decimal() objects using E notation to represent very small values.r"rs r"precision_numerics_enotation_smallz4SuiteRequirements.precision_numerics_enotation_smallr%rc*tjS)zbtarget backend supports Decimal() objects using E notation to represent very large values.rrs r"precision_numerics_enotation_largez4SuiteRequirements.precision_numerics_enotation_largerrc*tjS)ztarget backend supports values with many digits on both sides, such as 319438950232418390.273596, 87673.594069654243 r"rs r*precision_numerics_many_significant_digitsz>>rc*tjS)z8Target backend supports server side defaults for columnsr"rs rserver_defaultsz!SuiteRequirements.server_defaultsr%rc*tjS)zUTarget backend supports server side defaults with SQL expressions for columnsr"rs rexpression_server_defaultsz,SuiteRequirements.expression_server_defaultsr.rc*tjS)a target backend will return a selected Decimal as a Decimal, not a string. e.g.:: expr = decimal.Decimal("15.7563") value = e.scalar(select(literal(expr))) assert value == expr See :ticket:`4036` rrs rimplicit_decimal_bindsz(SuiteRequirements.implicit_decimal_bindss"  rc*tjS)aFtarget backend will return result columns that are explicitly against NUMERIC or similar precision-numeric datatypes (not including FLOAT or INT types) as Python Decimal objects, and not as floats or ints, including when no SQLAlchemy-side typing information is associated with the statement (e.g. such as a raw SQL string). This should be enabled if either the DBAPI itself returns Decimal objects, or if the dialect has set up DBAPI-specific return type handlers such that Decimal objects come back automatically. rrs r#numeric_received_as_decimal_untypedz5SuiteRequirements.numeric_received_as_decimal_untypeds  rc*tjS)zhtarget database can select an aggregate from a subquery that's also using an aggregate rrs rnested_aggregatesz#SuiteRequirements.nested_aggregatesr_rc*tjS)zbtarget database must support ON DELETE CASCADE on a self-referential foreign key rrs rrecursive_fk_cascadez&SuiteRequirements.recursive_fk_cascader_rc*tjS)zA precision numeric type will return empty significant digits, i.e. a value such as 10.000 will come back in Decimal form with the .000 maintained.r"rs r-precision_numerics_retains_significant_digitsz?SuiteRequirements.precision_numerics_retains_significant_digitsrrc*tjS)z@The Float type can persist and load float('inf'), float('-inf').r"rs rinfinity_floatsz!SuiteRequirements.infinity_floatsr%rc*tjSr=r"rs r-float_or_double_precision_behaves_genericallyz?SuiteRequirements.float_or_double_precision_behaves_genericallyr?rc*tjS)ztarget backend will return native floating point numbers with at least seven decimal places when using the generic Float type. rrs rprecision_generic_float_typez.SuiteRequirements.precision_generic_float_typer_rc*tjS)ztarget backend will return the exact float value 15.7563 with only four significant digits from this statement: SELECT :param where :param is the Python float 15.7563 i.e. it does not return 15.75629997253418 rrs rliteral_float_coercionz(SuiteRequirements.literal_float_coercion rjrc*tjS)ztarget backend can return a floating-point number with four significant digits (such as 15.7563) accurately (i.e. without FP inaccuracies, such as 15.75629997253418). rrs rfloats_to_four_decimalsz)SuiteRequirements.floats_to_four_decimalsrdrc*tjS)ztarget backend doesn't crash when you try to select a NUMERIC value that has a value of NULL. Added to support Pyodbc bug #351. rrs rfetch_null_from_numericz)SuiteRequirements.fetch_null_from_numeric"s  rc*tjS)z*target backend uses Numeric for Float/Dualrrs rfloat_is_numericz"SuiteRequirements.float_is_numeric,rrc*tjS)zUTarget database must support an unbounded Text() " "type such as TEXT or CLOBrrs r text_typezSuiteRequirements.text_type2r9rc*tjS)zTtarget database can persist/return an empty string with a varchar. rrs rempty_strings_varcharz'SuiteRequirements.empty_strings_varchar9r_rc*tjS)zRtarget database can persist/return an empty string with an unbounded text.rrs rempty_strings_textz$SuiteRequirements.empty_strings_textAr9rc*tjS)zUtarget database supports use of an unbounded textual field in a WHERE clause.rrs r"expressions_against_unbounded_textz4SuiteRequirements.expressions_against_unbounded_textHr9rc*tjS)z;target driver must support the literal statement 'select 1'rrs r selectonezSuiteRequirements.selectoneOrrc*tjS)z(Target database must support savepoints.r"rs r savepointszSuiteRequirements.savepointsTr%rc*tjS)z4Target database must support two-phase transactions.r"rs rtwo_phase_transactionsz(SuiteRequirements.two_phase_transactionsZr%rc*tjS)z'Target must support UPDATE..FROM syntaxr"rs r update_fromzSuiteRequirements.update_from`rwrc*tjS)z=Target must support DELETE FROM..FROM or DELETE..USING syntaxr"rs r delete_fromzSuiteRequirements.delete_fromerwrc*tjS)aTarget must support UPDATE (or DELETE) where the same table is present in a subquery in the WHERE clause. This is an ANSI-standard syntax that apparently MySQL can't handle, such as: .. sourcecode:: sql UPDATE documents SET flag=1 WHERE documents.title IN (SELECT max(documents.title) AS title FROM documents GROUP BY documents.user_id ) rrs rupdate_where_target_in_subqueryz1SuiteRequirements.update_where_target_in_subqueryjrurc*tjS)zOtarget database must use a plain percent '%' as the 'modulus' operator.r"rs rmod_operator_as_percent_signz.SuiteRequirements.mod_operator_as_percent_sign|r%rc*tjS)atarget backend supports weird identifiers with percent signs in them, e.g. 'some % column'. this is a very weird use case but often has problems because of DBAPIs that use python formatting. It's not a critical use case either. r"rs rpercent_schema_namesz&SuiteRequirements.percent_schema_namesrrc*tjS)ztarget database supports ordering by a column from a SELECT inside of a UNION E.g.: .. sourcecode:: sql (SELECT id, ...) UNION (SELECT id, ...) ORDER BY id rrs rorder_by_col_from_unionz)SuiteRequirements.order_by_col_from_unionrjrc*tjS)a4target backend supports ORDER BY a column label within an expression. Basically this: .. sourcecode:: sql select data as foo from test order by foo || 'bar' Lots of databases including PostgreSQL don't support this, so this is off by default. r"rs rorder_by_label_with_expressionz0SuiteRequirements.order_by_label_with_expressions  ""rc8fd}tj|S)NcH j|y#t$rYywxYw)NFT)get_order_by_collationr)rMrs rcheckz3SuiteRequirements.order_by_collation..checks+ ++F3&  s  !!rrrs` rorder_by_collationz$SuiteRequirements.order_by_collations !!%((rctr=)rrrMs rrz(SuiteRequirements.get_order_by_collations !##rc*tjS)zUTarget driver must support non-ASCII characters being passed at all. rrs runicode_connectionsz%SuiteRequirements.unicode_connectionsr9rc*tjS)zTarget driver must raise a DBAPI-level exception, such as InterfaceError, when the underlying connection has been closed and the execute() method is called. rrs rgraceful_disconnectsz&SuiteRequirements.graceful_disconnectsr_rc*tjS)zU Target must support simultaneous, independent database connections. rrs rindependent_connectionsz)SuiteRequirements.independent_connectionsr9rc*tjS)z Target must support simultaneous, independent database connections that will be used in a readonly fashion. rrs r independent_readonly_connectionsz2SuiteRequirements.independent_readonly_connectionsrdrc*tjS)z9Catchall for a large variety of MySQL on Windows failuresrrs rskip_mysql_on_windowsz'SuiteRequirements.skip_mysql_on_windowsrrc.tjdS)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. c.|jjSr=)optionslow_connectionsrLs rrCz2SuiteRequirements.ad_hoc_engines..s6>>99rrrs rad_hoc_enginesz SuiteRequirements.ad_hoc_enginess!! 9  rcHtj|jSr=)rr_running_on_windowsrs r no_windowszSuiteRequirements.no_windowss!!$":":"<==rc2tjddS)Nc0tjdk(S)NWindows)platformsystemrrrrCz7SuiteRequirements._running_on_windows..sHOO%2rzrunning on Windows) description)rLambdaPredicaters rrz%SuiteRequirements._running_on_windowss)) 2,  rc:ddlm}|jjSNrrL)rM add_to_markertiming_intensivers rrz"SuiteRequirements.timing_intensive##444rc.tjdS)Nc(tjdk7S)Nposix)osnamerrrrCz)SuiteRequirements.posix..s"''W*<rrrs rrzSuiteRequirements.posixs!!"<==rc:ddlm}|jjSr)rrMrmemory_intensivers rrz"SuiteRequirements.memory_intensiverrc0tjddS)z}Mark tests that use threading and mock at the same time - stability issues have been observed with coverage c.|jjSr=r has_coveragerLs rrCz7SuiteRequirements.threading_with_mock.. 6>>66rzStability issues with coveragerrs rthreading_with_mockz%SuiteRequirements.threading_with_mocks !! 6 ,  rc2d}tj|S)Nc: tdy#t$rYywxYwNzsqlalchemy-stubs.ext.mypyTF __import__ ImportErrorrLs rrz2SuiteRequirements.sqlalchemy2_stubs..check) 67    rDrs rsqlalchemy2_stubsz#SuiteRequirements.sqlalchemy2_stubs !!%((rc2d}tj|S)Nc: tdy#t$rYywxYwrrrLs rrz5SuiteRequirements.no_sqlalchemy2_stubs..checkrrrrs rno_sqlalchemy2_stubsz&SuiteRequirements.no_sqlalchemy2_stubsrrc2d}tj|S)Ncddl}ddl}t|d|j}|j d}|d|j ||f}t |tdS)Nr TypeAliasTypeTV TA_generic) type_params __value__)typingtyping_extensionsgetattrrTypeVarListhasattrint)rMr#r$rrr s rrz:SuiteRequirements.up_to_date_typealias_type..check/s^  $#):)H)HM%B&fkk"oB5J:c?K8 8rrDrs rup_to_date_typealias_typez+SuiteRequirements.up_to_date_typealias_type)s 9!!%((rc0tjddS)Nc"tjSr=)r py38rrrrCz,SuiteRequirements.python38..A DIIrzPython 3.8 or above requiredrDrs rpython38zSuiteRequirements.python38>!! =  rc0tjddS)Nc"tjSr=)r py39rrrrCz,SuiteRequirements.python39..Gr.rzPython 3.9 or above requiredrDrs rpython39zSuiteRequirements.python39Dr0rc0tjddS)Nc"tjSr=)r py310rrrrCz-SuiteRequirements.python310..M DJJrzPython 3.10 or above requiredrDrs r python310zSuiteRequirements.python310J!!  ?  rc0tjddS)Nc"tjSr=)r py311rrrrCz-SuiteRequirements.python311..Sr8rzPython 3.11 or above requiredrDrs r python311zSuiteRequirements.python311Pr:rc0tjddS)Nc"tjSr=)r py312rrrrCz-SuiteRequirements.python312..Yr8rzPython 3.12 or above requiredrDrs r python312zSuiteRequirements.python312Vr:rc0tjddS)Nc6tjjSr=)r compatpy314b1rrrrCz4SuiteRequirements.fail_python314b1.._sDKK''rzFails as of python 3.14.0b1rrs rfail_python314b1z"SuiteRequirements.fail_python314b1\s"" ')F  rc0tjddS)a This requirement is interim to assist with backporting of issue #12405. SQLAlchemy 2.0 still includes the ``await_fallback()`` method that makes use of ``asyncio.get_event_loop_policy()``. This is removed in SQLAlchemy 2.1. c"tjSr=)r py314rrrrCz1SuiteRequirements.not_python314..mr8rz"Python 3.14 or above not supportedrrs r not_python314zSuiteRequirements.not_python314bs!!  D  rc0tjddS)Nc"tjSr=)r cpythonrrrrCz+SuiteRequirements.cpython..ss DLLrzcPython interpreter neededrDrs rrNzSuiteRequirements.cpythonps!! ">  rc0tjddS)Nc$tj Sr=)r freethreadingrrrrCz/SuiteRequirements.gil_enabled..ys***rzGIL-enabled build neededrDrs r gil_enabledzSuiteRequirements.gil_enabledvs!! *,F  rc0tjddS)Nc"tjSr=)r is64bitrrrrCz+SuiteRequirements.is64bit..~s $,,rz64bit requiredrDrs rrUzSuiteRequirements.is64bit|s!!"68HIIrc4d}tj|dS)Nc: tdy#t$rYywxYw)NpatchTFrrrr check_libz2SuiteRequirements.patch_library..check_libs( 7#  rzpatch library neededrD)rrYs r patch_libraryzSuiteRequirements.patch_librarys !!)-CDDrc4|j|jzS)ztarget platform must remove all cycles unconditionally when gc.collect() is called, as well as clean out unreferenced subclasses. )rNrRrs rpredictable_gcz SuiteRequirements.predictable_gcs ||d....rc0tjddS)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. c.|jjSr=r rLs rrCz/SuiteRequirements.no_coverage..r rz(Issues observed when coverage is enabledrrs r no_coveragezSuiteRequirements.no_coverages!! 6 6  rcyNFrrs r_has_mysql_on_windowsz'SuiteRequirements._has_mysql_on_windowsrcyrarrs r_has_mysql_fully_case_sensitivez1SuiteRequirements._has_mysql_fully_case_sensitivercrc4tjfdS)Nc&j Sr=) _has_sqlitersrrCz*SuiteRequirements.sqlite..sd.>.>.@*@rrrs`rsqlitezSuiteRequirements.sqlites!!"@AArc0tjddS)Nc,tj Sr=)r has_compiled_extrrrrCz/SuiteRequirements.cextensions..s--//rzCython extensions not installedrrs r cextensionszSuiteRequirements.cextensionss!! / -  rc@ddlm} |dy#t$rYywxYw)Nrr z sqlite://TF) sqlalchemyr r)rr s rrhzSuiteRequirements._has_sqlites',  + &  s  c*tjS)z@dialect makes use of await_() to invoke operations on the DBAPI.r"rs r async_dialectzSuiteRequirements.async_dialectr%rc|jSr=)greenletrs rrzSuiteRequirements.asyncios }}rc2d}tj|S)Nc, ddl}y#t$rYywxYw)NrFT)rsrrMrss rrNz)SuiteRequirements.no_greenlet..gos#   s  rDrOs r no_greenletzSuiteRequirements.no_greenlets !!"%%rc2d}tj|S)NcNtjsy ddl}y#t$rYywxYw)NFrT) _test_asyncioENABLE_ASYNCIOrsrrvs rrNz&SuiteRequirements.greenlet..gos/ //   s  $$rDrOs rrszSuiteRequirements.greenlets !!"%%rc*tjS)zSupports computed columnsr"rs rcomputed_columnsz"SuiteRequirements.computed_columnsrwrc*tjS)z/Supports computed columns with `persisted=True`r"rs rcomputed_columns_storedz)SuiteRequirements.computed_columns_storedrwrc*tjS)z0Supports computed columns with `persisted=False`r"rs rcomputed_columns_virtualz*SuiteRequirements.computed_columns_virtualrwrc*tjS)zSIf the default persistence is virtual or stored when `persisted` is omittedr"rs r"computed_columns_default_persistedz4SuiteRequirements.computed_columns_default_persistedr%rc*tjS)zTIf persistence information is returned by the reflection of computed columnsr"rs r"computed_columns_reflect_persistedz4SuiteRequirements.computed_columns_reflect_persistedr%rc*tjS)z1If a backend supports the DISTINCT ON in a selectr"rs rsupports_distinct_onz&SuiteRequirements.supports_distinct_onrwrc0tjddS)a Supports some form of "x IS [NOT] DISTINCT FROM y" construct. Different dialects will implement their own flavour, e.g., sqlite will emit "x IS NOT y" instead of "x IS DISTINCT FROM y". .. seealso:: :meth:`.ColumnOperators.is_distinct_from` cD|jjj Sr=)rJrsupports_is_distinct_fromrLs rrCz=SuiteRequirements.supports_is_distinct_from.. svyy00JJJrz4driver doesn't support an IS DISTINCT FROM constructrrs rrz+SuiteRequirements.supports_is_distinct_froms!! J B  rc*tjS)zKIf a backend supports GENERATED { ALWAYS | BY DEFAULT } AS IDENTITYr"rs ridentity_columnsz"SuiteRequirements.identity_columnsr%rc*tjS)zIf a backend supports GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY with a standard syntax. This is mainly to exclude MSSql. r"rs ridentity_columns_standardz+SuiteRequirements.identity_columns_standardrrc*tjS)z+backend supports the regexp_match operator.r"rs r regexp_matchzSuiteRequirements.regexp_matchrwrc*tjS)z-backend supports the regexp_replace operator.r"rs rregexp_replacez SuiteRequirements.regexp_replace#rwrc*tjS)z(backend supports the fetch first clause.r"rs r fetch_firstzSuiteRequirements.fetch_first(rwrc*tjS)z5backend supports the fetch first clause with percent.r"rs r fetch_percentzSuiteRequirements.fetch_percent-rwrc*tjS)z2backend supports the fetch first clause with ties.r"rs r fetch_tieszSuiteRequirements.fetch_ties2rwrc*tjS)z1backend supports the fetch first without order byr"rs rfetch_no_order_byz#SuiteRequirements.fetch_no_order_by7rwrc*tjS)zwbackend supports the offset when using fetch first with percent or ties. basically this is "not mssql" r"rs rfetch_offset_with_optionsz+SuiteRequirements.fetch_offset_with_options<r.rc*tjS)zbackend supports fetch / offset with expression in them, like SELECT * FROM some_table OFFSET 1 + 1 ROWS FETCH FIRST 1 + 1 ROWS ONLY r"rs rfetch_expressionz"SuiteRequirements.fetch_expressionCrrc*tjS)zIf autoincrement=True on a column does not require an explicit sequence. This should be false only for oracle. rrs rautoincrement_without_sequencez0SuiteRequirements.autoincrement_without_sequenceLr9rc*tjS)z=If X[Y] can be implemented with ``__class_getitem__``. py3.7+rrs rgeneric_classesz!SuiteRequirements.generic_classesSrrc*tjS)z@indicates if the json_deserializer function is called with bytesr"rs rjson_deserializer_binaryz*SuiteRequirements.json_deserializer_binaryXrwrc*tjS)z6Target database must support reflecting table_options.r"rs rreflect_table_optionsz'SuiteRequirements.reflect_table_options]rwrc*tjS)z0Target database must support MATERIALIZED VIEWs.r"rs rmaterialized_viewsz$SuiteRequirements.materialized_viewsbrwrc*tjS)z/Target database reflect MATERIALIZED VIEWs pks.r"rs rmaterialized_views_reflect_pkz/SuiteRequirements.materialized_views_reflect_pkgrwrc*tjS)z#Target database supports bitwise orr"rs rsupports_bitwise_orz%SuiteRequirements.supports_bitwise_orlrwrc*tjS)z$Target database supports bitwise andr"rs rsupports_bitwise_andz&SuiteRequirements.supports_bitwise_andqrwrc*tjS)z$Target database supports bitwise notr"rs rsupports_bitwise_notz&SuiteRequirements.supports_bitwise_notvrwrc*tjS)z$Target database supports bitwise xorr"rs rsupports_bitwise_xorz&SuiteRequirements.supports_bitwise_xor{rwrc*tjS)z4Target database supports bitwise left or right shiftr"rs rsupports_bitwise_shiftz(SuiteRequirements.supports_bitwise_shiftrwrc*tjS)zNTarget backend supports custom ESCAPE characters with LIKE comparisonsrrs r like_escapeszSuiteRequirements.like_escapesrrN)rrrpropertyrr r$r'r)r+r-r0r2r4r6r8r;r>rFrPrRrTrVrXrZr\r^rarcrfrirlrnrprrrtrvryr{r}rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr r rrrrrrrrrr!r#r%r'r)r+r-r/r1r3r5r7r9r;r=r?rArCrErGrIrKrMrOrQrSrUrWrYr[r]r_rarcrfrhrjrlrnrprrrtrwryr{rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr*r/r4r9r>rBrGrKrNrRrUrZr\r_rbrerirmrhrqrrwrsr}rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr%s !! !! ## ## ## !! ## ## ##  # #!!&!! ## ##  &&!! !! !! !! !!!! !!!!!! ! ! ! !## !! ## !! !!######## #### ## !!  ! ! ! !          "" !!             ##!!     !!!!  # ####### JJ ##  # #####     77           ##!!## ## #### ##  ## !!!!##########!!**####!!##!!##!!!! ## ###### !!####!!!! ##!!!!## !!####!! ## ## !!!!!!!! ## ++## !! !! ## !! !! !!!!"#### ##$L&&(&&$####  !!##!! ## !! ##??## ## !!$ ! !!!!!#### ##!! ! !!!!!!! !! !!!! !! !!## ## ####!!"##  # # ! !## ))$!! !!!! !!!!    >> 55 >>55    ) ) ) )))(                    JJ E E//    BB  ##  & & & &######## ## ##    ## ################ ##!! !!##################!!rr)__doc__ __future__rrrrrrzrrr r rKr rrrrrrs?# &  d! d!r