Opened 7 months ago
Closed 7 months ago
#36349 closed Bug (duplicate)
Queryset.values() followed by annotate may crash depending of values parameters order
| Reported by: | Zankroh | Owned by: | |
|---|---|---|---|
| Component: | Database layer (models, ORM) | Version: | 5.2 |
| Severity: | Normal | Keywords: | values annotate |
| Cc: | Zankroh | Triage Stage: | Unreviewed |
| Has patch: | no | Needs documentation: | no |
| Needs tests: | no | Patch needs improvement: | no |
| Easy pickings: | no | UI/UX: | no |
Description (last modified by )
Since Django 5.2, the order of values can crash if annotate is used after.
Imagine the following "AgentAmount" model:
+---------------------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +---------------------+--------------+------+-----+---------+----------------+ | id | bigint | NO | PRI | NULL | auto_increment | | uid_agent | varchar(64) | NO | MUL | NULL | | | amount | int | NO | | NULL | | | status | varchar(60) | NO | MUL | NULL | | | last | tinyint(1) | NO | MUL | NULL | | | created_at | datetime(6) | NO | MUL | NULL | | +---------------------+--------------+------+-----+---------+----------------+
The following query will crash :
AgentAmount.objects.filter( uid_agent="SMP43279", last=True ).values( "created_at__date", "status", ).annotate( sum_amount=Sum("amount") )
Here the traceback:
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "C:\Users\xxx\Projects\env\Lib\site-packages\django\db\models\query.py", line 360, in __repr__
data = list(self[: REPR_OUTPUT_SIZE + 1])
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\xxx\Projects\env\Lib\site-packages\django\db\models\query.py", line 384, in __iter__
self._fetch_all()
File "C:\Users\xxx\Projects\env\Lib\site-packages\django\db\models\query.py", line 1935, in _fetch_all
self._result_cache = list(self._iterable_class(self))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\xxx\Projects\env\Lib\site-packages\django\db\models\query.py", line 216, in __iter__
for row in compiler.results_iter(
^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\xxx\Projects\env\Lib\site-packages\django\db\models\sql\compiler.py", line 1571, in results_iter
results = self.execute_sql(
^^^^^^^^^^^^^^^^^
File "C:\Users\xxx\Projects\env\Lib\site-packages\django\db\models\sql\compiler.py", line 1609, in execute_sql
sql, params = self.as_sql()
^^^^^^^^^^^^^
File "C:\Users\xxx\Projects\env\Lib\site-packages\django\db\models\sql\compiler.py", line 765, in as_sql
extra_select, order_by, group_by = self.pre_sql_setup(
^^^^^^^^^^^^^^^^^^^
File "C:\Users\xxx\Projects\env\Lib\site-packages\django\db\models\sql\compiler.py", line 85, in pre_sql_setup
self.setup_query(with_col_aliases=with_col_aliases)
File "C:\Users\xxx\Projects\env\Lib\site-packages\django\db\models\sql\compiler.py", line 74, in setup_query
self.select, self.klass_info, self.annotation_col_map = self.get_select(
^^^^^^^^^^^^^^^^
File "C:\Users\xxx\Projects\env\Lib\site-packages\django\db\models\sql\compiler.py", line 286, in get_select
expression = cols[expression]
~~~~^^^^^^^^^^^^
IndexError: tuple index out of range
But if I do this query
AgentAmount.objects.filter( uid_agent="SMP43279", last=True ).values( "status", "created_at__date", ).annotate( sum_amount=Sum("amount") )
Everything is fine
Change History (2)
comment:1 by , 7 months ago
| Description: | modified (diff) |
|---|
comment:2 by , 7 months ago
| Resolution: | → duplicate |
|---|---|
| Status: | new → closed |
Note:
See TracTickets
for help on using tickets.
Duplicate of #36292 (Annotating an aggregate function over a group including annotations or transforms followed by a column references crashes with
IndexError) fixed by 543e17c4405dfdac4f18759fc78b190406d14239 in Django 5.2.1 meant to be released on May 7th.