wow reduce() ! the one python function i havent tried yet. how come we need to test for an Alias wrapping a Select? why not just put an "is_correlated()" method on FromClause as a non implemented method, and each subclass of FromClause implements a version which either descends into its child selectable, or its list of from objects, and determines that there is a correlation occuring...that way MySQL compilation just has one simple test and the SQL object graph uses the is_correlated method recursively/polymorphically to give you the right answer.
also is this correlated FROM issue on all versions of MySQL or just some ? on myISAM tables or InnoDB tables as well ? Alastair Houghton wrote: > On 7 Feb 2006, at 17:53, Alastair Houghton wrote: > >> On 7 Feb 2006, at 17:47, Alastair Houghton wrote: >> >>> Hi all, >>> >>> Another patch; MySQL doesn't currently support correlated >>> subqueries in FROM clauses. This improves the error message you >>> get in that situation. (I didn't actually want or need a >>> correlated subquery, but I also spent quite some considerable time >>> trying to work out what was going on because MySQL threw a syntax >>> error rather than explaining that it didn't like correlated >>> subqueries in the FROM part of a SELECT.) >>> >>> (Note: I have assumed that it's only possible to reach this code >>> with a subquery in the FROM clause or the WHERE clause... if it's >>> also possible to get here with a scalar or row subquery, then this >>> code isn't quite right.) >> >> Oops. Just realised, this patch is in the wrong place :-) It >> should be checking whether anything actually correlated, not >> stopping things from working in cases where there was no >> correlation :-D > > OK, here's a patch that does work. > > BTW, why is there a lambda expression in the froms property() call? > I would have expected > > froms = property(_get_froms) > > to work just as well. > > Kind regards, > > Alastair. > > > Index: lib/sqlalchemy/sql.py > =================================================================== > --- lib/sqlalchemy/sql.py (revision 926) > +++ lib/sqlalchemy/sql.py (working copy) > @@ -1311,6 +1311,12 @@ > fromclause.accept_visitor(self._correlator) > fromclause._process_from_dict(self._froms, True) > > + def is_correlated(self): > + return (self._correlated is not None > + and reduce(lambda x, y: x or y, > + [self._correlated.has_key(f.id) > + for f in self._froms.values()])) > + > def _get_froms(self): > return [f for f in self._froms.values() if self._correlated > is None or not self._correlated.has_key(f.id)] > froms = property(lambda s: s._get_froms()) > Index: lib/sqlalchemy/databases/mysql.py > =================================================================== > --- lib/sqlalchemy/databases/mysql.py (revision 926) > +++ lib/sqlalchemy/databases/mysql.py (working copy) > @@ -244,7 +244,16 @@ > text += " \n LIMIT 18446744073709551615" > text += " OFFSET " + str(select.offset) > return text > + > + def visit_select(self, select): > + for f in select.froms: > + if (isinstance(f, sql.Alias) > + and isinstance(f.selectable, sql.Select) > + and f.selectable.is_correlated()): > + raise "MySQL does not support correlated subqueries > in the FROM clause. If it was not your intention to perform a > correlated subquery, you may need to use a table alias to avoid this > problem." > > + super(MySQLCompiler, self).visit_select(select) > + > class MySQLSchemaGenerator(ansisql.ANSISchemaGenerator): > def get_column_specification(self, column, override_pk=False, > first_pk=False): > colspec = column.name + " " + column.type.get_col_spec() > > > -- > http://www.alastairs-place.net > > > ------------------------------------------------------- This SF.net email is sponsored by: Splunk Inc. Do you grep through log files for problems? Stop! Download the new AJAX search engine that makes searching your log files as easy as surfing the web. DOWNLOAD SPLUNK! http://sel.as-us.falkag.net/sel?cmd=lnk&kid=103432&bid=230486&dat=121642 _______________________________________________ Sqlalchemy-users mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/sqlalchemy-users

