summaryrefslogtreecommitdiffstats
path: root/sqlglot/generator.py
diff options
context:
space:
mode:
Diffstat (limited to 'sqlglot/generator.py')
-rw-r--r--sqlglot/generator.py28
1 files changed, 26 insertions, 2 deletions
diff --git a/sqlglot/generator.py b/sqlglot/generator.py
index 95db795..f8d7d68 100644
--- a/sqlglot/generator.py
+++ b/sqlglot/generator.py
@@ -71,6 +71,8 @@ class Generator:
exp.ExternalProperty: lambda self, e: "EXTERNAL",
exp.HeapProperty: lambda self, e: "HEAP",
exp.InlineLengthColumnConstraint: lambda self, e: f"INLINE LENGTH {self.sql(e, 'this')}",
+ exp.IntervalDayToSecondSpan: "DAY TO SECOND",
+ exp.IntervalYearToMonthSpan: "YEAR TO MONTH",
exp.LanguageProperty: lambda self, e: self.naked_property(e),
exp.LocationProperty: lambda self, e: self.naked_property(e),
exp.LogProperty: lambda self, e: f"{'NO ' if e.args.get('no') else ''}LOG",
@@ -166,6 +168,9 @@ class Generator:
# Whether or not to generate an unquoted value for EXTRACT's date part argument
EXTRACT_ALLOWS_QUOTES = True
+ # Whether or not TIMETZ / TIMESTAMPTZ will be generated using the "WITH TIME ZONE" syntax
+ TZ_TO_WITH_TIME_ZONE = False
+
# https://cloud.google.com/bigquery/docs/reference/standard-sql/query-syntax
SELECT_KINDS: t.Tuple[str, ...] = ("STRUCT", "VALUE")
@@ -271,10 +276,12 @@ class Generator:
# Expressions whose comments are separated from them for better formatting
WITH_SEPARATED_COMMENTS: t.Tuple[t.Type[exp.Expression], ...] = (
+ exp.Create,
exp.Delete,
exp.Drop,
exp.From,
exp.Insert,
+ exp.Join,
exp.Select,
exp.Update,
exp.Where,
@@ -831,14 +838,17 @@ class Generator:
def datatype_sql(self, expression: exp.DataType) -> str:
type_value = expression.this
+
type_sql = (
self.TYPE_MAPPING.get(type_value, type_value.value)
if isinstance(type_value, exp.DataType.Type)
else type_value
)
+
nested = ""
interior = self.expressions(expression, flat=True)
values = ""
+
if interior:
if expression.args.get("nested"):
nested = f"{self.STRUCT_DELIMITER[0]}{interior}{self.STRUCT_DELIMITER[1]}"
@@ -846,10 +856,19 @@ class Generator:
delimiters = ("[", "]") if type_value == exp.DataType.Type.ARRAY else ("(", ")")
values = self.expressions(expression, key="values", flat=True)
values = f"{delimiters[0]}{values}{delimiters[1]}"
+ elif type_value == exp.DataType.Type.INTERVAL:
+ nested = f" {interior}"
else:
nested = f"({interior})"
- return f"{type_sql}{nested}{values}"
+ type_sql = f"{type_sql}{nested}{values}"
+ if self.TZ_TO_WITH_TIME_ZONE and type_value in (
+ exp.DataType.Type.TIMETZ,
+ exp.DataType.Type.TIMESTAMPTZ,
+ ):
+ type_sql = f"{type_sql} WITH TIME ZONE"
+
+ return type_sql
def directory_sql(self, expression: exp.Directory) -> str:
local = "LOCAL " if expression.args.get("local") else ""
@@ -1288,7 +1307,12 @@ class Generator:
unpivot = expression.args.get("unpivot")
direction = "UNPIVOT" if unpivot else "PIVOT"
field = self.sql(expression, "field")
- return f"{direction}({expressions} FOR {field}){alias}"
+ include_nulls = expression.args.get("include_nulls")
+ if include_nulls is not None:
+ nulls = " INCLUDE NULLS " if include_nulls else " EXCLUDE NULLS "
+ else:
+ nulls = ""
+ return f"{direction}{nulls}({expressions} FOR {field}){alias}"
def tuple_sql(self, expression: exp.Tuple) -> str:
return f"({self.expressions(expression, flat=True)})"