Permalink
Browse files

Fixed #27828 -- Fixed a crash when subtracting Integer/DurationField …

…from DateField on Oracle/PostgreSQL.
  • Loading branch information...
vytisb authored and timgraham committed Feb 12, 2017
1 parent 5729272 commit d5088f838d837fc9e3109c828f18511055f20bea
Showing with 10 additions and 1 deletion.
  1. +1 −1 django/db/models/expressions.py
  2. +3 −0 docs/releases/1.10.6.txt
  3. +6 −0 tests/expressions/tests.py
@@ -383,7 +383,7 @@ def as_sql(self, compiler, connection):
return DurationExpression(self.lhs, self.connector, self.rhs).as_sql(compiler, connection)
if (lhs_output and rhs_output and self.connector == self.SUB and
lhs_output.get_internal_type() in {'DateField', 'DateTimeField', 'TimeField'} and
- lhs_output.get_internal_type() == lhs_output.get_internal_type()):
+ lhs_output.get_internal_type() == rhs_output.get_internal_type()):
return TemporalSubtraction(self.lhs, self.rhs).as_sql(compiler, connection)
expressions = []
expression_params = []
View
@@ -14,3 +14,6 @@ Bugfixes
* Fixed ``RequestDataTooBig`` and ``TooManyFieldsSent`` exceptions crashing
rather than generating a bad request response (:ticket:`27820`).
+
+* Fixed a crash on Oracle and PostgreSQL when subtracting ``DurationField``
+ or ``IntegerField`` from ``DateField`` (:ticket:`27828`).
@@ -1184,6 +1184,12 @@ def test_duration_with_datetime(self):
).order_by('name')
self.assertQuerysetEqual(over_estimate, ['e3', 'e4'], lambda e: e.name)
+ def test_date_minus_duration(self):
+ more_than_4_days = Experiment.objects.filter(
+ assigned__lt=F('completed') - Value(datetime.timedelta(days=4), output_field=models.DurationField())
+ )
+ self.assertQuerysetEqual(more_than_4_days, ['e3', 'e4'], lambda e: e.name)
+
def test_negative_timedelta_update(self):
# subtract 30 seconds, 30 minutes, 2 hours and 2 days
experiments = Experiment.objects.filter(name='e0').annotate(

0 comments on commit d5088f8

Please sign in to comment.