Skip to content

Commit 2bf9405

Browse files
authored
fix(oracle)!: USING keyword in chr (#6637)
* fix: using in chr * moving chr to base * optimized the chr and char
1 parent e7b5d6f commit 2bf9405

File tree

4 files changed

+20
-8
lines changed

4 files changed

+20
-8
lines changed

sqlglot/dialects/mysql.py

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -373,11 +373,6 @@ class Parser(parser.Parser):
373373

374374
FUNCTION_PARSERS = {
375375
**parser.Parser.FUNCTION_PARSERS,
376-
"CHAR": lambda self: self.expression(
377-
exp.Chr,
378-
expressions=self._parse_csv(self._parse_assignment),
379-
charset=self._match(TokenType.USING) and self._parse_var(),
380-
),
381376
"GROUP_CONCAT": lambda self: self._parse_group_concat(),
382377
# https://dev.mysql.com/doc/refman/5.7/en/miscellaneous-functions.html#function_values
383378
"VALUES": lambda self: self.expression(
@@ -1303,7 +1298,7 @@ def _oldstyle_limit_sql(self, expression: exp.Show) -> str:
13031298
return ""
13041299

13051300
def chr_sql(self, expression: exp.Chr) -> str:
1306-
this = self.expressions(sqls=[expression.this] + expression.expressions)
1301+
this = self.expressions(expression)
13071302
charset = expression.args.get("charset")
13081303
using = f" USING {self.sql(charset)}" if charset else ""
13091304
return f"CHAR({this}{using})"

sqlglot/generator.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5472,3 +5472,9 @@ def weekstart_sql(self, expression: exp.WeekStart) -> str:
54725472
return "WEEK"
54735473

54745474
return self.func("WEEK", expression.this)
5475+
5476+
def chr_sql(self, expression: exp.Chr) -> str:
5477+
this = self.expressions(expression)
5478+
charset = expression.args.get("charset")
5479+
using = f" USING {self.sql(charset)}" if charset else ""
5480+
return f"{expression.sql_name()}({this}{using})"

sqlglot/parser.py

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -212,8 +212,6 @@ class Parser(metaclass=_Parser):
212212
"ARRAY_AGG": lambda args, dialect: exp.ArrayAgg(
213213
this=seq_get(args, 0), nulls_excluded=dialect.ARRAY_AGG_INCLUDES_NULLS is None or None
214214
),
215-
"CHAR": lambda args: exp.Chr(expressions=args),
216-
"CHR": lambda args: exp.Chr(expressions=args),
217215
"COUNT": lambda args: exp.Count(this=seq_get(args, 0), expressions=args[1:], big_int=True),
218216
"CONCAT": lambda args, dialect: exp.Concat(
219217
expressions=args,
@@ -1281,6 +1279,8 @@ def _parse_partitioned_by_bucket_or_truncate(self) -> t.Optional[exp.Expression]
12811279
"CAST": lambda self: self._parse_cast(self.STRICT_CAST),
12821280
"CEIL": lambda self: self._parse_ceil_floor(exp.Ceil),
12831281
"CONVERT": lambda self: self._parse_convert(self.STRICT_CAST),
1282+
"CHAR": lambda self: self._parse_char(),
1283+
"CHR": lambda self: self._parse_char(),
12841284
"DECODE": lambda self: self._parse_decode(),
12851285
"EXTRACT": lambda self: self._parse_extract(),
12861286
"FLOOR": lambda self: self._parse_ceil_floor(exp.Floor),
@@ -6765,6 +6765,13 @@ def _parse_gap_fill(self) -> exp.GapFill:
67656765
gap_fill = exp.GapFill.from_arg_list(args)
67666766
return self.validate_expression(gap_fill, args)
67676767

6768+
def _parse_char(self) -> exp.Chr:
6769+
return self.expression(
6770+
exp.Chr,
6771+
expressions=self._parse_csv(self._parse_assignment),
6772+
charset=self._match(TokenType.USING) and self._parse_var(),
6773+
)
6774+
67686775
def _parse_cast(self, strict: bool, safe: t.Optional[bool] = None) -> exp.Expression:
67696776
this = self._parse_disjunction()
67706777

tests/dialects/test_oracle.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -806,3 +806,7 @@ def test_pseudocolumns(self):
806806
qualified.sql(dialect="oracle"),
807807
'WITH "T" AS (SELECT 1 AS "COL") SELECT "T"."COL" AS "COL", ROWID AS "ROWID" FROM "T" "T" WHERE ROWNUM = 1',
808808
)
809+
810+
def test_chr(self):
811+
self.validate_identity("SELECT CHR(187 USING NCHAR_CS)")
812+
self.validate_identity("SELECT CHR(187)")

0 commit comments

Comments
 (0)