Skip to content

Commit fe35394

Browse files
authored
Fix(optimizer)!: fix datetime coercion in the canonicalize rule (#4431)
* Fix(optimizer): fix datetime coercion in the canonicalize rule * Refactor: infer literal type and promote as needed (mysql only atm) * Reduce nesting level
1 parent 41d6a13 commit fe35394

File tree

7 files changed

+98
-50
lines changed

7 files changed

+98
-50
lines changed

sqlglot/dialects/dialect.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -397,6 +397,13 @@ class Dialect(metaclass=_Dialect):
397397
ARRAY_AGG_INCLUDES_NULLS: t.Optional[bool] = True
398398
"""Whether ArrayAgg needs to filter NULL values."""
399399

400+
PROMOTE_TO_INFERRED_DATETIME_TYPE = False
401+
"""
402+
This flag is used in the optimizer's canonicalize rule and determines whether x will be promoted
403+
to the literal's type in x::DATE < '2020-01-01 12:05:03' (i.e., DATETIME). When false, the literal
404+
is cast to x's type to match it instead.
405+
"""
406+
400407
REGEXP_EXTRACT_DEFAULT_GROUP = 0
401408
"""The default value for the capturing group."""
402409

sqlglot/dialects/mysql.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,8 @@ def func(self: MySQL.Generator, expression: exp.Func) -> str:
145145

146146

147147
class MySQL(Dialect):
148+
PROMOTE_TO_INFERRED_DATETIME_TYPE = True
149+
148150
# https://dev.mysql.com/doc/refman/8.0/en/identifiers.html
149151
IDENTIFIERS_CAN_START_WITH_DIGIT = True
150152

sqlglot/expressions.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7866,6 +7866,7 @@ def cast(
78667866
types_are_equivalent = type_mapping.get(
78677867
existing_cast_type, existing_cast_type.value
78687868
) == type_mapping.get(new_cast_type, new_cast_type.value)
7869+
78697870
if expr.is_type(data_type) or types_are_equivalent:
78707871
return expr
78717872

sqlglot/optimizer/canonicalize.py

Lines changed: 47 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,12 @@
44
import typing as t
55

66
from sqlglot import exp
7+
from sqlglot.dialects.dialect import Dialect, DialectType
78
from sqlglot.helper import is_date_unit, is_iso_date, is_iso_datetime
9+
from sqlglot.optimizer.annotate_types import TypeAnnotator
810

911

10-
def canonicalize(expression: exp.Expression) -> exp.Expression:
12+
def canonicalize(expression: exp.Expression, dialect: DialectType = None) -> exp.Expression:
1113
"""Converts a sql expression into a standard form.
1214
1315
This method relies on annotate_types because many of the
@@ -17,10 +19,12 @@ def canonicalize(expression: exp.Expression) -> exp.Expression:
1719
expression: The expression to canonicalize.
1820
"""
1921

22+
dialect = Dialect.get_or_raise(dialect)
23+
2024
def _canonicalize(expression: exp.Expression) -> exp.Expression:
2125
expression = add_text_to_concat(expression)
2226
expression = replace_date_funcs(expression)
23-
expression = coerce_type(expression)
27+
expression = coerce_type(expression, dialect.PROMOTE_TO_INFERRED_DATETIME_TYPE)
2428
expression = remove_redundant_casts(expression)
2529
expression = ensure_bools(expression, _replace_int_predicate)
2630
expression = remove_ascending_order(expression)
@@ -68,11 +72,11 @@ def replace_date_funcs(node: exp.Expression) -> exp.Expression:
6872
)
6973

7074

71-
def coerce_type(node: exp.Expression) -> exp.Expression:
75+
def coerce_type(node: exp.Expression, promote_to_inferred_datetime_type: bool) -> exp.Expression:
7276
if isinstance(node, COERCIBLE_DATE_OPS):
73-
_coerce_date(node.left, node.right)
77+
_coerce_date(node.left, node.right, promote_to_inferred_datetime_type)
7478
elif isinstance(node, exp.Between):
75-
_coerce_date(node.this, node.args["low"])
79+
_coerce_date(node.this, node.args["low"], promote_to_inferred_datetime_type)
7680
elif isinstance(node, exp.Extract) and not node.expression.type.is_type(
7781
*exp.DataType.TEMPORAL_TYPES
7882
):
@@ -128,17 +132,48 @@ def remove_ascending_order(expression: exp.Expression) -> exp.Expression:
128132
return expression
129133

130134

131-
def _coerce_date(a: exp.Expression, b: exp.Expression) -> None:
135+
def _coerce_date(
136+
a: exp.Expression,
137+
b: exp.Expression,
138+
promote_to_inferred_datetime_type: bool,
139+
) -> None:
132140
for a, b in itertools.permutations([a, b]):
133141
if isinstance(b, exp.Interval):
134142
a = _coerce_timeunit_arg(a, b.unit)
143+
144+
a_type = a.type
135145
if (
136-
a.type
137-
and a.type.this in exp.DataType.TEMPORAL_TYPES
138-
and b.type
139-
and b.type.this in exp.DataType.TEXT_TYPES
146+
not a_type
147+
or a_type.this not in exp.DataType.TEMPORAL_TYPES
148+
or not b.type
149+
or b.type.this not in exp.DataType.TEXT_TYPES
140150
):
141-
_replace_cast(b, exp.DataType.Type.DATETIME)
151+
continue
152+
153+
if promote_to_inferred_datetime_type:
154+
if b.is_string:
155+
date_text = b.name
156+
if is_iso_date(date_text):
157+
b_type = exp.DataType.Type.DATE
158+
elif is_iso_datetime(date_text):
159+
b_type = exp.DataType.Type.DATETIME
160+
else:
161+
b_type = a_type.this
162+
else:
163+
# If b is not a datetime string, we conservatively promote it to a DATETIME,
164+
# in order to ensure there are no surprising truncations due to downcasting
165+
b_type = exp.DataType.Type.DATETIME
166+
167+
target_type = (
168+
b_type if b_type in TypeAnnotator.COERCES_TO.get(a_type.this, {}) else a_type
169+
)
170+
else:
171+
target_type = a_type
172+
173+
if target_type != a_type:
174+
_replace_cast(a, target_type)
175+
176+
_replace_cast(b, target_type)
142177

143178

144179
def _coerce_timeunit_arg(arg: exp.Expression, unit: t.Optional[exp.Expression]) -> exp.Expression:
@@ -168,7 +203,7 @@ def _coerce_datediff_args(node: exp.DateDiff) -> None:
168203
e.replace(exp.cast(e.copy(), to=exp.DataType.Type.DATETIME))
169204

170205

171-
def _replace_cast(node: exp.Expression, to: exp.DataType.Type) -> None:
206+
def _replace_cast(node: exp.Expression, to: exp.DATA_TYPE) -> None:
172207
node.replace(exp.cast(node.copy(), to=to))
173208

174209

tests/fixtures/optimizer/canonicalize.sql

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ SELECT w.d + w.e AS c FROM w AS w;
22
SELECT CONCAT("w"."d", "w"."e") AS "c" FROM "w" AS "w";
33

44
SELECT CAST(w.d AS DATE) > w.e AS a FROM w AS w;
5-
SELECT CAST("w"."d" AS DATE) > CAST("w"."e" AS DATETIME) AS "a" FROM "w" AS "w";
5+
SELECT CAST("w"."d" AS DATE) > CAST("w"."e" AS DATE) AS "a" FROM "w" AS "w";
66

77
SELECT CAST(1 AS VARCHAR) AS a FROM w AS w;
88
SELECT CAST(1 AS VARCHAR) AS "a" FROM "w" AS "w";
@@ -102,14 +102,25 @@ DATEDIFF('2023-01-01', '2023-01-02', DAY);
102102
DATEDIFF(CAST('2023-01-01' AS DATETIME), CAST('2023-01-02' AS DATETIME), DAY);
103103

104104
SELECT "t"."d" > '2023-01-01' AS "d" FROM "temporal" AS "t";
105-
SELECT "t"."d" > CAST('2023-01-01' AS DATETIME) AS "d" FROM "temporal" AS "t";
105+
SELECT "t"."d" > CAST('2023-01-01' AS DATE) AS "d" FROM "temporal" AS "t";
106106

107107
SELECT "t"."d" > CAST('2023-01-01' AS DATETIME) AS "d" FROM "temporal" AS "t";
108108
SELECT "t"."d" > CAST('2023-01-01' AS DATETIME) AS "d" FROM "temporal" AS "t";
109109

110110
SELECT "t"."t" > '2023-01-01 00:00:01' AS "t" FROM "temporal" AS "t";
111111
SELECT "t"."t" > CAST('2023-01-01 00:00:01' AS DATETIME) AS "t" FROM "temporal" AS "t";
112112

113+
WITH "t" AS (SELECT CAST("ext"."created_at" AS TIMESTAMP) AS "created_at" FROM "ext" AS "ext") SELECT "t"."created_at" > '2024-10-01 12:05:02' AS "col" FROM "t" AS "t";
114+
WITH "t" AS (SELECT CAST("ext"."created_at" AS TIMESTAMP) AS "created_at" FROM "ext" AS "ext") SELECT "t"."created_at" > CAST('2024-10-01 12:05:02' AS TIMESTAMP) AS "col" FROM "t" AS "t";
115+
116+
# dialect: mysql
117+
SELECT `t`.`d` < '2023-01-01 00:00:01' AS `col` FROM `temporal` AS `t`;
118+
SELECT CAST(`t`.`d` AS DATETIME) < CAST('2023-01-01 00:00:01' AS DATETIME) AS `col` FROM `temporal` AS `t`;
119+
120+
# dialect: mysql
121+
SELECT CAST(`t`.`some_col` AS DATE) < CAST(`t`.`other_col` AS CHAR) AS `col` FROM `other_table` AS `t`;
122+
SELECT CAST(CAST(`t`.`some_col` AS DATE) AS DATETIME) < CAST(CAST(`t`.`other_col` AS CHAR) AS DATETIME) AS `col` FROM `other_table` AS `t`;
123+
113124
--------------------------------------
114125
-- Remove redundant casts
115126
--------------------------------------

tests/fixtures/optimizer/tpc-ds/tpc-ds.sql

Lines changed: 25 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -736,8 +736,8 @@ WITH "salesreturns" AS (
736736
"date_dim"."d_date" AS "d_date"
737737
FROM "date_dim" AS "date_dim"
738738
WHERE
739-
CAST("date_dim"."d_date" AS DATETIME) <= CAST('2002-09-05' AS DATE)
740-
AND CAST("date_dim"."d_date" AS DATETIME) >= CAST('2002-08-22' AS DATE)
739+
CAST("date_dim"."d_date" AS DATE) <= CAST('2002-09-05' AS DATE)
740+
AND CAST("date_dim"."d_date" AS DATE) >= CAST('2002-08-22' AS DATE)
741741
), "ssr" AS (
742742
SELECT
743743
"store"."s_store_id" AS "s_store_id",
@@ -1853,8 +1853,8 @@ SELECT
18531853
FROM "web_sales" AS "web_sales"
18541854
JOIN "date_dim" AS "date_dim"
18551855
ON "date_dim"."d_date_sk" = "web_sales"."ws_sold_date_sk"
1856-
AND CAST("date_dim"."d_date" AS DATETIME) <= CAST('2000-06-10' AS DATE)
1857-
AND CAST("date_dim"."d_date" AS DATETIME) >= CAST('2000-05-11' AS DATE)
1856+
AND CAST("date_dim"."d_date" AS DATE) <= CAST('2000-06-10' AS DATE)
1857+
AND CAST("date_dim"."d_date" AS DATE) >= CAST('2000-05-11' AS DATE)
18581858
JOIN "item" AS "item"
18591859
ON "item"."i_category" IN ('Home', 'Men', 'Women')
18601860
AND "item"."i_item_sk" = "web_sales"."ws_item_sk"
@@ -2422,7 +2422,7 @@ JOIN "date_dim" AS "date_dim"
24222422
AND "date_dim"."d_date" >= '2002-3-01'
24232423
AND (
24242424
CAST('2002-3-01' AS DATE) + INTERVAL '60' DAY
2425-
) >= CAST("date_dim"."d_date" AS DATETIME)
2425+
) >= CAST("date_dim"."d_date" AS DATE)
24262426
WHERE
24272427
"_u_3"."_u_4" IS NULL
24282428
AND ARRAY_ANY("_u_0"."_u_2", "_x" -> "cs1"."cs_warehouse_sk" <> "_x")
@@ -2731,8 +2731,8 @@ SELECT
27312731
FROM "catalog_sales" AS "catalog_sales"
27322732
JOIN "date_dim" AS "date_dim"
27332733
ON "catalog_sales"."cs_sold_date_sk" = "date_dim"."d_date_sk"
2734-
AND CAST("date_dim"."d_date" AS DATETIME) <= CAST('2001-03-05' AS DATE)
2735-
AND CAST("date_dim"."d_date" AS DATETIME) >= CAST('2001-02-03' AS DATE)
2734+
AND CAST("date_dim"."d_date" AS DATE) <= CAST('2001-03-05' AS DATE)
2735+
AND CAST("date_dim"."d_date" AS DATE) >= CAST('2001-02-03' AS DATE)
27362736
JOIN "item" AS "item"
27372737
ON "catalog_sales"."cs_item_sk" = "item"."i_item_sk"
27382738
AND "item"."i_category" IN ('Children', 'Women', 'Electronics')
@@ -2811,8 +2811,8 @@ WITH "x" AS (
28112811
FROM "inventory" AS "inventory"
28122812
JOIN "date_dim" AS "date_dim"
28132813
ON "date_dim"."d_date_sk" = "inventory"."inv_date_sk"
2814-
AND CAST("date_dim"."d_date" AS DATETIME) <= CAST('2000-06-12' AS DATE)
2815-
AND CAST("date_dim"."d_date" AS DATETIME) >= CAST('2000-04-13' AS DATE)
2814+
AND CAST("date_dim"."d_date" AS DATE) <= CAST('2000-06-12' AS DATE)
2815+
AND CAST("date_dim"."d_date" AS DATE) >= CAST('2000-04-13' AS DATE)
28162816
JOIN "item" AS "item"
28172817
ON "inventory"."inv_item_sk" = "item"."i_item_sk"
28182818
AND "item"."i_current_price" <= 1.49
@@ -3944,7 +3944,7 @@ WITH "catalog_sales_2" AS (
39443944
FROM "date_dim" AS "date_dim"
39453945
WHERE
39463946
"date_dim"."d_date" >= '2001-03-04'
3947-
AND CAST("date_dim"."d_date" AS DATETIME) <= CAST('2001-06-02' AS DATE)
3947+
AND CAST("date_dim"."d_date" AS DATE) <= CAST('2001-06-02' AS DATE)
39483948
), "_u_0" AS (
39493949
SELECT
39503950
1.3 * AVG("catalog_sales"."cs_ext_discount_amt") AS "_col_0",
@@ -4510,8 +4510,8 @@ JOIN "inventory" AS "inventory"
45104510
AND "inventory"."inv_quantity_on_hand" >= 100
45114511
JOIN "date_dim" AS "date_dim"
45124512
ON "date_dim"."d_date_sk" = "inventory"."inv_date_sk"
4513-
AND CAST("date_dim"."d_date" AS DATETIME) <= CAST('1999-05-05' AS DATE)
4514-
AND CAST("date_dim"."d_date" AS DATETIME) >= CAST('1999-03-06' AS DATE)
4513+
AND CAST("date_dim"."d_date" AS DATE) <= CAST('1999-05-05' AS DATE)
4514+
AND CAST("date_dim"."d_date" AS DATE) >= CAST('1999-03-06' AS DATE)
45154515
WHERE
45164516
"item"."i_current_price" <= 50
45174517
AND "item"."i_current_price" >= 20
@@ -4787,8 +4787,8 @@ LEFT JOIN "catalog_returns" AS "catalog_returns"
47874787
AND "catalog_returns"."cr_order_number" = "catalog_sales"."cs_order_number"
47884788
JOIN "date_dim" AS "date_dim"
47894789
ON "catalog_sales"."cs_sold_date_sk" = "date_dim"."d_date_sk"
4790-
AND CAST("date_dim"."d_date" AS DATETIME) <= CAST('2002-07-01' AS DATE)
4791-
AND CAST("date_dim"."d_date" AS DATETIME) >= CAST('2002-05-02' AS DATE)
4790+
AND CAST("date_dim"."d_date" AS DATE) <= CAST('2002-07-01' AS DATE)
4791+
AND CAST("date_dim"."d_date" AS DATE) >= CAST('2002-05-02' AS DATE)
47924792
JOIN "item" AS "item"
47934793
ON "catalog_sales"."cs_item_sk" = "item"."i_item_sk"
47944794
AND "item"."i_current_price" <= 1.49
@@ -10318,8 +10318,8 @@ WITH "date_dim_2" AS (
1031810318
"date_dim"."d_date" AS "d_date"
1031910319
FROM "date_dim" AS "date_dim"
1032010320
WHERE
10321-
CAST("date_dim"."d_date" AS DATETIME) <= CAST('2001-09-15' AS DATE)
10322-
AND CAST("date_dim"."d_date" AS DATETIME) >= CAST('2001-08-16' AS DATE)
10321+
CAST("date_dim"."d_date" AS DATE) <= CAST('2001-09-15' AS DATE)
10322+
AND CAST("date_dim"."d_date" AS DATE) >= CAST('2001-08-16' AS DATE)
1032310323
), "store_2" AS (
1032410324
SELECT
1032510325
"store"."s_store_sk" AS "s_store_sk"
@@ -10828,8 +10828,8 @@ WITH "date_dim_2" AS (
1082810828
"date_dim"."d_date" AS "d_date"
1082910829
FROM "date_dim" AS "date_dim"
1083010830
WHERE
10831-
CAST("date_dim"."d_date" AS DATETIME) <= CAST('2000-09-25' AS DATE)
10832-
AND CAST("date_dim"."d_date" AS DATETIME) >= CAST('2000-08-26' AS DATE)
10831+
CAST("date_dim"."d_date" AS DATE) <= CAST('2000-09-25' AS DATE)
10832+
AND CAST("date_dim"."d_date" AS DATE) >= CAST('2000-08-26' AS DATE)
1083310833
), "item_2" AS (
1083410834
SELECT
1083510835
"item"."i_item_sk" AS "i_item_sk",
@@ -11109,8 +11109,8 @@ JOIN "store_sales" AS "store_sales"
1110911109
ON "item"."i_item_sk" = "store_sales"."ss_item_sk"
1111011110
JOIN "date_dim" AS "date_dim"
1111111111
ON "date_dim"."d_date_sk" = "inventory"."inv_date_sk"
11112-
AND CAST("date_dim"."d_date" AS DATETIME) <= CAST('1998-06-26' AS DATE)
11113-
AND CAST("date_dim"."d_date" AS DATETIME) >= CAST('1998-04-27' AS DATE)
11112+
AND CAST("date_dim"."d_date" AS DATE) <= CAST('1998-06-26' AS DATE)
11113+
AND CAST("date_dim"."d_date" AS DATE) >= CAST('1998-04-27' AS DATE)
1111411114
WHERE
1111511115
"item"."i_current_price" <= 93
1111611116
AND "item"."i_current_price" >= 63
@@ -12180,7 +12180,7 @@ WITH "web_sales_2" AS (
1218012180
FROM "date_dim" AS "date_dim"
1218112181
WHERE
1218212182
"date_dim"."d_date" >= '2002-03-29'
12183-
AND CAST("date_dim"."d_date" AS DATETIME) <= CAST('2002-06-27' AS DATE)
12183+
AND CAST("date_dim"."d_date" AS DATE) <= CAST('2002-06-27' AS DATE)
1218412184
), "_u_0" AS (
1218512185
SELECT
1218612186
1.3 * AVG("web_sales"."ws_ext_discount_amt") AS "_col_0",
@@ -12321,7 +12321,7 @@ JOIN "date_dim" AS "date_dim"
1232112321
AND "date_dim"."d_date_sk" = "ws1"."ws_ship_date_sk"
1232212322
AND (
1232312323
CAST('2000-3-01' AS DATE) + INTERVAL '60' DAY
12324-
) >= CAST("date_dim"."d_date" AS DATETIME)
12324+
) >= CAST("date_dim"."d_date" AS DATE)
1232512325
JOIN "web_site" AS "web_site"
1232612326
ON "web_site"."web_company_name" = 'pri'
1232712327
AND "web_site"."web_site_sk" = "ws1"."ws_web_site_sk"
@@ -12411,7 +12411,7 @@ JOIN "date_dim" AS "date_dim"
1241112411
AND "date_dim"."d_date_sk" = "ws1"."ws_ship_date_sk"
1241212412
AND (
1241312413
CAST('2000-4-01' AS DATE) + INTERVAL '60' DAY
12414-
) >= CAST("date_dim"."d_date" AS DATETIME)
12414+
) >= CAST("date_dim"."d_date" AS DATE)
1241512415
JOIN "web_site" AS "web_site"
1241612416
ON "web_site"."web_company_name" = 'pri'
1241712417
AND "web_site"."web_site_sk" = "ws1"."ws_web_site_sk"
@@ -12595,8 +12595,8 @@ SELECT
1259512595
FROM "store_sales" AS "store_sales"
1259612596
JOIN "date_dim" AS "date_dim"
1259712597
ON "date_dim"."d_date_sk" = "store_sales"."ss_sold_date_sk"
12598-
AND CAST("date_dim"."d_date" AS DATETIME) <= CAST('2000-06-17' AS DATE)
12599-
AND CAST("date_dim"."d_date" AS DATETIME) >= CAST('2000-05-18' AS DATE)
12598+
AND CAST("date_dim"."d_date" AS DATE) <= CAST('2000-06-17' AS DATE)
12599+
AND CAST("date_dim"."d_date" AS DATE) >= CAST('2000-05-18' AS DATE)
1260012600
JOIN "item" AS "item"
1260112601
ON "item"."i_category" IN ('Men', 'Home', 'Electronics')
1260212602
AND "item"."i_item_sk" = "store_sales"."ss_item_sk"

tests/test_optimizer.py

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,6 @@ def check_file(
132132
func,
133133
pretty=False,
134134
execute=False,
135-
set_dialect=False,
136135
only=None,
137136
**kwargs,
138137
):
@@ -158,7 +157,7 @@ def check_file(
158157
validate_qualify_columns
159158
)
160159

161-
if set_dialect and dialect:
160+
if dialect:
162161
func_kwargs["dialect"] = dialect
163162

164163
future = pool.submit(parse_and_optimize, func, sql, dialect, **func_kwargs)
@@ -207,7 +206,6 @@ def test_optimize(self, logger):
207206
pretty=True,
208207
execute=True,
209208
schema=schema,
210-
set_dialect=True,
211209
)
212210

213211
def test_isolate_table_selects(self):
@@ -235,7 +233,6 @@ def test_qualify_tables(self):
235233
optimizer.qualify_tables.qualify_tables,
236234
db="db",
237235
catalog="c",
238-
set_dialect=True,
239236
)
240237

241238
def test_normalize(self):
@@ -446,11 +443,8 @@ def test_qualify_columns(self, logger):
446443
qualify_columns,
447444
execute=True,
448445
schema=self.schema,
449-
set_dialect=True,
450-
)
451-
self.check_file(
452-
"qualify_columns_ddl", qualify_columns, schema=self.schema, set_dialect=True
453446
)
447+
self.check_file("qualify_columns_ddl", qualify_columns, schema=self.schema)
454448

455449
def test_qualify_columns__with_invisible(self):
456450
schema = MappingSchema(self.schema, {"x": {"a"}, "y": {"b"}, "z": {"b"}})
@@ -475,7 +469,6 @@ def test_normalize_identifiers(self):
475469
self.check_file(
476470
"normalize_identifiers",
477471
optimizer.normalize_identifiers.normalize_identifiers,
478-
set_dialect=True,
479472
)
480473

481474
self.assertEqual(optimizer.normalize_identifiers.normalize_identifiers("a%").sql(), '"a%"')
@@ -484,14 +477,13 @@ def test_quote_identifiers(self):
484477
self.check_file(
485478
"quote_identifiers",
486479
optimizer.qualify_columns.quote_identifiers,
487-
set_dialect=True,
488480
)
489481

490482
def test_pushdown_projection(self):
491483
self.check_file("pushdown_projections", pushdown_projections, schema=self.schema)
492484

493485
def test_simplify(self):
494-
self.check_file("simplify", simplify, set_dialect=True)
486+
self.check_file("simplify", simplify)
495487

496488
expression = parse_one("SELECT a, c, b FROM table1 WHERE 1 = 1")
497489
self.assertEqual(simplify(simplify(expression.find(exp.Where))).sql(), "WHERE TRUE")

0 commit comments

Comments
 (0)