#32418: F() expressions crash due to some interval/duration error on MySQL.
-------------------------------------+-------------------------------------
     Reporter:  Hoshi Yamazaki       |                    Owner:  nobody
         Type:  Bug                  |                   Status:  closed
    Component:  Database layer       |                  Version:  3.1
  (models, ORM)                      |
     Severity:  Normal               |               Resolution:  duplicate
     Keywords:                       |             Triage Stage:
                                     |  Unreviewed
    Has patch:  0                    |      Needs documentation:  0
  Needs tests:  0                    |  Patch needs improvement:  0
Easy pickings:  0                    |                    UI/UX:  0
-------------------------------------+-------------------------------------
Changes (by Mariusz Felisiak):

 * status:  new => closed
 * resolution:   => duplicate
 * component:  Uncategorized => Database layer (models, ORM)


Old description:

> My code:
>

> {{{
> duration_expression = ExpressionWrapper(
>     datetime.timedelta(minutes=1) * F('duration'),
>     output_field=DurationField())
> booking_end = ExpressionWrapper(
>     F('booking_dt') + duration_expression,
>     output_field=DateTimeField())
> booking_qs.annotate(
>     booking_end=booking_end).get(
>     Q(Q(booking_dt__lte=first_interval),
>       Q(booking_dt__gte=next_interval)) |
>     Q(Q(booking_end__lte=first_interval),
>       Q(booking_end__gte=next_interval)))duration_expression =
> ExpressionWrapper(
>     datetime.timedelta(minutes=1) * F('duration'),
>     output_field=DurationField())
> booking_end = ExpressionWrapper(
>     F('booking_dt') + duration_expression,
>     output_field=DateTimeField())
> booking_qs.annotate(
>     booking_end=booking_end).get(
>     Q(Q(booking_dt__lte=first_interval),
>       Q(booking_dt__gte=next_interval)) |
>     Q(Q(booking_end__lte=first_interval),
>       Q(booking_end__gte=next_interval)))
> }}}
>

>
> Error I get:
>

> {{{
> (1064, "You have an error in your SQL syntax; check the manual that
> corresponds to your MySQL server version for the right syntax to use near
> '* `carwashes_carwashbooking`.`duration`) MICROSECOND) AS `booking_end`
> FROM `car' at line 1")
> }}}
>

> SQL query:
>

> {{{
> ('SELECT `carwashes_carwashbooking`.`id`, '
>  '`carwashes_carwashbooking`.`carwash_id`, '
>  '`carwashes_carwashbooking`.`created_dt`, '
>  '`carwashes_carwashbooking`.`booking_dt`, '
>  '`carwashes_carwashbooking`.`duration`,
> `carwashes_carwashbooking`.`car_id`, '
>  '`carwashes_carwashbooking`.`car_name`,
> `carwashes_carwashbooking`.`plate`, '
>  '`carwashes_carwashbooking`.`status`,
> `carwashes_carwashbooking`.`driver_id`, '
>  '`carwashes_carwashbooking`.`phone_number`, '
>  '`carwashes_carwashbooking`.`service_id`,
> `carwashes_carwashbooking`.`notes`, '
>  '(`carwashes_carwashbooking`.`booking_dt` + INTERVAL (INTERVAL 60000000
> '
>  'MICROSECOND * `carwashes_carwashbooking`.`duration`) MICROSECOND) AS '
>  '`booking_end` FROM `carwashes_carwashbooking` WHERE '
>  '(`carwashes_carwashbooking`.`carwash_id` = %s AND '
>  '`carwashes_carwashbooking`.`driver_id` = %s AND '
>  '((`carwashes_carwashbooking`.`booking_dt` <= %s AND '
>  '`carwashes_carwashbooking`.`booking_dt` >= %s) OR '
>  '((`carwashes_carwashbooking`.`booking_dt` + INTERVAL (INTERVAL 60000000
> '
>  'MICROSECOND * `carwashes_carwashbooking`.`duration`) MICROSECOND) <= %s
> AND '
>  '(`carwashes_carwashbooking`.`booking_dt` + INTERVAL (INTERVAL 60000000
> '
>  'MICROSECOND * `carwashes_carwashbooking`.`duration`) MICROSECOND) >=
> %s))) '
>  'LIMIT 21')
> }}}
>

>
> Stackoverflow issue: https://stackoverflow.com/questions/66044255/django-
> returns-sql-syntax-error-when-using-expressionwrapper-and-f-expressions

New description:

 My code:


 {{{
 duration_expression = ExpressionWrapper(
     datetime.timedelta(minutes=1) * F('duration'),
     output_field=DurationField())
 booking_end = ExpressionWrapper(
     F('booking_dt') + duration_expression,
     output_field=DateTimeField())
 booking_qs.annotate(
     booking_end=booking_end).get(
     Q(Q(booking_dt__lte=first_interval),
       Q(booking_dt__gte=next_interval)) |
     Q(Q(booking_end__lte=first_interval),
       Q(booking_end__gte=next_interval)))
 }}}

 Error I get:

 {{{
 (1064, "You have an error in your SQL syntax; check the manual that
 corresponds to your MySQL server version for the right syntax to use near
 '* `carwashes_carwashbooking`.`duration`) MICROSECOND) AS `booking_end`
 FROM `car' at line 1")
 }}}


 SQL query:


 {{{
 ('SELECT `carwashes_carwashbooking`.`id`, '
  '`carwashes_carwashbooking`.`carwash_id`, '
  '`carwashes_carwashbooking`.`created_dt`, '
  '`carwashes_carwashbooking`.`booking_dt`, '
  '`carwashes_carwashbooking`.`duration`,
 `carwashes_carwashbooking`.`car_id`, '
  '`carwashes_carwashbooking`.`car_name`,
 `carwashes_carwashbooking`.`plate`, '
  '`carwashes_carwashbooking`.`status`,
 `carwashes_carwashbooking`.`driver_id`, '
  '`carwashes_carwashbooking`.`phone_number`, '
  '`carwashes_carwashbooking`.`service_id`,
 `carwashes_carwashbooking`.`notes`, '
  '(`carwashes_carwashbooking`.`booking_dt` + INTERVAL (INTERVAL 60000000 '
  'MICROSECOND * `carwashes_carwashbooking`.`duration`) MICROSECOND) AS '
  '`booking_end` FROM `carwashes_carwashbooking` WHERE '
  '(`carwashes_carwashbooking`.`carwash_id` = %s AND '
  '`carwashes_carwashbooking`.`driver_id` = %s AND '
  '((`carwashes_carwashbooking`.`booking_dt` <= %s AND '
  '`carwashes_carwashbooking`.`booking_dt` >= %s) OR '
  '((`carwashes_carwashbooking`.`booking_dt` + INTERVAL (INTERVAL 60000000
 '
  'MICROSECOND * `carwashes_carwashbooking`.`duration`) MICROSECOND) <= %s
 AND '
  '(`carwashes_carwashbooking`.`booking_dt` + INTERVAL (INTERVAL 60000000 '
  'MICROSECOND * `carwashes_carwashbooking`.`duration`) MICROSECOND) >=
 %s))) '
  'LIMIT 21')
 }}}



 Stackoverflow issue: https://stackoverflow.com/questions/66044255/django-
 returns-sql-syntax-error-when-using-expressionwrapper-and-f-expressions

--

Comment:

 Duplicate of #28925, fixed in dd5aa8cb5ffc0a89c4b9b8dee45c1c919d203489
 (Django 3.2+).

-- 
Ticket URL: <https://code.djangoproject.com/ticket/32418#comment:3>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/071.c3243fe4fbc294ac436bad494f0f7948%40djangoproject.com.

Reply via email to