#35539: contrib/postgres/search.py COALESCE breaks GIN Index creation on 
PostgreSQL
15
--------------------------------------------+------------------------
               Reporter:  deece             |          Owner:  (none)
                   Type:  Bug               |         Status:  new
              Component:  contrib.postgres  |        Version:  5.0
               Severity:  Normal            |       Keywords:
           Triage Stage:  Unreviewed        |      Has patch:  1
    Needs documentation:  0                 |    Needs tests:  0
Patch needs improvement:  0                 |  Easy pickings:  0
                  UI/UX:  0                 |
--------------------------------------------+------------------------
 I have a Document model with the following subclass:
 {{{
     class Meta:
         indexes = [
             GinIndex(SearchVector('search_vector'), name='Document search
 vector'),  # Create a GIN index on the search vector
         ]
 }}}

 It creates the following migration:
 {{{
         migrations.AddIndex(
             model_name='document',
 
index=django.contrib.postgres.indexes.GinIndex(django.contrib.postgres.search.SearchVector('search_vector'),
 name='Document search vector'),
         ),
 }}}

 which in turn attempts to create the following index:
 {{{
 CREATE INDEX "Document search vector" ON "documents_document" USING gin
 ((to_tsvector(COALESCE(("search_vector")::text, ''))))
 }}}

 This fails with:
 {{{
 ERROR:  functions in index expression must be marked IMMUTABLE
 }}}

 If I update contrib/postgres/search.py as follows:
 91:
 {{{
 function = ""
 }}}

 and 116-128:
 {{{
 #        clone.set_source_expressions(
 #            [
 #               Coalesce(
 #                    (
 #                        expression
 #                        if isinstance(expression.output_field,
 (CharField, TextField))
 #                        else Cast(expression, TextField())
 #                    ),
 #                    Value(""),
 #                )
 #                for expression in clone.get_source_expressions()
 #            ]
 #        )
 }}}

 I can successfully create the index, and searches using SearchRank
 successfully use it.
-- 
Ticket URL: <https://code.djangoproject.com/ticket/35539>
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 view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/010701903418388a-a0d65bc3-0472-4bfe-afe2-17aeb26ccdaa-000000%40eu-central-1.amazonses.com.

Reply via email to