mirror of
				https://github.com/django/django.git
				synced 2025-10-31 01:25:32 +00:00 
			
		
		
		
	Fixed #28197 -- Fixed introspection of index field ordering on PostgreSQL.
This commit is contained in:
		
				
					committed by
					
						 Tim Graham
						Tim Graham
					
				
			
			
				
	
			
			
			
						parent
						
							3008f30f19
						
					
				
				
					commit
					3a5299c19c
				
			| @@ -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) | ||||
|   | ||||
| @@ -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`). | ||||
|   | ||||
| @@ -47,6 +47,7 @@ class Article(models.Model): | ||||
|         ordering = ('headline',) | ||||
|         index_together = [ | ||||
|             ["headline", "pub_date"], | ||||
|             ['headline', 'response_to', 'pub_date', 'reporter'], | ||||
|         ] | ||||
|  | ||||
|  | ||||
|   | ||||
| @@ -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): | ||||
|   | ||||
		Reference in New Issue
	
	Block a user