diff --git a/ibis/backends/sql/rewrites.py b/ibis/backends/sql/rewrites.py index addc87ef7fea..551891798898 100644 --- a/ibis/backends/sql/rewrites.py +++ b/ibis/backends/sql/rewrites.py @@ -124,10 +124,15 @@ def filter_to_select(_, **kwargs): ) +def is_constant(value: ops.Value) -> bool: + return not value.relations and not value.find(ops.Impure, filter=ops.Value) + + @replace(p.Sort) def sort_to_select(_, **kwargs): """Convert a Sort node to a Select node.""" - return Select(_.parent, selections=_.values, sort_keys=_.keys) + non_constant_keys = tuple(key for key in _.keys if not is_constant(key.expr)) + return Select(_.parent, selections=_.values, sort_keys=non_constant_keys) @replace(p.Distinct) diff --git a/ibis/backends/tests/sql/snapshots/test_sql/test_order_by/column/out.sql b/ibis/backends/tests/sql/snapshots/test_sql/test_order_by/column/out.sql index 28f406fe0583..f4810b5f65db 100644 --- a/ibis/backends/tests/sql/snapshots/test_sql/test_order_by/column/out.sql +++ b/ibis/backends/tests/sql/snapshots/test_sql/test_order_by/column/out.sql @@ -1,5 +1,6 @@ SELECT - * + "t0"."f", + "t0"."c" FROM "star1" AS "t0" ORDER BY "t0"."f" ASC \ No newline at end of file diff --git a/ibis/backends/tests/sql/snapshots/test_sql/test_order_by/column_and_literal/out.sql b/ibis/backends/tests/sql/snapshots/test_sql/test_order_by/column_and_literal/out.sql new file mode 100644 index 000000000000..f4810b5f65db --- /dev/null +++ b/ibis/backends/tests/sql/snapshots/test_sql/test_order_by/column_and_literal/out.sql @@ -0,0 +1,6 @@ +SELECT + "t0"."f", + "t0"."c" +FROM "star1" AS "t0" +ORDER BY + "t0"."f" ASC \ No newline at end of file diff --git a/ibis/backends/tests/sql/snapshots/test_sql/test_order_by/column_derived/out.sql b/ibis/backends/tests/sql/snapshots/test_sql/test_order_by/column_derived/out.sql new file mode 100644 index 000000000000..1190c7bb4f4f --- /dev/null +++ b/ibis/backends/tests/sql/snapshots/test_sql/test_order_by/column_derived/out.sql @@ -0,0 +1,6 @@ +SELECT + "t0"."f", + "t0"."c" +FROM "star1" AS "t0" +ORDER BY + "t0"."f" + 1 ASC \ No newline at end of file diff --git a/ibis/backends/tests/sql/snapshots/test_sql/test_order_by/literal/out.sql b/ibis/backends/tests/sql/snapshots/test_sql/test_order_by/literal/out.sql new file mode 100644 index 000000000000..d622436bf0e7 --- /dev/null +++ b/ibis/backends/tests/sql/snapshots/test_sql/test_order_by/literal/out.sql @@ -0,0 +1,4 @@ +SELECT + "t0"."f", + "t0"."c" +FROM "star1" AS "t0" \ No newline at end of file diff --git a/ibis/backends/tests/sql/snapshots/test_sql/test_order_by/literal_derived/out.sql b/ibis/backends/tests/sql/snapshots/test_sql/test_order_by/literal_derived/out.sql new file mode 100644 index 000000000000..d622436bf0e7 --- /dev/null +++ b/ibis/backends/tests/sql/snapshots/test_sql/test_order_by/literal_derived/out.sql @@ -0,0 +1,4 @@ +SELECT + "t0"."f", + "t0"."c" +FROM "star1" AS "t0" \ No newline at end of file diff --git a/ibis/backends/tests/sql/snapshots/test_sql/test_order_by/random/out.sql b/ibis/backends/tests/sql/snapshots/test_sql/test_order_by/random/out.sql index 3eba0f7b3f84..08d99827c8af 100644 --- a/ibis/backends/tests/sql/snapshots/test_sql/test_order_by/random/out.sql +++ b/ibis/backends/tests/sql/snapshots/test_sql/test_order_by/random/out.sql @@ -1,5 +1,16 @@ SELECT * -FROM "star1" AS "t0" +FROM ( + SELECT + "t1"."f", + "t1"."c" + FROM ( + SELECT + * + FROM "star1" AS "t0" + ORDER BY + RANDOM() ASC + ) AS "t1" +) AS "t2" ORDER BY RANDOM() ASC \ No newline at end of file diff --git a/ibis/backends/tests/sql/snapshots/test_sql/test_order_by/random_and_column/out.sql b/ibis/backends/tests/sql/snapshots/test_sql/test_order_by/random_and_column/out.sql new file mode 100644 index 000000000000..e17a396e578a --- /dev/null +++ b/ibis/backends/tests/sql/snapshots/test_sql/test_order_by/random_and_column/out.sql @@ -0,0 +1,18 @@ +SELECT + * +FROM ( + SELECT + "t1"."f", + "t1"."c" + FROM ( + SELECT + * + FROM "star1" AS "t0" + ORDER BY + RANDOM() ASC, + "t0"."f" ASC + ) AS "t1" +) AS "t2" +ORDER BY + RANDOM() ASC, + "t2"."f" ASC \ No newline at end of file diff --git a/ibis/backends/tests/sql/snapshots/test_sql/test_order_by/random_and_literal/out.sql b/ibis/backends/tests/sql/snapshots/test_sql/test_order_by/random_and_literal/out.sql new file mode 100644 index 000000000000..08d99827c8af --- /dev/null +++ b/ibis/backends/tests/sql/snapshots/test_sql/test_order_by/random_and_literal/out.sql @@ -0,0 +1,16 @@ +SELECT + * +FROM ( + SELECT + "t1"."f", + "t1"."c" + FROM ( + SELECT + * + FROM "star1" AS "t0" + ORDER BY + RANDOM() ASC + ) AS "t1" +) AS "t2" +ORDER BY + RANDOM() ASC \ No newline at end of file diff --git a/ibis/backends/tests/sql/snapshots/test_sql/test_order_by/random_derived/out.sql b/ibis/backends/tests/sql/snapshots/test_sql/test_order_by/random_derived/out.sql new file mode 100644 index 000000000000..6396ee29a4d7 --- /dev/null +++ b/ibis/backends/tests/sql/snapshots/test_sql/test_order_by/random_derived/out.sql @@ -0,0 +1,16 @@ +SELECT + * +FROM ( + SELECT + "t1"."f", + "t1"."c" + FROM ( + SELECT + * + FROM "star1" AS "t0" + ORDER BY + RANDOM() + 1 ASC + ) AS "t1" +) AS "t2" +ORDER BY + RANDOM() + 1 ASC \ No newline at end of file diff --git a/ibis/backends/tests/sql/test_sql.py b/ibis/backends/tests/sql/test_sql.py index f635da1c17a4..20a26320ffa5 100644 --- a/ibis/backends/tests/sql/test_sql.py +++ b/ibis/backends/tests/sql/test_sql.py @@ -266,11 +266,22 @@ def test_aggregate(star1, expr_fn, snapshot): @pytest.mark.parametrize( "key", - ["f", ibis.random()], - ids=["column", "random"], + [ + pytest.param("f", id="column"), + pytest.param(ibis._.f + 1, id="column_derived"), + pytest.param(ibis.random(), id="random"), + pytest.param(ibis.random() + 1, id="random_derived"), + pytest.param(ibis.literal(5), id="literal"), + pytest.param(ibis.literal(5) + 1, id="literal_derived"), + pytest.param((ibis.random(), "f"), id="random_and_column"), + pytest.param((ibis.random(), ibis.literal(5)), id="random_and_literal"), + pytest.param(("f", ibis.literal(5)), id="column_and_literal"), + ], ) def test_order_by(star1, key, snapshot): - expr = star1.order_by(key) + # We are doing two order_bys to test that the rewrite that drops constant keys + # works at all levels of the expression tree. + expr = star1.order_by(key).select("f", "c").order_by(key) snapshot.assert_match(to_sql(expr), "out.sql")