diff options
Diffstat (limited to 'sqlglot/executor/python.py')
-rw-r--r-- | sqlglot/executor/python.py | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/sqlglot/executor/python.py b/sqlglot/executor/python.py index d2ae79d..e1e597d 100644 --- a/sqlglot/executor/python.py +++ b/sqlglot/executor/python.py @@ -397,6 +397,20 @@ def _lambda_sql(self, e: exp.Lambda) -> str: return f"lambda {self.expressions(e, flat=True)}: {self.sql(e, 'this')}" +def _div_sql(self: generator.Generator, e: exp.Div) -> str: + denominator = self.sql(e, "expression") + + if e.args.get("safe"): + denominator += " or None" + + sql = f"DIV({self.sql(e, 'this')}, {denominator})" + + if e.args.get("typed"): + sql = f"int({sql})" + + return sql + + class Python(Dialect): class Tokenizer(tokens.Tokenizer): STRING_ESCAPES = ["\\"] @@ -413,7 +427,11 @@ class Python(Dialect): exp.Boolean: lambda self, e: "True" if e.this else "False", exp.Cast: lambda self, e: f"CAST({self.sql(e.this)}, exp.DataType.Type.{e.args['to']})", exp.Column: lambda self, e: f"scope[{self.sql(e, 'table') or None}][{self.sql(e.this)}]", + exp.Concat: lambda self, e: self.func( + "SAFECONCAT" if e.args.get("safe") else "CONCAT", *e.expressions + ), exp.Distinct: lambda self, e: f"set({self.sql(e, 'this')})", + exp.Div: _div_sql, exp.Extract: lambda self, e: f"EXTRACT('{e.name.lower()}', {self.sql(e, 'expression')})", exp.In: lambda self, e: f"{self.sql(e, 'this')} in {{{self.expressions(e, flat=True)}}}", exp.Interval: lambda self, e: f"INTERVAL({self.sql(e.this)}, '{self.sql(e.unit)}')", |