code: def decompose_select(selectx):
    "return [(parent,setter) for scalar_subquery], wherex_including_on, NameIndexer. helper for run_select"
    nix = NameIndexer.ctor_fromlist(selectx.tables)
    where = []
    for fromx in selectx.tables:
      if isinstance(fromx,sqparse2.JoinX) and fromx.on_stmt is not None:
        # todo: what happens if on_stmt columns are non-ambiguous in the context of the join tables but ambiguous overall? yuck.
        where.append(fromx.on_stmt)
    if selectx.where: where.append(selectx.where)
    return nix, wherf decompose_select(selectx):
    "return [(parent,setter) for scalar_subquery], wherex_including_on, NameIndexer. helper for run_select"
    nix = NameIndexer.ctor_fromlist(selectx.tables)
    where = []
    for fromx in selectx.tables:
      if isinstance(fromx,sqparse2.JoinX) and fromx.on_stmt is not None:
        # todo: what happens if on_stmt columns are non-ambiguous in the context of the join tables but ambiguous overall? yuck.
        where.append(fromx.on_stmt)
    if selectx.where: where.append(selectx.where)
    return nix, where
docs: return [(parent,setter) for scalar_subquery], wherex_including_on, NameIndexer. helper for run_select