#35180: PostgreSQL pattern ops indexes are dropped when changing between 
CharField
and TextField
-------------------------------------+-------------------------------------
     Reporter:  Robin Ray            |                    Owner:
                                     |  timbaginski
         Type:  Bug                  |                   Status:  assigned
    Component:  Database layer       |                  Version:  dev
  (models, ORM)                      |
     Severity:  Normal               |               Resolution:
     Keywords:  index postgres       |             Triage Stage:  Accepted
  migration                          |
    Has patch:  0                    |      Needs documentation:  0
  Needs tests:  0                    |  Patch needs improvement:  0
Easy pickings:  0                    |                    UI/UX:  0
-------------------------------------+-------------------------------------
Changes (by Natalia Bidart):

 * cc: Simon Charette, Mariusz Felisiak (added)
 * version:  5.0 => dev
 * stage:  Unreviewed => Accepted

Comment:

 Hello Robin Ray, thank you for your report and for helping making Django
 better.

 As far as I can see, this is a valid issue. When I first read the
 description, I was sure there were already similar reports so I searched a
 bit for possible duplicates. I couldn't find an exact duplicate but there
 are related issues reported (and fixed in some cases) in #25412, #34505,
 and a few others involving collations.

 It seems that the code at fault is the `_alter_field` in
 `django/db/backends/postgresql/schema.py` that skips creating the index
 because `old_field.db_index` and `new_field.db_index` are both True. I'm
 not an expert in this area so I have added some people as cc in this
 ticket, but I think this guard needs to also consider whether the column
 being altered is also changing its type:

 {{{#!python
 diff --git a/django/db/backends/postgresql/schema.py
 b/django/db/backends/postgresql/schema.py
 index 842830be30..975a9f1e93 100644
 --- a/django/db/backends/postgresql/schema.py
 +++ b/django/db/backends/postgresql/schema.py
 @@ -295,10 +295,12 @@ class
 DatabaseSchemaEditor(BaseDatabaseSchemaEditor):
              new_db_params,
              strict,
          )
 +        type_changed = old_type != new_type
 +        old_db_index = old_field.db_index or old_field.unique
 +        new_db_index = new_field.db_index or new_field.unique
 +        needs_index = (not old_db_index and new_db_index) or
 (type_changed and new_db_index)
          # Added an index? Create any PostgreSQL-specific indexes.
 -        if (not (old_field.db_index or old_field.unique) and
 new_field.db_index) or (
 -            not old_field.unique and new_field.unique
 -        ):
 +        if needs_index:
              like_index_statement = self._create_like_index_sql(model,
 new_field)
              if like_index_statement is not None:
                  self.execute(like_index_statement)
 }}}

 **NOTE:** please do not consider this diff as suitable for a patch without
 further discussion.

 With the patch above no test fail, so at least this is a starting point
 for a conversation.
-- 
Ticket URL: <https://code.djangoproject.com/ticket/35180#comment:3>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to django-updates+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/0107018d9e7cce8c-6f28680d-3fa7-452e-9601-a983d59b6099-000000%40eu-central-1.amazonses.com.

Reply via email to