diff --git a/django/db/backends/postgresql/base.py b/django/db/backends/postgresql/base.py
index afb7432..19d5ea7 100644
--- a/django/db/backends/postgresql/base.py
+++ b/django/db/backends/postgresql/base.py
@@ -121,7 +121,7 @@ class DatabaseWrapper(BaseDatabaseWrapper):
             cursor.execute("SET TIME ZONE %s", [settings_dict['TIME_ZONE']])
             if not hasattr(self, '_version'):
                 self.__class__._version = get_version(cursor)
-            if self._version < (8, 0):
+            if self._version[0:2] < (8, 0):
                 # No savepoint support for earlier version of PostgreSQL.
                 self.features.uses_savepoints = False
         cursor.execute("SET client_encoding to 'UNICODE'")
diff --git a/django/db/backends/postgresql/operations.py b/django/db/backends/postgresql/operations.py
index 3582460..ad75ef2 100644
--- a/django/db/backends/postgresql/operations.py
+++ b/django/db/backends/postgresql/operations.py
@@ -2,8 +2,6 @@ import re
 
 from django.db.backends import BaseDatabaseOperations
 
-server_version_re = re.compile(r'PostgreSQL (\d{1,2})\.(\d{1,2})\.?(\d{1,2})?')
-
 # This DatabaseOperations class lives in here instead of base.py because it's
 # used by both the 'postgresql' and 'postgresql_psycopg2' backends.
 
@@ -14,13 +12,9 @@ class DatabaseOperations(BaseDatabaseOperations):
     def _get_postgres_version(self):
         if self._postgres_version is None:
             from django.db import connection
+            from django.db.backends.postgresql.version import get_version
             cursor = connection.cursor()
-            cursor.execute("SELECT version()")
-            version_string = cursor.fetchone()[0]
-            m = server_version_re.match(version_string)
-            if not m:
-                raise Exception('Unable to determine PostgreSQL version from version() function string: %r' % version_string)
-            self._postgres_version = [int(val) for val in m.groups() if val]
+            self._postgres_version = get_version(cursor)
         return self._postgres_version
     postgres_version = property(_get_postgres_version)
 
@@ -72,7 +66,8 @@ class DatabaseOperations(BaseDatabaseOperations):
 
     def sql_flush(self, style, tables, sequences):
         if tables:
-            if self.postgres_version[0] >= 8 and self.postgres_version[1] >= 1:
+            if (self.postgres_version[0] == 8 and self.postgres_version[1] >= 1) or \
+                self.postgres_version[0] > 8:
                 # Postgres 8.1+ can do 'TRUNCATE x, y, z...;'. In fact, it *has to*
                 # in order to be able to truncate tables referenced by a foreign
                 # key in any other table. The result is a single SQL TRUNCATE
@@ -157,5 +152,8 @@ class DatabaseOperations(BaseDatabaseOperations):
         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[2] <= 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)
+            if self.postgres_version[0] == 8 and self.postgres_version[1] == 2:
+                if self.postgres_version[2] is None:
+                    raise NotImplementedError('PostgreSQL 8.2 to 8.2.4 is known to have a faulty implementation of %s. Please upgrade your version of PostgreSQL. Additionally, we couldn\'t  get the full version of your PostgreSQL 8.2.X' % aggregate.sql_function)
+                elif self.postgres_version[2] <= 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)
diff --git a/django/db/backends/postgresql/version.py b/django/db/backends/postgresql/version.py
index ed2ad9e..4152a61 100644
--- a/django/db/backends/postgresql/version.py
+++ b/django/db/backends/postgresql/version.py
@@ -9,15 +9,19 @@ import re
 #   PostgreSQL 8.3.6
 #   EnterpriseDB 8.3
 #   PostgreSQL 8.3 beta4
-VERSION_RE = re.compile(r'\S+ (\d+)\.(\d+)')
+#   PostgreSQL 8.4beta1
+VERSION_RE = re.compile(r'\S+ (\d+)\.(\d+)\.?(\d+)?')
 
 def get_version(cursor):
     """
-    Returns a tuple representing the major and minor version number of the
-    server. For example, (7, 4) or (8, 3).
+    Returns a tuple representing the two major and the minor version number of the
+    server. For example, (7, 4, 0) or (8, 3, 4). In some cases, the minor version
+    could be None: 'PostgreSQL 8.4beta1' will return ('8', '4', None)
     """
     cursor.execute("SELECT version()")
     version = cursor.fetchone()[0]
-    major, minor = VERSION_RE.search(version).groups()
-    return int(major), int(minor)
-
+    major, major2, minor = VERSION_RE.search(version).groups()
+    try:
+        return int(major), int(major2), int(minor)
+    except (ValueError, TypeError):
+        return int(major), int(major2), None
diff --git a/django/db/backends/postgresql_psycopg2/base.py b/django/db/backends/postgresql_psycopg2/base.py
index 4d6a1e2..8dbe915 100644
--- a/django/db/backends/postgresql_psycopg2/base.py
+++ b/django/db/backends/postgresql_psycopg2/base.py
@@ -104,11 +104,11 @@ class DatabaseWrapper(BaseDatabaseWrapper):
             cursor.execute("SET TIME ZONE %s", [settings_dict['TIME_ZONE']])
             if not hasattr(self, '_version'):
                 self.__class__._version = get_version(cursor)
-            if self._version < (8, 0):
+            if self._version[0:2] < (8, 0):
                 # No savepoint support for earlier version of PostgreSQL.
                 self.features.uses_savepoints = False
             if self.features.uses_autocommit:
-                if self._version < (8, 2):
+                if self._version[0:2] < (8, 2):
                     # FIXME: Needs extra code to do reliable model insert
                     # handling, so we forbid it for now.
                     from django.core.exceptions import ImproperlyConfigured
