Fixed #10142 -- Added docs and an exploding error message to highlight an error present in the implementation of STDDEV_POP and VAR_POP in PostgreSQL 8.2-8.2.4 that will give incorrect answers (the database function mistakenly returns sample, rather than population deviation/variance). Thanks to Vinay Sajip <vinay_sajip@yahoo.co.uk> for the report, and Ian Kelly for pointing out the cause of the problem.
git-svn-id: http://code.djangoproject.com/svn/django/trunk@9804 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
parent
2b8e768b22
commit
65ad2132ab
|
@ -398,6 +398,15 @@ class BaseDatabaseOperations(object):
|
||||||
# Default to a float
|
# Default to a float
|
||||||
return float(value)
|
return float(value)
|
||||||
|
|
||||||
|
def check_aggregate_support(self, aggregate_func):
|
||||||
|
"""Check that the backend supports the provided aggregate
|
||||||
|
|
||||||
|
This is used on specific backends to rule out known aggregates
|
||||||
|
that are known to have faulty implementations. If the named
|
||||||
|
aggregate function has a known problem, the backend should
|
||||||
|
raise NotImplemented.
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
class BaseDatabaseIntrospection(object):
|
class BaseDatabaseIntrospection(object):
|
||||||
"""
|
"""
|
||||||
|
|
|
@ -144,3 +144,14 @@ class DatabaseOperations(BaseDatabaseOperations):
|
||||||
|
|
||||||
def prep_for_iexact_query(self, x):
|
def prep_for_iexact_query(self, x):
|
||||||
return x
|
return x
|
||||||
|
|
||||||
|
def check_aggregate_support(self, aggregate):
|
||||||
|
"""Check that the backend fully supports the provided aggregate.
|
||||||
|
|
||||||
|
The implementation of population statistics (STDDEV_POP and VAR_POP)
|
||||||
|
under Postgres 8.2 - 8.2.4 is known to be faulty. Raise
|
||||||
|
NotImplementedError if this is the database in use.
|
||||||
|
"""
|
||||||
|
if aggregate.sql_function == 'STDDEV_POP' or aggregate.sql_function == 'VAR_POP':
|
||||||
|
if self.postgres_version[0] == 8 and self.postgres_version[1] == 2 and self.postgres_version[1] <= 4:
|
||||||
|
raise NotImplementedError('PostgreSQL 8.2 to 8.2.4 is known to have a faulty implementation of %s. Please upgrade your version of PostgreSQL.' % aggregate.sql_function)
|
||||||
|
|
|
@ -41,8 +41,12 @@ class Aggregate(object):
|
||||||
* is_summary is a boolean that is set True if the aggregate is a
|
* is_summary is a boolean that is set True if the aggregate is a
|
||||||
summary value rather than an annotation.
|
summary value rather than an annotation.
|
||||||
"""
|
"""
|
||||||
aggregate = getattr(query.aggregates_module, self.name)
|
klass = getattr(query.aggregates_module, self.name)
|
||||||
query.aggregate_select[alias] = aggregate(col, source=source, is_summary=is_summary, **self.extra)
|
aggregate = klass(col, source=source, is_summary=is_summary, **self.extra)
|
||||||
|
# Validate that the backend has a fully supported, correct
|
||||||
|
# implementation of this aggregate
|
||||||
|
query.connection.ops.check_aggregate_support(aggregate)
|
||||||
|
query.aggregate_select[alias] = aggregate
|
||||||
|
|
||||||
class Avg(Aggregate):
|
class Avg(Aggregate):
|
||||||
name = 'Avg'
|
name = 'Avg'
|
||||||
|
|
|
@ -13,6 +13,22 @@ This file describes some of the features that might be relevant to Django
|
||||||
usage. Of course, it is not intended as a replacement for server-specific
|
usage. Of course, it is not intended as a replacement for server-specific
|
||||||
documentation or reference manuals.
|
documentation or reference manuals.
|
||||||
|
|
||||||
|
PostgreSQL notes
|
||||||
|
================
|
||||||
|
|
||||||
|
PostgreSQL 8.2 to 8.2.4
|
||||||
|
-----------------------
|
||||||
|
|
||||||
|
The implementation of the population statistics aggregates ``STDDEV_POP`` and
|
||||||
|
``VAR_POP`` that shipped with PostgreSQL 8.2 to 8.2.4 are `known to be
|
||||||
|
faulty`_. Users of these releases of PostgreSQL are advised to upgrade to
|
||||||
|
`Release 8.2.5`_ or later. Django will raise a ``NotImplementedError`` if you
|
||||||
|
attempt to use the ``StdDev(sample=False)`` or ``Variance(sample=False)``
|
||||||
|
aggregate with an database backend falls within the affected release range.
|
||||||
|
|
||||||
|
.. _known to be faulty: http://archives.postgresql.org/pgsql-bugs/2007-07/msg00046.php
|
||||||
|
.. _Release 8.2.5: http://developer.postgresql.org/pgdocs/postgres/release-8-2-5.html
|
||||||
|
|
||||||
.. _mysql-notes:
|
.. _mysql-notes:
|
||||||
|
|
||||||
MySQL notes
|
MySQL notes
|
||||||
|
|
Loading…
Reference in New Issue