Skip to content

Commit 66ffdd7

Browse files
committed
refactor impl
1 parent 1f2a23a commit 66ffdd7

File tree

6 files changed

+53
-45
lines changed

6 files changed

+53
-45
lines changed

sqlglot/optimizer/simplify.py

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -280,9 +280,9 @@ def _simplify_connectors(expression, left, right):
280280
return exp.null()
281281
if always_true(left) and always_true(right):
282282
return exp.true()
283-
if is_true(left):
283+
if always_true(left) and right.is_type(exp.DataType.Type.BOOLEAN):
284284
return right
285-
if is_true(right):
285+
if always_true(right) and left.is_type(exp.DataType.Type.BOOLEAN):
286286
return left
287287
return _simplify_comparison(expression, left, right)
288288
elif isinstance(expression, exp.Or):
@@ -294,9 +294,9 @@ def _simplify_connectors(expression, left, right):
294294
or (always_false(left) and is_null(right))
295295
):
296296
return exp.null()
297-
if is_false(left):
297+
if is_false(left) and right.is_type(exp.DataType.Type.BOOLEAN):
298298
return right
299-
if is_false(right):
299+
if is_false(right) and left.is_type(exp.DataType.Type.BOOLEAN):
300300
return left
301301
return _simplify_comparison(expression, left, right, or_=True)
302302

@@ -1130,7 +1130,7 @@ def remove_where_true(expression):
11301130

11311131

11321132
def always_true(expression):
1133-
return is_true(expression) or (
1133+
return (isinstance(expression, exp.Boolean) and expression.this) or (
11341134
isinstance(expression, exp.Literal) and expression.is_number and not is_zero(expression)
11351135
)
11361136

@@ -1151,10 +1151,6 @@ def is_false(a: exp.Expression) -> bool:
11511151
return type(a) is exp.Boolean and not a.this
11521152

11531153

1154-
def is_true(a: exp.Expression):
1155-
return type(a) is exp.Boolean and a.this
1156-
1157-
11581154
def is_null(a: exp.Expression) -> bool:
11591155
return type(a) is exp.Null
11601156

tests/fixtures/optimizer/normalize.sql

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,13 @@
22
(A OR B) AND (B OR C) AND (E OR F);
33

44
(A AND B) OR (B AND C AND D);
5-
(A OR C) AND (A OR D) AND B;
5+
(A OR C) AND (A OR D) AND B AND TRUE;
66

77
(A OR B) AND (A OR C) AND (A OR D) AND (B OR C) AND (B OR D) AND B;
8-
(A OR C) AND (A OR D) AND B;
8+
(A OR C) AND (A OR D) AND B AND TRUE;
99

1010
(A AND E) OR (B AND C) OR (D AND (E OR F));
11-
(A OR B OR D) AND (A OR C OR D) AND (B OR D OR E) AND (B OR E OR F) AND (C OR D OR E) AND (C OR E OR F);
11+
(A OR B OR D) AND (A OR C OR D) AND (B OR D OR E) AND (B OR E OR F) AND (C OR D OR E) AND (C OR E OR F) AND TRUE;
1212

1313
(A AND B AND C AND D AND E AND F AND G) OR (H AND I AND J AND K AND L AND M AND N) OR (O AND P AND Q);
1414
(A AND B AND C AND D AND E AND F AND G) OR (H AND I AND J AND K AND L AND M AND N) OR (O AND P AND Q);
@@ -32,7 +32,7 @@ A OR (B OR (C AND D));
3232
(A OR B OR C) AND (A OR B OR D);
3333

3434
A OR ((((B OR C) AND (B OR D)) OR C) AND (((B OR C) AND (B OR D)) OR D));
35-
(A OR B OR C) AND (A OR B OR D);
35+
(A OR B OR C) AND (A OR B OR D) AND TRUE;
3636

3737
(A AND B) OR (C AND D);
3838
(A OR C) AND (A OR D) AND (B OR C) AND (B OR D);

tests/fixtures/optimizer/optimizer.sql

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -534,7 +534,10 @@ SELECT
534534
) AS "sort_order"
535535
FROM "unioned" AS "unioned"
536536
WHERE
537-
"unioned"."source_system" = 'bamboohr' OR "unioned"."source_system" = 'workday'
537+
(
538+
"unioned"."source_system" = 'bamboohr' OR "unioned"."source_system" = 'workday'
539+
)
540+
AND TRUE
538541
QUALIFY
539542
ROW_NUMBER() OVER (
540543
PARTITION BY "unioned"."unique_filter_key"

tests/fixtures/optimizer/pushdown_predicates.sql

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ SELECT x.a FROM (SELECT * FROM x) AS x CROSS JOIN y WHERE y.a = 1 OR (x.a = 1 AN
88
SELECT x.a FROM (SELECT * FROM x) AS x CROSS JOIN y WHERE (x.a = 1 AND x.b = 1) OR y.a = 1;
99

1010
SELECT x.a FROM (SELECT * FROM x) AS x JOIN y WHERE (x.a = y.a AND x.a = 1 AND x.b = 1) OR x.a = y.a;
11-
SELECT x.a FROM (SELECT * FROM x) AS x JOIN y ON x.a = y.a WHERE TRUE;
11+
SELECT x.a FROM (SELECT * FROM x) AS x JOIN y ON FALSE OR x.a = y.a WHERE TRUE;
1212

1313
SELECT x.a FROM (SELECT * FROM x) AS x JOIN y WHERE (x.a = y.a AND x.a = 1 AND x.b = 1) OR x.a = y.b;
1414
SELECT x.a FROM (SELECT * FROM x) AS x JOIN y ON (x.a = 1 AND x.a = y.a AND x.b = 1) OR x.a = y.b WHERE (x.a = 1 AND x.a = y.a AND x.b = 1) OR x.a = y.b;

tests/fixtures/optimizer/simplify.sql

Lines changed: 34 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -153,11 +153,17 @@ COALESCE(x, y) <> ALL (SELECT z FROM w);
153153
SELECT NOT (2 <> ALL (SELECT 2 UNION ALL SELECT 3));
154154
SELECT 2 = ANY(SELECT 2 UNION ALL SELECT 3);
155155

156-
x AND TRUE;
157-
x;
156+
SELECT t_bool.b AND TRUE FROM t_bool;
157+
SELECT t_bool.b FROM t_bool;
158158

159-
TRUE AND x;
160-
x;
159+
SELECT TRUE AND t_bool.b FROM t_bool;
160+
SELECT t_bool.b FROM t_bool;
161+
162+
SELECT t_bool.b OR FALSE FROM t_bool;
163+
SELECT t_bool.b FROM t_bool;
164+
165+
SELECT FALSE OR t_bool.b FROM t_bool;
166+
SELECT t_bool.b FROM t_bool;
161167

162168
--------------------------------------
163169
-- Absorption
@@ -166,49 +172,49 @@ x;
166172
(A OR B) AND (C OR NOT A);
167173

168174
A AND (A OR B);
169-
A;
175+
A AND TRUE;
170176

171177
A AND D AND E AND (B OR A);
172-
A AND D AND E;
178+
A AND D AND E AND TRUE;
173179

174180
D AND A AND E AND (B OR A);
175-
A AND D AND E;
181+
A AND D AND E AND TRUE;
176182

177183
(A OR B) AND A;
178-
A;
184+
A AND TRUE;
179185

180186
C AND D AND (A OR B) AND E AND F AND A;
181-
A AND C AND D AND E AND F;
187+
A AND C AND D AND E AND F AND TRUE;
182188

183189
A OR (A AND B);
184-
A;
190+
A OR FALSE;
185191

186192
(A AND B) OR A;
187-
A;
193+
A OR FALSE;
188194

189195
A AND (NOT A OR B);
190-
A AND B;
196+
A AND (B OR FALSE);
191197

192198
(NOT A OR B) AND A;
193-
A AND B;
199+
A AND (B OR FALSE);
194200

195201
A OR (NOT A AND B);
196-
A OR B;
202+
A OR (B AND TRUE);
197203

198204
(A OR C) AND ((A OR C) OR B);
199-
A OR C;
205+
(A OR C) AND TRUE;
200206

201207
(A OR C) AND (A OR B OR C);
202-
A OR C;
208+
(A OR C) AND TRUE;
203209

204210
A AND (B AND C) AND (D AND E);
205211
A AND B AND C AND D AND E;
206212

207213
A AND (A OR B) AND (A OR B OR C);
208-
A;
214+
A AND TRUE;
209215

210216
(A OR B) AND (A OR C) AND (A OR B OR C);
211-
(A OR B) AND (A OR C);
217+
(A OR B) AND (A OR C) AND TRUE;
212218

213219
--------------------------------------
214220
-- Elimination
@@ -863,41 +869,41 @@ COALESCE(x);
863869
x;
864870

865871
COALESCE(x, 1) = 2;
866-
NOT x IS NULL AND x = 2;
872+
FALSE OR (NOT x IS NULL AND x = 2);
867873

868874
# dialect: redshift
869875
COALESCE(x, 1) = 2;
870876
COALESCE(x, 1) = 2;
871877

872878
2 = COALESCE(x, 1);
873-
NOT x IS NULL AND x = 2;
879+
FALSE OR (NOT x IS NULL AND x = 2);
874880

875881
COALESCE(x, 1, 1) = 1 + 1;
876-
NOT x IS NULL AND x = 2;
882+
FALSE OR (NOT x IS NULL AND x = 2);
877883

878884
COALESCE(x, 1, 2) = 2;
879-
NOT x IS NULL AND x = 2;
885+
FALSE OR (NOT x IS NULL AND x = 2);
880886

881887
COALESCE(x, 3) <= 2;
882-
NOT x IS NULL AND x <= 2;
888+
FALSE OR (NOT x IS NULL AND x <= 2);
883889

884890
COALESCE(x, 1) <> 2;
885-
x <> 2 OR x IS NULL;
891+
(NOT x IS NULL AND x <> 2) OR (TRUE AND x IS NULL);
886892

887893
COALESCE(x, 1) <= 2;
888-
x <= 2 OR x IS NULL;
894+
(NOT x IS NULL AND x <= 2) OR (TRUE AND x IS NULL);
889895

890896
COALESCE(x, 1) = 1;
891-
x = 1 OR x IS NULL;
897+
(NOT x IS NULL AND x = 1) OR (TRUE AND x IS NULL);
892898

893899
COALESCE(x, 1) IS NULL;
894900
FALSE;
895901

896902
COALESCE(ROW() OVER (), 1) = 1;
897-
ROW() OVER () = 1 OR ROW() OVER () IS NULL;
903+
(NOT ROW() OVER () IS NULL AND ROW() OVER () = 1) OR (TRUE AND ROW() OVER () IS NULL);
898904

899905
a AND b AND COALESCE(ROW() OVER (), 1) = 1;
900-
(ROW() OVER () = 1 OR ROW() OVER () IS NULL) AND a AND b;
906+
((NOT ROW() OVER () IS NULL AND ROW() OVER () = 1) OR (TRUE AND ROW() OVER () IS NULL)) AND a AND b;
901907

902908
COALESCE(1, 2);
903909
1;

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

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5774,8 +5774,11 @@ JOIN "item" AS "item"
57745774
LEFT JOIN "_u_0" AS "_u_0"
57755775
ON "_u_0"."i_item_id" = "item"."i_item_id"
57765776
WHERE
5777-
NOT "_u_0"."i_item_id" IS NULL
5778-
OR SUBSTRING("customer_address"."ca_zip", 1, 5) IN ('85669', '86197', '88274', '83405', '86475', '85392', '85460', '80348', '81792')
5777+
(
5778+
NOT "_u_0"."i_item_id" IS NULL
5779+
OR SUBSTRING("customer_address"."ca_zip", 1, 5) IN ('85669', '86197', '88274', '83405', '86475', '85392', '85460', '80348', '81792')
5780+
)
5781+
AND TRUE
57795782
GROUP BY
57805783
"customer_address"."ca_zip",
57815784
"customer_address"."ca_state"

0 commit comments

Comments
 (0)