summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--django/db/backends/postgresql/introspection.py10
-rw-r--r--docs/releases/1.11.2.txt2
-rw-r--r--tests/introspection/models.py1
-rw-r--r--tests/introspection/tests.py7
4 files changed, 16 insertions, 4 deletions
diff --git a/django/db/backends/postgresql/introspection.py b/django/db/backends/postgresql/introspection.py
index 0ec3bf7680..5be80f3edd 100644
--- a/django/db/backends/postgresql/introspection.py
+++ b/django/db/backends/postgresql/introspection.py
@@ -191,13 +191,17 @@ class DatabaseIntrospection(BaseDatabaseIntrospection):
"options": options,
}
# Now get indexes
+ # The row_number() function for ordering the index fields can be
+ # replaced by WITH ORDINALITY in the unnest() functions when support
+ # for PostgreSQL 9.3 is dropped.
cursor.execute("""
SELECT
- indexname, array_agg(attname), indisunique, indisprimary,
- array_agg(ordering), amname, exprdef, s2.attoptions
+ indexname, array_agg(attname ORDER BY rnum), indisunique, indisprimary,
+ array_agg(ordering ORDER BY rnum), amname, exprdef, s2.attoptions
FROM (
SELECT
- c2.relname as indexname, idx.*, attr.attname, am.amname,
+ row_number() OVER () as rnum, c2.relname as indexname,
+ idx.*, attr.attname, am.amname,
CASE
WHEN idx.indexprs IS NOT NULL THEN
pg_get_indexdef(idx.indexrelid)
diff --git a/docs/releases/1.11.2.txt b/docs/releases/1.11.2.txt
index 6831f60cef..8d82581966 100644
--- a/docs/releases/1.11.2.txt
+++ b/docs/releases/1.11.2.txt
@@ -23,3 +23,5 @@ Bugfixes
* Fixed ``django.contrib.auth.authenticate()`` when multiple authentication
backends don't accept a positional ``request`` argument (:ticket:`28207`).
+
+* Fixed introspection of index field ordering on PostgreSQL (:ticket:`28197`).
diff --git a/tests/introspection/models.py b/tests/introspection/models.py
index 2a1746531d..6c5c00a336 100644
--- a/tests/introspection/models.py
+++ b/tests/introspection/models.py
@@ -47,6 +47,7 @@ class Article(models.Model):
ordering = ('headline',)
index_together = [
["headline", "pub_date"],
+ ['headline', 'response_to', 'pub_date', 'reporter'],
]
diff --git a/tests/introspection/tests.py b/tests/introspection/tests.py
index 4d96bf8514..c449b6de82 100644
--- a/tests/introspection/tests.py
+++ b/tests/introspection/tests.py
@@ -189,10 +189,14 @@ class IntrospectionTests(TransactionTestCase):
with connection.cursor() as cursor:
constraints = connection.introspection.get_constraints(cursor, Article._meta.db_table)
index = {}
+ index2 = {}
for key, val in constraints.items():
if val['columns'] == ['headline', 'pub_date']:
index = val
+ if val['columns'] == ['headline', 'response_to_id', 'pub_date', 'reporter_id']:
+ index2 = val
self.assertEqual(index['type'], Index.suffix)
+ self.assertEqual(index2['type'], Index.suffix)
@skipUnlessDBFeature('supports_index_column_ordering')
def test_get_constraints_indexes_orders(self):
@@ -206,13 +210,14 @@ class IntrospectionTests(TransactionTestCase):
['reporter_id'],
['headline', 'pub_date'],
['response_to_id'],
+ ['headline', 'response_to_id', 'pub_date', 'reporter_id'],
]
for key, val in constraints.items():
if val['index'] and not (val['primary_key'] or val['unique']):
self.assertIn(val['columns'], expected_columns)
self.assertEqual(val['orders'], ['ASC'] * len(val['columns']))
indexes_verified += 1
- self.assertEqual(indexes_verified, 3)
+ self.assertEqual(indexes_verified, 4)
def datatype(dbtype, description):