Opened 3 years ago

Closed 3 years ago

Last modified 3 years ago

#32182 closed Bug (fixed)

Nested KeyTransform errors when used with a subquery on PostgreSQL.

Reported by: Hannes Ljungberg Owned by: Hannes Ljungberg
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

Annotating a subquery which returns a JSONField and then applying a nested KeyTransform on that annotation results in a TypeError.

Example:

NullableJSONModel.objects.annotate(
    subquery_value=models.Subquery(
        NullableJSONModel.objects.filter(id=OuterRef("id")).values("value")[:1]
    ),
    expr=KeyTransform("foo", KeyTransform("bar", "subquery_value")),
)
Traceback (most recent call last):
  File "/tests/django/tests/model_fields/test_jsonfield.py", line 421, in test_nested_key_transform_on_subquery
    [self.objs[4]],
  File "/usr/local/lib/python3.6/unittest/case.py", line 1005, in assertSequenceEqual
    difflib.ndiff(pprint.pformat(seq1).splitlines(),
  File "/usr/local/lib/python3.6/pprint.py", line 58, in pformat
    compact=compact).pformat(object)
  File "/usr/local/lib/python3.6/pprint.py", line 144, in pformat
    self._format(object, sio, 0, 0, {}, 0)
  File "/usr/local/lib/python3.6/pprint.py", line 161, in _format
    rep = self._repr(object, context, level)
  File "/usr/local/lib/python3.6/pprint.py", line 393, in _repr
    self._depth, level)
  File "/usr/local/lib/python3.6/pprint.py", line 405, in format
    return _safe_repr(object, context, maxlevels, level)
  File "/usr/local/lib/python3.6/pprint.py", line 555, in _safe_repr
    rep = repr(object)
  File "/tests/django/django/db/models/query.py", line 256, in __repr__
    data = list(self[:REPR_OUTPUT_SIZE + 1])
  File "/tests/django/django/db/models/query.py", line 280, in __iter__
    self._fetch_all()
  File "/tests/django/django/db/models/query.py", line 1320, in _fetch_all
    self._result_cache = list(self._iterable_class(self))
  File "/tests/django/django/db/models/query.py", line 51, in __iter__
    results = compiler.execute_sql(chunked_fetch=self.chunked_fetch, chunk_size=self.chunk_size)
  File "/tests/django/django/db/models/sql/compiler.py", line 1147, in execute_sql
    sql, params = self.as_sql()
  File "/tests/django/django/db/models/sql/compiler.py", line 498, in as_sql
    extra_select, order_by, group_by = self.pre_sql_setup()
  File "/tests/django/django/db/models/sql/compiler.py", line 55, in pre_sql_setup
    self.setup_query()
  File "/tests/django/django/db/models/sql/compiler.py", line 46, in setup_query
    self.select, self.klass_info, self.annotation_col_map = self.get_select()
  File "/tests/django/django/db/models/sql/compiler.py", line 262, in get_select
    sql, params = self.compile(col)
  File "/tests/django/django/db/models/sql/compiler.py", line 428, in compile
    sql, params = vendor_impl(self, self.connection)
  File "/tests/django/django/db/models/fields/json.py", line 305, in as_postgresql
    return '(%s %s %%s)' % (lhs, self.postgres_nested_operator), params + [key_transforms,]
TypeError: can only concatenate tuple (not "list") to tuple

Change History (5)

comment:1 by Hannes Ljungberg, 3 years ago

Has patch: set

comment:2 by Mariusz Felisiak, 3 years ago

Severity: NormalRelease blocker
Summary: Nested KeyTransform errors when used with a subqueryNested KeyTransform errors when used with a subquery on PostgreSQL.
Triage Stage: UnreviewedAccepted

It's not a regression, but a bug in a new feature.

comment:3 by Mariusz Felisiak, 3 years ago

Triage Stage: AcceptedReady for checkin
Last edited 3 years ago by Mariusz Felisiak (previous) (diff)

comment:4 by Mariusz Felisiak <felisiak.mariusz@…>, 3 years ago

Resolution: fixed
Status: assignedclosed

In 0773837:

Fixed #32182 -- Fixed crash of JSONField nested key transforms with subquery annotations on PostgreSQL.

comment:5 by Mariusz Felisiak <felisiak.mariusz@…>, 3 years ago

In cc3870c3:

[3.1.x] Fixed #32182 -- Fixed crash of JSONField nested key transforms with subquery annotations on PostgreSQL.

Backport of 0773837e15bb632afffb6848a58c59a791008fa1 from master

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