U
    db5                     @   s4   d dl Z d dlmZ d dlmZ G dd deZdS )    N)BaseDatabaseFeatures)cached_propertyc                       s  e Zd ZdZdZdZdZdZdZdZ	dZ
dZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZedd Zedd	 Zed
d Z dZ!edd Z"edd Z#edd Z$edd Z%edd Z&e fddZ'edd Z(e)e*+dZ,edd Z-edd Z.ed d! Z/e)e*+d"Z0ed#d$ Z1e)e*+d%Z2ed&d' Z3ed(d) Z4ed*d+ Z5ed,d- Z6ed.d/ Z7ed0d1 Z8ed2d3 Z9e)e*+d4Z:e)e*+d4Zed5d6 Z;ed7d8 Z<ed9d: Z=ed;d< Z>ed=d> Z?ed?d@ Z@edAdB ZA  ZBS )CDatabaseFeatures TFz
        CREATE PROCEDURE test_procedure ()
        BEGIN
            DECLARE V_I INTEGER;
            SET V_I = 1;
        END;
    z
        CREATE PROCEDURE test_procedure (P_I INTEGER)
        BEGIN
            DECLARE V_I INTEGER;
            SET V_I = P_I;
        END;
    c                 C   s   | j jrdS dS d S )N)
      )      
connectionmysql_is_mariadbselfr   r   E/tmp/pip-unpacked-wheel-7vj2equ7/django/db/backends/mysql/features.pyminimum_database_version4   s    z)DatabaseFeatures.minimum_database_versionc                 C   s0   | j jr| j jdk s(| j js,| j jdk r,dS dS )Nr         z
 FROM DUAL r   r   mysql_versionr   r   r   r   bare_select_suffix;   s    

z#DatabaseFeatures.bare_select_suffixc                 C   sN   d}| j jr| j jdks,| j js0| j jdkr0d}| d| d| ddS )	Nutf8r      )r   r      Zutf8mb3Z_general_ciZ_esperanto_ciZ_swedish_ci)ciZnon_defaultZ
swedish_cir   )r   charsetr   r   r   test_collationsF   s    

z DatabaseFeatures.test_collationsZUTC_TIMESTAMPc                 C   s.  ddhddhdhdhddhd	}d
| j jkr>|dddhi | j jsj| j jdk rj|ddhddhd | j jrd| j j  k rdk rn n|ddhi | j jrd| j j  k rdk rn n|ddhi | j jr| j jdk s| j js| j jdk r|dddd hi | js*|d!d"hi |S )#NzLdb_functions.comparison.test_greatest.GreatestTests.test_coalesce_workaroundzFdb_functions.comparison.test_least.LeastTests.test_coalesce_workaroundz5model_fields.test_textfield.TextFieldTests.test_emojiz4model_fields.test_charfield.TestCharField.test_emojiz;schema.tests.SchemaTests.test_func_index_json_key_transformzDexpressions.tests.FTimeDeltaTests.test_durationfield_multiply_dividezGupdate.tests.AdvancedTests.test_update_ordered_by_inline_m2m_annotationz@update.tests.AdvancedTests.test_update_ordered_by_m2m_annotation)zThis doesn't work on MySQL.z4Running on MySQL requires utf8mb4 encoding (#18392).zHMySQL doesn't support functional indexes on a function that returns JSONzkMySQL supports multiplying and dividing DurationFields by a scalar value but it's not implemented (#25287).zWUPDATE ... ORDER BY syntax on MySQL/MariaDB does not support ordering byrelated fields.ZONLY_FULL_GROUP_BYzjGROUP BY optimization does not work properly when ONLY_FULL_GROUP_BY mode is enabled on MySQL, see #31331.zTaggregation.tests.AggregateTestCase.test_aggregation_subquery_annotation_multivaluedzSannotations.tests.NonAggregateAnnotationTestCase.test_annotation_aggregate_with_m2or   zSaggregation.tests.AggregateTestCase.test_aggregation_default_using_time_from_pythonzWaggregation.tests.AggregateTestCase.test_aggregation_default_using_datetime_from_pythonzUaggregation.tests.AggregateTestCase.test_aggregation_default_using_time_from_databasezYaggregation.tests.AggregateTestCase.test_aggregation_default_using_datetime_from_database)zBCasting to datetime/time is not supported by MySQL < 8.0. (#30224)zBMySQL < 8.0 returns string type instead of datetime/time. (#30224))r   r   r   r   r      z*https://jira.mariadb.org/browse/MDEV-19598zCschema.tests.SchemaTests.test_alter_not_unique_field_to_primary_key)r   r      )r   r   z*https://jira.mariadb.org/browse/MDEV-22775zBschema.tests.SchemaTests.test_alter_pk_with_self_referential_fieldr   zPParenthesized combined queries are not supported on MySQL < 8 and MariaDB < 10.4zLqueries.test_qs_combinators.QuerySetSetOperationTests.test_union_in_subqueryz]queries.test_qs_combinators.QuerySetSetOperationTests.test_union_in_subquery_related_outerrefzQqueries.test_qs_combinators.QuerySetSetOperationTests.test_union_in_with_orderingz%MariaDB and MySQL >= 8.0.18 specific.z4queries.test_explain.ExplainTests.test_mysql_analyze)r   sql_modeupdater   r   supports_explain_analyze)r   skipsr   r   r   django_test_skipsZ   s    



	

z"DatabaseFeatures.django_test_skipsc                 C   s   | j jd S )zGInternal method used in Django tests. Don't rely on this from your codeZdefault_storage_enginer   Zmysql_server_datar   r   r   r   _mysql_storage_engine   s    z&DatabaseFeatures._mysql_storage_enginec                 C   s   d| j jkS )zt
        Autoincrement primary key can be set to 0 if it doesn't generate new
        autoincrement values.
        ZNO_AUTO_VALUE_ON_ZERO)r   r#   r   r   r   r   allows_auto_pk_0   s    z!DatabaseFeatures.allows_auto_pk_0c                 C   s   | j jo| j jdkS )N)r   r   r!   r   r   r   r   r   update_can_self_select   s    z'DatabaseFeatures.update_can_self_selectc                 C   s
   | j dkS )z-Confirm support for introspected foreign keysMyISAMr)   r   r   r   r   can_introspect_foreign_keys   s    z,DatabaseFeatures.can_introspect_foreign_keysc                    s   t  jdddddS )NZ	TextFieldZIntegerFieldZBigIntegerFieldZ	CharField)ZBinaryFieldZBooleanFieldZDurationFieldZGenericIPAddressField)superintrospected_field_typesr   	__class__r   r   r0      s    z)DatabaseFeatures.introspected_field_typesc                 C   s   | j jo| j jdkS )N)r   r   r   r   r   r   r   r   can_return_columns_from_insert   s    z/DatabaseFeatures.can_return_columns_from_insertr3   c                 C   s   | j jd S )Nhas_zoneinfo_databaser(   r   r   r   r   r4      s    z&DatabaseFeatures.has_zoneinfo_databasec                 C   s   | j jd S )NZsql_auto_is_nullr(   r   r   r   r   is_sql_auto_is_null_enabled  s    z,DatabaseFeatures.is_sql_auto_is_null_enabledc                 C   s   | j jrdS | j jdkS )NT)r   r   r!   r   r   r   r   r   supports_over_clause  s    z%DatabaseFeatures.supports_over_clauser6   c                 C   s   | j jrdS | j jdkS )NTr   r      r   r   r   r   r   !supports_column_check_constraints  s    z2DatabaseFeatures.supports_column_check_constraintsr9   c                 C   s$   | j jr| j j}|dkS | j jdkS )N)r   r   r   r7   r   )r   versionr   r   r    can_introspect_check_constraints  s    z1DatabaseFeatures.can_introspect_check_constraintsc                 C   s    | j jr| j jdkS | j jdkS )Nr   r   r      r   r   r   r   r   !has_select_for_update_skip_locked!  s    z2DatabaseFeatures.has_select_for_update_skip_lockedc                 C   s   | j jrdS | j jdkS )NTr<   r   r   r   r   r   has_select_for_update_nowait'  s    z-DatabaseFeatures.has_select_for_update_nowaitc                 C   s   | j j o| j jdkS )Nr<   r   r   r   r   r   has_select_for_update_of-  s    

z)DatabaseFeatures.has_select_for_update_ofc                 C   s   | j jp| j jdkS )N)r   r      r   r   r   r   r   r%   4  s    z)DatabaseFeatures.supports_explain_analyzec                 C   s,   dddh}| j js(| j jdkr(|d |S )NZJSONZTEXTZTRADITIONALr7   ZTREE)r   r   r   add)r   formatsr   r   r   supported_explain_formats<  s    

z*DatabaseFeatures.supported_explain_formatsc                 C   s
   | j dkS )zI
        All storage engines except MyISAM support transactions.
        r,   r-   r   r   r   r   supports_transactionsI  s    z&DatabaseFeatures.supports_transactionsrE   c                 C   s   | j jd S )NZlower_case_table_namesr(   r   r   r   r   ignores_table_name_caseS  s    z(DatabaseFeatures.ignores_table_name_casec                 C   s
   | j j S Nr
   r   r   r   r   supports_default_in_lead_lagW  s    z-DatabaseFeatures.supports_default_in_lead_lagc                 C   s   | j jrdS | j jdkS )NT)r   r	   r   r   r   r   r   r   supports_json_field\  s    z$DatabaseFeatures.supports_json_fieldc                 C   s   | j jr| jo| jS | jS rG   )r   r   rI   r;   r   r   r   r   can_introspect_json_fieldb  s    z*DatabaseFeatures.can_introspect_json_fieldc                 C   s.   | j dkrdS | jjr"| jjdkS | jjdkS )NZInnoDBF)r   r   r<   )r)   r   r   r   r   r   r   r   supports_index_column_orderingh  s
    
z/DatabaseFeatures.supports_index_column_orderingc                 C   s    | j j o| jdko| j jdkS )Nr,   )r   r      )r   r   r)   r   r   r   r   r   supports_expression_indexesp  s
    

z,DatabaseFeatures.supports_expression_indexesc                 C   s   | j jr| j jdkS dS )Nr    Tr   r   r   r   r   can_rename_indexx  s    z!DatabaseFeatures.can_rename_index)C__name__
__module____qualname__Zempty_fetchmany_valueZallows_group_by_pkZrelated_fields_match_typeZallow_sliced_subqueries_with_inZhas_select_for_updateZsupports_forward_referencesZsupports_regex_backreferencingZ!supports_date_lookup_using_stringZsupports_timezonesZ-requires_explicit_null_ordering_when_groupingZcan_release_savepointsZatomic_transactionsZcan_clone_databasesZsupports_temporal_subtractionZsupports_select_intersectionZsupports_select_differenceZ%supports_slicing_ordering_in_compoundZsupports_index_on_text_fieldZsupports_update_conflictsZ(create_test_procedure_without_params_sqlZ(create_test_procedure_with_int_param_sqlZsupports_partial_indexesZcollate_as_index_expressionZ supports_order_by_nulls_modifierZorder_by_nulls_firstZsupports_logical_xorr   r   r   r   Ztest_now_utc_templater'   r)   r*   r+   r.   r0   r3   propertyoperator
attrgetterZ can_return_rows_from_bulk_insertr4   r5   r6   Z#supports_frame_range_fixed_distancer9   Z supports_table_check_constraintsr;   r>   r?   r@   r%   rD   rE   Zuses_savepointsrF   rH   rI   rJ   rK   rM   rN   __classcell__r   r   r1   r   r      s   




s



	

















r   )rS   Z django.db.backends.base.featuresr   Zdjango.utils.functionalr   r   r   r   r   r   <module>   s   