Skip to content

Commit e4ff1bd

Browse files
cpcloudjcrist
authored andcommitted
fix(duckdb): avoid literals casts that might defeat optimization
1 parent feb12f4 commit e4ff1bd

File tree

72 files changed

+156
-177
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

72 files changed

+156
-177
lines changed
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
SELECT
2-
ST_DWITHIN("t0"."geom", "t0"."geom", CAST(3.0 AS DOUBLE)) AS "tmp"
2+
ST_DWITHIN("t0"."geom", "t0"."geom", 3.0) AS "tmp"
33
FROM "t" AS "t0"

ibis/backends/sql/compilers/duckdb.py

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -201,10 +201,17 @@ def visit_ArrayZip(self, op, *, arg):
201201
any_arg_null = sg.or_(*(arr.is_(NULL) for arr in arg))
202202
return self.if_(any_arg_null, NULL, zipped_arrays)
203203

204+
def visit_Array(self, op, *, exprs):
205+
return self.cast(self.f.array(*exprs), op.dtype)
206+
204207
def visit_Map(self, op, *, keys, values):
205208
# workaround for https://github.com/ibis-project/ibis/issues/8632
206209
return self.if_(
207-
sg.or_(keys.is_(NULL), values.is_(NULL)), NULL, self.f.map(keys, values)
210+
sg.or_(keys.is_(NULL), values.is_(NULL)),
211+
NULL,
212+
self.f.map(
213+
self.cast(keys, op.keys.dtype), self.cast(values, op.values.dtype)
214+
),
208215
)
209216

210217
def visit_MapGet(self, op, *, arg, key, default):
@@ -378,6 +385,8 @@ def visit_NonNullLiteral(self, op, *, value, dtype):
378385
return self.cast(
379386
str(value), to=dt.float32 if dtype.is_decimal() else dtype
380387
)
388+
if dtype.is_floating() or dtype.is_integer():
389+
return sge.convert(value)
381390
return self.cast(value, dtype)
382391
elif dtype.is_time():
383392
return self.f.make_time(
@@ -401,16 +410,16 @@ def visit_NonNullLiteral(self, op, *, value, dtype):
401410

402411
return self.f[funcname](*args)
403412
elif dtype.is_struct():
404-
return sge.Struct.from_arg_list(
405-
[
406-
sge.PropertyEQ(
407-
this=sg.to_identifier(k, quoted=self.quoted),
408-
expression=self.visit_Literal(
413+
return self.cast(
414+
sge.Struct.from_arg_list(
415+
[
416+
self.visit_Literal(
409417
ops.Literal(v, field_dtype), value=v, dtype=field_dtype
410-
),
411-
)
412-
for field_dtype, (k, v) in zip(dtype.types, value.items())
413-
]
418+
)
419+
for field_dtype, v in zip(dtype.types, value.values())
420+
]
421+
),
422+
op.dtype,
414423
)
415424
else:
416425
return None

ibis/backends/tests/snapshots/test_generic/test_many_subqueries/duckdb/out.sql

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
WITH "t1" AS (
22
SELECT
33
"t0"."street",
4-
ROW_NUMBER() OVER (ORDER BY "t0"."street" ASC ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) - CAST(1 AS TINYINT) AS "key"
4+
ROW_NUMBER() OVER (ORDER BY "t0"."street" ASC ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) - 1 AS "key"
55
FROM "data" AS "t0"
66
), "t7" AS (
77
SELECT
88
"t6"."street",
9-
ROW_NUMBER() OVER (ORDER BY "t6"."street" ASC ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) - CAST(1 AS TINYINT) AS "key"
9+
ROW_NUMBER() OVER (ORDER BY "t6"."street" ASC ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) - 1 AS "key"
1010
FROM (
1111
SELECT
1212
"t3"."street",

ibis/backends/tests/snapshots/test_sql/test_isin_bug/duckdb/out.sql

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,6 @@ SELECT
44
*
55
FROM "t" AS "t0"
66
WHERE
7-
"t0"."x" > CAST(2 AS TINYINT)
7+
"t0"."x" > 2
88
) AS "InSubquery(x)"
99
FROM "t" AS "t0"

ibis/backends/tests/snapshots/test_sql/test_union_aliasing/duckdb/out.sql

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -26,26 +26,26 @@ WITH "t5" AS (
2626
SELECT
2727
"t0"."field_of_study",
2828
UNNEST(
29-
[
30-
{'years': '1970-71', 'degrees': "t0"."1970-71"},
31-
{'years': '1975-76', 'degrees': "t0"."1975-76"},
32-
{'years': '1980-81', 'degrees': "t0"."1980-81"},
33-
{'years': '1985-86', 'degrees': "t0"."1985-86"},
34-
{'years': '1990-91', 'degrees': "t0"."1990-91"},
35-
{'years': '1995-96', 'degrees': "t0"."1995-96"},
36-
{'years': '2000-01', 'degrees': "t0"."2000-01"},
37-
{'years': '2005-06', 'degrees': "t0"."2005-06"},
38-
{'years': '2010-11', 'degrees': "t0"."2010-11"},
39-
{'years': '2011-12', 'degrees': "t0"."2011-12"},
40-
{'years': '2012-13', 'degrees': "t0"."2012-13"},
41-
{'years': '2013-14', 'degrees': "t0"."2013-14"},
42-
{'years': '2014-15', 'degrees': "t0"."2014-15"},
43-
{'years': '2015-16', 'degrees': "t0"."2015-16"},
44-
{'years': '2016-17', 'degrees': "t0"."2016-17"},
45-
{'years': '2017-18', 'degrees': "t0"."2017-18"},
46-
{'years': '2018-19', 'degrees': "t0"."2018-19"},
47-
{'years': '2019-20', 'degrees': "t0"."2019-20"}
48-
]
29+
CAST([
30+
ROW('1970-71', "t0"."1970-71"),
31+
ROW('1975-76', "t0"."1975-76"),
32+
ROW('1980-81', "t0"."1980-81"),
33+
ROW('1985-86', "t0"."1985-86"),
34+
ROW('1990-91', "t0"."1990-91"),
35+
ROW('1995-96', "t0"."1995-96"),
36+
ROW('2000-01', "t0"."2000-01"),
37+
ROW('2005-06', "t0"."2005-06"),
38+
ROW('2010-11', "t0"."2010-11"),
39+
ROW('2011-12', "t0"."2011-12"),
40+
ROW('2012-13', "t0"."2012-13"),
41+
ROW('2013-14', "t0"."2013-14"),
42+
ROW('2014-15', "t0"."2014-15"),
43+
ROW('2015-16', "t0"."2015-16"),
44+
ROW('2016-17', "t0"."2016-17"),
45+
ROW('2017-18', "t0"."2017-18"),
46+
ROW('2018-19', "t0"."2018-19"),
47+
ROW('2019-20', "t0"."2019-20")
48+
] AS STRUCT("years" TEXT, "degrees" BIGINT)[])
4949
) AS "__pivoted__"
5050
FROM "humanities" AS "t0"
5151
) AS "t1"
@@ -73,7 +73,7 @@ FROM (
7373
*
7474
FROM "t5" AS "t6"
7575
WHERE
76-
"t6"."diff" < CAST(0 AS TINYINT)
76+
"t6"."diff" < 0
7777
ORDER BY
7878
"t6"."diff" ASC
7979
LIMIT 10

ibis/backends/tests/sql/snapshots/test_compiler/test_agg_and_non_agg_filter/out.sql

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ SELECT
22
*
33
FROM "my_table" AS "t0"
44
WHERE
5-
"t0"."a" < CAST(100 AS TINYINT)
5+
"t0"."a" < 100
66
AND "t0"."a" = (
77
SELECT
88
MAX("t1"."a") AS "Max(a)"
@@ -11,7 +11,7 @@ WHERE
1111
*
1212
FROM "my_table" AS "t0"
1313
WHERE
14-
"t0"."a" < CAST(100 AS TINYINT)
14+
"t0"."a" < 100
1515
) AS "t1"
1616
)
1717
AND "t0"."b" = 'a'
Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,18 @@
11
SELECT
22
"t0"."a",
3-
"t0"."b" * CAST(2 AS TINYINT) AS "b2"
3+
"t0"."b" * 2 AS "b2"
44
FROM "my_table" AS "t0"
55
WHERE
6-
"t0"."a" < CAST(100 AS TINYINT)
6+
"t0"."a" < 100
77
AND "t0"."a" = (
88
SELECT
99
MAX("t1"."a") AS "Max(a)"
1010
FROM (
1111
SELECT
1212
"t0"."a",
13-
"t0"."b" * CAST(2 AS TINYINT) AS "b2"
13+
"t0"."b" * 2 AS "b2"
1414
FROM "my_table" AS "t0"
1515
WHERE
16-
"t0"."a" < CAST(100 AS TINYINT)
16+
"t0"."a" < 100
1717
) AS "t1"
1818
)
Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,18 @@
11
SELECT
22
"t0"."a",
3-
"t0"."b" * CAST(2 AS TINYINT) AS "b2"
3+
"t0"."b" * 2 AS "b2"
44
FROM "my_table" AS "t0"
55
WHERE
6-
"t0"."a" < CAST(100 AS TINYINT)
6+
"t0"."a" < 100
77
AND "t0"."a" = (
88
SELECT
99
MAX("t1"."a") AS "Max(a)"
1010
FROM (
1111
SELECT
1212
"t0"."a",
13-
"t0"."b" * CAST(2 AS TINYINT) AS "b2"
13+
"t0"."b" * 2 AS "b2"
1414
FROM "my_table" AS "t0"
1515
WHERE
16-
"t0"."a" < CAST(100 AS TINYINT)
16+
"t0"."a" < 100
1717
) AS "t1"
1818
)
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
SELECT
2-
"t0"."int_col" + CAST(4 AS TINYINT) AS "Add(int_col, 4)"
2+
"t0"."int_col" + 4 AS "Add(int_col, 4)"
33
FROM "int_col_table" AS "t0"
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
SELECT
2-
"t0"."int_col" + CAST(4 AS TINYINT) AS "foo"
2+
"t0"."int_col" + 4 AS "foo"
33
FROM "int_col_table" AS "t0"

ibis/backends/tests/sql/snapshots/test_compiler/test_count_distinct/out.sql

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ FROM (
66
*
77
FROM "functional_alltypes" AS "t0"
88
WHERE
9-
"t0"."bigint_col" > CAST(0 AS TINYINT)
9+
"t0"."bigint_col" > 0
1010
) AS "t1"
1111
GROUP BY
1212
1

ibis/backends/tests/sql/snapshots/test_compiler/test_difference_project_column/out.sql

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ FROM (
99
CAST("t0"."float_col" AS DOUBLE) AS "value"
1010
FROM "functional_alltypes" AS "t0"
1111
WHERE
12-
"t0"."int_col" > CAST(0 AS TINYINT)
12+
"t0"."int_col" > 0
1313
) AS "t1"
1414
EXCEPT
1515
SELECT
@@ -20,6 +20,6 @@ FROM (
2020
"t0"."double_col" AS "value"
2121
FROM "functional_alltypes" AS "t0"
2222
WHERE
23-
"t0"."int_col" <= CAST(0 AS TINYINT)
23+
"t0"."int_col" <= 0
2424
) AS "t2"
2525
) AS "t3"

ibis/backends/tests/sql/snapshots/test_compiler/test_having_from_filter/out.sql

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,4 +17,4 @@ FROM (
1717
1
1818
) AS "t2"
1919
WHERE
20-
"t2"."Max(a)" = CAST(2 AS TINYINT)
20+
"t2"."Max(a)" = 2

ibis/backends/tests/sql/snapshots/test_compiler/test_having_size/out.sql

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,4 @@ FROM (
1111
1
1212
) AS "t1"
1313
WHERE
14-
"t1"."Max(double_col)" = CAST(1 AS TINYINT)
14+
"t1"."Max(double_col)" = 1

ibis/backends/tests/sql/snapshots/test_compiler/test_intersect_project_column/out.sql

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ FROM (
99
CAST("t0"."float_col" AS DOUBLE) AS "value"
1010
FROM "functional_alltypes" AS "t0"
1111
WHERE
12-
"t0"."int_col" > CAST(0 AS TINYINT)
12+
"t0"."int_col" > 0
1313
) AS "t1"
1414
INTERSECT
1515
SELECT
@@ -20,6 +20,6 @@ FROM (
2020
"t0"."double_col" AS "value"
2121
FROM "functional_alltypes" AS "t0"
2222
WHERE
23-
"t0"."int_col" <= CAST(0 AS TINYINT)
23+
"t0"."int_col" <= 0
2424
) AS "t2"
2525
) AS "t3"

ibis/backends/tests/sql/snapshots/test_compiler/test_pushdown_with_or/out.sql

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,14 @@ SELECT
22
*
33
FROM "functional_alltypes" AS "t0"
44
WHERE
5-
"t0"."double_col" > CAST(3.14 AS DOUBLE)
5+
"t0"."double_col" > 3.14
66
AND CONTAINS("t0"."string_col", 'foo')
77
AND (
88
(
99
(
10-
"t0"."int_col" - CAST(1 AS TINYINT)
11-
) = CAST(0 AS TINYINT)
12-
)
13-
OR (
14-
"t0"."float_col" <= CAST(1.34 AS DOUBLE)
10+
"t0"."int_col" - 1
11+
) = 0
12+
) OR (
13+
"t0"."float_col" <= 1.34
1514
)
1615
)

ibis/backends/tests/sql/snapshots/test_compiler/test_simple_agg_filter/out.sql

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ SELECT
22
*
33
FROM "my_table" AS "t0"
44
WHERE
5-
"t0"."a" < CAST(100 AS TINYINT)
5+
"t0"."a" < 100
66
AND "t0"."a" = (
77
SELECT
88
MAX("t1"."a") AS "Max(a)"
@@ -11,6 +11,6 @@ WHERE
1111
*
1212
FROM "my_table" AS "t0"
1313
WHERE
14-
"t0"."a" < CAST(100 AS TINYINT)
14+
"t0"."a" < 100
1515
) AS "t1"
1616
)

ibis/backends/tests/sql/snapshots/test_compiler/test_table_difference/out.sql

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ FROM (
66
CAST("t0"."float_col" AS DOUBLE) AS "value"
77
FROM "functional_alltypes" AS "t0"
88
WHERE
9-
"t0"."int_col" > CAST(0 AS TINYINT)
9+
"t0"."int_col" > 0
1010
) AS "t1"
1111
EXCEPT
1212
SELECT
@@ -17,5 +17,5 @@ FROM (
1717
"t0"."double_col" AS "value"
1818
FROM "functional_alltypes" AS "t0"
1919
WHERE
20-
"t0"."int_col" <= CAST(0 AS TINYINT)
20+
"t0"."int_col" <= 0
2121
) AS "t2"

ibis/backends/tests/sql/snapshots/test_compiler/test_table_drop_with_filter/out.sql

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,4 +16,4 @@ FROM (
1616
ON "t4"."b" = "t2"."b"
1717
) AS "t5"
1818
WHERE
19-
"t5"."a" < CAST(1.0 AS DOUBLE)
19+
"t5"."a" < 1.0

ibis/backends/tests/sql/snapshots/test_compiler/test_table_intersect/out.sql

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ FROM (
66
CAST("t0"."float_col" AS DOUBLE) AS "value"
77
FROM "functional_alltypes" AS "t0"
88
WHERE
9-
"t0"."int_col" > CAST(0 AS TINYINT)
9+
"t0"."int_col" > 0
1010
) AS "t1"
1111
INTERSECT
1212
SELECT
@@ -17,5 +17,5 @@ FROM (
1717
"t0"."double_col" AS "value"
1818
FROM "functional_alltypes" AS "t0"
1919
WHERE
20-
"t0"."int_col" <= CAST(0 AS TINYINT)
20+
"t0"."int_col" <= 0
2121
) AS "t2"

ibis/backends/tests/sql/snapshots/test_compiler/test_union/out.sql

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ FROM (
66
CAST("t0"."float_col" AS DOUBLE) AS "value"
77
FROM "functional_alltypes" AS "t0"
88
WHERE
9-
"t0"."int_col" > CAST(0 AS TINYINT)
9+
"t0"."int_col" > 0
1010
) AS "t1"
1111
UNION
1212
SELECT
@@ -17,5 +17,5 @@ FROM (
1717
"t0"."double_col" AS "value"
1818
FROM "functional_alltypes" AS "t0"
1919
WHERE
20-
"t0"."int_col" <= CAST(0 AS TINYINT)
20+
"t0"."int_col" <= 0
2121
) AS "t2"

ibis/backends/tests/sql/snapshots/test_compiler/test_union_project_column/out.sql

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ FROM (
99
CAST("t0"."float_col" AS DOUBLE) AS "value"
1010
FROM "functional_alltypes" AS "t0"
1111
WHERE
12-
"t0"."int_col" > CAST(0 AS TINYINT)
12+
"t0"."int_col" > 0
1313
) AS "t1"
1414
UNION ALL
1515
SELECT
@@ -20,6 +20,6 @@ FROM (
2020
"t0"."double_col" AS "value"
2121
FROM "functional_alltypes" AS "t0"
2222
WHERE
23-
"t0"."int_col" <= CAST(0 AS TINYINT)
23+
"t0"."int_col" <= 0
2424
) AS "t2"
2525
) AS "t3"

0 commit comments

Comments
 (0)