summaryrefslogtreecommitdiffstats
path: root/sqlglot/optimizer/simplify.py
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-01-23 05:06:14 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-01-23 05:06:14 +0000
commit38e6461a8afbd7cb83709ddb998f03d40ba87755 (patch)
tree64b68a893a3b946111b9cab69503f83ca233c335 /sqlglot/optimizer/simplify.py
parentReleasing debian version 20.4.0-1. (diff)
downloadsqlglot-38e6461a8afbd7cb83709ddb998f03d40ba87755.tar.xz
sqlglot-38e6461a8afbd7cb83709ddb998f03d40ba87755.zip
Merging upstream version 20.9.0.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'sqlglot/optimizer/simplify.py')
-rw-r--r--sqlglot/optimizer/simplify.py23
1 files changed, 22 insertions, 1 deletions
diff --git a/sqlglot/optimizer/simplify.py b/sqlglot/optimizer/simplify.py
index f53023c..25d4e75 100644
--- a/sqlglot/optimizer/simplify.py
+++ b/sqlglot/optimizer/simplify.py
@@ -100,6 +100,7 @@ def simplify(
node = simplify_parens(node)
node = simplify_datetrunc(node, dialect)
node = sort_comparison(node)
+ node = simplify_startswith(node)
if root:
expression.replace(node)
@@ -776,6 +777,26 @@ def simplify_conditionals(expression):
return expression
+def simplify_startswith(expression: exp.Expression) -> exp.Expression:
+ """
+ Reduces a prefix check to either TRUE or FALSE if both the string and the
+ prefix are statically known.
+
+ Example:
+ >>> from sqlglot import parse_one
+ >>> simplify_startswith(parse_one("STARTSWITH('foo', 'f')")).sql()
+ 'TRUE'
+ """
+ if (
+ isinstance(expression, exp.StartsWith)
+ and expression.this.is_string
+ and expression.expression.is_string
+ ):
+ return exp.convert(expression.name.startswith(expression.expression.name))
+
+ return expression
+
+
DateRange = t.Tuple[datetime.date, datetime.date]
@@ -1160,7 +1181,7 @@ def gen(expression: t.Any) -> str:
GEN_MAP = {
exp.Add: lambda e: _binary(e, "+"),
exp.And: lambda e: _binary(e, "AND"),
- exp.Anonymous: lambda e: f"{e.this} {','.join(gen(e) for e in e.expressions)}",
+ exp.Anonymous: lambda e: f"{e.this.upper()} {','.join(gen(e) for e in e.expressions)}",
exp.Between: lambda e: f"{gen(e.this)} BETWEEN {gen(e.args.get('low'))} AND {gen(e.args.get('high'))}",
exp.Boolean: lambda e: "TRUE" if e.this else "FALSE",
exp.Bracket: lambda e: f"{gen(e.this)}[{gen(e.expressions)}]",