Opened 4 years ago

Last modified 3 years ago

#32584 closed Uncategorized

OrderBy.as_sql() overwrites template — at Initial Version

Reported by: Tim Nyborg Owned by: nobody
Component: Database layer (models, ORM) Version: 3.2
Severity: Normal Keywords: order_by, nulls_first
Cc: David Beitey Triage Stage: Unreviewed
Has patch: no Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no

Description

A change in 3.1 has caused OrderBy.as_sql() in django.db.models.expressions to ignore sql templates provided by db backends when nulls_first or nulls_last is set:


  def as_sql(self, compiler, connection, template=None, **extra_context):
        template = template or self.template
        if connection.features.supports_order_by_nulls_modifier:
            if self.nulls_last:
                template = '%s NULLS LAST' % template
            elif self.nulls_first:
                template = '%s NULLS FIRST' % template
        else:
            if self.nulls_last and not (
                self.descending and connection.features.order_by_nulls_first
            ):
                template = '%%(expression)s IS NULL, %s' % template
            elif self.nulls_first and not (
                not self.descending and connection.features.order_by_nulls_first
            ):
                template = '%%(expression)s IS NOT NULL, %s' % template

Note that template is always overwritten if nulls_first == True. In 3.0, the function first tested for template == None.

This causes trouble for the MSSQL 3rd party driver, which provides its own order by functionality:
https://github.com/microsoft/mssql-django/issues/19

The following change (simply testing for template) fixed the issue for me (forked off 3.1 as I'm on py 3.7)
https://github.com/timnyborg/django/commit/fd41b39ade8d37138951223eba7f2e3fb66d0d1c

Change History (0)

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