Opened 4 years ago

Closed 4 years ago

Last modified 4 years ago

#24751 closed Bug (fixed)

hstore isnull lookup fails

Reported by: mrAdm Owned by: Tim Graham <timograham@…>
Component: contrib.postgres Version: 1.8
Severity: Release blocker Keywords: hstore
Cc: Triage Stage: Accepted
Has patch: yes Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no

Description

from django.db import models
from django.contrib.postgres.fields import HStoreField


class HStoreModel(Model):
    hstore_field = HStoreField()

Execute the query:

HStoreModel.objects.create(hstore_field={'a': None})
HStoreModel.objects.filter(hstore_field__a__isnull=True)
# or non existing key
HStoreModel.objects.filter(hstore_field__b__isnull=True)

Exception:

Traceback (most recent call last):
  File "/vagrant/manage.py", line 10, in <module>
    execute_from_command_line(sys.argv)
  File "/usr/local/lib/python2.7/dist-packages/django/core/management/__init__.py", line 338, in execute_from_command_line
    utility.execute()
  File "/usr/local/lib/python2.7/dist-packages/django/core/management/__init__.py", line 312, in execute
    django.setup()
  File "/usr/local/lib/python2.7/dist-packages/django/__init__.py", line 18, in setup
    apps.populate(settings.INSTALLED_APPS)
  File "/usr/local/lib/python2.7/dist-packages/django/apps/registry.py", line 115, in populate
    app_config.ready()
  File "/vagrant/st/apps.py", line 12, in ready
    print HStoreModel.objects.filter(hstore_field__a__isnull=True)
  File "/usr/local/lib/python2.7/dist-packages/django/db/models/query.py", line 138, in __repr__
    data = list(self[:REPR_OUTPUT_SIZE + 1])
  File "/usr/local/lib/python2.7/dist-packages/django/db/models/query.py", line 162, in __iter__
    self._fetch_all()
  File "/usr/local/lib/python2.7/dist-packages/django/db/models/query.py", line 965, in _fetch_all
    self._result_cache = list(self.iterator())
  File "/usr/local/lib/python2.7/dist-packages/django/db/models/query.py", line 238, in iterator
    results = compiler.execute_sql()
  File "/usr/local/lib/python2.7/dist-packages/django/db/models/sql/compiler.py", line 829, in execute_sql
    cursor.execute(sql, params)
  File "/usr/local/lib/python2.7/dist-packages/django/db/backends/utils.py", line 79, in execute
    return super(CursorDebugWrapper, self).execute(sql, params)
  File "/usr/local/lib/python2.7/dist-packages/django/db/backends/utils.py", line 64, in execute
    return self.cursor.execute(sql, params)
  File "/usr/local/lib/python2.7/dist-packages/django/db/utils.py", line 97, in __exit__
    six.reraise(dj_exc_type, dj_exc_value, traceback)
  File "/usr/local/lib/python2.7/dist-packages/django/db/backends/utils.py", line 64, in execute
    return self.cursor.execute(sql, params)
django.db.utils.ProgrammingError: operator does not exist: hstore -> boolean
LINE 1: ...storemodel" WHERE "st_hstoremodel"."hstore_field" -> 'a' IS ...
                                                             ^
HINT:  No operator matches the given name and argument type(s). You might need to add explicit type casts.

Wrong SQL syntax?:

WHERE "st_hstoremodel"."hstore_field" -> 'b' IS NULL

Maybe you need this:

WHERE ("st_hstoremodel"."hstore_field" -> 'b') IS NULL

Attachments (1)

24751-test.diff (692 bytes) - added by Tim Graham 4 years ago.

Download all attachments as: .zip

Change History (8)

comment:1 Changed 4 years ago by Tim Graham

Triage Stage: UnreviewedAccepted

Attaching a failing test.

Changed 4 years ago by Tim Graham

Attachment: 24751-test.diff added

comment:2 Changed 4 years ago by Josh Smeaton

Is there any reason these hstore lookups couldn't always be wrapped in brackets (assuming this fixes the isnull problem)? We do a similar thing with F-combinables already: https://github.com/django/django/blob/9096e2b5f75abf8e8882937bd3c3d47ccdc24e25/django/db/models/expressions.py#L391-L392

comment:3 Changed 4 years ago by Anssi Kääriäinen

+1 to brackets. It should fix the isnull problem.

comment:4 Changed 4 years ago by Marc Tamlyn

Can't think of a reason the brackets would be a problem. We likely will need the same thing for JSON as well.

comment:5 Changed 4 years ago by Tim Graham

Has patch: set

comment:6 Changed 4 years ago by Tim Graham <timograham@…>

Owner: set to Tim Graham <timograham@…>
Resolution: fixed
Status: newclosed

In 3c8fe5d:

Fixed #24751 -- Fixed HStoreField isnull lookup.

comment:7 Changed 4 years ago by Tim Graham <timograham@…>

In df0674ea:

[1.8.x] Fixed #24751 -- Fixed HStoreField isnull lookup.

Backport of 3c8fe5dddf34533a419d2deed5208a28de32cb4a from master

Note: See TracTickets for help on using tickets.
Back to Top