|
35 | 35 | from sqlglot.tokens import TokenType
|
36 | 36 | from sqlglot.transforms import unqualify_columns
|
37 | 37 |
|
| 38 | +DATE_ADD_OR_SUB = t.Union[exp.DateAdd, exp.TimestampAdd, exp.DateSub] |
| 39 | + |
38 | 40 |
|
39 | 41 | def _explode_to_unnest_sql(self: Presto.Generator, expression: exp.Lateral) -> str:
|
40 | 42 | if isinstance(expression.this, exp.Explode):
|
@@ -223,6 +225,21 @@ def _build_to_char(args: t.List) -> exp.TimeToStr:
|
223 | 225 | return build_formatted_time(exp.TimeToStr, "teradata")(args)
|
224 | 226 |
|
225 | 227 |
|
| 228 | +def _date_delta_sql( |
| 229 | + name: str, negate_interval: bool = False |
| 230 | +) -> t.Callable[[Presto.Generator, DATE_ADD_OR_SUB], str]: |
| 231 | + def _delta_sql(self: Presto.Generator, expression: DATE_ADD_OR_SUB) -> str: |
| 232 | + interval = _to_int(expression.expression) |
| 233 | + return self.func( |
| 234 | + name, |
| 235 | + unit_to_str(expression), |
| 236 | + interval * (-1) if negate_interval else interval, |
| 237 | + expression.this, |
| 238 | + ) |
| 239 | + |
| 240 | + return _delta_sql |
| 241 | + |
| 242 | + |
226 | 243 | class Presto(Dialect):
|
227 | 244 | INDEX_OFFSET = 1
|
228 | 245 | NULL_ORDERING = "nulls_are_last"
|
@@ -385,24 +402,14 @@ class Generator(generator.Generator):
|
385 | 402 | exp.BitwiseXor: lambda self, e: self.func("BITWISE_XOR", e.this, e.expression),
|
386 | 403 | exp.Cast: transforms.preprocess([transforms.epoch_cast_to_ts]),
|
387 | 404 | exp.CurrentTimestamp: lambda *_: "CURRENT_TIMESTAMP",
|
388 |
| - exp.DateAdd: lambda self, e: self.func( |
389 |
| - "DATE_ADD", |
390 |
| - unit_to_str(e), |
391 |
| - _to_int(e.expression), |
392 |
| - e.this, |
393 |
| - ), |
| 405 | + exp.DateAdd: _date_delta_sql("DATE_ADD"), |
394 | 406 | exp.DateDiff: lambda self, e: self.func(
|
395 | 407 | "DATE_DIFF", unit_to_str(e), e.expression, e.this
|
396 | 408 | ),
|
397 | 409 | exp.DateStrToDate: datestrtodate_sql,
|
398 | 410 | exp.DateToDi: lambda self,
|
399 | 411 | e: f"CAST(DATE_FORMAT({self.sql(e, 'this')}, {Presto.DATEINT_FORMAT}) AS INT)",
|
400 |
| - exp.DateSub: lambda self, e: self.func( |
401 |
| - "DATE_ADD", |
402 |
| - unit_to_str(e), |
403 |
| - _to_int(e.expression * -1), |
404 |
| - e.this, |
405 |
| - ), |
| 412 | + exp.DateSub: _date_delta_sql("DATE_ADD", negate_interval=True), |
406 | 413 | exp.Decode: lambda self, e: encode_decode_sql(self, e, "FROM_UTF8"),
|
407 | 414 | exp.DiToDate: lambda self,
|
408 | 415 | e: f"CAST(DATE_PARSE(CAST({self.sql(e, 'this')} AS VARCHAR), {Presto.DATEINT_FORMAT}) AS DATE)",
|
@@ -451,6 +458,7 @@ class Generator(generator.Generator):
|
451 | 458 | exp.StructExtract: struct_extract_sql,
|
452 | 459 | exp.Table: transforms.preprocess([_unnest_sequence]),
|
453 | 460 | exp.Timestamp: no_timestamp_sql,
|
| 461 | + exp.TimestampAdd: _date_delta_sql("DATE_ADD"), |
454 | 462 | exp.TimestampTrunc: timestamptrunc_sql(),
|
455 | 463 | exp.TimeStrToDate: timestrtotime_sql,
|
456 | 464 | exp.TimeStrToTime: timestrtotime_sql,
|
|
0 commit comments