#25180: ArrayFields should not have varchar_patterns_ops or text_patterns_ops
indexes
----------------------------------+-----------------
     Reporter:  fabianbuechler    |      Owner:
         Type:  Bug               |     Status:  new
    Component:  contrib.postgres  |    Version:  1.8
     Severity:  Normal            |   Keywords:
 Triage Stage:  Unreviewed        |  Has patch:  0
Easy pickings:  0                 |      UI/UX:  0
----------------------------------+-----------------
 I believe I bumped into a bug using the new PostgreSQL `ArrayField` from
 1.8 in combination with `db_index=True`:


 This seems to be related to Django ticket #12234 which introduced creating
 secondary
 `varchar_patterns_ops` or `text_patterns_ops` indexes for varchar or text
 fields
 respectively, so that PostgreSQL could use them for the `contains` filter
 (e.g. `MyModel.object.filter(name__contains='abc')`).

 However, for the array fields introduced with Django 1.8 this does not
 seem to
 work when having `db_index` activated. When `syncdb` or `migrate` try to
 create the secondary index, PostgreSQL raises an error like this:

 {{{#!python
 django.db.utils.ProgrammingError: operator class "varchar_pattern_ops"
 does not accept data type character varying[]
 }}}

 The executed SQL statement is something like this:

 {{{#!sql
 CREATE INDEX "shop_product_package_product_numbers_2ebd72fe1541fbd4_like"
 ON "shop_product" ("package_product_numbers" varchar_pattern_ops)
 }}}

 The important parts of the model defintion are:

 {{{#!python
 class Product(models.Model):

     package_product_numbers = ArrayField(
         models.CharField(max_length=10, blank=True),
         verbose_name="Package product numbers",
         null=True, default=None, db_index=True)
 }}}

 I'm currently using a workaroud to fix this. I created a custom DB backend
 that inherits from the postgresql_psycopg2 one and overwrites the
 `DatabaseCreation.sql_indexes_for_field` and
 `DatabaseSchemaEditor._model_indexes_sql` methods to check for ArrayFields
 when creating those secondary indexes. I can post this code here, if you
 need it, however, I don't think that this is the right solution, since the
 PostgreSQL database backend should not really need to know anything about
 the `django.contrib.postgresql` stuff.

 Please let me know if I can help to reproduce this.

--
Ticket URL: <https://code.djangoproject.com/ticket/25180>
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 [email protected].
To post to this group, send email to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/057.166717ac0d923ce5f33535e4bf275297%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to