summaryrefslogtreecommitdiffstats
path: root/sqlglot/optimizer/isolate_table_selects.py
blob: 5d78353caa510ffc23de0f9f4c0dc311f3915730 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
from sqlglot import alias, exp
from sqlglot.errors import OptimizeError
from sqlglot.optimizer.scope import traverse_scope
from sqlglot.schema import ensure_schema


def isolate_table_selects(expression, schema=None):
    schema = ensure_schema(schema)

    for scope in traverse_scope(expression):
        if len(scope.selected_sources) == 1:
            continue

        for _, source in scope.selected_sources.values():
            if not isinstance(source, exp.Table) or not schema.column_names(source):
                continue

            if not source.alias:
                raise OptimizeError("Tables require an alias. Run qualify_tables optimization.")

            source.replace(
                exp.select("*")
                .from_(
                    alias(source.copy(), source.name or source.alias, table=True),
                    copy=False,
                )
                .subquery(source.alias, copy=False)
            )

    return expression