summaryrefslogtreecommitdiffstats
path: root/sqlglot/optimizer/simplify.py
diff options
context:
space:
mode:
Diffstat (limited to 'sqlglot/optimizer/simplify.py')
-rw-r--r--sqlglot/optimizer/simplify.py26
1 files changed, 25 insertions, 1 deletions
diff --git a/sqlglot/optimizer/simplify.py b/sqlglot/optimizer/simplify.py
index 1a2d82c..e247f58 100644
--- a/sqlglot/optimizer/simplify.py
+++ b/sqlglot/optimizer/simplify.py
@@ -8,6 +8,9 @@ from sqlglot import exp
from sqlglot.generator import cached_generator
from sqlglot.helper import first, while_changing
+# Final means that an expression should not be simplified
+FINAL = "final"
+
def simplify(expression):
"""
@@ -27,8 +30,29 @@ def simplify(expression):
generate = cached_generator()
+ # group by expressions cannot be simplified, for example
+ # select x + 1 + 1 FROM y GROUP BY x + 1 + 1
+ # the projection must exactly match the group by key
+ for group in expression.find_all(exp.Group):
+ select = group.parent
+ groups = set(group.expressions)
+ group.meta[FINAL] = True
+
+ for e in select.selects:
+ for node, *_ in e.walk():
+ if node in groups:
+ e.meta[FINAL] = True
+ break
+
+ having = select.args.get("having")
+ if having:
+ for node, *_ in having.walk():
+ if node in groups:
+ having.meta[FINAL] = True
+ break
+
def _simplify(expression, root=True):
- if expression.meta.get("final"):
+ if expression.meta.get(FINAL):
return expression
node = expression
node = rewrite_between(node)