Skip to content

Commit b0cc7d0

Browse files
authored
Feat: add support for IS_ASCII (#4557)
* IS_ASCII support * linter fix * mysql is_ascii simplified
1 parent df44c37 commit b0cc7d0

File tree

7 files changed

+32
-0
lines changed

7 files changed

+32
-0
lines changed

sqlglot/dialects/mysql.py

+3
Original file line numberDiff line numberDiff line change
@@ -1261,3 +1261,6 @@ def converttimezone_sql(self, expression: exp.ConvertTimezone) -> str:
12611261
def attimezone_sql(self, expression: exp.AtTimeZone) -> str:
12621262
self.unsupported("AT TIME ZONE is not supported by MySQL")
12631263
return self.sql(expression.this)
1264+
1265+
def isascii_sql(self, expression: exp.IsAscii) -> str:
1266+
return f"REGEXP_LIKE({self.sql(expression.this)}, '^[[:ascii:]]*$')"

sqlglot/dialects/oracle.py

+3
Original file line numberDiff line numberDiff line change
@@ -398,3 +398,6 @@ def hint_sql(self, expression: exp.Hint) -> str:
398398
expressions.append(self.sql(expression))
399399

400400
return f" /*+ {self.expressions(sqls=expressions, sep=self.QUERY_HINT_SEP).strip()} */"
401+
402+
def isascii_sql(self, expression: exp.IsAscii) -> str:
403+
return f"NVL(REGEXP_LIKE({self.sql(expression.this)}, '^[' || CHR(1) || '-' || CHR(127) || ']*$'), TRUE)"

sqlglot/dialects/postgres.py

+3
Original file line numberDiff line numberDiff line change
@@ -716,3 +716,6 @@ def array_sql(self, expression: exp.Array) -> str:
716716

717717
def computedcolumnconstraint_sql(self, expression: exp.ComputedColumnConstraint) -> str:
718718
return f"GENERATED ALWAYS AS ({self.sql(expression, 'this')}) STORED"
719+
720+
def isascii_sql(self, expression: exp.IsAscii) -> str:
721+
return f"({self.sql(expression.this)} ~ '^[[:ascii:]]*$')"

sqlglot/dialects/sqlite.py

+3
Original file line numberDiff line numberDiff line change
@@ -300,3 +300,6 @@ def transaction_sql(self, expression: exp.Transaction) -> str:
300300
this = expression.this
301301
this = f" {this}" if this else ""
302302
return f"BEGIN{this} TRANSACTION"
303+
304+
def isascii_sql(self, expression: exp.IsAscii) -> str:
305+
return f"(NOT {self.sql(expression.this)} GLOB CAST(x'2a5b5e012d7f5d2a' AS TEXT))"

sqlglot/dialects/tsql.py

+3
Original file line numberDiff line numberDiff line change
@@ -1267,3 +1267,6 @@ def dpipe_sql(self, expression: exp.DPipe) -> str:
12671267
return self.sql(
12681268
reduce(lambda x, y: exp.Add(this=x, expression=y), expression.flatten())
12691269
)
1270+
1271+
def isascii_sql(self, expression: exp.IsAscii) -> str:
1272+
return f"(PATINDEX('%[^' + CHAR(0x00) + '-' + CHAR(0x7f) + ']%' COLLATE Latin1_General_BIN, {self.sql(expression.this)}) = 0)"

sqlglot/expressions.py

+4
Original file line numberDiff line numberDiff line change
@@ -5891,6 +5891,10 @@ class Initcap(Func):
58915891
arg_types = {"this": True, "expression": False}
58925892

58935893

5894+
class IsAscii(Func):
5895+
pass
5896+
5897+
58945898
class IsNan(Func):
58955899
_sql_names = ["IS_NAN", "ISNAN"]
58965900

tests/dialects/test_dialect.py

+13
Original file line numberDiff line numberDiff line change
@@ -520,6 +520,19 @@ def test_if_null(self):
520520
},
521521
)
522522

523+
def test_is_ascii(self):
524+
self.validate_all(
525+
"SELECT IS_ASCII(x)",
526+
write={
527+
"": "SELECT IS_ASCII(x)",
528+
"sqlite": "SELECT (NOT x GLOB CAST(x'2a5b5e012d7f5d2a' AS TEXT))",
529+
"mysql": "SELECT REGEXP_LIKE(x, '^[[:ascii:]]*$')",
530+
"postgres": "SELECT (x ~ '^[[:ascii:]]*$')",
531+
"tsql": "SELECT (PATINDEX('%[^' + CHAR(0x00) + '-' + CHAR(0x7f) + ']%' COLLATE Latin1_General_BIN, x) = 0)",
532+
"oracle": "SELECT NVL(REGEXP_LIKE(x, '^[' || CHR(1) || '-' || CHR(127) || ']*$'), TRUE)",
533+
},
534+
)
535+
523536
def test_nvl2(self):
524537
self.validate_all(
525538
"SELECT NVL2(a, b, c)",

0 commit comments

Comments
 (0)