#32252 closed Bug (fixed)
Using __isnull=True on a KeyTransform should not match JSON null on SQLite and Oracle
Reported by: | Sage Abdullah | Owned by: | Sage Abdullah |
---|---|---|---|
Component: | Database layer (models, ORM) | Version: | 3.1 |
Severity: | Release blocker | Keywords: | |
Cc: | Triage Stage: | Ready for checkin | |
Has patch: | yes | Needs documentation: | no |
Needs tests: | no | Patch needs improvement: | no |
Easy pickings: | no | UI/UX: | no |
Description
The KeyTransformIsNull
lookup borrows the logic from HasKey
for isnull=False
, which is correct. If isnull=True
, the query should only match objects that do not have the key. The query is correct for MariaDB, MySQL, and PostgreSQL. However, on SQLite and Oracle, the query also matches objects that have the key with the value null
, which is incorrect.
To confirm, edit tests.model_fields.test_jsonfield.TestQuerying.test_isnull_key
. For the first assertion, change
self.assertSequenceEqual( NullableJSONModel.objects.filter(value__a__isnull=True), self.objs[:3] + self.objs[5:], )
to
self.assertSequenceEqual( NullableJSONModel.objects.filter(value__j__isnull=True), self.objs[:4] + self.objs[5:], )
The test previously only checks with value__a
which could not catch this behavior because the value is not JSON null
.
Change History (5)
comment:1 by , 4 years ago
Has patch: | set |
---|
comment:2 by , 4 years ago
Triage Stage: | Unreviewed → Accepted |
---|
comment:3 by , 4 years ago
Triage Stage: | Accepted → Ready for checkin |
---|
PR.