1
0
Fork 0

Merging upstream version 25.18.0.

Signed-off-by: Daniel Baumann <daniel@debian.org>
This commit is contained in:
Daniel Baumann 2025-02-13 21:52:55 +01:00
parent 75ba8bde98
commit f2390c2221
Signed by: daniel
GPG key ID: FBB4F0E80A80222F
81 changed files with 34133 additions and 33517 deletions

View file

@ -24,6 +24,8 @@ from sqlglot.dialects.dialect import (
rename_func,
strposition_to_locate_sql,
unit_to_var,
trim_sql,
timestrtotime_sql,
)
from sqlglot.helper import seq_get
from sqlglot.tokens import TokenType
@ -95,21 +97,6 @@ def _str_to_date_sql(
return self.func("STR_TO_DATE", expression.this, self.format_time(expression))
def _trim_sql(self: MySQL.Generator, expression: exp.Trim) -> str:
target = self.sql(expression, "this")
trim_type = self.sql(expression, "position")
remove_chars = self.sql(expression, "expression")
# Use TRIM/LTRIM/RTRIM syntax if the expression isn't mysql-specific
if not remove_chars:
return self.trim_sql(expression)
trim_type = f"{trim_type} " if trim_type else ""
remove_chars = f"{remove_chars} " if remove_chars else ""
from_part = "FROM " if trim_type or remove_chars else ""
return f"TRIM({trim_type}{remove_chars}{from_part}{target})"
def _unix_to_time_sql(self: MySQL.Generator, expression: exp.UnixToTime) -> str:
scale = expression.args.get("scale")
timestamp = expression.this
@ -348,6 +335,7 @@ class MySQL(Dialect):
"VALUES": lambda self: self.expression(
exp.Anonymous, this="VALUES", expressions=[self._parse_id_var()]
),
"JSON_VALUE": lambda self: self._parse_json_value(),
}
STATEMENT_PARSERS = {
@ -677,6 +665,33 @@ class MySQL(Dialect):
return self.expression(exp.GroupConcat, this=this, separator=separator)
def _parse_json_value(self) -> exp.JSONValue:
def _parse_on_options() -> t.Optional[exp.Expression] | str:
if self._match_texts(("NULL", "ERROR")):
value = self._prev.text.upper()
else:
value = self._match(TokenType.DEFAULT) and self._parse_bitwise()
self._match_text_seq("ON")
self._match_texts(("EMPTY", "ERROR"))
return value
this = self._parse_bitwise()
self._match(TokenType.COMMA)
path = self._parse_bitwise()
returning = self._match(TokenType.RETURNING) and self._parse_type()
return self.expression(
exp.JSONValue,
this=this,
path=self.dialect.to_json_path(path),
returning=returning,
on_error=_parse_on_options(),
on_empty=_parse_on_options(),
)
class Generator(generator.Generator):
INTERVAL_ALLOWS_PLURAL_FORM = False
LOCKING_READS_SUPPORTED = True
@ -742,13 +757,15 @@ class MySQL(Dialect):
),
exp.TimestampSub: date_add_interval_sql("DATE", "SUB"),
exp.TimeStrToUnix: rename_func("UNIX_TIMESTAMP"),
exp.TimeStrToTime: lambda self, e: self.sql(
exp.cast(e.this, exp.DataType.Type.DATETIME, copy=True)
exp.TimeStrToTime: lambda self, e: timestrtotime_sql(
self,
e,
include_precision=not e.args.get("zone"),
),
exp.TimeToStr: _remove_ts_or_ds_to_date(
lambda self, e: self.func("DATE_FORMAT", e.this, self.format_time(e))
),
exp.Trim: _trim_sql,
exp.Trim: trim_sql,
exp.TryCast: no_trycast_sql,
exp.TsOrDsAdd: date_add_sql("ADD"),
exp.TsOrDsDiff: lambda self, e: self.func("DATEDIFF", e.this, e.expression),
@ -1224,3 +1241,7 @@ class MySQL(Dialect):
dt = expression.args.get("timestamp")
return self.func("CONVERT_TZ", dt, from_tz, to_tz)
def attimezone_sql(self, expression: exp.AtTimeZone) -> str:
self.unsupported("AT TIME ZONE is not supported by MySQL")
return self.sql(expression.this)