From 98d5537435b2951b36c45f1fda667fa27c165794 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Wed, 3 May 2023 11:12:24 +0200 Subject: Adding upstream version 11.7.1. Signed-off-by: Daniel Baumann --- docs/sqlglot/dialects/drill.html | 333 ++++++++++++++++++++------------------- 1 file changed, 174 insertions(+), 159 deletions(-) (limited to 'docs/sqlglot/dialects/drill.html') diff --git a/docs/sqlglot/dialects/drill.html b/docs/sqlglot/dialects/drill.html index e6ed13c..bd76bd7 100644 --- a/docs/sqlglot/dialects/drill.html +++ b/docs/sqlglot/dialects/drill.html @@ -3,7 +3,7 @@ - + sqlglot.dialects.drill API documentation @@ -186,58 +186,62 @@ 104 LOG_DEFAULTS_TO_LN = True 105 106 class Generator(generator.Generator): -107 TYPE_MAPPING = { -108 **generator.Generator.TYPE_MAPPING, # type: ignore -109 exp.DataType.Type.INT: "INTEGER", -110 exp.DataType.Type.SMALLINT: "INTEGER", -111 exp.DataType.Type.TINYINT: "INTEGER", -112 exp.DataType.Type.BINARY: "VARBINARY", -113 exp.DataType.Type.TEXT: "VARCHAR", -114 exp.DataType.Type.NCHAR: "VARCHAR", -115 exp.DataType.Type.TIMESTAMPLTZ: "TIMESTAMP", -116 exp.DataType.Type.TIMESTAMPTZ: "TIMESTAMP", -117 exp.DataType.Type.DATETIME: "TIMESTAMP", -118 } -119 -120 PROPERTIES_LOCATION = { -121 **generator.Generator.PROPERTIES_LOCATION, # type: ignore -122 exp.PartitionedByProperty: exp.Properties.Location.POST_SCHEMA, -123 } -124 -125 TRANSFORMS = { -126 **generator.Generator.TRANSFORMS, # type: ignore -127 exp.CurrentTimestamp: lambda *_: "CURRENT_TIMESTAMP", -128 exp.ArrayContains: rename_func("REPEATED_CONTAINS"), -129 exp.ArraySize: rename_func("REPEATED_COUNT"), -130 exp.Create: create_with_partitions_sql, -131 exp.DateAdd: _date_add_sql("ADD"), -132 exp.DateStrToDate: datestrtodate_sql, -133 exp.DateSub: _date_add_sql("SUB"), -134 exp.DateToDi: lambda self, e: f"CAST(TO_DATE({self.sql(e, 'this')}, {Drill.dateint_format}) AS INT)", -135 exp.DiToDate: lambda self, e: f"TO_DATE(CAST({self.sql(e, 'this')} AS VARCHAR), {Drill.dateint_format})", -136 exp.If: lambda self, e: f"`IF`({self.format_args(e.this, e.args.get('true'), e.args.get('false'))})", -137 exp.ILike: lambda self, e: f" {self.sql(e, 'this')} `ILIKE` {self.sql(e, 'expression')}", -138 exp.Levenshtein: rename_func("LEVENSHTEIN_DISTANCE"), -139 exp.PartitionedByProperty: lambda self, e: f"PARTITION BY {self.sql(e, 'this')}", -140 exp.RegexpLike: rename_func("REGEXP_MATCHES"), -141 exp.StrPosition: str_position_sql, -142 exp.StrToDate: _str_to_date, -143 exp.Pow: rename_func("POW"), -144 exp.StrToTime: lambda self, e: f"TO_TIMESTAMP({self.sql(e, 'this')}, {self.format_time(e)})", -145 exp.TimeStrToDate: lambda self, e: f"CAST({self.sql(e, 'this')} AS DATE)", -146 exp.TimeStrToTime: timestrtotime_sql, -147 exp.TimeStrToUnix: rename_func("UNIX_TIMESTAMP"), -148 exp.TimeToStr: lambda self, e: f"TO_CHAR({self.sql(e, 'this')}, {self.format_time(e)})", -149 exp.TimeToUnix: rename_func("UNIX_TIMESTAMP"), -150 exp.ToChar: lambda self, e: self.function_fallback_sql(e), -151 exp.TryCast: no_trycast_sql, -152 exp.TsOrDsAdd: lambda self, e: f"DATE_ADD(CAST({self.sql(e, 'this')} AS DATE), {self.sql(exp.Interval(this=e.expression, unit=exp.Var(this='DAY')))})", -153 exp.TsOrDsToDate: ts_or_ds_to_date_sql("drill"), -154 exp.TsOrDiToDi: lambda self, e: f"CAST(SUBSTR(REPLACE(CAST({self.sql(e, 'this')} AS VARCHAR), '-', ''), 1, 8) AS INT)", -155 } -156 -157 def normalize_func(self, name: str) -> str: -158 return name if exp.SAFE_IDENTIFIER_RE.match(name) else f"`{name}`" +107 JOIN_HINTS = False +108 TABLE_HINTS = False +109 +110 TYPE_MAPPING = { +111 **generator.Generator.TYPE_MAPPING, # type: ignore +112 exp.DataType.Type.INT: "INTEGER", +113 exp.DataType.Type.SMALLINT: "INTEGER", +114 exp.DataType.Type.TINYINT: "INTEGER", +115 exp.DataType.Type.BINARY: "VARBINARY", +116 exp.DataType.Type.TEXT: "VARCHAR", +117 exp.DataType.Type.NCHAR: "VARCHAR", +118 exp.DataType.Type.TIMESTAMPLTZ: "TIMESTAMP", +119 exp.DataType.Type.TIMESTAMPTZ: "TIMESTAMP", +120 exp.DataType.Type.DATETIME: "TIMESTAMP", +121 } +122 +123 PROPERTIES_LOCATION = { +124 **generator.Generator.PROPERTIES_LOCATION, # type: ignore +125 exp.PartitionedByProperty: exp.Properties.Location.POST_SCHEMA, +126 exp.VolatileProperty: exp.Properties.Location.UNSUPPORTED, +127 } +128 +129 TRANSFORMS = { +130 **generator.Generator.TRANSFORMS, # type: ignore +131 exp.CurrentTimestamp: lambda *_: "CURRENT_TIMESTAMP", +132 exp.ArrayContains: rename_func("REPEATED_CONTAINS"), +133 exp.ArraySize: rename_func("REPEATED_COUNT"), +134 exp.Create: create_with_partitions_sql, +135 exp.DateAdd: _date_add_sql("ADD"), +136 exp.DateStrToDate: datestrtodate_sql, +137 exp.DateSub: _date_add_sql("SUB"), +138 exp.DateToDi: lambda self, e: f"CAST(TO_DATE({self.sql(e, 'this')}, {Drill.dateint_format}) AS INT)", +139 exp.DiToDate: lambda self, e: f"TO_DATE(CAST({self.sql(e, 'this')} AS VARCHAR), {Drill.dateint_format})", +140 exp.If: lambda self, e: f"`IF`({self.format_args(e.this, e.args.get('true'), e.args.get('false'))})", +141 exp.ILike: lambda self, e: f" {self.sql(e, 'this')} `ILIKE` {self.sql(e, 'expression')}", +142 exp.Levenshtein: rename_func("LEVENSHTEIN_DISTANCE"), +143 exp.PartitionedByProperty: lambda self, e: f"PARTITION BY {self.sql(e, 'this')}", +144 exp.RegexpLike: rename_func("REGEXP_MATCHES"), +145 exp.StrPosition: str_position_sql, +146 exp.StrToDate: _str_to_date, +147 exp.Pow: rename_func("POW"), +148 exp.StrToTime: lambda self, e: f"TO_TIMESTAMP({self.sql(e, 'this')}, {self.format_time(e)})", +149 exp.TimeStrToDate: lambda self, e: f"CAST({self.sql(e, 'this')} AS DATE)", +150 exp.TimeStrToTime: timestrtotime_sql, +151 exp.TimeStrToUnix: rename_func("UNIX_TIMESTAMP"), +152 exp.TimeToStr: lambda self, e: f"TO_CHAR({self.sql(e, 'this')}, {self.format_time(e)})", +153 exp.TimeToUnix: rename_func("UNIX_TIMESTAMP"), +154 exp.ToChar: lambda self, e: self.function_fallback_sql(e), +155 exp.TryCast: no_trycast_sql, +156 exp.TsOrDsAdd: lambda self, e: f"DATE_ADD(CAST({self.sql(e, 'this')} AS DATE), {self.sql(exp.Interval(this=e.expression, unit=exp.Var(this='DAY')))})", +157 exp.TsOrDsToDate: ts_or_ds_to_date_sql("drill"), +158 exp.TsOrDiToDi: lambda self, e: f"CAST(SUBSTR(REPLACE(CAST({self.sql(e, 'this')} AS VARCHAR), '-', ''), 1, 8) AS INT)", +159 } +160 +161 def normalize_func(self, name: str) -> str: +162 return name if exp.SAFE_IDENTIFIER_RE.match(name) else f"`{name}`" @@ -311,58 +315,62 @@ 105 LOG_DEFAULTS_TO_LN = True 106 107 class Generator(generator.Generator): -108 TYPE_MAPPING = { -109 **generator.Generator.TYPE_MAPPING, # type: ignore -110 exp.DataType.Type.INT: "INTEGER", -111 exp.DataType.Type.SMALLINT: "INTEGER", -112 exp.DataType.Type.TINYINT: "INTEGER", -113 exp.DataType.Type.BINARY: "VARBINARY", -114 exp.DataType.Type.TEXT: "VARCHAR", -115 exp.DataType.Type.NCHAR: "VARCHAR", -116 exp.DataType.Type.TIMESTAMPLTZ: "TIMESTAMP", -117 exp.DataType.Type.TIMESTAMPTZ: "TIMESTAMP", -118 exp.DataType.Type.DATETIME: "TIMESTAMP", -119 } -120 -121 PROPERTIES_LOCATION = { -122 **generator.Generator.PROPERTIES_LOCATION, # type: ignore -123 exp.PartitionedByProperty: exp.Properties.Location.POST_SCHEMA, -124 } -125 -126 TRANSFORMS = { -127 **generator.Generator.TRANSFORMS, # type: ignore -128 exp.CurrentTimestamp: lambda *_: "CURRENT_TIMESTAMP", -129 exp.ArrayContains: rename_func("REPEATED_CONTAINS"), -130 exp.ArraySize: rename_func("REPEATED_COUNT"), -131 exp.Create: create_with_partitions_sql, -132 exp.DateAdd: _date_add_sql("ADD"), -133 exp.DateStrToDate: datestrtodate_sql, -134 exp.DateSub: _date_add_sql("SUB"), -135 exp.DateToDi: lambda self, e: f"CAST(TO_DATE({self.sql(e, 'this')}, {Drill.dateint_format}) AS INT)", -136 exp.DiToDate: lambda self, e: f"TO_DATE(CAST({self.sql(e, 'this')} AS VARCHAR), {Drill.dateint_format})", -137 exp.If: lambda self, e: f"`IF`({self.format_args(e.this, e.args.get('true'), e.args.get('false'))})", -138 exp.ILike: lambda self, e: f" {self.sql(e, 'this')} `ILIKE` {self.sql(e, 'expression')}", -139 exp.Levenshtein: rename_func("LEVENSHTEIN_DISTANCE"), -140 exp.PartitionedByProperty: lambda self, e: f"PARTITION BY {self.sql(e, 'this')}", -141 exp.RegexpLike: rename_func("REGEXP_MATCHES"), -142 exp.StrPosition: str_position_sql, -143 exp.StrToDate: _str_to_date, -144 exp.Pow: rename_func("POW"), -145 exp.StrToTime: lambda self, e: f"TO_TIMESTAMP({self.sql(e, 'this')}, {self.format_time(e)})", -146 exp.TimeStrToDate: lambda self, e: f"CAST({self.sql(e, 'this')} AS DATE)", -147 exp.TimeStrToTime: timestrtotime_sql, -148 exp.TimeStrToUnix: rename_func("UNIX_TIMESTAMP"), -149 exp.TimeToStr: lambda self, e: f"TO_CHAR({self.sql(e, 'this')}, {self.format_time(e)})", -150 exp.TimeToUnix: rename_func("UNIX_TIMESTAMP"), -151 exp.ToChar: lambda self, e: self.function_fallback_sql(e), -152 exp.TryCast: no_trycast_sql, -153 exp.TsOrDsAdd: lambda self, e: f"DATE_ADD(CAST({self.sql(e, 'this')} AS DATE), {self.sql(exp.Interval(this=e.expression, unit=exp.Var(this='DAY')))})", -154 exp.TsOrDsToDate: ts_or_ds_to_date_sql("drill"), -155 exp.TsOrDiToDi: lambda self, e: f"CAST(SUBSTR(REPLACE(CAST({self.sql(e, 'this')} AS VARCHAR), '-', ''), 1, 8) AS INT)", -156 } -157 -158 def normalize_func(self, name: str) -> str: -159 return name if exp.SAFE_IDENTIFIER_RE.match(name) else f"`{name}`" +108 JOIN_HINTS = False +109 TABLE_HINTS = False +110 +111 TYPE_MAPPING = { +112 **generator.Generator.TYPE_MAPPING, # type: ignore +113 exp.DataType.Type.INT: "INTEGER", +114 exp.DataType.Type.SMALLINT: "INTEGER", +115 exp.DataType.Type.TINYINT: "INTEGER", +116 exp.DataType.Type.BINARY: "VARBINARY", +117 exp.DataType.Type.TEXT: "VARCHAR", +118 exp.DataType.Type.NCHAR: "VARCHAR", +119 exp.DataType.Type.TIMESTAMPLTZ: "TIMESTAMP", +120 exp.DataType.Type.TIMESTAMPTZ: "TIMESTAMP", +121 exp.DataType.Type.DATETIME: "TIMESTAMP", +122 } +123 +124 PROPERTIES_LOCATION = { +125 **generator.Generator.PROPERTIES_LOCATION, # type: ignore +126 exp.PartitionedByProperty: exp.Properties.Location.POST_SCHEMA, +127 exp.VolatileProperty: exp.Properties.Location.UNSUPPORTED, +128 } +129 +130 TRANSFORMS = { +131 **generator.Generator.TRANSFORMS, # type: ignore +132 exp.CurrentTimestamp: lambda *_: "CURRENT_TIMESTAMP", +133 exp.ArrayContains: rename_func("REPEATED_CONTAINS"), +134 exp.ArraySize: rename_func("REPEATED_COUNT"), +135 exp.Create: create_with_partitions_sql, +136 exp.DateAdd: _date_add_sql("ADD"), +137 exp.DateStrToDate: datestrtodate_sql, +138 exp.DateSub: _date_add_sql("SUB"), +139 exp.DateToDi: lambda self, e: f"CAST(TO_DATE({self.sql(e, 'this')}, {Drill.dateint_format}) AS INT)", +140 exp.DiToDate: lambda self, e: f"TO_DATE(CAST({self.sql(e, 'this')} AS VARCHAR), {Drill.dateint_format})", +141 exp.If: lambda self, e: f"`IF`({self.format_args(e.this, e.args.get('true'), e.args.get('false'))})", +142 exp.ILike: lambda self, e: f" {self.sql(e, 'this')} `ILIKE` {self.sql(e, 'expression')}", +143 exp.Levenshtein: rename_func("LEVENSHTEIN_DISTANCE"), +144 exp.PartitionedByProperty: lambda self, e: f"PARTITION BY {self.sql(e, 'this')}", +145 exp.RegexpLike: rename_func("REGEXP_MATCHES"), +146 exp.StrPosition: str_position_sql, +147 exp.StrToDate: _str_to_date, +148 exp.Pow: rename_func("POW"), +149 exp.StrToTime: lambda self, e: f"TO_TIMESTAMP({self.sql(e, 'this')}, {self.format_time(e)})", +150 exp.TimeStrToDate: lambda self, e: f"CAST({self.sql(e, 'this')} AS DATE)", +151 exp.TimeStrToTime: timestrtotime_sql, +152 exp.TimeStrToUnix: rename_func("UNIX_TIMESTAMP"), +153 exp.TimeToStr: lambda self, e: f"TO_CHAR({self.sql(e, 'this')}, {self.format_time(e)})", +154 exp.TimeToUnix: rename_func("UNIX_TIMESTAMP"), +155 exp.ToChar: lambda self, e: self.function_fallback_sql(e), +156 exp.TryCast: no_trycast_sql, +157 exp.TsOrDsAdd: lambda self, e: f"DATE_ADD(CAST({self.sql(e, 'this')} AS DATE), {self.sql(exp.Interval(this=e.expression, unit=exp.Var(this='DAY')))})", +158 exp.TsOrDsToDate: ts_or_ds_to_date_sql("drill"), +159 exp.TsOrDiToDi: lambda self, e: f"CAST(SUBSTR(REPLACE(CAST({self.sql(e, 'this')} AS VARCHAR), '-', ''), 1, 8) AS INT)", +160 } +161 +162 def normalize_func(self, name: str) -> str: +163 return name if exp.SAFE_IDENTIFIER_RE.match(name) else f"`{name}`" @@ -497,58 +505,62 @@ Default: "nulls_are_small"
107    class Generator(generator.Generator):
-108        TYPE_MAPPING = {
-109            **generator.Generator.TYPE_MAPPING,  # type: ignore
-110            exp.DataType.Type.INT: "INTEGER",
-111            exp.DataType.Type.SMALLINT: "INTEGER",
-112            exp.DataType.Type.TINYINT: "INTEGER",
-113            exp.DataType.Type.BINARY: "VARBINARY",
-114            exp.DataType.Type.TEXT: "VARCHAR",
-115            exp.DataType.Type.NCHAR: "VARCHAR",
-116            exp.DataType.Type.TIMESTAMPLTZ: "TIMESTAMP",
-117            exp.DataType.Type.TIMESTAMPTZ: "TIMESTAMP",
-118            exp.DataType.Type.DATETIME: "TIMESTAMP",
-119        }
-120
-121        PROPERTIES_LOCATION = {
-122            **generator.Generator.PROPERTIES_LOCATION,  # type: ignore
-123            exp.PartitionedByProperty: exp.Properties.Location.POST_SCHEMA,
-124        }
-125
-126        TRANSFORMS = {
-127            **generator.Generator.TRANSFORMS,  # type: ignore
-128            exp.CurrentTimestamp: lambda *_: "CURRENT_TIMESTAMP",
-129            exp.ArrayContains: rename_func("REPEATED_CONTAINS"),
-130            exp.ArraySize: rename_func("REPEATED_COUNT"),
-131            exp.Create: create_with_partitions_sql,
-132            exp.DateAdd: _date_add_sql("ADD"),
-133            exp.DateStrToDate: datestrtodate_sql,
-134            exp.DateSub: _date_add_sql("SUB"),
-135            exp.DateToDi: lambda self, e: f"CAST(TO_DATE({self.sql(e, 'this')}, {Drill.dateint_format}) AS INT)",
-136            exp.DiToDate: lambda self, e: f"TO_DATE(CAST({self.sql(e, 'this')} AS VARCHAR), {Drill.dateint_format})",
-137            exp.If: lambda self, e: f"`IF`({self.format_args(e.this, e.args.get('true'), e.args.get('false'))})",
-138            exp.ILike: lambda self, e: f" {self.sql(e, 'this')} `ILIKE` {self.sql(e, 'expression')}",
-139            exp.Levenshtein: rename_func("LEVENSHTEIN_DISTANCE"),
-140            exp.PartitionedByProperty: lambda self, e: f"PARTITION BY {self.sql(e, 'this')}",
-141            exp.RegexpLike: rename_func("REGEXP_MATCHES"),
-142            exp.StrPosition: str_position_sql,
-143            exp.StrToDate: _str_to_date,
-144            exp.Pow: rename_func("POW"),
-145            exp.StrToTime: lambda self, e: f"TO_TIMESTAMP({self.sql(e, 'this')}, {self.format_time(e)})",
-146            exp.TimeStrToDate: lambda self, e: f"CAST({self.sql(e, 'this')} AS DATE)",
-147            exp.TimeStrToTime: timestrtotime_sql,
-148            exp.TimeStrToUnix: rename_func("UNIX_TIMESTAMP"),
-149            exp.TimeToStr: lambda self, e: f"TO_CHAR({self.sql(e, 'this')}, {self.format_time(e)})",
-150            exp.TimeToUnix: rename_func("UNIX_TIMESTAMP"),
-151            exp.ToChar: lambda self, e: self.function_fallback_sql(e),
-152            exp.TryCast: no_trycast_sql,
-153            exp.TsOrDsAdd: lambda self, e: f"DATE_ADD(CAST({self.sql(e, 'this')} AS DATE), {self.sql(exp.Interval(this=e.expression, unit=exp.Var(this='DAY')))})",
-154            exp.TsOrDsToDate: ts_or_ds_to_date_sql("drill"),
-155            exp.TsOrDiToDi: lambda self, e: f"CAST(SUBSTR(REPLACE(CAST({self.sql(e, 'this')} AS VARCHAR), '-', ''), 1, 8) AS INT)",
-156        }
-157
-158        def normalize_func(self, name: str) -> str:
-159            return name if exp.SAFE_IDENTIFIER_RE.match(name) else f"`{name}`"
+108        JOIN_HINTS = False
+109        TABLE_HINTS = False
+110
+111        TYPE_MAPPING = {
+112            **generator.Generator.TYPE_MAPPING,  # type: ignore
+113            exp.DataType.Type.INT: "INTEGER",
+114            exp.DataType.Type.SMALLINT: "INTEGER",
+115            exp.DataType.Type.TINYINT: "INTEGER",
+116            exp.DataType.Type.BINARY: "VARBINARY",
+117            exp.DataType.Type.TEXT: "VARCHAR",
+118            exp.DataType.Type.NCHAR: "VARCHAR",
+119            exp.DataType.Type.TIMESTAMPLTZ: "TIMESTAMP",
+120            exp.DataType.Type.TIMESTAMPTZ: "TIMESTAMP",
+121            exp.DataType.Type.DATETIME: "TIMESTAMP",
+122        }
+123
+124        PROPERTIES_LOCATION = {
+125            **generator.Generator.PROPERTIES_LOCATION,  # type: ignore
+126            exp.PartitionedByProperty: exp.Properties.Location.POST_SCHEMA,
+127            exp.VolatileProperty: exp.Properties.Location.UNSUPPORTED,
+128        }
+129
+130        TRANSFORMS = {
+131            **generator.Generator.TRANSFORMS,  # type: ignore
+132            exp.CurrentTimestamp: lambda *_: "CURRENT_TIMESTAMP",
+133            exp.ArrayContains: rename_func("REPEATED_CONTAINS"),
+134            exp.ArraySize: rename_func("REPEATED_COUNT"),
+135            exp.Create: create_with_partitions_sql,
+136            exp.DateAdd: _date_add_sql("ADD"),
+137            exp.DateStrToDate: datestrtodate_sql,
+138            exp.DateSub: _date_add_sql("SUB"),
+139            exp.DateToDi: lambda self, e: f"CAST(TO_DATE({self.sql(e, 'this')}, {Drill.dateint_format}) AS INT)",
+140            exp.DiToDate: lambda self, e: f"TO_DATE(CAST({self.sql(e, 'this')} AS VARCHAR), {Drill.dateint_format})",
+141            exp.If: lambda self, e: f"`IF`({self.format_args(e.this, e.args.get('true'), e.args.get('false'))})",
+142            exp.ILike: lambda self, e: f" {self.sql(e, 'this')} `ILIKE` {self.sql(e, 'expression')}",
+143            exp.Levenshtein: rename_func("LEVENSHTEIN_DISTANCE"),
+144            exp.PartitionedByProperty: lambda self, e: f"PARTITION BY {self.sql(e, 'this')}",
+145            exp.RegexpLike: rename_func("REGEXP_MATCHES"),
+146            exp.StrPosition: str_position_sql,
+147            exp.StrToDate: _str_to_date,
+148            exp.Pow: rename_func("POW"),
+149            exp.StrToTime: lambda self, e: f"TO_TIMESTAMP({self.sql(e, 'this')}, {self.format_time(e)})",
+150            exp.TimeStrToDate: lambda self, e: f"CAST({self.sql(e, 'this')} AS DATE)",
+151            exp.TimeStrToTime: timestrtotime_sql,
+152            exp.TimeStrToUnix: rename_func("UNIX_TIMESTAMP"),
+153            exp.TimeToStr: lambda self, e: f"TO_CHAR({self.sql(e, 'this')}, {self.format_time(e)})",
+154            exp.TimeToUnix: rename_func("UNIX_TIMESTAMP"),
+155            exp.ToChar: lambda self, e: self.function_fallback_sql(e),
+156            exp.TryCast: no_trycast_sql,
+157            exp.TsOrDsAdd: lambda self, e: f"DATE_ADD(CAST({self.sql(e, 'this')} AS DATE), {self.sql(exp.Interval(this=e.expression, unit=exp.Var(this='DAY')))})",
+158            exp.TsOrDsToDate: ts_or_ds_to_date_sql("drill"),
+159            exp.TsOrDiToDi: lambda self, e: f"CAST(SUBSTR(REPLACE(CAST({self.sql(e, 'this')} AS VARCHAR), '-', ''), 1, 8) AS INT)",
+160        }
+161
+162        def normalize_func(self, name: str) -> str:
+163            return name if exp.SAFE_IDENTIFIER_RE.match(name) else f"`{name}`"
 
@@ -607,8 +619,8 @@ Default: True -
158        def normalize_func(self, name: str) -> str:
-159            return name if exp.SAFE_IDENTIFIER_RE.match(name) else f"`{name}`"
+            
162        def normalize_func(self, name: str) -> str:
+163            return name if exp.SAFE_IDENTIFIER_RE.match(name) else f"`{name}`"
 
@@ -651,6 +663,7 @@ Default: True
tablealias_sql
bitstring_sql
hexstring_sql
+
bytestring_sql
datatype_sql
directory_sql
delete_sql
@@ -662,6 +675,7 @@ Default: True
hint_sql
index_sql
identifier_sql
+
inputoutputformat_sql
national_sql
partition_sql
properties_sql
@@ -687,6 +701,7 @@ Default: True
intersect_op
introducer_sql
pseudotype_sql
+
onconflict_sql
returning_sql
rowformatdelimitedproperty_sql
table_sql
-- cgit v1.2.3