Skip to content

Commit

Permalink
Fixed #11101: Rewrote the sequence reset SQL for Oracle to prevent it…
Browse files Browse the repository at this point in the history
… from performing an implicit commit that caused all fixtures to be automatically committed, causing a large number of test failures.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@14537 bcc190cf-cafb-0310-a4f2-bffc1f526a37
  • Loading branch information
nightflyerkilo committed Nov 12, 2010
1 parent 590bde8 commit ee6bec6
Show file tree
Hide file tree
Showing 4 changed files with 46 additions and 15 deletions.
20 changes: 8 additions & 12 deletions django/db/backends/oracle/base.py
Expand Up @@ -669,19 +669,15 @@ def _get_sequence_reset_sql():
# TODO: colorize this SQL code with style.SQL_KEYWORD(), etc.
return """
DECLARE
startvalue integer;
cval integer;
table_value integer;
seq_value integer;
BEGIN
LOCK TABLE %(table)s IN SHARE MODE;
SELECT NVL(MAX(%(column)s), 0) INTO startvalue FROM %(table)s;
SELECT "%(sequence)s".nextval INTO cval FROM dual;
cval := startvalue - cval;
IF cval != 0 THEN
EXECUTE IMMEDIATE 'ALTER SEQUENCE "%(sequence)s" MINVALUE 0 INCREMENT BY '||cval;
SELECT "%(sequence)s".nextval INTO cval FROM dual;
EXECUTE IMMEDIATE 'ALTER SEQUENCE "%(sequence)s" INCREMENT BY 1';
END IF;
COMMIT;
SELECT NVL(MAX(%(column)s), 0) INTO table_value FROM %(table)s;
SELECT NVL(last_number - cache_size, 0) INTO seq_value FROM user_sequences
WHERE sequence_name = '%(sequence)s';
WHILE table_value > seq_value LOOP
SELECT "%(sequence)s".nextval INTO seq_value FROM dual;
END LOOP;
END;
/"""

Expand Down
9 changes: 9 additions & 0 deletions tests/regressiontests/fixtures_regress/fixtures/thingy.json
@@ -0,0 +1,9 @@
[
{
"pk": "1",
"model": "fixtures_regress.thingy",
"fields": {
"name": "Whatchamacallit"
}
}
]
4 changes: 4 additions & 0 deletions tests/regressiontests/fixtures_regress/models.py
Expand Up @@ -225,3 +225,7 @@ def natural_key(self):
return self.name
natural_key.dependencies = ['fixtures_regress.book']


# Model for regression test of #11101
class Thingy(models.Model):
name = models.CharField(max_length=255)
28 changes: 25 additions & 3 deletions tests/regressiontests/fixtures_regress/tests.py
Expand Up @@ -12,7 +12,8 @@
from django.core.management.commands.dumpdata import sort_dependencies
from django.core.management.base import CommandError
from django.db.models import signals
from django.test import TestCase
from django.db import transaction
from django.test import TestCase, TransactionTestCase

from models import Animal, Stuff
from models import Absolute, Parent, Child
Expand All @@ -21,6 +22,7 @@
from models import NKChild, RefToNKChild
from models import Circle1, Circle2, Circle3
from models import ExternalDependency
from models import Thingy


pre_save_checks = []
Expand Down Expand Up @@ -57,7 +59,7 @@ def test_duplicate_pk(self):
weight=2.2
)
animal.save()
self.assertEqual(animal.id, 2)
self.assertGreater(animal.id, 1)

def test_pretty_print_xml(self):
"""
Expand Down Expand Up @@ -315,7 +317,8 @@ def test_dumpdata_uses_default_manager(self):

lion_json = '{"pk": 1, "model": "fixtures_regress.animal", "fields": {"count": 3, "weight": 1.2, "name": "Lion", "latin_name": "Panthera leo"}}'
emu_json = '{"pk": 10, "model": "fixtures_regress.animal", "fields": {"count": 42, "weight": 1.2, "name": "Emu", "latin_name": "Dromaius novaehollandiae"}}'
platypus_json = '{"pk": 11, "model": "fixtures_regress.animal", "fields": {"count": 2, "weight": 2.2, "name": "Platypus", "latin_name": "Ornithorhynchus anatinus"}}'
platypus_json = '{"pk": %d, "model": "fixtures_regress.animal", "fields": {"count": 2, "weight": 2.2, "name": "Platypus", "latin_name": "Ornithorhynchus anatinus"}}'
platypus_json = platypus_json % animal.pk

self.assertEqual(len(data), len('[%s]' % ', '.join([lion_json, emu_json, platypus_json])))
self.assertTrue(lion_json in data)
Expand Down Expand Up @@ -575,3 +578,22 @@ def test_normal_pk(self):
books.__repr__(),
"""[<Book: Cryptonomicon by Neal Stephenson (available at Amazon, Borders)>, <Book: Ender's Game by Orson Scott Card (available at Collins Bookstore)>, <Book: Permutation City by Greg Egan (available at Angus and Robertson)>]"""
)


class TestTicket11101(TransactionTestCase):

def ticket_11101(self):
management.call_command(
'loaddata',
'thingy.json',
verbosity=0,
commit=False
)
self.assertEqual(Thingy.objects.count(), 1)
transaction.rollback()
self.assertEqual(Thingy.objects.count(), 0)

def test_ticket_11101(self):
"""Test that fixtures can be rolled back (ticket #11101)."""
ticket_11101 = transaction.commit_manually(self.ticket_11101)
ticket_11101()

0 comments on commit ee6bec6

Please sign in to comment.