summaryrefslogtreecommitdiff
path: root/tests/db_functions
diff options
context:
space:
mode:
authorArtur Beltsov <artur1998g@gmail.com>2021-05-16 15:25:35 +0500
committerMariusz Felisiak <felisiak.mariusz@gmail.com>2021-05-17 17:51:39 +0200
commit3954bf50fb814e7362e69f1020a747e601cc73fe (patch)
tree92f1d41fcbc42ab906b124375be265ae3b4164fc /tests/db_functions
parent0851933cba7b40e22f5e424c95763dbc27c40aa9 (diff)
downloaddjango-3954bf50fb814e7362e69f1020a747e601cc73fe.tar.gz
Fixed #32750 -- Fixed crash of Extract() transform on OuterRef() expressions.
Thanks Simon Charette for the review.
Diffstat (limited to 'tests/db_functions')
-rw-r--r--tests/db_functions/datetime/test_extract_trunc.py34
1 files changed, 34 insertions, 0 deletions
diff --git a/tests/db_functions/datetime/test_extract_trunc.py b/tests/db_functions/datetime/test_extract_trunc.py
index fe80904330..e9e069c1cf 100644
--- a/tests/db_functions/datetime/test_extract_trunc.py
+++ b/tests/db_functions/datetime/test_extract_trunc.py
@@ -266,6 +266,15 @@ class DateFunctionTests(TestCase):
with self.subTest(t):
self.assertIsNone(DTModel.objects.annotate(extracted=t).first().extracted)
+ def test_extract_outerref_validation(self):
+ inner_qs = DTModel.objects.filter(name=ExtractMonth(OuterRef('name')))
+ msg = (
+ 'Extract input expression must be DateField, DateTimeField, '
+ 'TimeField, or DurationField.'
+ )
+ with self.assertRaisesMessage(ValueError, msg):
+ DTModel.objects.annotate(related_name=Subquery(inner_qs.values('name')[:1]))
+
@skipUnlessDBFeature('has_native_duration_field')
def test_extract_duration(self):
start_datetime = datetime(2015, 6, 15, 14, 30, 50, 321)
@@ -1098,6 +1107,31 @@ class DateFunctionTests(TestCase):
]
)
+ def test_extract_outerref(self):
+ datetime_1 = datetime(2000, 1, 1)
+ datetime_2 = datetime(2001, 3, 5)
+ datetime_3 = datetime(2002, 1, 3)
+ if settings.USE_TZ:
+ datetime_1 = timezone.make_aware(datetime_1, is_dst=False)
+ datetime_2 = timezone.make_aware(datetime_2, is_dst=False)
+ datetime_3 = timezone.make_aware(datetime_3, is_dst=False)
+ obj_1 = self.create_model(datetime_1, datetime_3)
+ obj_2 = self.create_model(datetime_2, datetime_1)
+ obj_3 = self.create_model(datetime_3, datetime_2)
+
+ inner_qs = DTModel.objects.filter(
+ start_datetime__year=2000,
+ start_datetime__month=ExtractMonth(OuterRef('end_datetime')),
+ )
+ qs = DTModel.objects.annotate(
+ related_pk=Subquery(inner_qs.values('pk')[:1]),
+ )
+ self.assertSequenceEqual(qs.order_by('name').values('pk', 'related_pk'), [
+ {'pk': obj_1.pk, 'related_pk': obj_1.pk},
+ {'pk': obj_2.pk, 'related_pk': obj_1.pk},
+ {'pk': obj_3.pk, 'related_pk': None},
+ ])
+
@override_settings(USE_TZ=True, TIME_ZONE='UTC')
class DateFunctionWithTimeZoneTests(DateFunctionTests):