Opened 5 years ago

Closed 4 years ago

#17932 closed Bug (fixed)

Test suite fails to run under Oracle

Reported by: Aymeric Augustin 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 Aymeric Augustin)

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 Bragg 5 years ago.

Download all attachments as: .zip

Change History (11)

comment:1 Changed 5 years ago by Aymeric Augustin

Description: modified (diff)

comment:2 Changed 5 years ago by anonymous

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

Changed 5 years ago by Nate Bragg

Attachment: 17932.patch added

comment:3 Changed 5 years ago by Nate Bragg

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 5 years ago by Aymeric Augustin

I'll confirm the fix and commit it today.

comment:5 Changed 5 years ago by Aymeric Augustin

Resolution: fixed
Status: newclosed

In [17767]:

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

comment:6 Changed 5 years ago by Anssi Kääriäinen

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 5 years ago by Aymeric Augustin

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 5 years ago by Aymeric Augustin

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

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

comment:9 Changed 5 years ago by Vinay Sajip

Has patch: unset
Resolution: fixed
Status: closedreopened

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 5 years ago by Vinay Sajip (previous) (next) (diff)

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

Resolution: fixed
Status: reopenedclosed

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