﻿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
25425	Enforce calling resolve_expression before as_sql on all expressions	Josh Smeaton	nobody	"There are many places in the ORM that will try to compile an expression without first having ensured it was resolved.  The contract of expressions is as follows:

{{{
resolved = expression.resolve_expression(*kwargs)
sql, params = compiler.compile(resolved)
}}}

Resolving the expression does two major things. First, it creates a copy so that expressions can be shared without clashing with each other. Secondly, the resolve_expression method may do necessary validation or extra query work.

There are a few known places where expression like objects are used without first being resolved.

- Most `Where` nodes are not resolved correctly (anywhere where self.where or self.query.where is compiled)
- SQLUpdateCompiler
- SQLDeleteCompiler
- django.db.models.lookups.Lookup
- django.db.models.related_lookups.RelatedIn

I wonder if we should consider enforcing this at the code level. Refuse to compile the expression unless it has been resolved first. A naive way of doing this would be to maintain a `resolved` boolean flag, and switch it to `True` when resolved. The `as_sql` method could then error if the expression has not been resolved."	Cleanup/optimization	new	Database layer (models, ORM)	dev	Normal				Accepted	0	0	0	0	0	0
