'Return the full list of \'from\' clauses to be displayed.
Takes into account a set of existing froms which may be
rendered in the FROM clause of enclosing selects; this Select
may want to leave those absent if it is automatically
correlating.'

def _get_display_froms(self, explicit_correlate_froms=None, implicit_correlate_froms=None):

    froms = self._froms
    toremove = set(itertools.chain(*[_expand_cloned(f._hide_froms) for f in froms]))
    if toremove:
        if self._from_cloned:
            toremove.update((self._from_cloned[f] for f in toremove.intersection(self._from_cloned) if self._from_cloned[f]._is_lexical_equivalent(f)))
        froms = [f for f in froms if (f not in toremove)]
    if self._correlate:
        to_correlate = self._correlate
        if to_correlate:
            froms = [f for f in froms if (f not in _cloned_intersection(_cloned_intersection(froms, (explicit_correlate_froms or ())), to_correlate))]
    if (self._correlate_except is not None):
        froms = [f for f in froms if (f not in _cloned_difference(_cloned_intersection(froms, (explicit_correlate_froms or ())), self._correlate_except))]
    if (self._auto_correlate and implicit_correlate_froms and (len(froms) > 1)):
        froms = [f for f in froms if (f not in _cloned_intersection(froms, implicit_correlate_froms))]
        if (not len(froms)):
            raise exc.InvalidRequestError(("Select    statement    '%s'    returned    no    FROM    clauses    due    to    auto-correlation;    specify    correlate(<tables>)    to    control    correlation    manually." % self))
    return froms
