U
    û‚ºev  ã                   @   sP   d dl Z d dlmZmZ d dlmZ d dlmZ d dlm	Z	 G dd„ deƒZ
dS )é    N)Ú	DataErrorÚInterfaceError)ÚBaseDatabaseFeatures)Úis_psycopg3)Úcached_propertyc                       sR  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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ddd	hZ(dZ)dZ*dZ+dZ,dZ-dZ.dZ/d
dddœZ0dZ1dhdhdœZ2e3dd„ ƒZ4e3dd„ ƒZ5e3dd„ ƒZ6e3‡ fdd„ƒZ7e3dd„ ƒZ8e3dd„ ƒZ9e:e; <d¡ƒZ=e:e; <d¡ƒZ>dZ?‡  Z@S )ÚDatabaseFeatures)é   Tz°
        CREATE FUNCTION test_procedure () RETURNS void AS $$
        DECLARE
            V_I INTEGER;
        BEGIN
            V_I := 1;
        END;
    $$ LANGUAGE plpgsql;z½
        CREATE FUNCTION test_procedure (P_I INTEGER) RETURNS void AS $$
        DECLARE
            V_I INTEGER;
        BEGIN
            V_I := P_I;
        END;
    $$ LANGUAGE plpgsql;z¸
        CREATE TABLE test_table_composite_pk (
            column_1 INTEGER NOT NULL,
            column_2 INTEGER NOT NULL,
            PRIMARY KEY(column_1, column_2)
        )
    ZJSONZTEXTÚXMLZYAMLÚCzsv-x-icu)ZdeterministicZnon_defaultZ
swedish_ciz(STATEMENT_TIMESTAMP() AT TIME ZONE 'UTC'zQindexes.tests.SchemaIndexesNotPostgreSQLTests.test_create_index_ignores_opclassesz2lookup.tests.LookupTests.test_textfield_exact_null)zopclasses are PostgreSQL only.z$PostgreSQL requires casting to text.c                 C   s   t ƒ }| jr| dh¡ |S )NzOaggregation.tests.AggregateTestCase.test_group_by_nested_expression_with_params)ÚsetÚuses_server_side_bindingÚupdate)ÚselfZexpected_failures© r   úJ/tmp/pip-unpacked-wheel-lctamlir/django/db/backends/postgresql/features.pyÚdjango_test_expected_failures[   s    üÿ	z.DatabaseFeatures.django_test_expected_failuresc                 C   s   | j jd }to| d¡dkS )NÚOPTIONSZserver_side_bindingT)Ú
connectionZsettings_dictr   Úget)r   Úoptionsr   r   r   r   j   s    z)DatabaseFeatures.uses_server_side_bindingc                 C   s   t rtdfS tdfS d S )Nz6PostgreSQL text fields cannot contain NUL (0x00) bytesz6A string literal cannot contain NUL (0x00) characters.)r   r   Ú
ValueError©r   r   r   r   Ú+prohibits_null_characters_in_text_exceptiono   s    z<DatabaseFeatures.prohibits_null_characters_in_text_exceptionc                    s   t ƒ jddddœ–S )NZBigIntegerFieldZIntegerFieldZSmallIntegerField)ZPositiveBigIntegerFieldZPositiveIntegerFieldZPositiveSmallIntegerField)ÚsuperÚintrospected_field_typesr   ©Ú	__class__r   r   r   v   s
    üz)DatabaseFeatures.introspected_field_typesc                 C   s   | j jdkS )NiÐû ©r   Z
pg_versionr   r   r   r   Úis_postgresql_13   s    z!DatabaseFeatures.is_postgresql_13c                 C   s   | j jdkS )Nià" r   r   r   r   r   Úis_postgresql_14ƒ   s    z!DatabaseFeatures.is_postgresql_14r   )AÚ__name__Ú
__module__Ú__qualname__Zminimum_database_versionZallows_group_by_selected_pksZcan_return_columns_from_insertZ can_return_rows_from_bulk_insertZhas_real_datatypeZhas_native_uuid_fieldZhas_native_duration_fieldZhas_native_json_fieldZcan_defer_constraint_checksZhas_select_for_updateZhas_select_for_update_nowaitZhas_select_for_update_ofZ!has_select_for_update_skip_lockedZhas_select_for_no_key_updateZcan_release_savepointsZsupports_commentsZsupports_tablespacesZsupports_transactionsZ!can_introspect_materialized_viewsZcan_distinct_on_fieldsZcan_rollback_ddlZ+schema_editor_uses_clientside_param_bindingZsupports_combined_altersZnulls_order_largestr   Zclosed_cursor_error_classZgreatest_least_ignores_nullsZcan_clone_databasesZsupports_temporal_subtractionZ%supports_slicing_ordering_in_compoundZ(create_test_procedure_without_params_sqlZ(create_test_procedure_with_int_param_sqlZ,create_test_table_with_composite_primary_keyZrequires_casted_case_in_updatesZsupports_over_clauseZ4only_supports_unbounded_with_preceding_and_followingZ supports_aggregate_filter_clauseZsupported_explain_formatsZ&supports_deferrable_unique_constraintsZhas_json_operatorsZ-json_key_contains_list_matching_requires_listZsupports_update_conflictsZ%supports_update_conflicts_with_targetZsupports_covering_indexesZcan_rename_indexZtest_collationsZtest_now_utc_templateZdjango_test_skipsr   r   r   r   r   r   r   ÚpropertyÚoperatorÚ
attrgetterZhas_bit_xorZ supports_covering_spgist_indexesZsupports_unlimited_charfieldÚ__classcell__r   r   r   r   r   	   sŠ   ýÿÿû





r   )r$   Z	django.dbr   r   Z django.db.backends.base.featuresr   Z)django.db.backends.postgresql.psycopg_anyr   Zdjango.utils.functionalr   r   r   r   r   r   Ú<module>   s
   