mirror of
				https://github.com/django/django.git
				synced 2025-10-31 09:41:08 +00:00 
			
		
		
		
	Fixed #33901 -- Skipped varchar_pattern_ops/text_pattern_ops index creation when db_collation is set.
This commit is contained in:
		
				
					committed by
					
						
						Mariusz Felisiak
					
				
			
			
				
	
			
			
			
						parent
						
							e30d667842
						
					
				
				
					commit
					f3f9d03edf
				
			@@ -96,6 +96,10 @@ class DatabaseSchemaEditor(BaseDatabaseSchemaEditor):
 | 
				
			|||||||
            # and text[size], so skip them.
 | 
					            # and text[size], so skip them.
 | 
				
			||||||
            if "[" in db_type:
 | 
					            if "[" in db_type:
 | 
				
			||||||
                return None
 | 
					                return None
 | 
				
			||||||
 | 
					            # Non-deterministic collations on Postgresql don't support indexes
 | 
				
			||||||
 | 
					            # for operator classes varchar_pattern_ops/text_pattern_ops.
 | 
				
			||||||
 | 
					            if getattr(field, "db_collation", None):
 | 
				
			||||||
 | 
					                return None
 | 
				
			||||||
            if db_type.startswith("varchar"):
 | 
					            if db_type.startswith("varchar"):
 | 
				
			||||||
                return self._create_index_sql(
 | 
					                return self._create_index_sql(
 | 
				
			||||||
                    model,
 | 
					                    model,
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1321,6 +1321,42 @@ class SchemaTests(TransactionTestCase):
 | 
				
			|||||||
            cs_collation,
 | 
					            cs_collation,
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @isolate_apps("schema")
 | 
				
			||||||
 | 
					    @unittest.skipUnless(connection.vendor == "postgresql", "PostgreSQL specific")
 | 
				
			||||||
 | 
					    @skipUnlessDBFeature(
 | 
				
			||||||
 | 
					        "supports_collation_on_charfield",
 | 
				
			||||||
 | 
					        "supports_non_deterministic_collations",
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					    def test_unique_with_collation_charfield(self):
 | 
				
			||||||
 | 
					        ci_collation = "case_insensitive"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        def drop_collation():
 | 
				
			||||||
 | 
					            with connection.cursor() as cursor:
 | 
				
			||||||
 | 
					                cursor.execute(f"DROP COLLATION IF EXISTS {ci_collation}")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        with connection.cursor() as cursor:
 | 
				
			||||||
 | 
					            cursor.execute(
 | 
				
			||||||
 | 
					                f"CREATE COLLATION IF NOT EXISTS {ci_collation} (provider = icu, "
 | 
				
			||||||
 | 
					                f"locale = 'und-u-ks-level2', deterministic = false)"
 | 
				
			||||||
 | 
					            )
 | 
				
			||||||
 | 
					        self.addCleanup(drop_collation)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        class CiCharModel(Model):
 | 
				
			||||||
 | 
					            field = CharField(max_length=16, db_collation=ci_collation, unique=True)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            class Meta:
 | 
				
			||||||
 | 
					                app_label = "schema"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        # Create the table.
 | 
				
			||||||
 | 
					        with connection.schema_editor() as editor:
 | 
				
			||||||
 | 
					            editor.create_model(CiCharModel)
 | 
				
			||||||
 | 
					        self.isolated_local_models = [CiCharModel]
 | 
				
			||||||
 | 
					        self.assertEqual(
 | 
				
			||||||
 | 
					            self.get_column_collation(CiCharModel._meta.db_table, "field"),
 | 
				
			||||||
 | 
					            ci_collation,
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					        self.assertIn("field", self.get_uniques(CiCharModel._meta.db_table))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def test_alter_textfield_to_null(self):
 | 
					    def test_alter_textfield_to_null(self):
 | 
				
			||||||
        """
 | 
					        """
 | 
				
			||||||
        #24307 - Should skip an alter statement on databases with
 | 
					        #24307 - Should skip an alter statement on databases with
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user