The new processDeferredExpressionsStack does not look good. It processes all expressions. Previously, each (sub)query had its own stack.
Now, when you do sth like this: "select u, (select max(o.id) from Other o) maxId from User u" you will trigger all validations at the end of the subquery. 'u' will be validated but is still undefined.
Please explain why the old behavior with one stack for each (sub)query was not preserved.
Also, things like
lead to very fragile (bad) code.