mirror of
https://github.com/django/django.git
synced 2025-05-10 08:56:29 +00:00
Thanks to Adam Johnson, Carlton Gibson, Mariusz Felisiak, and Raphael Michel for mentoring this Google Summer of Code 2019 project and everyone else who helped with the patch. Special thanks to Mads Jensen, Nick Pope, and Simon Charette for extensive reviews. Co-authored-by: Mariusz Felisiak <felisiak.mariusz@gmail.com>
83 lines
2.9 KiB
Python
83 lines
2.9 KiB
Python
import operator
|
|
|
|
from django.db import InterfaceError
|
|
from django.db.backends.base.features import BaseDatabaseFeatures
|
|
from django.utils.functional import cached_property
|
|
|
|
|
|
class DatabaseFeatures(BaseDatabaseFeatures):
|
|
allows_group_by_selected_pks = True
|
|
can_return_columns_from_insert = True
|
|
can_return_rows_from_bulk_insert = True
|
|
has_real_datatype = True
|
|
has_native_uuid_field = True
|
|
has_native_duration_field = True
|
|
has_native_json_field = True
|
|
can_defer_constraint_checks = True
|
|
has_select_for_update = True
|
|
has_select_for_update_nowait = True
|
|
has_select_for_update_of = True
|
|
has_select_for_update_skip_locked = True
|
|
can_release_savepoints = True
|
|
supports_tablespaces = True
|
|
supports_transactions = True
|
|
can_introspect_autofield = True
|
|
can_introspect_ip_address_field = True
|
|
can_introspect_materialized_views = True
|
|
can_introspect_small_integer_field = True
|
|
can_distinct_on_fields = True
|
|
can_rollback_ddl = True
|
|
supports_combined_alters = True
|
|
nulls_order_largest = True
|
|
closed_cursor_error_class = InterfaceError
|
|
has_case_insensitive_like = False
|
|
greatest_least_ignores_nulls = True
|
|
can_clone_databases = True
|
|
supports_temporal_subtraction = True
|
|
supports_slicing_ordering_in_compound = True
|
|
create_test_procedure_without_params_sql = """
|
|
CREATE FUNCTION test_procedure () RETURNS void AS $$
|
|
DECLARE
|
|
V_I INTEGER;
|
|
BEGIN
|
|
V_I := 1;
|
|
END;
|
|
$$ LANGUAGE plpgsql;"""
|
|
create_test_procedure_with_int_param_sql = """
|
|
CREATE FUNCTION test_procedure (P_I INTEGER) RETURNS void AS $$
|
|
DECLARE
|
|
V_I INTEGER;
|
|
BEGIN
|
|
V_I := P_I;
|
|
END;
|
|
$$ LANGUAGE plpgsql;"""
|
|
requires_casted_case_in_updates = True
|
|
supports_over_clause = True
|
|
only_supports_unbounded_with_preceding_and_following = True
|
|
supports_aggregate_filter_clause = True
|
|
supported_explain_formats = {'JSON', 'TEXT', 'XML', 'YAML'}
|
|
validates_explain_options = False # A query will error on invalid options.
|
|
supports_deferrable_unique_constraints = True
|
|
|
|
@cached_property
|
|
def is_postgresql_9_6(self):
|
|
return self.connection.pg_version >= 90600
|
|
|
|
@cached_property
|
|
def is_postgresql_10(self):
|
|
return self.connection.pg_version >= 100000
|
|
|
|
@cached_property
|
|
def is_postgresql_11(self):
|
|
return self.connection.pg_version >= 110000
|
|
|
|
@cached_property
|
|
def is_postgresql_12(self):
|
|
return self.connection.pg_version >= 120000
|
|
|
|
has_bloom_index = property(operator.attrgetter('is_postgresql_9_6'))
|
|
has_brin_autosummarize = property(operator.attrgetter('is_postgresql_10'))
|
|
has_phraseto_tsquery = property(operator.attrgetter('is_postgresql_9_6'))
|
|
has_websearch_to_tsquery = property(operator.attrgetter('is_postgresql_11'))
|
|
supports_table_partitions = property(operator.attrgetter('is_postgresql_10'))
|