Edit on GitHub

sqlglot.optimizer.isolate_table_selects

 1from sqlglot import alias, exp
 2from sqlglot.errors import OptimizeError
 3from sqlglot.optimizer.scope import traverse_scope
 4from sqlglot.schema import ensure_schema
 5
 6
 7def isolate_table_selects(expression, schema=None):
 8    schema = ensure_schema(schema)
 9
10    for scope in traverse_scope(expression):
11        if len(scope.selected_sources) == 1:
12            continue
13
14        for _, source in scope.selected_sources.values():
15            if not isinstance(source, exp.Table) or not schema.column_names(source):
16                continue
17
18            if not source.alias:
19                raise OptimizeError("Tables require an alias. Run qualify_tables optimization.")
20
21            source.replace(
22                exp.select("*")
23                .from_(
24                    alias(source.copy(), source.name or source.alias, table=True),
25                    copy=False,
26                )
27                .subquery(source.alias, copy=False)
28            )
29
30    return expression
def isolate_table_selects(expression, schema=None):
 8def isolate_table_selects(expression, schema=None):
 9    schema = ensure_schema(schema)
10
11    for scope in traverse_scope(expression):
12        if len(scope.selected_sources) == 1:
13            continue
14
15        for _, source in scope.selected_sources.values():
16            if not isinstance(source, exp.Table) or not schema.column_names(source):
17                continue
18
19            if not source.alias:
20                raise OptimizeError("Tables require an alias. Run qualify_tables optimization.")
21
22            source.replace(
23                exp.select("*")
24                .from_(
25                    alias(source.copy(), source.name or source.alias, table=True),
26                    copy=False,
27                )
28                .subquery(source.alias, copy=False)
29            )
30
31    return expression