Opened 3 years ago

Closed 3 years ago

#17932 closed Bug (fixed)

Test suite fails to run under Oracle

Reported by: aaugustin Owned by: nobody
Component: contrib.admin Version: master
Severity: Release blocker Keywords:
Cc: anssi.kaariainen@… Triage Stage: Accepted
Has patch: no Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no

Description (last modified by aaugustin)

For some reason I don't quite understand, starting with r17635, the test suite fails to run under Oracle:

Creating test database for alias 'default'...
Traceback (most recent call last):
  File "runtests.py", line 323, in <module>
    options.failfast, args)
  File "runtests.py", line 166, in django_tests
    failures = test_runner.run_tests(test_labels, extra_tests=extra_tests)
  File "/var/lib/jenkins/jobs/Django + Oracle/workspace/django/test/simple.py", line 381, in run_tests
    old_config = self.setup_databases()
  File "/var/lib/jenkins/jobs/Django + Oracle/workspace/django/test/simple.py", line 317, in setup_databases
    self.verbosity, autoclobber=not self.interactive)
  File "/var/lib/jenkins/jobs/Django + Oracle/workspace/django/db/backends/creation.py", line 271, in create_test_db
    load_initial_data=False)
  File "/var/lib/jenkins/jobs/Django + Oracle/workspace/django/core/management/__init__.py", line 150, in call_command
    return klass.execute(*args, **defaults)
  File "/var/lib/jenkins/jobs/Django + Oracle/workspace/django/core/management/base.py", line 232, in execute
    output = self.handle(*args, **options)
  File "/var/lib/jenkins/jobs/Django + Oracle/workspace/django/core/management/base.py", line 371, in handle
    return self.handle_noargs(**options)
  File "/var/lib/jenkins/jobs/Django + Oracle/workspace/django/core/management/commands/syncdb.py", line 102, in handle_noargs
    cursor.execute(statement)
  File "/var/lib/jenkins/jobs/Django + Oracle/workspace/django/db/backends/oracle/base.py", line 674, in execute
    return self.cursor.execute(query, self._param_generator(params))
django.db.utils.DatabaseError: ORA-06552: PL/SQL: Compilation unit analysis terminated
ORA-06553: PLS-320: the declaration of the type of this expression is incomplete or malformed

The problem is reproducible by running the admin_changelist tests in isolation.

Setting component to "admin" because the bug appears in the "admin" tests, but that may be totally wrong.

Attachments (1)

17932.patch (956 bytes) - added by nate_b 3 years ago.

Download all attachments as: .zip

Change History (11)

comment:1 Changed 3 years ago by aaugustin

  • Description modified (diff)

comment:2 Changed 3 years ago by anonymous

We've hit this before (r12358) -- Oracle doesn't like columns named "number".

Changed 3 years ago by nate_b

comment:3 Changed 3 years ago by nate_b

  • Has patch set

I think I just about fell out of my chair when I read that.

I verified that this is the issue. The admin_changelist tests run just fine when the column is renamed.

comment:4 Changed 3 years ago by aaugustin

I'll confirm the fix and commit it today.

comment:5 Changed 3 years ago by aaugustin

  • Resolution set to fixed
  • Status changed from new to closed

In [17767]:

Fixed #17932 -- Tweaked the admin_changelist tests because Oracle doesn't like columns named 'number'.

comment:6 Changed 3 years ago by akaariai

  • Cc anssi.kaariainen@… added

Not this tickets or todays problem, but would there be need for validation to complain on columns named "number" when running on Oracle? It seems this isn't the first time this has bitten us. If an user gets bitten by this, he will have even harder time solving the issue. Oracle's nice error message doesn't help much here.

I don't know how hard writing that validation is, but it might be worth it. Is there some precedence for doing/not doing this? I will open a ticket for this in a couple of days if there isn't complaints against doing this validation.

comment:7 Changed 3 years ago by aaugustin

IIRC Django can do backend-specific checks. I just don't know how to extract the list of forbidden names.

Anyway, it's certainly worth a ticket.

comment:8 Changed 3 years ago by aaugustin

Actually this idea is part of the validation improvements GSoC proposal:

https://code.djangoproject.com/wiki/SummerOfCode2012#Validationfunctionalityrevamping

comment:9 Changed 3 years ago by vsajip

  • Has patch unset
  • Resolution fixed deleted
  • Status changed from closed to reopened

Reopened, as the problem is still occurring. I'm getting an error when syncdb tries to execute the following SQL against Oracle 10g XE:

CREATE OR REPLACE TRIGGER "ADMIN_CHANGELIST_EVENT_TR"
BEFORE INSERT ON "ADMIN_CHANGELIST_EVENT"
FOR EACH ROW
WHEN (new."ID" IS NULL)
    BEGIN
        SELECT "ADMIN_CHANGELIST_EVENT_SQ".nextval
        INTO :new."ID" FROM dual;
    END;

The error is

django.db.utils.DatabaseError: ORA-06552: PL/SQL: Compilation unit analysis terminated
ORA-06553: PLS-320: the declaration of the type of this expression is incomplete or malformed 

This time it's due to a column named 'date', and just to confuse things further, the column name is accepted for the table creation itself, but fails for the trigger creation, even though the offending column name doesn't appear in the trigger definition. Adding "db_column='event_date'" to the relevant model definition caused the failure to disappear.

Version 2, edited 3 years ago by vsajip (previous) (next) (diff)

comment:10 Changed 3 years ago by Anssi Kääriäinen <akaariai@…>

  • Resolution set to fixed
  • Status changed from reopened to closed

In [34340517fc2ac324114791d784502de2a4780757]:

Avoid using a column named "date" in tests

Oracle can have problems with such columns. Fixed #17932 again.
Thanks to Vinay Sajip for the report.

Note: See TracTickets for help on using tickets.
Back to Top