diff options
Diffstat (limited to 'sqlglot/generator.py')
-rw-r--r-- | sqlglot/generator.py | 28 |
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)})" |