Opened 8 months ago

Last modified 7 months ago

#20971 new Bug

Annotating a count of distinct ForeignKey (a) of a reverse foreignkey (b) doesn't work on oracle if (a) has any TextFields

Reported by: kimvais@… Owned by: nobody
Component: Database layer (models, ORM) Version: 1.5
Severity: Normal Keywords: oracle
Cc: 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 shai)

If there is a model X that has foreignkey to model Y and X has foreign key to Z and has TextFields the query for an instance of Y fails.

y.xys.all().defer(list_of_all_text_fields).annotate(Count('z__pk', distinct=True) causes "DatabaseError: ORA-00932: inconsistent datatypes: expected - got NCLOB"

This is probably(?) because the "GROUP BY" clause will contain all the deferred fields.

As a workaround I have to do sum(len(set(x)) for x in y.xys.all().values_list('z__pk'))
Works flawlessly on PostgreSQL.

Attachments (0)

Change History (4)

comment:1 Changed 8 months ago by kimvais@…

  • Needs documentation unset
  • Needs tests unset
  • Patch needs improvement unset

Looks related to #17144

comment:2 Changed 7 months ago by shai

  • Description modified (diff)
  • Type changed from Uncategorized to Bug

This seems to be a correctness problem on Oracle, but may cause performance issues elsewhere (other backends will group over deferred fields, in particular text-fields, which may indeed bring back the problems of #17144).

What this needs now is a test-case. Note that if the test checks the generated SQL (this may be done with qset.query.sql_with_params()) it can be made to fail on non-oracle backends.

comment:3 Changed 7 months ago by shai

#19259 appears related.

comment:4 Changed 7 months ago by timo

  • Triage Stage changed from Unreviewed to Accepted

Add Comment

Modify Ticket

Change Properties
<Author field>
as new
The owner will be changed from nobody to anonymous. Next status will be 'assigned'
as The resolution will be set. Next status will be 'closed'

E-mail address and user name can be saved in the Preferences.

Note: See TracTickets for help on using tickets.