diff options
Diffstat (limited to 'django/db/backends/postgresql/operations.py')
-rw-r--r-- | django/db/backends/postgresql/operations.py | 31 |
1 files changed, 23 insertions, 8 deletions
diff --git a/django/db/backends/postgresql/operations.py b/django/db/backends/postgresql/operations.py index 1cb6050bc5..f2d451026a 100644 --- a/django/db/backends/postgresql/operations.py +++ b/django/db/backends/postgresql/operations.py @@ -8,6 +8,18 @@ from django.db.backends.utils import split_tzname_delta class DatabaseOperations(BaseDatabaseOperations): cast_char_field_without_max_length = "varchar" explain_prefix = "EXPLAIN" + explain_options = frozenset( + [ + "ANALYZE", + "BUFFERS", + "COSTS", + "SETTINGS", + "SUMMARY", + "TIMING", + "VERBOSE", + "WAL", + ] + ) cast_data_types = { "AutoField": "integer", "BigAutoField": "bigint", @@ -288,17 +300,20 @@ class DatabaseOperations(BaseDatabaseOperations): return super().subtract_temporals(internal_type, lhs, rhs) def explain_query_prefix(self, format=None, **options): - prefix = super().explain_query_prefix(format) extra = {} + # Normalize options. + if options: + options = { + name.upper(): "true" if value else "false" + for name, value in options.items() + } + for valid_option in self.explain_options: + value = options.pop(valid_option, None) + if value is not None: + extra[valid_option.upper()] = value + prefix = super().explain_query_prefix(format, **options) if format: extra["FORMAT"] = format - if options: - extra.update( - { - name.upper(): "true" if value else "false" - for name, value in options.items() - } - ) if extra: prefix += " (%s)" % ", ".join("%s %s" % i for i in extra.items()) return prefix |