summaryrefslogtreecommitdiffstats
path: root/sqlglot/optimizer/isolate_table_selects.py
diff options
context:
space:
mode:
Diffstat (limited to 'sqlglot/optimizer/isolate_table_selects.py')
-rw-r--r--sqlglot/optimizer/isolate_table_selects.py31
1 files changed, 31 insertions, 0 deletions
diff --git a/sqlglot/optimizer/isolate_table_selects.py b/sqlglot/optimizer/isolate_table_selects.py
new file mode 100644
index 0000000..c2e021e
--- /dev/null
+++ b/sqlglot/optimizer/isolate_table_selects.py
@@ -0,0 +1,31 @@
+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