Skip to content

Commit

Permalink
fix: revert sorts on all CTEs (in PQ postprocessing) (#5128)
Browse files Browse the repository at this point in the history
  • Loading branch information
kgutwin authored Jan 28, 2025
1 parent d4c4287 commit e798202
Show file tree
Hide file tree
Showing 7 changed files with 976 additions and 9 deletions.
14 changes: 5 additions & 9 deletions prqlc/prqlc/src/sql/pq/postprocess.rs
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,6 @@ impl PqMapper<RelationExpr, RelationExpr, (), ()> for SortingInference<'_> {
transforms: Vec<SqlTransform<RelationExpr, ()>>,
) -> Result<Vec<SqlTransform<RelationExpr, ()>>> {
let mut sorting = Vec::new();
let mut has_sort_transform = false;

let mut result = Vec::with_capacity(transforms.len() + 1);

Expand Down Expand Up @@ -128,7 +127,6 @@ impl PqMapper<RelationExpr, RelationExpr, (), ()> for SortingInference<'_> {
// just store sorting and don't emit Sort
SqlTransform::Sort(expr) => {
sorting.clone_from(&expr);
has_sort_transform = true;
continue;
}

Expand Down Expand Up @@ -159,13 +157,11 @@ impl PqMapper<RelationExpr, RelationExpr, (), ()> for SortingInference<'_> {
}
}

if has_sort_transform {
// now revert the sort columns so that the output
// sorting reflects the input column cids, needed to
// ensure proper column reference lookup in the final
// steps
sorting = CidRedirector::revert_sorts(sorting, &mut self.ctx.anchor);
}
// now revert the sort columns so that the output
// sorting reflects the input column cids, needed to
// ensure proper column reference lookup in the final
// steps
sorting = CidRedirector::revert_sorts(sorting, &mut self.ctx.anchor);
}

// remember sorting for this pipeline
Expand Down
8 changes: 8 additions & 0 deletions prqlc/prqlc/tests/integration/queries/sort_3.prql
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
from [{track_id=0, album_id=1, genre_id=2}]
select { AA=track_id, album_id, genre_id }
sort AA
join side:left [{album_id=1, album_title="Songs"}] (==album_id)
select { AA, AT = album_title ?? "unknown", genre_id }
filter AA < 25
join side:left [{genre_id=1, genre_title="Rock"}] (==genre_id)
select { AA, AT, GT = genre_title ?? "unknown" }
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
---
source: prqlc/prqlc/tests/integration/queries.rs
expression: "from [{track_id=0, album_id=1, genre_id=2}]\nselect { AA=track_id, album_id, genre_id }\nsort AA\njoin side:left [{album_id=1, album_title=\"Songs\"}] (==album_id)\nselect { AA, AT = album_title ?? \"unknown\", genre_id }\nfilter AA < 25\njoin side:left [{genre_id=1, genre_title=\"Rock\"}] (==genre_id)\nselect { AA, AT, GT = genre_title ?? \"unknown\" }\n"
input_file: prqlc/prqlc/tests/integration/queries/sort_3.prql
---
WITH table_0 AS (
SELECT
0 AS track_id,
1 AS album_id,
2 AS genre_id
),
table_5 AS (
SELECT
track_id AS "AA",
genre_id,
album_id
FROM
table_0
),
table_1 AS (
SELECT
1 AS album_id,
'Songs' AS album_title
),
table_4 AS (
SELECT
table_5."AA",
COALESCE(table_1.album_title, 'unknown') AS "AT",
table_5.genre_id
FROM
table_5
LEFT JOIN table_1 ON table_5.album_id = table_1.album_id
),
table_3 AS (
SELECT
"AA",
"AT",
genre_id
FROM
table_4
WHERE
"AA" < 25
),
table_2 AS (
SELECT
1 AS genre_id,
'Rock' AS genre_title
)
SELECT
table_3."AA",
table_3."AT",
COALESCE(table_2.genre_title, 'unknown') AS "GT"
FROM
table_3
LEFT JOIN table_2 ON table_3.genre_id = table_2.genre_id
ORDER BY
table_3."AA"
Loading

0 comments on commit e798202

Please sign in to comment.