From 7b83b2634654bad012a18ebcd1c5a7ad61cab8db Mon Sep 17 00:00:00 2001 From: Erik Grinaker Date: Tue, 16 Jul 2024 22:57:05 +0200 Subject: [PATCH] sql: improve formatting of `Remap` nodes --- src/sql/planner/plan.rs | 15 +++++++++++++-- src/sql/testscripts/queries/having | 12 ++++++------ src/sql/testscripts/queries/join_inner | 2 +- src/sql/testscripts/queries/join_outer | 8 ++++---- src/sql/testscripts/queries/order | 16 ++++++++-------- 5 files changed, 32 insertions(+), 21 deletions(-) diff --git a/src/sql/planner/plan.rs b/src/sql/planner/plan.rs index fe45546a5..15debc4b3 100644 --- a/src/sql/planner/plan.rs +++ b/src/sql/planner/plan.rs @@ -510,13 +510,24 @@ impl Node { Self::Remap { source, targets } => { let remap = remap_sources(targets) .into_iter() - .map(|from| from.map(|from| format!("#{from}")).unwrap_or("Null".to_string())) + .map(|from| { + from.map(|from| match source.column_label(from) { + Label::None => format!("#{from}"), + label => format!("{label}"), + }) + .unwrap_or("Null".to_string()) + }) .join(", "); write!(f, "Remap: {remap}")?; let dropped = targets .iter() .enumerate() - .filter_map(|(i, v)| v.is_none().then_some(format!("#{i}"))) + .filter_map(|(i, v)| { + v.is_none().then_some(match source.column_label(i) { + Label::None => format!("#{i}"), + label => format!("{label}"), + }) + }) .join(", "); if !dropped.is_empty() { write!(f, " (dropped: {dropped})")?; diff --git a/src/sql/testscripts/queries/having b/src/sql/testscripts/queries/having index 61ab63780..daa414329 100644 --- a/src/sql/testscripts/queries/having +++ b/src/sql/testscripts/queries/having @@ -46,7 +46,7 @@ b, 42 [plan]> SELECT "group" FROM test GROUP BY "group" HAVING MAX("int") > 10 --- -Remap: #0 (dropped: #1) +Remap: test.group (dropped: #1) └─ Filter: #1 > 10 └─ Aggregate: test.group, max(test.int) └─ Scan: test @@ -54,7 +54,7 @@ b [plan]> SELECT "group", MAX("int") FROM test GROUP BY "group" HAVING MAX("int") - MIN("int") > 10 --- -Remap: #0, #1 (dropped: #2) +Remap: test.group, #1 (dropped: #2) └─ Filter: #1 - #2 > 10 └─ Aggregate: test.group, max(test.int), min(test.int) └─ Scan: test @@ -72,7 +72,7 @@ b, 42 # Having works with an aggregate function not in the SELECT clause. [plan]> SELECT "group", COUNT(*) FROM test GROUP BY "group" HAVING MAX("int") > 10 --- -Remap: #0, #1 (dropped: #2) +Remap: test.group, #1 (dropped: #2) └─ Filter: #2 > 10 └─ Aggregate: test.group, count(TRUE), max(test.int) └─ Scan: test @@ -81,7 +81,7 @@ b, 3 # Having works with compound expressions. [plan]> SELECT "group", COUNT(*) FROM test GROUP BY "group" HAVING MAX("int") / COUNT(*) > 3 --- -Remap: #0, #1 (dropped: #2) +Remap: test.group, #1 (dropped: #2) └─ Filter: #2 / #1 > 3 └─ Aggregate: test.group, count(TRUE), max(test.int) └─ Scan: test @@ -102,7 +102,7 @@ Remap: #0 (dropped: #1) # Having can use (un)qualified expressions for an (un)qualified GROUP BY. [plan]> SELECT COUNT(*) FROM test GROUP BY "group" HAVING test."group" = 'a' --- -Remap: #0 (dropped: #1) +Remap: #0 (dropped: test.group) └─ Filter: test.group = a └─ Projection: #1, test.group └─ Aggregate: test.group, count(TRUE) @@ -111,7 +111,7 @@ Remap: #0 (dropped: #1) [plan]> SELECT COUNT(*) FROM test GROUP BY test."group" HAVING "group" = 'a' --- -Remap: #0 (dropped: #1) +Remap: #0 (dropped: test.group) └─ Filter: test.group = a └─ Projection: #1, test.group └─ Aggregate: test.group, count(TRUE) diff --git a/src/sql/testscripts/queries/join_inner b/src/sql/testscripts/queries/join_inner index 40768ff2e..573578eff 100644 --- a/src/sql/testscripts/queries/join_inner +++ b/src/sql/testscripts/queries/join_inner @@ -221,7 +221,7 @@ Error: invalid input: unknown field movies.unknown_id WHERE m.studio_id = s.id \ ORDER BY m.rating DESC, m.released ASC, m.id ASC --- -Remap: #0, #1, #2, #3, #4 (dropped: #5) +Remap: m.id, m.title, genre, studio, m.rating (dropped: m.released) └─ Order: m.rating desc, m.released asc, m.id asc └─ Projection: m.id, m.title, g.name as genre, s.name as studio, m.rating, m.released └─ HashJoin: inner on m.studio_id = s.id diff --git a/src/sql/testscripts/queries/join_outer b/src/sql/testscripts/queries/join_outer index dae2c050a..2d1e334b7 100644 --- a/src/sql/testscripts/queries/join_outer +++ b/src/sql/testscripts/queries/join_outer @@ -70,7 +70,7 @@ HashJoin: outer on movies.id = genres.id # Right join. [plan]> SELECT * FROM genres RIGHT JOIN movies ON movies.id = genres.id --- -Remap: #7, #8, #0, #1, #2, #3, #4, #5, #6 +Remap: genres.id, genres.name, movies.id, movies.title, movies.studio_id, movies.genre_id, movies.released, movies.rating, movies.ultrahd └─ HashJoin: outer on movies.id = genres.id ├─ Scan: movies └─ Scan: genres @@ -104,7 +104,7 @@ HashJoin: outer on movies.id = genres.id [plan]> SELECT * FROM genres RIGHT OUTER JOIN movies ON movies.id = genres.id --- -Remap: #7, #8, #0, #1, #2, #3, #4, #5, #6 +Remap: genres.id, genres.name, movies.id, movies.title, movies.studio_id, movies.genre_id, movies.released, movies.rating, movies.ultrahd └─ HashJoin: outer on movies.id = genres.id ├─ Scan: movies └─ Scan: genres @@ -131,7 +131,7 @@ HashJoin: outer on genres.id = movies.id [plan]> SELECT * FROM movies RIGHT JOIN genres ON movies.id = genres.id --- -Remap: #2, #3, #4, #5, #6, #7, #8, #0, #1 +Remap: movies.id, movies.title, movies.studio_id, movies.genre_id, movies.released, movies.rating, movies.ultrahd, genres.id, genres.name └─ HashJoin: outer on genres.id = movies.id ├─ Scan: genres └─ Scan: movies @@ -164,7 +164,7 @@ NestedLoopJoin: outer on genres.id > movies.id OR genres.id = movies.id LEFT JOIN genres ON studios.id = genres.id \ RIGHT JOIN movies ON movies.id = studios.id --- -Remap: #7, #8, #9, #10, #11, #0, #1, #2, #3, #4, #5, #6 +Remap: studios.id, studios.name, studios.country_id, genres.id, genres.name, movies.id, movies.title, movies.studio_id, movies.genre_id, movies.released, movies.rating, movies.ultrahd └─ HashJoin: outer on movies.id = studios.id ├─ Scan: movies └─ HashJoin: outer on studios.id = genres.id diff --git a/src/sql/testscripts/queries/order b/src/sql/testscripts/queries/order index d8018fdd8..f3ba549a1 100644 --- a/src/sql/testscripts/queries/order +++ b/src/sql/testscripts/queries/order @@ -258,7 +258,7 @@ Order: test.float ^ 2 asc # only result in one hidden column. [plan]> SELECT id, "int" FROM test ORDER BY "bool" DESC --- -Remap: #0, #1 (dropped: #2) +Remap: test.id, test.int (dropped: test.bool) └─ Order: test.bool desc └─ Projection: test.id, test.int, test.bool └─ Scan: test @@ -275,7 +275,7 @@ Remap: #0, #1 (dropped: #2) [plan]> SELECT id, "int" FROM test ORDER BY "bool" DESC, "bool" ASC --- -Remap: #0, #1 (dropped: #2) +Remap: test.id, test.int (dropped: test.bool) └─ Order: test.bool desc, test.bool asc └─ Projection: test.id, test.int, test.bool └─ Scan: test @@ -293,7 +293,7 @@ Remap: #0, #1 (dropped: #2) # Can order on expressions on columns not in the result. [plan]> SELECT id FROM test ORDER BY "float" ^ 2 - "int" ^ 2 DESC --- -Remap: #0 (dropped: #1, #2) +Remap: test.id (dropped: test.float, test.int) └─ Order: test.float ^ 2 - test.int ^ 2 desc └─ Projection: test.id, test.float, test.int └─ Scan: test @@ -373,7 +373,7 @@ Order: int desc [plan]> SELECT id AS "int" FROM test ORDER BY test."int" DESC --- -Remap: #0 (dropped: #1) +Remap: int (dropped: test.int) └─ Order: test.int desc └─ Projection: test.id as int, test.int └─ Scan: test @@ -481,7 +481,7 @@ FALSE, -1 [plan]> SELECT "bool" FROM test GROUP BY "bool" ORDER BY MAX("int") DESC --- -Remap: #0 (dropped: #1) +Remap: test.bool (dropped: #1) └─ Order: #1 desc └─ Aggregate: test.bool, max(test.int) └─ Scan: test @@ -491,7 +491,7 @@ FALSE [plan]> SELECT "bool", MAX("int") FROM test GROUP BY "bool" ORDER BY MAX("int") - MIN("int") DESC --- -Remap: #0, #1 (dropped: #2) +Remap: test.bool, #1 (dropped: #2) └─ Order: #1 - #2 desc └─ Aggregate: test.bool, max(test.int), min(test.int) └─ Scan: test @@ -514,7 +514,7 @@ Remap: #0 (dropped: #1) # ORDER BY can use (un)qualified expressions for an (un)qualified GROUP BY. [plan]> SELECT COUNT(*) FROM test GROUP BY "bool" ORDER BY test."bool" --- -Remap: #0 (dropped: #1) +Remap: #0 (dropped: test.bool) └─ Order: test.bool asc └─ Projection: #1, test.bool └─ Aggregate: test.bool, count(TRUE) @@ -525,7 +525,7 @@ Remap: #0 (dropped: #1) [plan]> SELECT COUNT(*) FROM test GROUP BY test."bool" ORDER BY "bool" --- -Remap: #0 (dropped: #1) +Remap: #0 (dropped: test.bool) └─ Order: test.bool asc └─ Projection: #1, test.bool └─ Aggregate: test.bool, count(TRUE)