﻿id	summary	reporter	owner	description	type	status	component	version	severity	resolution	keywords	cc	stage	has_patch	needs_docs	needs_tests	needs_better_patch	easy	ui_ux
22434	Ordering is cleared in Subqueries with limits	maciej.pawlisz@…	justhamade	"This can lead to unexpected and unpredictable results. In my case I had a method on ModelManager that returned custom query. I was interested only in the most recent result:
{{{
In [76]: pr = Program.objects.get_all_for_user(98,True)
In [77]: print pr[:1].query
SELECT ""training_program"".""id"", ""training_program"".""name"", ""training_program"".""d
escription"", ""training_program"".""created"", ""training_program"".""modified"", ""train
ing_program"".""created_by_id"", ""training_program"".""status"" FROM ""training_program
"" INNER JOIN ""training_programuser"" ON ( ""training_program"".""id"" = ""training_pro
gramuser"".""program_id"" ) WHERE (""training_program"".""status"" = published  AND ""tr
aining_programuser"".""user_id"" IN (98) AND ""training_programuser"".""available_sinc
e"" <= 2014-04-11 08:40:19.680000 ) ORDER BY ""training_programuser"".""user_id"" DES
C, ""training_programuser"".""available_since"" DESC LIMIT 1
}}}
The resulting query is as expected. Unfortunately when using this query in another query produces sql which does not give results as expected:

{{{
In [78]: print Session.objects.filter(programs__in=pr[:1]).query
SELECT ""training_session"".""id"", ""training_session"".""name"", ""training_session"".""d
escription"", ""training_session"".""created"", ""training_session"".""modified"", ""train
ing_session"".""created_by_id"", ""training_session"".""areas"" FROM ""training_session"" 
 INNER JOIN ""training_program_sessions"" ON ( ""training_session"".""id"" = ""training
_program_sessions"".""session_id"" ) WHERE ""training_program_sessions"".""program_id"" 
 IN (SELECT ""training_program"".""id"" FROM ""training_program"" INNER JOIN ""training
_programuser"" ON ( ""training_program"".""id"" = ""training_programuser"".""program_id"" 
 ) WHERE (""training_program"".""status"" = published  AND ""training_programuser"".""u
ser_id"" IN (98) AND ""training_programuser"".""available_since"" <= 2014-04-10 13:48
:57.228000 ) LIMIT 1)
}}}
There is no ORDER BY clause in sql, so the resulting Program is different then the one in previous example.
Quick fix that worked for me was changing line 408 in django/db/modelse/sql/where.py, to:
          

{{{
            if query.low_mark == 0 and query.high_mark is None:
                query.clear_ordering(True)
}}}
"	Bug	closed	Database layer (models, ORM)	dev	Normal	fixed			Accepted	1	0	0	1	0	0
