summaryrefslogtreecommitdiffstats
path: root/sqlglot/generator.py
diff options
context:
space:
mode:
Diffstat (limited to 'sqlglot/generator.py')
-rw-r--r--sqlglot/generator.py42
1 files changed, 31 insertions, 11 deletions
diff --git a/sqlglot/generator.py b/sqlglot/generator.py
index 11d9073..ffb34eb 100644
--- a/sqlglot/generator.py
+++ b/sqlglot/generator.py
@@ -67,7 +67,7 @@ class Generator:
exp.LocationProperty: lambda self, e: self.naked_property(e),
exp.ReturnsProperty: lambda self, e: self.naked_property(e),
exp.ExecuteAsProperty: lambda self, e: self.naked_property(e),
- exp.VolatilityProperty: lambda self, e: self.sql(e.name),
+ exp.VolatilityProperty: lambda self, e: e.name,
}
# Whether 'CREATE ... TRANSIENT ... TABLE' is allowed
@@ -94,6 +94,9 @@ class Generator:
ROOT_PROPERTIES = {
exp.ReturnsProperty,
exp.LanguageProperty,
+ exp.DistStyleProperty,
+ exp.DistKeyProperty,
+ exp.SortKeyProperty,
}
WITH_PROPERTIES = {
@@ -241,7 +244,7 @@ class Generator:
if not NEWLINE_RE.search(comment):
return f"{sql} --{comment.rstrip()}" if single_line else f"{sql} /*{comment}*/"
- return f"/*{comment}*/\n{sql}"
+ return f"/*{comment}*/\n{sql}" if sql else f" /*{comment}*/"
def wrap(self, expression):
this_sql = self.indent(
@@ -475,7 +478,8 @@ class Generator:
exists_sql = " IF EXISTS " if expression.args.get("exists") else " "
temporary = " TEMPORARY" if expression.args.get("temporary") else ""
materialized = " MATERIALIZED" if expression.args.get("materialized") else ""
- return f"DROP{temporary}{materialized} {kind}{exists_sql}{this}"
+ cascade = " CASCADE" if expression.args.get("cascade") else ""
+ return f"DROP{temporary}{materialized} {kind}{exists_sql}{this}{cascade}"
def except_sql(self, expression):
return self.prepend_ctes(
@@ -915,13 +919,15 @@ class Generator:
def subquery_sql(self, expression):
alias = self.sql(expression, "alias")
- return self.query_modifiers(
+ sql = self.query_modifiers(
expression,
self.wrap(expression),
self.expressions(expression, key="pivots", sep=" "),
f" AS {alias}" if alias else "",
)
+ return self.prepend_ctes(expression, sql)
+
def qualify_sql(self, expression):
this = self.indent(self.sql(expression, "this"))
return f"{self.seg('QUALIFY')}{self.sep()}{this}"
@@ -1111,9 +1117,12 @@ class Generator:
def paren_sql(self, expression):
if isinstance(expression.unnest(), exp.Select):
- return self.wrap(expression)
- sql = self.seg(self.indent(self.sql(expression, "this")), sep="")
- return f"({sql}{self.seg(')', sep='')}"
+ sql = self.wrap(expression)
+ else:
+ sql = self.seg(self.indent(self.sql(expression, "this")), sep="")
+ sql = f"({sql}{self.seg(')', sep='')}"
+
+ return self.prepend_ctes(expression, sql)
def neg_sql(self, expression):
return f"-{self.sql(expression, 'this')}"
@@ -1173,9 +1182,23 @@ class Generator:
zone = self.sql(expression, "this")
return f"CURRENT_DATE({zone})" if zone else "CURRENT_DATE"
+ def collate_sql(self, expression):
+ return self.binary(expression, "COLLATE")
+
def command_sql(self, expression):
return f"{self.sql(expression, 'this').upper()} {expression.text('expression').strip()}"
+ def transaction_sql(self, *_):
+ return "BEGIN"
+
+ def commit_sql(self, *_):
+ return "COMMIT"
+
+ def rollback_sql(self, expression):
+ savepoint = expression.args.get("savepoint")
+ savepoint = f" TO {savepoint}" if savepoint else ""
+ return f"ROLLBACK{savepoint}"
+
def distinct_sql(self, expression):
this = self.expressions(expression, flat=True)
this = f" {this}" if this else ""
@@ -1193,10 +1216,7 @@ class Generator:
def intdiv_sql(self, expression):
return self.sql(
exp.Cast(
- this=exp.Div(
- this=expression.args["this"],
- expression=expression.args["expression"],
- ),
+ this=exp.Div(this=expression.this, expression=expression.expression),
to=exp.DataType(this=exp.DataType.Type.INT),
)
)