Created
September 25, 2013 21:12
-
-
Save manfre/6706115 to your computer and use it in GitHub Desktop.
Improved SubqueryTests to cover some potential problem areas for database backends that must do some trickery for slicing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class SubqueryTests(TestCase): | |
def setUp(self): | |
DumbCategory.objects.create(id=1) | |
DumbCategory.objects.create(id=2) | |
DumbCategory.objects.create(id=3) | |
DumbCategory.objects.create(id=4) | |
def test_ordered_subselect(self): | |
"Subselects honor any manual ordering" | |
try: | |
query = DumbCategory.objects.filter(id__in=DumbCategory.objects.order_by('-id')[0:2]) | |
self.assertEqual(set(query.values_list('id', flat=True)), set([3,4])) | |
query = DumbCategory.objects.filter(id__in=DumbCategory.objects.order_by('-id')[:2]) | |
self.assertEqual(set(query.values_list('id', flat=True)), set([3,4])) | |
query = DumbCategory.objects.filter(id__in=DumbCategory.objects.order_by('-id')[1:2]) | |
self.assertEqual(set(query.values_list('id', flat=True)), set([3])) | |
query = DumbCategory.objects.filter(id__in=DumbCategory.objects.order_by('-id')[2:]) | |
self.assertEqual(set(query.values_list('id', flat=True)), set([1,2])) | |
except DatabaseError as e: | |
# Oracle and MySQL both have problems with sliced subselects. | |
# This prevents us from even evaluating this test case at all. | |
# Refs #10099 | |
self.assertFalse(connections[DEFAULT_DB_ALIAS].features.allow_sliced_subqueries, str(e)) | |
def test_sliced_delete(self): | |
"Delete queries can safely contain sliced subqueries" | |
try: | |
DumbCategory.objects.filter(id__in=DumbCategory.objects.order_by('-id')[0:1]).delete() | |
self.assertEqual(set(DumbCategory.objects.values_list('id', flat=True)), set([1,2,3])) | |
DumbCategory.objects.filter(id__in=DumbCategory.objects.order_by('-id')[1:2]).delete() | |
self.assertEqual(set(DumbCategory.objects.values_list('id', flat=True)), set([1,3])) | |
DumbCategory.objects.filter(id__in=DumbCategory.objects.order_by('-id')[1:]).delete() | |
self.assertEqual(set(DumbCategory.objects.values_list('id', flat=True)), set([3])) | |
except DatabaseError as e: | |
# Oracle and MySQL both have problems with sliced subselects. | |
# This prevents us from even evaluating this test case at all. | |
# Refs #10099 | |
self.assertFalse(connections[DEFAULT_DB_ALIAS].features.allow_sliced_subqueries, str(e)) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment