goldmedal commented on code in PR #11527:
URL: https://github.com/apache/datafusion/pull/11527#discussion_r1682891322


##########
datafusion/sql/tests/cases/plan_to_sql.rs:
##########
@@ -240,6 +240,63 @@ fn roundtrip_statement_with_dialect() -> Result<()> {
             parser_dialect: Box::new(GenericDialect {}),
             unparser_dialect: Box::new(UnparserDefaultDialect {}),
         },
+        TestStatementWithDialect {
+            sql: "SELECT j1_string from j1 order by j1_id",

Review Comment:
   I tried adding another test case using join, and it works well, too. 👍 
   ```rust
           TestStatementWithDialect {
               sql: "SELECT j1_string from j1 join j2 on j1.j1_id = j2.j2_id 
order by j1_id",
               expected: r#"SELECT j1.j1_string FROM j1 JOIN j2 ON (j1.j1_id = 
j2.j2_id) ORDER BY j1.j1_id ASC NULLS LAST"#,
               parser_dialect: Box::new(GenericDialect {}),
               unparser_dialect: Box::new(UnparserDefaultDialect {}),
           },
   ```



##########
datafusion/sql/tests/cases/plan_to_sql.rs:
##########
@@ -240,6 +240,63 @@ fn roundtrip_statement_with_dialect() -> Result<()> {
             parser_dialect: Box::new(GenericDialect {}),
             unparser_dialect: Box::new(UnparserDefaultDialect {}),
         },
+        TestStatementWithDialect {
+            sql: "SELECT j1_string from j1 order by j1_id",
+            expected: r#"SELECT j1.j1_string FROM j1 ORDER BY j1.j1_id ASC 
NULLS LAST"#,
+            parser_dialect: Box::new(GenericDialect {}),
+            unparser_dialect: Box::new(UnparserDefaultDialect {}),
+        },
+        // Test query with derived tables that put distinct,sort,limit on the 
wrong level

Review Comment:
   It also works for grouping. 👍 
   ```rust
           TestStatementWithDialect {
               sql: "
                   SELECT
                     j1_string,
                     j2_string
                   FROM
                     (
                       SELECT
                         j1_id,
                         j1_string,
                         j2_string
                       from
                         j1
                         INNER join j2 ON j1.j1_id = j2.j2_id
                       group by
                         j1_id,
                         j1_string,
                         j2_string
                       order by
                         j1.j1_id desc
                       limit
                         10
                     ) abc
                   ORDER BY
                     abc.j2_string",
               expected: r#"SELECT abc.j1_string, abc.j2_string FROM (SELECT 
j1.j1_id, j1.j1_string, j2.j2_string FROM j1 JOIN j2 ON (j1.j1_id = j2.j2_id) 
GROUP BY j1.j1_id, j1.j1_string, j2.j2_string ORDER BY j1.j1_id DESC NULLS 
FIRST LIMIT 10) AS abc ORDER BY abc.j2_string ASC NULLS LAST"#,
               parser_dialect: Box::new(GenericDialect {}),
               unparser_dialect: Box::new(UnparserDefaultDialect {}),
           },
   ```



##########
datafusion/sql/src/unparser/rewrite.rs:
##########
@@ -99,3 +99,61 @@ fn rewrite_sort_expr_for_union(exprs: Vec<Expr>) -> 
Result<Vec<Expr>> {
 
     Ok(sort_exprs)
 }
+
+// Rewrite logic plan for query that order by columns are not in projections
+// Plan before rewrite:
+//
+// Projection: j1.j1_string, j2.j2_string
+//   Sort: j1.j1_id DESC NULLS FIRST, j2.j2_id DESC NULLS FIRST
+//     Projection: j1.j1_string, j2.j2_string, j1.j1_id, j2.j2_id
+//       Inner Join:  Filter: j1.j1_id = j2.j2_id
+//         TableScan: j1
+//         TableScan: j2
+//
+// Plan after rewrite
+//
+// Sort: j1.j1_id DESC NULLS FIRST, j2.j2_id DESC NULLS FIRST
+//   Projection: j1.j1_string, j2.j2_string
+//     Inner Join:  Filter: j1.j1_id = j2.j2_id
+//       TableScan: j1
+//       TableScan: j2
+//
+// This prevents the original plan generate query with derived table but 
missing alias.
+pub(super) fn rewrite_plan_for_sort_on_non_projected_fields(
+    p: &Projection,
+) -> Option<LogicalPlan> {
+    let mut collects = vec![];
+
+    for expr in p.expr.clone() {
+        collects.push(expr.clone());
+    }

Review Comment:
   ```suggestion
       p.expr.iter().cloned().for_each(|expr| {
           collects.push(expr);
       });
   ```
   I think this way could save one time to clone all expressions.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: github-unsubscr...@datafusion.apache.org

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: github-unsubscr...@datafusion.apache.org
For additional commands, e-mail: github-h...@datafusion.apache.org

Reply via email to