29 lines
902 B
Python
29 lines
902 B
Python
from sqlglot import alias, exp
|
|
from sqlglot.errors import OptimizeError
|
|
from sqlglot.optimizer.scope import traverse_scope
|
|
|
|
|
|
def isolate_table_selects(expression):
|
|
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):
|
|
continue
|
|
|
|
if not isinstance(source.parent, exp.Alias):
|
|
raise OptimizeError("Tables require an alias. Run qualify_tables optimization.")
|
|
|
|
parent = source.parent
|
|
|
|
parent.replace(
|
|
exp.select("*")
|
|
.from_(
|
|
alias(source, source.name or parent.alias, table=True),
|
|
copy=False,
|
|
)
|
|
.subquery(parent.alias, copy=False)
|
|
)
|
|
|
|
return expression
|