Opened 3 years ago

Closed 3 years ago

#30770 closed Bug (duplicate)

Incorrect escaping TruncBase on ExpressionWrapper for date arithmetic.

Reported by: Jurgis Pralgauskis Owned by: nobody
Component: Database layer (models, ORM) Version: 1.11
Severity: Normal Keywords: TruncBase, DateTime arithmetics,
Cc: 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 Jurgis Pralgauskis)

I tried:

from django.db.models import F,  DateTimeField, ExpressionWrapper
from django.db.models.functions import Cast, Least, Greatest, Now, Coalesce, ExtractWeekDay, TruncDay

User.objects
   .annotate(trial_end=TruncDay(ExpressionWrapper(F('date_joined')+ timedelta(days=30), output_field=DateTimeField())))
   .values('id', 'date_joined', 'trial_end')[:3]
)

and got

Traceback (most recent call last):
  File "<input>", line 3, in <module>
  File "lib/python3.4/site-packages/django/db/models/query.py", line 226, in __repr__
    data = list(self[:REPR_OUTPUT_SIZE + 1])
  File "lib/python3.4/site-packages/django/db/models/query.py", line 250, in __iter__
    self._fetch_all()
  File "lib/python3.4/site-packages/django/db/models/query.py", line 1118, in _fetch_all
    self._result_cache = list(self._iterable_class(self))
  File "lib/python3.4/site-packages/django/db/models/query.py", line 106, in __iter__
    for row in compiler.results_iter():
  File "lib/python3.4/site-packages/django/db/models/sql/compiler.py", line 836, in results_iter
    results = self.execute_sql(MULTI)
  File "lib/python3.4/site-packages/django/db/models/sql/compiler.py", line 894, in execute_sql
    raise original_exception
  File "lib/python3.4/site-packages/django/db/models/sql/compiler.py", line 884, in execute_sql
    cursor.execute(sql, params)
  File "lib/python3.4/site-packages/django/db/backends/utils.py", line 80, in execute
    return super(CursorDebugWrapper, self).execute(sql, params)
  File "lib/python3.4/site-packages/django/db/backends/utils.py", line 65, in execute
    return self.cursor.execute(sql, params)
TypeError: not all arguments converted during string formatting

and

 qs.query.sql_with_params()[0]

shows

'SELECT "ta_account"."id", "ta_account"."date_joined", DATE_TRUNC(\'day\', ("ta_account"."date_joined" + %%s) AT TIME ZONE %s) AS "trial_end" FROM "ta_account" LIMIT 3'

notice %%s -- that causes problem..

Change History (3)

comment:1 Changed 3 years ago by Jurgis Pralgauskis

Description: modified (diff)
Summary: annotating TruncBase on ExpressionWrapper for date arithmetic, causes unnecessary placeholder "%s" escaping to "%%s"annotating TruncBase on ExpressionWrapper for date arithmetic, causes unnecessary placeholder "%s" escaping to "%%s" and TypeError

ps.:
here one can workaround by exchanging TruncDay with ExpressionWrapper:

trial_end=ExpressionWrapper(TruncDay('date_joined')+ timedelta(days=30))

But my situation was more complex (I was doing arithmetics in minutes and applying TruncDay few steps later )

comment:2 Changed 3 years ago by Mariusz Felisiak

Summary: annotating TruncBase on ExpressionWrapper for date arithmetic, causes unnecessary placeholder "%s" escaping to "%%s" and TypeErrorIncorrect escaping TruncBase on ExpressionWrapper for date arithmetic.

Thanks for this report, this issue was fixed in 155b31d4ec138664d62665eb2d8a442469045b78 (Django 2.2+).

Duplicate of #29648.

comment:3 Changed 3 years ago by Mariusz Felisiak

Resolution: duplicate
Status: newclosed
Note: See TracTickets for help on using tickets.
Back to Top