o
    y¬´\“f  ã                   @   sH   d Z ddlZddlmZ ddlmZ G dd„ deƒZG d	d
„ d
eƒZdS )zóGlobal 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   e Zd ZdS )ÚRequirementsN)Ú__name__Ú
__module__Ú__qualname__© r
   r
   úQ/var/www/html/env/lib/python3.10/site-packages/sqlalchemy/testing/requirements.pyr      s    r   c                   @   sÔ  e Zd Zedd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZed	d
„ ƒZedd„ ƒZ	edd„ ƒZ
edd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZedd „ ƒZed!d"„ ƒZed#d$„ ƒZed%d&„ ƒZed'd(„ ƒZed)d*„ ƒZed+d,„ ƒZed-d.„ ƒZed/d0„ ƒZed1d2„ ƒZed3d4„ ƒZed5d6„ ƒZed7d8„ ƒZed9d:„ ƒZ ed;d<„ ƒZ!ed=d>„ ƒZ"ed?d@„ ƒZ#edAdB„ ƒZ$edCdD„ ƒZ%edEdF„ ƒZ&edGdH„ ƒZ'edIdJ„ ƒZ(edKdL„ ƒZ)edMdN„ ƒZ*edOdP„ ƒZ+edQdR„ ƒZ,edSdT„ ƒZ-edUdV„ ƒZ.edWdX„ ƒZ/edYdZ„ ƒZ0ed[d\„ ƒZ1ed]d^„ ƒZ2ed_d`„ ƒZ3edadb„ ƒZ4edcdd„ ƒZ5ededf„ ƒZ6edgdh„ ƒZ7edidj„ ƒZ8edkdl„ ƒZ9edmdn„ ƒZ:edodp„ ƒZ;edqdr„ ƒZ<edsdt„ ƒZ=edudv„ ƒZ>edwdx„ ƒZ?edydz„ ƒZ@ed{d|„ ƒZAed}d~„ ƒZBedd€„ ƒZCed�d‚„ ƒZDedƒd„„ ƒZEed…d†„ ƒZFed‡dˆ„ ƒZGed‰dŠ„ ƒZHed‹dŒ„ ƒZIed�dŽ„ ƒZJed�d�„ ƒZKed‘d’„ ƒZLed“d”„ ƒZMed•d–„ ƒZNed—d˜„ ƒZOed™dš„ ƒZPed›dœ„ ƒZQed�dž„ ƒZRedŸd „ ƒZSed¡d¢„ ƒZTed£d¤„ ƒZUed¥d¦„ ƒZVed§d¨„ ƒZWed©dª„ ƒZXed«d¬„ ƒZYed­d®„ ƒZZed¯d°„ ƒZ[ed±d²„ ƒZ\ed³d´„ ƒZ]edµd¶„ ƒZ^ed·d¸„ ƒZ_ed¹dº„ ƒZ`ed»d¼„ ƒZaed½d¾„ ƒZbed¿dÀ„ ƒZcedÁdÂ„ ƒZdedÃdÄ„ ƒZeedÅdÆ„ ƒZfedÇdÈ„ ƒZgedÉdÊ„ ƒZhedËdÌ„ ƒZiedÍdÎ„ ƒZjedÏdÐ„ ƒZkedÑdÒ„ ƒZldÓdÔ„ ZmedÕdÖ„ ƒZned×dØ„ ƒZoedÙdÚ„ ƒZpedÛdÜ„ ƒZqedÝdÞ„ ƒZredßdà„ ƒZsedádâ„ ƒZtedãdä„ ƒZuedådæ„ ƒZvedçdè„ ƒZwedédê„ ƒZxedëdì„ ƒZyedídî„ ƒZzdïdð„ Z{dñdò„ Z|edódô„ ƒZ}edõdö„ ƒZ~d÷dø„ Zdùdú„ Z€dûS )üÚSuiteRequirementsc                 C   ó   t  ¡ S )z/target platform can emit basic CreateTable DDL.©r   Úopen©Úselfr
   r
   r   Úcreate_table   ó   zSuiteRequirements.create_tablec                 C   r   )z-target platform can emit basic DropTable DDL.r   r   r
   r
   r   Ú
drop_table#   r   zSuiteRequirements.drop_tablec                 C   r   )z*Target database must support foreign keys.r   r   r
   r
   r   Úforeign_keys)   r   zSuiteRequirements.foreign_keysc                 C   r   )zR"target database must support ON UPDATE..CASCADE behavior in
        foreign keys.r   r   r
   r
   r   Úon_update_cascade/   ó   z#SuiteRequirements.on_update_cascadec                 C   r   )zWtarget database must *not* support ON UPDATE..CASCADE behavior in
        foreign keys.©r   Úclosedr   r
   r
   r   Únon_updating_cascade6   r   z&SuiteRequirements.non_updating_cascadec                 C   r   ©Nr   r   r
   r
   r   Údeferrable_fks<   ó   z SuiteRequirements.deferrable_fksc                    ó   t  ‡ fdd„¡S )Nc                      s   ˆ j jpˆ jjS r   )r   Úenabledr   r
   r   r
   r   Ú<lambda>F   s    z?SuiteRequirements.on_update_or_deferrable_fks.<locals>.<lambda>©r   Úonly_ifr   r
   r   r   Úon_update_or_deferrable_fks@   s   
ÿz-SuiteRequirements.on_update_or_deferrable_fksc                 C   r   )z;Target database must support self-referential foreign keys.r   r   r
   r
   r   Úself_referential_foreign_keysJ   r   z/SuiteRequirements.self_referential_foreign_keysc                 C   r   )z=Target database must support the DDL phrases for FOREIGN KEY.r   r   r
   r
   r   Úforeign_key_ddlP   r   z!SuiteRequirements.foreign_key_ddlc                 C   r   )z3target database must support names for constraints.r   r   r
   r
   r   Únamed_constraintsV   r   z#SuiteRequirements.named_constraintsc                 C   r   )z(Target database must support subqueries.r   r   r
   r
   r   Ú
subqueries\   r   zSuiteRequirements.subqueriesc                 C   r   )zRtarget database can render OFFSET, or an equivalent, in a
        SELECT.
        r   r   r
   r
   r   Úoffsetb   ó   zSuiteRequirements.offsetc                 C   r   )zWtarget database can render LIMIT and/or OFFSET using a bound
        parameter
        r   r   r
   r
   r   Úbound_limit_offsetj   r)   z$SuiteRequirements.bound_limit_offsetc                 C   r   )zÎTarget 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.

        r   r   r
   r
   r   Ú/parens_in_union_contained_select_w_limit_offsetr   ó   
zASuiteRequirements.parens_in_union_contained_select_w_limit_offsetc                 C   r   )al  Target 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.

        r   r   r
   r
   r   Ú0parens_in_union_contained_select_wo_limit_offset~   s   zBSuiteRequirements.parens_in_union_contained_select_wo_limit_offsetc                 C   r   )z;Target database must support boolean expressions as columnsr   r   r
   r
   r   Úboolean_col_expressionsŒ   r   z)SuiteRequirements.boolean_col_expressionsc                 C   r   )z,Target backends that support nulls ordering.r   r   r
   r
   r   Únullsordering’   r   zSuiteRequirements.nullsorderingc                 C   r   )zˆtarget database/driver supports bound parameters as column expressions
        without being in the context of a typed column.

        r   r   r
   r
   r   Ústandalone_binds˜   r)   z"SuiteRequirements.standalone_bindsc                 C   r   )z5Target database must support INTERSECT or equivalent.r   r   r
   r
   r   Ú	intersect    ó   zSuiteRequirements.intersectc                 C   r   )z?Target database must support EXCEPT or equivalent (i.e. MINUS).r   r   r
   r
   r   Úexcept_¥   r2   zSuiteRequirements.except_c                 C   r   )z.Target database must support window functions.r   r   r
   r
   r   Úwindow_functionsª   r2   z"SuiteRequirements.window_functionsc                 C   r   )zTarget database supports CTEsr   r   r
   r
   r   Úctes¯   r   zSuiteRequirements.ctesc                 C   r   )z™target database supports CTES that ride on top of a normal UPDATE
        or DELETE statement which refers to the CTE in a correlated subquery.

        r   r   r
   r
   r   Úctes_with_update_deleteµ   ó   z)SuiteRequirements.ctes_with_update_deletec                 C   r   )z}target database supports CTES which consist of INSERT, UPDATE
        or DELETE *within* the CTE, e.g. WITH x AS (UPDATE....)r   r   r
   r
   r   Úctes_on_dml¾   r   zSuiteRequirements.ctes_on_dmlc                 C   r   )z~target platform generates new surrogate integer primary key values
        when insert() is executed, excluding the pk column.r   r   r
   r
   r   Úautoincrement_insertÅ   r   z&SuiteRequirements.autoincrement_insertc                 C   r   )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.

        r   r   r
   r
   r   Úfetch_rows_post_commitÌ   s   z(SuiteRequirements.fetch_rows_post_commitc                 C   r   )z‰target platform supports SQL expressions in GROUP BY

        e.g.

        SELECT x + y AS somelabel FROM table GROUP BY x + y

        r   r   r
   r
   r   Úgroup_by_complex_expressionÙ   r,   z-SuiteRequirements.group_by_complex_expressionc                 C   ó   t  dd„ d¡S )Nc                 S   ó   | j jj S r   )ÚdbÚdialectÚsupports_sane_rowcount©Úconfigr
   r
   r   r    è   ó    z1SuiteRequirements.sane_rowcount.<locals>.<lambda>z&driver doesn't support 'sane' rowcount©r   Úskip_ifr   r
   r
   r   Úsane_rowcountå   ó   þzSuiteRequirements.sane_rowcountc                 C   r<   )Nc                 S   r=   r   )r>   r?   Úsupports_sane_multi_rowcountrA   r
   r
   r   r    ï   rC   z7SuiteRequirements.sane_multi_rowcount.<locals>.<lambda>z;driver %(driver)s %(doesnt_support)s 'sane' multi row count©r   Úfails_ifr   r
   r
   r   Úsane_multi_rowcountì   rG   z%SuiteRequirements.sane_multi_rowcountc                 C   r<   )Nc                 S   r=   r   )r>   r?   Ú supports_sane_rowcount_returningrA   r
   r
   r   r    ö   s   ÿz=SuiteRequirements.sane_rowcount_w_returning.<locals>.<lambda>z;driver doesn't support 'sane' rowcount when returning is onrI   r   r
   r
   r   Úsane_rowcount_w_returningó   s   üz+SuiteRequirements.sane_rowcount_w_returningc                 C   r<   )zatarget platform supports INSERT with no values, i.e.
        INSERT DEFAULT VALUES or equivalent.c                 S   s   | j jjp	| j jjS r   )r>   r?   Úsupports_empty_insertÚsupports_default_valuesrA   r
   r
   r   r      ó   
 
z1SuiteRequirements.empty_inserts.<locals>.<lambda>zempty inserts not supportedr!   r   r
   r
   r   Úempty_insertsü   s   ýzSuiteRequirements.empty_insertsc                 C   r   )z.target platform supports INSERT from a SELECT.r   r   r
   r
   r   Úinsert_from_select  r   z$SuiteRequirements.insert_from_selectc                 C   r<   )z#target platform supports RETURNING.c                 S   ó
   | j jjS r   )r>   r?   Úimplicit_returningrA   r
   r
   r   r      ó   
 z-SuiteRequirements.returning.<locals>.<lambda>z)%(database)s %(does_support)s 'returning'r!   r   r
   r
   r   Ú	returning  s   þzSuiteRequirements.returningc                 C   r   )zZTarget platform supports the syntax
        "(x, y) IN ((x1, y1), (x2, y2), ...)"
        r   r   r
   r
   r   Útuple_in  r)   zSuiteRequirements.tuple_inc                 C   r   )zwtarget platform supports a SELECT statement that has
        the same name repeated more than once in the columns list.r   r   r
   r
   r   Ú%duplicate_names_in_cursor_description  r   z7SuiteRequirements.duplicate_names_in_cursor_descriptionc                 C   r<   )z[Target database must have 'denormalized', i.e.
        UPPERCASE as case insensitive names.c                 S   r=   r   )r>   r?   Úrequires_name_normalizerA   r
   r
   r   r    +  rC   z6SuiteRequirements.denormalized_names.<locals>.<lambda>z,Backend does not require denormalized names.rD   r   r
   r
   r   Údenormalized_names%  ó   þz$SuiteRequirements.denormalized_namesc                 C   r<   )zTtarget database must support multiple VALUES clauses in an
        INSERT statement.c                 S   r=   r   )r>   r?   Úsupports_multivalues_insertrA   r
   r
   r   r    5  rC   z7SuiteRequirements.multivalues_inserts.<locals>.<lambda>z*Backend does not support multirow inserts.rD   r   r
   r
   r   Úmultivalues_inserts/  r[   z%SuiteRequirements.multivalues_insertsc                 C   r   )zw"target dialect implements the executioncontext.get_lastrowid()
        method without reliance on RETURNING.

        r   r   r
   r
   r   Úimplements_get_lastrowid9  r)   z*SuiteRequirements.implements_get_lastrowidc                 C   r   )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   r   r
   r
   r   Úemulated_lastrowidA  r,   z$SuiteRequirements.emulated_lastrowidc                 C   r   )z^"target platform includes a 'lastrowid' accessor on the DBAPI
        cursor object.

        r   r   r
   r
   r   Údbapi_lastrowidM  r)   z!SuiteRequirements.dbapi_lastrowidc                 C   r   )z#Target database must support VIEWs.r   r   r
   r
   r   ÚviewsU  r   zSuiteRequirements.viewsc                 C   r   )zXTarget database must support external schemas, and have one
        named 'test_schema'.r   r   r
   r
   r   Úschemas[  r   zSuiteRequirements.schemasc                 C   ó   t  dd„ gd¡S )z0Target dialect must support server side cursors.c                 S   rS   r   )r>   r?   Úsupports_server_side_cursorsrA   r
   r
   r   r    g  rU   z7SuiteRequirements.server_side_cursors.<locals>.<lambda>zno server side cursors supportr!   r   r
   r
   r   Úserver_side_cursorsb  ó   þz%SuiteRequirements.server_side_cursorsc                 C   rc   )z'Target database must support SEQUENCEs.c                 S   rS   r   )r>   r?   Úsupports_sequencesrA   r
   r
   r   r    p  rU   z-SuiteRequirements.sequences.<locals>.<lambda>zno sequence supportr!   r   r
   r
   r   Ú	sequencesk  rf   zSuiteRequirements.sequencesc                 C   rc   )zgTarget database supports sequences, but also optionally
        as a means of generating new PK values.c                 S   s   | j jjo	| j jjS r   )r>   r?   rg   Úsequences_optionalrA   r
   r
   r   r    {  rP   z6SuiteRequirements.sequences_optional.<locals>.<lambda>z.no sequence support, or sequences not optionalr!   r   r
   r
   r   ri   t  s
   ÿûz$SuiteRequirements.sequences_optionalc                 C   r   r   r   r   r
   r
   r   Úreflects_pk_names�  r   z#SuiteRequirements.reflects_pk_namesc                 C   r   r   r   r   r
   r
   r   Útable_reflection…  r   z"SuiteRequirements.table_reflectionc                 C   r   r   r   r   r
   r
   r   Úcomment_reflection‰  r   z$SuiteRequirements.comment_reflectionc                 C   ó   | j S )z¹target 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.

        ©ra   r   r
   r
   r   Úview_column_reflection�  s   z(SuiteRequirements.view_column_reflectionc                 C   rm   )zTtarget database must support inspection of the full CREATE VIEW definition.
        rn   r   r
   r
   r   Úview_reflection—  s   z!SuiteRequirements.view_reflectionc                 C   rm   r   )rb   r   r
   r
   r   Úschema_reflection�  s   z#SuiteRequirements.schema_reflectionc                 C   r   r   r   r   r
   r
   r   Ú!primary_key_constraint_reflection¡  r   z3SuiteRequirements.primary_key_constraint_reflectionc                 C   r   r   r   r   r
   r
   r   Ú!foreign_key_constraint_reflection¥  r   z3SuiteRequirements.foreign_key_constraint_reflectionc                 C   r   r   r   r   r
   r
   r   Ú1foreign_key_constraint_option_reflection_ondelete©  r   zCSuiteRequirements.foreign_key_constraint_option_reflection_ondeletec                 C   r   r   r   r   r
   r
   r   Ú1foreign_key_constraint_option_reflection_onupdate­  r   zCSuiteRequirements.foreign_key_constraint_option_reflection_onupdatec                 C   r   r   r   r   r
   r
   r   Útemp_table_reflection±  r   z'SuiteRequirements.temp_table_reflectionc                 C   r   )z8target dialect supports listing of temporary table namesr   r   r
   r
   r   Útemp_table_namesµ  r2   z"SuiteRequirements.temp_table_namesc                 C   r   )z)target database supports temporary tablesr   r   r
   r
   r   Útemporary_tablesº  r2   z"SuiteRequirements.temporary_tablesc                 C   r   )z(target database supports temporary viewsr   r   r
   r
   r   Útemporary_views¿  r2   z!SuiteRequirements.temporary_viewsc                 C   r   r   r   r   r
   r
   r   Úindex_reflectionÄ  r   z"SuiteRequirements.index_reflectionc                 C   r   )z>target database supports CREATE INDEX against SQL expressions.r   r   r
   r
   r   Úindexes_with_expressionsÈ  r2   z*SuiteRequirements.indexes_with_expressionsc                 C   r   )z8target dialect supports reflection of unique constraintsr   r   r
   r
   r   Úunique_constraint_reflectionÍ  r2   z.SuiteRequirements.unique_constraint_reflectionc                 C   r   )z7target dialect supports reflection of check constraintsr   r   r
   r
   r   Úcheck_constraint_reflectionÒ  r2   z-SuiteRequirements.check_constraint_reflectionc                 C   r   )z€target dialect raises IntegrityError when reporting an INSERT
        with a primary key violation.  (hint: it should)

        r   r   r
   r
   r   Ú$duplicate_key_raises_integrity_error×  r)   z6SuiteRequirements.duplicate_key_raises_integrity_errorc                 C   r   )z3Target database must support VARCHAR with no lengthr   r   r
   r
   r   Úunbounded_varcharß  r   z#SuiteRequirements.unbounded_varcharc                 C   r   )zµTarget database/dialect must support Python unicode objects with
        non-ASCII characters represented, delivered as bound parameters
        as well as in result rows.

        r   r   r
   r
   r   Úunicode_dataå  r7   zSuiteRequirements.unicode_datac                 C   r   )zRTarget driver must support some degree of non-ascii symbol
        names.
        r   r   r
   r
   r   Úunicode_ddlî  r   zSuiteRequirements.unicode_ddlc                 C   r   )z™target dialect supports rendering of a date, time, or datetime as a
        literal string, e.g. via the TypeEngine.literal_processor() method.

        r   r   r
   r
   r   Údatetime_literalsõ  r7   z#SuiteRequirements.datetime_literalsc                 C   r   )zUtarget dialect supports representation of Python
        datetime.datetime() objects.r   r   r
   r
   r   Údatetimeþ  r   zSuiteRequirements.datetimec                 C   r   )zftarget dialect supports representation of Python
        datetime.datetime() with microsecond objects.r   r   r
   r
   r   Údatetime_microseconds  r   z'SuiteRequirements.datetime_microsecondsc                 C   r   )zŒtarget dialect supports representation of Python
        datetime.datetime() with microsecond objects but only
        if TIMESTAMP is used.r   r   r
   r
   r   Útimestamp_microseconds  r   z(SuiteRequirements.timestamp_microsecondsc                 C   r   ©zutarget dialect supports representation of Python
        datetime.datetime() objects with historic (pre 1970) values.r   r   r
   r
   r   Údatetime_historic  r   z#SuiteRequirements.datetime_historicc                 C   r   )zQtarget dialect supports representation of Python
        datetime.date() objects.r   r   r
   r
   r   Údate  r   zSuiteRequirements.datec                 C   r   )zPtarget dialect accepts a datetime object as the target
        of a date column.r   r   r
   r
   r   Údate_coerces_from_datetime!  r   z,SuiteRequirements.date_coerces_from_datetimec                 C   r   r†   r   r   r
   r
   r   Údate_historic(  r   zSuiteRequirements.date_historicc                 C   r   )zQtarget dialect supports representation of Python
        datetime.time() objects.r   r   r
   r
   r   Útime/  r   zSuiteRequirements.timec                 C   r   )zbtarget dialect supports representation of Python
        datetime.time() with microsecond objects.r   r   r
   r
   r   Útime_microseconds6  r   z#SuiteRequirements.time_microsecondsc                 C   r   )zttarget database/driver can allow BLOB/BINARY fields to be compared
        against a bound parameter value.
        r   r   r
   r
   r   Úbinary_comparisons=  r)   z$SuiteRequirements.binary_comparisonsc                 C   r   )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.

        r   r   r
   r
   r   Úbinary_literalsE  ó   z!SuiteRequirements.binary_literalsc                 C   r   )z:target dialect supports 'AUTOCOMMIT' as an isolation_levelr   r   r
   r
   r   Ú
autocommitU  r2   zSuiteRequirements.autocommitc                 C   r   )z.target platform implements a native JSON type.r   r   r
   r
   r   Ú	json_typeZ  r   zSuiteRequirements.json_typec                 C   rm   )zO"target platform supports numeric array indexes
        within a JSON structure)r‘   r   r
   r
   r   Újson_array_indexes`  s   z$SuiteRequirements.json_array_indexesc                 C   r   )zRtarget backend has general support for moderately high-precision
        numerics.r   r   r
   r
   r   Úprecision_numerics_generalg  r   z,SuiteRequirements.precision_numerics_generalc                 C   r   )zbtarget backend supports Decimal() objects using E notation
        to represent very small values.r   r   r
   r
   r   Ú"precision_numerics_enotation_smallm  r   z4SuiteRequirements.precision_numerics_enotation_smallc                 C   r   )zbtarget backend supports Decimal() objects using E notation
        to represent very large values.r   r   r
   r
   r   Ú"precision_numerics_enotation_larges  r   z4SuiteRequirements.precision_numerics_enotation_largec                 C   r   )z†target backend supports values with many digits on both sides,
        such as 319438950232418390.273596, 87673.594069654243

        r   r   r
   r
   r   Ú*precision_numerics_many_significant_digitsy  r)   z<SuiteRequirements.precision_numerics_many_significant_digitsc                 C   r   )zhtarget database can select an aggregate from a subquery that's
        also using an aggregate

        r   r   r
   r
   r   Únested_aggregates�  r)   z#SuiteRequirements.nested_aggregatesc                 C   r   )zbtarget database must support ON DELETE CASCADE on a self-referential
        foreign key

        r   r   r
   r
   r   Úrecursive_fk_cascade‰  r)   z&SuiteRequirements.recursive_fk_cascadec                 C   r   )z£A 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   r   r
   r
   r   Ú-precision_numerics_retains_significant_digits‘  r)   z?SuiteRequirements.precision_numerics_retains_significant_digitsc                 C   r   )z�target backend will return native floating point numbers with at
        least seven decimal places when using the generic Float type.

        r   r   r
   r
   r   Úprecision_generic_float_type™  r)   z.SuiteRequirements.precision_generic_float_typec                 C   r   )zÀtarget 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).

        r   r   r
   r
   r   Úfloats_to_four_decimals¡  r7   z)SuiteRequirements.floats_to_four_decimalsc                 C   r   )z™target backend doesn't crash when you try to select a NUMERIC
        value that has a value of NULL.

        Added to support Pyodbc bug #351.
        r   r   r
   r
   r   Úfetch_null_from_numericª  s   z)SuiteRequirements.fetch_null_from_numericc                 C   r   )zUTarget database must support an unbounded Text() "
        "type such as TEXT or CLOBr   r   r
   r
   r   Ú	text_type´  r   zSuiteRequirements.text_typec                 C   r   )zTtarget database can persist/return an empty string with a
        varchar.

        r   r   r
   r
   r   Úempty_strings_varchar»  r)   z'SuiteRequirements.empty_strings_varcharc                 C   r   )zRtarget database can persist/return an empty string with an
        unbounded text.r   r   r
   r
   r   Úempty_strings_textÃ  r   z$SuiteRequirements.empty_strings_textc                 C   r   )z;target driver must support the literal statement 'select 1'r   r   r
   r
   r   Ú	selectoneÊ  r2   zSuiteRequirements.selectonec                 C   r   )z(Target database must support savepoints.r   r   r
   r
   r   Ú
savepointsÏ  r   zSuiteRequirements.savepointsc                 C   r   )z4Target database must support two-phase transactions.r   r   r
   r
   r   Útwo_phase_transactionsÕ  r   z(SuiteRequirements.two_phase_transactionsc                 C   r   )z'Target must support UPDATE..FROM syntaxr   r   r
   r
   r   Úupdate_fromÛ  r2   zSuiteRequirements.update_fromc                 C   r   )z=Target must support DELETE FROM..FROM or DELETE..USING syntaxr   r   r
   r
   r   Údelete_fromà  r2   zSuiteRequirements.delete_fromc                 C   r   )a¢  Target 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::

            UPDATE documents SET flag=1 WHERE documents.title IN
                (SELECT max(documents.title) AS title
                    FROM documents GROUP BY documents.user_id
                )

        r   r   r
   r
   r   Úupdate_where_target_in_subqueryå  r�   z1SuiteRequirements.update_where_target_in_subqueryc                 C   r   )zOtarget database must use a plain percent '%' as the 'modulus'
        operator.r   r   r
   r
   r   Úmod_operator_as_percent_signõ  r   z.SuiteRequirements.mod_operator_as_percent_signc                 C   r   )a  target 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   r   r
   r
   r   Úpercent_schema_namesû  r,   z&SuiteRequirements.percent_schema_namesc                 C   r   )a  target backend supports ORDER BY a column label within an
        expression.

        Basically this::

            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   r   r
   r
   r   Úorder_by_label_with_expression  s   z0SuiteRequirements.order_by_label_with_expressionc                    s   ‡ fdd„}t  |¡S )Nc                    s&   zˆ   | ¡ W dS  ty   Y dS w )NFT)Úget_order_by_collationÚNotImplementedErrorrA   r   r
   r   Úcheck  s   
ÿz3SuiteRequirements.order_by_collation.<locals>.checkrD   )r   r«   r
   r   r   Úorder_by_collation  s   
z$SuiteRequirements.order_by_collationc                 C   s   t ƒ ‚r   )rª   ©r   rB   r
   r
   r   r©   !  s   z(SuiteRequirements.get_order_by_collationc                 C   r   )zUTarget driver must support non-ASCII characters being passed at
        all.
        r   r   r
   r
   r   Úunicode_connections$  r   z%SuiteRequirements.unicode_connectionsc                 C   r   )zµTarget driver must raise a DBAPI-level exception, such as
        InterfaceError, when the underlying connection has been closed
        and the execute() method is called.
        r   r   r
   r
   r   Úgraceful_disconnects+  r)   z&SuiteRequirements.graceful_disconnectsc                 C   r   )z9Catchall for a large variety of MySQL on Windows failuresr   r   r
   r
   r   Úskip_mysql_on_windows3  r2   z'SuiteRequirements.skip_mysql_on_windowsc                 C   s   t  dd„ ¡S )a   Test 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                 S   ó   | j jS r   )ÚoptionsÚlow_connectionsrA   r
   r
   r   r    B  ó    z2SuiteRequirements.ad_hoc_engines.<locals>.<lambda>rD   r   r
   r
   r   Úad_hoc_engines8  s   	ÿz SuiteRequirements.ad_hoc_enginesc                 C   ó
   t  d¡S )NÚtiming_intensive©r   Úrequires_tagr   r
   r
   r   r·   E  ó   
z"SuiteRequirements.timing_intensivec                 C   r¶   )NÚmemory_intensiver¸   r   r
   r
   r   r»   I  rº   z"SuiteRequirements.memory_intensivec                 C   r<   )zŠMark tests that use threading and mock at the same time - stability
        issues have been observed with coverage + python 3.3

        c                 S   s   t jo| jjS r   )r   Úpy3kr²   Úhas_coveragerA   r
   r
   r   r    T  s    z7SuiteRequirements.threading_with_mock.<locals>.<lambda>z%Stability issues with coverage + py3krD   r   r
   r
   r   Úthreading_with_mockM  s   þz%SuiteRequirements.threading_with_mockc                 C   r<   )Nc                   S   s
   t jdkS ©N)é   ©ÚsysÚversion_infor
   r
   r
   r   r    [  rU   z+SuiteRequirements.python2.<locals>.<lambda>z Python version 2.xx is required.rD   r   r
   r
   r   Úpython2X  rG   zSuiteRequirements.python2c                 C   r<   )Nc                   S   s
   t jdk S r¿   rÁ   r
   r
   r
   r   r    b  rU   z+SuiteRequirements.python3.<locals>.<lambda>z Python version 3.xx is required.rD   r   r
   r
   r   Úpython3_  ó   ÿzSuiteRequirements.python3c                 C   r<   )Nc                   S   s   t jS r   )r   Úcpythonr
   r
   r
   r   r    h  s    z+SuiteRequirements.cpython.<locals>.<lambda>zcPython interpreter neededr!   r   r
   r
   r   rÇ   e  rÆ   zSuiteRequirements.cpythonc                    s    ddl m‰  t ‡ fdd„d¡S )Nr   ©Úpicklec                      s   t j r	ˆ jdkptjdkS )NÚcPickle)rÀ   r   )r   Úpypyr   rÂ   rÃ   r
   rÈ   r
   r   r    p  s    ÿ
z5SuiteRequirements.non_broken_pickle.<locals>.<lambda>z.Needs cPickle+cPython or newer Python 3 pickle)Úsqlalchemy.utilrÉ   r   r"   r   r
   rÈ   r   Únon_broken_picklek  s
   
üz#SuiteRequirements.non_broken_picklec                 C   rm   )z“target platform must remove all cycles unconditionally when
        gc.collect() is called, as well as clean out unreferenced subclasses.

        )rÇ   r   r
   r
   r   Úpredictable_gcv  s   z SuiteRequirements.predictable_gcc                 C   r<   )zÂTest 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                 S   r±   r   )r²   r½   rA   r
   r
   r   r    ‡  r´   z/SuiteRequirements.no_coverage.<locals>.<lambda>z(Issues observed when coverage is enabledrD   r   r
   r
   r   Úno_coverage~  s   þzSuiteRequirements.no_coveragec                 C   ó   dS ©NFr
   r­   r
   r
   r   Ú_has_mysql_on_windows‹  ó   z'SuiteRequirements._has_mysql_on_windowsc                 C   rÐ   rÑ   r
   r­   r
   r
   r   Ú_has_mysql_fully_case_sensitiveŽ  rÓ   z1SuiteRequirements._has_mysql_fully_case_sensitivec                    r   )Nc                      ó
   ˆ   ¡  S r   )Ú_has_sqliter
   r   r
   r   r    “  rU   z*SuiteRequirements.sqlite.<locals>.<lambda>rD   r   r
   r   r   Úsqlite‘  s   zSuiteRequirements.sqlitec                    s   t  ‡ fdd„d¡S )Nc                      rÕ   r   )Ú_has_cextensionsr
   r   r
   r   r    ˜  rU   z/SuiteRequirements.cextensions.<locals>.<lambda>zC extensions not installedrD   r   r
   r   r   Úcextensions•  s   ÿzSuiteRequirements.cextensionsc                 C   s0   ddl m} z|dƒ W dS  ty   Y dS w )Nr   )Úcreate_enginez	sqlite://TF)Ú
sqlalchemyrÚ   ÚImportError)r   rÚ   r
   r
   r   rÖ   ›  s   ÿzSuiteRequirements._has_sqlitec                 C   s,   zddl m}m} W dS  ty   Y dS w )Nr   )ÚcresultproxyÚcprocessorsTF)rÛ   rÝ   rÞ   rÜ   )r   rÝ   rÞ   r
   r
   r   rØ   ¤  s   ÿz"SuiteRequirements._has_cextensionsN)�r   r   r	   Úpropertyr   r   r   r   r   r   r#   r$   r%   r&   r'   r(   r*   r+   r-   r.   r/   r0   r1   r3   r4   r5   r6   r8   r9   r:   r;   rF   rK   rM   rQ   rR   rV   rW   rX   rZ   r]   r^   r_   r`   ra   rb   re   rh   ri   rj   rk   rl   ro   rp   rq   rr   rs   rt   ru   rv   rw   rx   ry   rz   r{   r|   r}   r~   r   r€   r�   r‚   rƒ   r„   r…   r‡   rˆ   r‰   rŠ   r‹   rŒ   r�   rŽ   r�   r‘   r’   r“   r”   r•   r–   r—   r˜   r™   rš   r›   rœ   r�   rž   rŸ   r    r¡   r¢   r£   r¤   r¥   r¦   r§   r¨   r¬   r©   r®   r¯   r°   rµ   r·   r»   r¾   rÄ   rÅ   rÇ   rÍ   rÎ   rÏ   rÒ   rÔ   r×   rÙ   rÖ   rØ   r
   r
   r
   r   r      sì   






	





























	
	











	










































	






























	r   )Ú__doc__rÂ   Ú r   r   Úobjectr   r   r
   r
   r
   r   Ú<module>   s   
