You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@impala.apache.org by jo...@apache.org on 2019/02/06 05:18:25 UTC

[impala] 06/08: IMPALA-8103: In Analyzed Query use /* and */ to delimit hints.

This is an automated email from the ASF dual-hosted git repository.

joemcdonnell pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/impala.git

commit 14996f495129eaee35ee030be87b289b9dae517e
Author: Andrew Sherman <as...@cloudera.com>
AuthorDate: Mon Feb 4 14:25:33 2019 -0800

    IMPALA-8103: In Analyzed Query use /* and */ to delimit hints.
    
    IMPALA-5821 added the analyzed query text to the output of EXPLAIN when
    explain_level is 2 or greater. Any query hits were displayed in the form
    
    SELECT
    -- +straight_join
    * FROM table_name [...]
    
    which meant that care had to be taken to embed and preserve newlines in
    the EXPLAIN output. This change makes the output to be of the form
    
    SELECT /* +straight_join */ * FROM  table_name  [...]
    
    The  /* +straight_join */ form was chosen over  /*+straight_join */ as
    it seems more readable, and is more commonly used in exiting tests.
    
    To do this the following changes were made:
    ToSqlUtils.getPlanHintsSql() was extended to take a ToSqlOptions
    parameter. If this parameter indicates that the analyzed query is being
    shown, then the hints are surrounded with '/*' and '*/'.
    PrintUtils.wrapString() was simplified as it no longer has to preserve
    newlines in a an analyzed query.
    
    TESTING
     All end-to-end tests were run.
     The output in a few .test files was updated.
     A couple of new cases were added to ToSqlTest.java
    
    Change-Id: I7215a4c17508e3408680a1d2bb6c3af355c78c8d
    Reviewed-on: http://gerrit.cloudera.org:8080/12360
    Reviewed-by: Impala Public Jenkins <im...@cloudera.com>
    Tested-by: Impala Public Jenkins <im...@cloudera.com>
---
 .../org/apache/impala/analysis/BaseTableRef.java   |  2 +-
 .../org/apache/impala/analysis/InsertStmt.java     |  4 +-
 .../org/apache/impala/analysis/SelectStmt.java     |  3 +-
 .../java/org/apache/impala/analysis/TableRef.java  |  3 +-
 .../org/apache/impala/analysis/ToSqlUtils.java     | 14 +++-
 .../java/org/apache/impala/common/PrintUtils.java  | 15 +---
 .../java/org/apache/impala/analysis/ToSqlTest.java | 33 ++++++--
 .../org/apache/impala/util/PrintUtilsTest.java     | 11 ---
 .../queries/PlannerTest/max-row-size.test          | 21 ++---
 .../queries/PlannerTest/resource-requirements.test | 93 +++++++++-------------
 .../PlannerTest/spillable-buffer-sizing.test       | 82 +++++++------------
 11 files changed, 121 insertions(+), 160 deletions(-)

diff --git a/fe/src/main/java/org/apache/impala/analysis/BaseTableRef.java b/fe/src/main/java/org/apache/impala/analysis/BaseTableRef.java
index 7644329..7b10fdc 100644
--- a/fe/src/main/java/org/apache/impala/analysis/BaseTableRef.java
+++ b/fe/src/main/java/org/apache/impala/analysis/BaseTableRef.java
@@ -79,7 +79,7 @@ public class BaseTableRef extends TableRef {
     if (alias != null) aliasSql = " " + ToSqlUtils.getIdentSql(alias);
     String tableSampleSql = "";
     if (sampleParams_ != null) tableSampleSql = " " + sampleParams_.toSql(options);
-    String tableHintsSql = ToSqlUtils.getPlanHintsSql(tableHints_);
+    String tableHintsSql = ToSqlUtils.getPlanHintsSql(options, tableHints_);
     return getTable().getTableName().toSql() + aliasSql + tableSampleSql + tableHintsSql;
   }
 
diff --git a/fe/src/main/java/org/apache/impala/analysis/InsertStmt.java b/fe/src/main/java/org/apache/impala/analysis/InsertStmt.java
index 7c34d52..72c29b3 100644
--- a/fe/src/main/java/org/apache/impala/analysis/InsertStmt.java
+++ b/fe/src/main/java/org/apache/impala/analysis/InsertStmt.java
@@ -928,7 +928,7 @@ public class InsertStmt extends StatementBase {
 
     strBuilder.append(getOpName());
     if (!planHints_.isEmpty() && hintLoc_ == HintLocation.Start) {
-      strBuilder.append(" " + ToSqlUtils.getPlanHintsSql(getPlanHints()));
+      strBuilder.append(" " + ToSqlUtils.getPlanHintsSql(options, getPlanHints()));
     }
     if (overwrite_) {
       strBuilder.append(" OVERWRITE");
@@ -955,7 +955,7 @@ public class InsertStmt extends StatementBase {
       strBuilder.append(" PARTITION (" + Joiner.on(", ").join(values) + ")");
     }
     if (!planHints_.isEmpty() && hintLoc_ == HintLocation.End) {
-      strBuilder.append(" " + ToSqlUtils.getPlanHintsSql(getPlanHints()));
+      strBuilder.append(" " + ToSqlUtils.getPlanHintsSql(options, getPlanHints()));
     }
     if (!needsGeneratedQueryStatement_) {
       strBuilder.append(" " + queryStmt_.toSql(options));
diff --git a/fe/src/main/java/org/apache/impala/analysis/SelectStmt.java b/fe/src/main/java/org/apache/impala/analysis/SelectStmt.java
index d568429..ff45a56 100644
--- a/fe/src/main/java/org/apache/impala/analysis/SelectStmt.java
+++ b/fe/src/main/java/org/apache/impala/analysis/SelectStmt.java
@@ -1051,7 +1051,8 @@ public class SelectStmt extends QueryStmt {
       strBuilder.append("DISTINCT ");
     }
     if (selectList_.hasPlanHints()) {
-      strBuilder.append(ToSqlUtils.getPlanHintsSql(selectList_.getPlanHints()) + " ");
+      strBuilder.append(ToSqlUtils.getPlanHintsSql(options, selectList_.getPlanHints()))
+          .append(" ");
     }
     for (int i = 0; i < selectList_.getItems().size(); ++i) {
       strBuilder.append(selectList_.getItems().get(i).toSql(options));
diff --git a/fe/src/main/java/org/apache/impala/analysis/TableRef.java b/fe/src/main/java/org/apache/impala/analysis/TableRef.java
index 5a6e866..f0acc41 100644
--- a/fe/src/main/java/org/apache/impala/analysis/TableRef.java
+++ b/fe/src/main/java/org/apache/impala/analysis/TableRef.java
@@ -600,7 +600,8 @@ public class TableRef extends StmtNode {
     }
 
     StringBuilder output = new StringBuilder(" " + joinOp_.toString() + " ");
-    if(!joinHints_.isEmpty()) output.append(ToSqlUtils.getPlanHintsSql(joinHints_) + " ");
+    if (!joinHints_.isEmpty())
+      output.append(ToSqlUtils.getPlanHintsSql(options, joinHints_)).append(" ");
     output.append(tableRefToSql(options));
     if (usingColNames_ != null) {
       output.append(" USING (").append(Joiner.on(", ").join(usingColNames_)).append(")");
diff --git a/fe/src/main/java/org/apache/impala/analysis/ToSqlUtils.java b/fe/src/main/java/org/apache/impala/analysis/ToSqlUtils.java
index 366fb8f..3909eb8 100644
--- a/fe/src/main/java/org/apache/impala/analysis/ToSqlUtils.java
+++ b/fe/src/main/java/org/apache/impala/analysis/ToSqlUtils.java
@@ -533,13 +533,19 @@ public class ToSqlUtils {
    * commented plan hint style such that hinted views created by Impala are readable by
    * Hive (parsed as a comment by Hive).
    */
-  public static String getPlanHintsSql(List<PlanHint> hints) {
+  public static String getPlanHintsSql(ToSqlOptions options, List<PlanHint> hints) {
     Preconditions.checkNotNull(hints);
     if (hints.isEmpty()) return "";
     StringBuilder sb = new StringBuilder();
-    sb.append("\n-- +");
-    sb.append(Joiner.on(",").join(hints));
-    sb.append("\n");
+    if (options.showRewritten()) {
+      sb.append("/* +");
+      sb.append(Joiner.on(",").join(hints));
+      sb.append(" */");
+    } else {
+      sb.append("\n-- +");
+      sb.append(Joiner.on(",").join(hints));
+      sb.append("\n");
+    }
     return sb.toString();
   }
 }
diff --git a/fe/src/main/java/org/apache/impala/common/PrintUtils.java b/fe/src/main/java/org/apache/impala/common/PrintUtils.java
index 70a667c..1f347be 100644
--- a/fe/src/main/java/org/apache/impala/common/PrintUtils.java
+++ b/fe/src/main/java/org/apache/impala/common/PrintUtils.java
@@ -175,16 +175,9 @@ public class PrintUtils {
    * Any newlines in the input are maintained.
    */
   public static String wrapString(String s, int wrapLength) {
-    StringBuilder ret = new StringBuilder(s.length());
-    String[] split = s.split("\n");
-    for (int i = 0; i < split.length; i++) {
-      String line = split[i];
-      String wrappedLine = WordUtils.wrap(line, wrapLength, null, true);
-      // we keep any existing newlines in text - these should be commented hints
-      wrappedLine = wrappedLine.replaceAll(" +$", "");
-      ret.append(wrappedLine);
-      if (i < split.length - 1) ret.append("\n");
-    }
-    return ret.toString();
+    String wrapped = WordUtils.wrap(s, wrapLength, null, true);
+    // Remove any trailing blanks from a line.
+    wrapped = wrapped.replaceAll(" +$", "");
+    return wrapped;
   }
 }
diff --git a/fe/src/test/java/org/apache/impala/analysis/ToSqlTest.java b/fe/src/test/java/org/apache/impala/analysis/ToSqlTest.java
index a106820..6bc048f 100644
--- a/fe/src/test/java/org/apache/impala/analysis/ToSqlTest.java
+++ b/fe/src/test/java/org/apache/impala/analysis/ToSqlTest.java
@@ -82,6 +82,11 @@ public class ToSqlTest extends FrontendTestBase {
     testToSql(query, System.getProperty("user.name"), expected);
   }
 
+  private void testToSql(String query, String expected, ToSqlOptions options) {
+    String defaultDb = System.getProperty("user.name");
+    testToSql(createAnalysisCtx(defaultDb), query, defaultDb, expected, false, options);
+  }
+
   private void testToSql(AnalysisContext ctx, String query, String expected) {
     testToSql(ctx, query, System.getProperty("user.name"), expected);
   }
@@ -92,23 +97,24 @@ public class ToSqlTest extends FrontendTestBase {
 
   private void testToSql(AnalysisContext ctx, String query, String defaultDb,
       String expected) {
-    testToSql(ctx, query, defaultDb, expected, false);
+    testToSql(ctx, query, defaultDb, expected, false, ToSqlOptions.DEFAULT);
   }
 
   private void testToSql(String query, String defaultDb, String expected,
       boolean ignoreWhitespace) {
-    testToSql(createAnalysisCtx(defaultDb), query, defaultDb, expected, ignoreWhitespace);
+    testToSql(createAnalysisCtx(defaultDb), query, defaultDb, expected, ignoreWhitespace,
+        ToSqlOptions.DEFAULT);
   }
 
   private void testToSql(AnalysisContext ctx, String query, String defaultDb,
-      String expected, boolean ignoreWhitespace) {
+      String expected, boolean ignoreWhitespace, ToSqlOptions options) {
     String actual = null;
     try {
       ParseNode node = AnalyzesOk(query, ctx);
-      if (node instanceof QueryStmt) {
+      if (node instanceof QueryStmt && !options.showRewritten()) {
         actual = ((QueryStmt)node).getOrigSqlString();
       } else {
-        actual = node.toSql();
+        actual = node.toSql(options);
       }
       if (ignoreWhitespace) {
         // Transform whitespace to single space.
@@ -686,6 +692,23 @@ public class ToSqlTest extends FrontendTestBase {
           String.format("select distinct %sstraight_join%s * from functional.alltypes",
           prefix, suffix),
           "SELECT DISTINCT \n-- +straight_join\n * FROM functional.alltypes");
+
+      // Tests for analyzed/rewritten sql.
+      // First test the test by passing ToSqlOptions.DEFAULT which should result in the
+      // hints appearing with '--' style comments.
+      testToSql(
+          String.format("select distinct %sstraight_join%s * from functional.alltypes",
+              prefix, suffix),
+          "SELECT DISTINCT \n-- +straight_join\n * FROM functional.alltypes",
+          ToSqlOptions.DEFAULT);
+      // Test that analyzed queries use the '/*' style comments.
+      testToSql(
+          String.format("select distinct %sstraight_join%s * from functional.alltypes "
+                  + "where bool_col = false and id <= 5 and id >= 2",
+              prefix, suffix),
+          "SELECT DISTINCT /* +straight_join */ * FROM functional.alltypes "
+              + "WHERE bool_col = FALSE AND id <= 5 AND id >= 2",
+          ToSqlOptions.REWRITTEN);
     }
   }
 
diff --git a/fe/src/test/java/org/apache/impala/util/PrintUtilsTest.java b/fe/src/test/java/org/apache/impala/util/PrintUtilsTest.java
index 300022f..cd475a4 100644
--- a/fe/src/test/java/org/apache/impala/util/PrintUtilsTest.java
+++ b/fe/src/test/java/org/apache/impala/util/PrintUtilsTest.java
@@ -97,17 +97,6 @@ public class PrintUtilsTest {
             + " AS DOUBLE) < CAST(10 AS DOUBLE)",
         "Analyzed query: SELECT * FROM functional_kudu.alltypestiny\n"
             + "WHERE CAST(bigint_col AS DOUBLE) < CAST(10 AS DOUBLE)");
-    // Simple query with a hint retains newlines surrounding hint.
-    assertWrap("SELECT\n"
-            + "-- +straight_join\n"
-            + " * FROM tpch_parquet.orders INNER JOIN\n"
-            + "-- +shuffle\n"
-            + " tpch_parquet.customer ON o_custkey = c_custkey",
-        "SELECT\n"
-            + "-- +straight_join\n"
-            + "* FROM tpch_parquet.orders INNER JOIN\n"
-            + "-- +shuffle\n"
-            + "tpch_parquet.customer ON o_custkey = c_custkey");
     // test that a long string of blanks prints OK, some may be lost for clarity
     assertWrap("insert into foo values ('                                      "
             + "                                                                          "
diff --git a/testdata/workloads/functional-planner/queries/PlannerTest/max-row-size.test b/testdata/workloads/functional-planner/queries/PlannerTest/max-row-size.test
index 34c4938..793c231 100644
--- a/testdata/workloads/functional-planner/queries/PlannerTest/max-row-size.test
+++ b/testdata/workloads/functional-planner/queries/PlannerTest/max-row-size.test
@@ -6,10 +6,8 @@ from tpch_parquet.customer
 ---- DISTRIBUTEDPLAN
 Max Per-Host Resource Reservation: Memory=33.97MB Threads=5
 Per-Host Resource Estimates: Memory=68MB
-Analyzed query: SELECT
--- +straight_join
-* FROM tpch_parquet.customer INNER JOIN tpch_parquet.nation ON c_nationkey =
-n_nationkey
+Analyzed query: SELECT /* +straight_join */ * FROM tpch_parquet.customer INNER
+JOIN tpch_parquet.nation ON c_nationkey = n_nationkey
 
 F02:PLAN FRAGMENT [UNPARTITIONED] hosts=1 instances=1
 |  Per-Host Resources: mem-estimate=10.33MB mem-reservation=0B thread-reservation=1
@@ -67,10 +65,8 @@ from tpch_parquet.lineitem
 ---- DISTRIBUTEDPLAN
 Max Per-Host Resource Reservation: Memory=110.00MB Threads=5
 Per-Host Resource Estimates: Memory=410MB
-Analyzed query: SELECT
--- +straight_join
-* FROM tpch_parquet.lineitem LEFT OUTER JOIN tpch_parquet.orders ON l_orderkey =
-o_orderkey
+Analyzed query: SELECT /* +straight_join */ * FROM tpch_parquet.lineitem LEFT
+OUTER JOIN tpch_parquet.orders ON l_orderkey = o_orderkey
 
 F02:PLAN FRAGMENT [UNPARTITIONED] hosts=1 instances=1
 |  Per-Host Resources: mem-estimate=11.20MB mem-reservation=0B thread-reservation=1
@@ -184,11 +180,10 @@ having count(*) = 1
 ---- DISTRIBUTEDPLAN
 Max Per-Host Resource Reservation: Memory=110.00MB Threads=7
 Per-Host Resource Estimates: Memory=272MB
-Analyzed query: SELECT
--- +straight_join
-l_orderkey, o_orderstatus, count(*) FROM tpch_parquet.lineitem INNER JOIN
-tpch_parquet.orders ON o_orderkey = l_orderkey GROUP BY l_orderkey,
-o_orderstatus HAVING count(*) = CAST(1 AS BIGINT)
+Analyzed query: SELECT /* +straight_join */ l_orderkey, o_orderstatus, count(*)
+FROM tpch_parquet.lineitem INNER JOIN tpch_parquet.orders ON o_orderkey =
+l_orderkey GROUP BY l_orderkey, o_orderstatus HAVING count(*) = CAST(1 AS
+BIGINT)
 
 F04:PLAN FRAGMENT [UNPARTITIONED] hosts=1 instances=1
 |  Per-Host Resources: mem-estimate=10.10MB mem-reservation=0B thread-reservation=1
diff --git a/testdata/workloads/functional-planner/queries/PlannerTest/resource-requirements.test b/testdata/workloads/functional-planner/queries/PlannerTest/resource-requirements.test
index fdde0a1..a90363f 100644
--- a/testdata/workloads/functional-planner/queries/PlannerTest/resource-requirements.test
+++ b/testdata/workloads/functional-planner/queries/PlannerTest/resource-requirements.test
@@ -2422,8 +2422,7 @@ from tpch.lineitem inner join /* +shuffle */ tpch.orders on l_orderkey = o_order
 ---- PLAN
 Max Per-Host Resource Reservation: Memory=51.00MB Threads=3
 Per-Host Resource Estimates: Memory=446MB
-Analyzed query: SELECT * FROM tpch.lineitem INNER JOIN
--- +shuffle
+Analyzed query: SELECT * FROM tpch.lineitem INNER JOIN /* +shuffle */
 tpch.orders ON l_orderkey = o_orderkey
 
 F00:PLAN FRAGMENT [UNPARTITIONED] hosts=1 instances=1
@@ -2462,8 +2461,7 @@ PLAN-ROOT SINK
 ---- DISTRIBUTEDPLAN
 Max Per-Host Resource Reservation: Memory=52.00MB Threads=6
 Per-Host Resource Estimates: Memory=300MB
-Analyzed query: SELECT * FROM tpch.lineitem INNER JOIN
--- +shuffle
+Analyzed query: SELECT * FROM tpch.lineitem INNER JOIN /* +shuffle */
 tpch.orders ON l_orderkey = o_orderkey
 
 F03:PLAN FRAGMENT [UNPARTITIONED] hosts=1 instances=1
@@ -2523,8 +2521,7 @@ Per-Host Resources: mem-estimate=89.00MB mem-reservation=9.00MB thread-reservati
 ---- PARALLELPLANS
 Max Per-Host Resource Reservation: Memory=104.00MB Threads=7
 Per-Host Resource Estimates: Memory=481MB
-Analyzed query: SELECT * FROM tpch.lineitem INNER JOIN
--- +shuffle
+Analyzed query: SELECT * FROM tpch.lineitem INNER JOIN /* +shuffle */
 tpch.orders ON l_orderkey = o_orderkey
 
 F03:PLAN FRAGMENT [UNPARTITIONED] hosts=1 instances=1
@@ -4956,15 +4953,12 @@ join (
 ---- PLAN
 Max Per-Host Resource Reservation: Memory=99.00MB Threads=5
 Per-Host Resource Estimates: Memory=180MB
-Analyzed query: SELECT
--- +straight_join
-* FROM tpch_parquet.orders t1 INNER JOIN (SELECT
--- +straight_join
-t2.o_orderkey k2, k3, k4 FROM tpch_parquet.orders t2 INNER JOIN (SELECT
--- +straight_join
-t3.o_orderkey k3, t4.o_orderkey k4 FROM tpch_parquet.orders t3 INNER JOIN
-tpch_parquet.orders t4 ON t3.o_orderkey = t4.o_orderkey) v2 ON v2.k3 =
-t2.o_orderkey) v1 ON v1.k3 = t1.o_orderkey
+Analyzed query: SELECT /* +straight_join */ * FROM tpch_parquet.orders t1 INNER
+JOIN (SELECT /* +straight_join */ t2.o_orderkey k2, k3, k4 FROM
+tpch_parquet.orders t2 INNER JOIN (SELECT /* +straight_join */ t3.o_orderkey k3,
+t4.o_orderkey k4 FROM tpch_parquet.orders t3 INNER JOIN tpch_parquet.orders t4
+ON t3.o_orderkey = t4.o_orderkey) v2 ON v2.k3 = t2.o_orderkey) v1 ON v1.k3 =
+t1.o_orderkey
 
 F00:PLAN FRAGMENT [UNPARTITIONED] hosts=1 instances=1
 |  Per-Host Resources: mem-estimate=180.00MB mem-reservation=99.00MB thread-reservation=5 runtime-filters-memory=3.00MB
@@ -5040,15 +5034,12 @@ PLAN-ROOT SINK
 ---- DISTRIBUTEDPLAN
 Max Per-Host Resource Reservation: Memory=100.50MB Threads=10
 Per-Host Resource Estimates: Memory=260MB
-Analyzed query: SELECT
--- +straight_join
-* FROM tpch_parquet.orders t1 INNER JOIN (SELECT
--- +straight_join
-t2.o_orderkey k2, k3, k4 FROM tpch_parquet.orders t2 INNER JOIN (SELECT
--- +straight_join
-t3.o_orderkey k3, t4.o_orderkey k4 FROM tpch_parquet.orders t3 INNER JOIN
-tpch_parquet.orders t4 ON t3.o_orderkey = t4.o_orderkey) v2 ON v2.k3 =
-t2.o_orderkey) v1 ON v1.k3 = t1.o_orderkey
+Analyzed query: SELECT /* +straight_join */ * FROM tpch_parquet.orders t1 INNER
+JOIN (SELECT /* +straight_join */ t2.o_orderkey k2, k3, k4 FROM
+tpch_parquet.orders t2 INNER JOIN (SELECT /* +straight_join */ t3.o_orderkey k3,
+t4.o_orderkey k4 FROM tpch_parquet.orders t3 INNER JOIN tpch_parquet.orders t4
+ON t3.o_orderkey = t4.o_orderkey) v2 ON v2.k3 = t2.o_orderkey) v1 ON v1.k3 =
+t1.o_orderkey
 
 F05:PLAN FRAGMENT [UNPARTITIONED] hosts=1 instances=1
 |  Per-Host Resources: mem-estimate=10.41MB mem-reservation=0B thread-reservation=1
@@ -5159,15 +5150,12 @@ Per-Host Resources: mem-estimate=88.84MB mem-reservation=59.00MB thread-reservat
 ---- PARALLELPLANS
 Max Per-Host Resource Reservation: Memory=176.50MB Threads=11
 Per-Host Resource Estimates: Memory=454MB
-Analyzed query: SELECT
--- +straight_join
-* FROM tpch_parquet.orders t1 INNER JOIN (SELECT
--- +straight_join
-t2.o_orderkey k2, k3, k4 FROM tpch_parquet.orders t2 INNER JOIN (SELECT
--- +straight_join
-t3.o_orderkey k3, t4.o_orderkey k4 FROM tpch_parquet.orders t3 INNER JOIN
-tpch_parquet.orders t4 ON t3.o_orderkey = t4.o_orderkey) v2 ON v2.k3 =
-t2.o_orderkey) v1 ON v1.k3 = t1.o_orderkey
+Analyzed query: SELECT /* +straight_join */ * FROM tpch_parquet.orders t1 INNER
+JOIN (SELECT /* +straight_join */ t2.o_orderkey k2, k3, k4 FROM
+tpch_parquet.orders t2 INNER JOIN (SELECT /* +straight_join */ t3.o_orderkey k3,
+t4.o_orderkey k4 FROM tpch_parquet.orders t3 INNER JOIN tpch_parquet.orders t4
+ON t3.o_orderkey = t4.o_orderkey) v2 ON v2.k3 = t2.o_orderkey) v1 ON v1.k3 =
+t1.o_orderkey
 
 F05:PLAN FRAGMENT [UNPARTITIONED] hosts=1 instances=1
 |  Per-Host Resources: mem-estimate=10.82MB mem-reservation=0B thread-reservation=1
@@ -5318,14 +5306,11 @@ join (
 ---- PLAN
 Max Per-Host Resource Reservation: Memory=176.00KB Threads=5
 Per-Host Resource Estimates: Memory=138MB
-Analyzed query: SELECT
--- +straight_join
-* FROM tpch_parquet.nation t1 INNER JOIN (SELECT
--- +straight_join
-t2.n_nationkey k2, k3, k4 FROM tpch_parquet.nation t2 INNER JOIN (SELECT
--- +straight_join
-t3.n_nationkey k3, t4.s_suppkey k4 FROM tpch_parquet.nation t3 INNER JOIN
-tpch_parquet.supplier t4) v2) v1
+Analyzed query: SELECT /* +straight_join */ * FROM tpch_parquet.nation t1 INNER
+JOIN (SELECT /* +straight_join */ t2.n_nationkey k2, k3, k4 FROM
+tpch_parquet.nation t2 INNER JOIN (SELECT /* +straight_join */ t3.n_nationkey
+k3, t4.s_suppkey k4 FROM tpch_parquet.nation t3 INNER JOIN tpch_parquet.supplier
+t4) v2) v1
 
 F00:PLAN FRAGMENT [UNPARTITIONED] hosts=1 instances=1
 |  Per-Host Resources: mem-estimate=137.99MB mem-reservation=176.00KB thread-reservation=5
@@ -5389,14 +5374,11 @@ PLAN-ROOT SINK
 ---- DISTRIBUTEDPLAN
 Max Per-Host Resource Reservation: Memory=176.00KB Threads=9
 Per-Host Resource Estimates: Memory=161MB
-Analyzed query: SELECT
--- +straight_join
-* FROM tpch_parquet.nation t1 INNER JOIN (SELECT
--- +straight_join
-t2.n_nationkey k2, k3, k4 FROM tpch_parquet.nation t2 INNER JOIN (SELECT
--- +straight_join
-t3.n_nationkey k3, t4.s_suppkey k4 FROM tpch_parquet.nation t3 INNER JOIN
-tpch_parquet.supplier t4) v2) v1
+Analyzed query: SELECT /* +straight_join */ * FROM tpch_parquet.nation t1 INNER
+JOIN (SELECT /* +straight_join */ t2.n_nationkey k2, k3, k4 FROM
+tpch_parquet.nation t2 INNER JOIN (SELECT /* +straight_join */ t3.n_nationkey
+k3, t4.s_suppkey k4 FROM tpch_parquet.nation t3 INNER JOIN tpch_parquet.supplier
+t4) v2) v1
 
 F04:PLAN FRAGMENT [UNPARTITIONED] hosts=1 instances=1
 |  Per-Host Resources: mem-estimate=10.13MB mem-reservation=0B thread-reservation=1
@@ -5488,14 +5470,11 @@ Per-Host Resources: mem-estimate=97.55MB mem-reservation=32.00KB thread-reservat
 ---- PARALLELPLANS
 Max Per-Host Resource Reservation: Memory=352.00KB Threads=9
 Per-Host Resource Estimates: Memory=311MB
-Analyzed query: SELECT
--- +straight_join
-* FROM tpch_parquet.nation t1 INNER JOIN (SELECT
--- +straight_join
-t2.n_nationkey k2, k3, k4 FROM tpch_parquet.nation t2 INNER JOIN (SELECT
--- +straight_join
-t3.n_nationkey k3, t4.s_suppkey k4 FROM tpch_parquet.nation t3 INNER JOIN
-tpch_parquet.supplier t4) v2) v1
+Analyzed query: SELECT /* +straight_join */ * FROM tpch_parquet.nation t1 INNER
+JOIN (SELECT /* +straight_join */ t2.n_nationkey k2, k3, k4 FROM
+tpch_parquet.nation t2 INNER JOIN (SELECT /* +straight_join */ t3.n_nationkey
+k3, t4.s_suppkey k4 FROM tpch_parquet.nation t3 INNER JOIN tpch_parquet.supplier
+t4) v2) v1
 
 F04:PLAN FRAGMENT [UNPARTITIONED] hosts=1 instances=1
 |  Per-Host Resources: mem-estimate=10.27MB mem-reservation=0B thread-reservation=1
diff --git a/testdata/workloads/functional-planner/queries/PlannerTest/spillable-buffer-sizing.test b/testdata/workloads/functional-planner/queries/PlannerTest/spillable-buffer-sizing.test
index 8d35928..68e5110 100644
--- a/testdata/workloads/functional-planner/queries/PlannerTest/spillable-buffer-sizing.test
+++ b/testdata/workloads/functional-planner/queries/PlannerTest/spillable-buffer-sizing.test
@@ -5,10 +5,8 @@ from tpch_parquet.customer
 ---- DISTRIBUTEDPLAN
 Max Per-Host Resource Reservation: Memory=18.97MB Threads=5
 Per-Host Resource Estimates: Memory=53MB
-Analyzed query: SELECT 
--- +straight_join
-* FROM tpch_parquet.customer INNER JOIN tpch_parquet.nation ON c_nationkey =
-n_nationkey
+Analyzed query: SELECT /* +straight_join */ * FROM tpch_parquet.customer INNER
+JOIN tpch_parquet.nation ON c_nationkey = n_nationkey
 
 F02:PLAN FRAGMENT [UNPARTITIONED] hosts=1 instances=1
 |  Per-Host Resources: mem-estimate=10.33MB mem-reservation=0B thread-reservation=1
@@ -60,10 +58,8 @@ Per-Host Resources: mem-estimate=26.95MB mem-reservation=18.94MB thread-reservat
 ---- PARALLELPLANS
 Max Per-Host Resource Reservation: Memory=37.94MB Threads=5
 Per-Host Resource Estimates: Memory=97MB
-Analyzed query: SELECT 
--- +straight_join
-* FROM tpch_parquet.customer INNER JOIN tpch_parquet.nation ON c_nationkey =
-n_nationkey
+Analyzed query: SELECT /* +straight_join */ * FROM tpch_parquet.customer INNER
+JOIN tpch_parquet.nation ON c_nationkey = n_nationkey
 
 F02:PLAN FRAGMENT [UNPARTITIONED] hosts=1 instances=1
 |  Per-Host Resources: mem-estimate=10.65MB mem-reservation=0B thread-reservation=1
@@ -128,10 +124,8 @@ from tpch_parquet.lineitem
 ---- DISTRIBUTEDPLAN
 Max Per-Host Resource Reservation: Memory=98.00MB Threads=5
 Per-Host Resource Estimates: Memory=410MB
-Analyzed query: SELECT 
--- +straight_join
-* FROM tpch_parquet.lineitem LEFT OUTER JOIN tpch_parquet.orders ON l_orderkey =
-o_orderkey
+Analyzed query: SELECT /* +straight_join */ * FROM tpch_parquet.lineitem LEFT
+OUTER JOIN tpch_parquet.orders ON l_orderkey = o_orderkey
 
 F02:PLAN FRAGMENT [UNPARTITIONED] hosts=1 instances=1
 |  Per-Host Resources: mem-estimate=11.20MB mem-reservation=0B thread-reservation=1
@@ -181,10 +175,8 @@ Per-Host Resources: mem-estimate=359.29MB mem-reservation=74.00MB thread-reserva
 ---- PARALLELPLANS
 Max Per-Host Resource Reservation: Memory=196.00MB Threads=5
 Per-Host Resource Estimates: Memory=790MB
-Analyzed query: SELECT 
--- +straight_join
-* FROM tpch_parquet.lineitem LEFT OUTER JOIN tpch_parquet.orders ON l_orderkey =
-o_orderkey
+Analyzed query: SELECT /* +straight_join */ * FROM tpch_parquet.lineitem LEFT
+OUTER JOIN tpch_parquet.orders ON l_orderkey = o_orderkey
 
 F02:PLAN FRAGMENT [UNPARTITIONED] hosts=1 instances=1
 |  Per-Host Resources: mem-estimate=12.40MB mem-reservation=0B thread-reservation=1
@@ -247,11 +239,8 @@ from tpch_parquet.orders
 ---- DISTRIBUTEDPLAN
 Max Per-Host Resource Reservation: Memory=59.00MB Threads=6
 Per-Host Resource Estimates: Memory=114MB
-Analyzed query: SELECT 
--- +straight_join
-* FROM tpch_parquet.orders INNER JOIN 
--- +shuffle
-tpch_parquet.customer ON o_custkey = c_custkey
+Analyzed query: SELECT /* +straight_join */ * FROM tpch_parquet.orders INNER
+JOIN /* +shuffle */ tpch_parquet.customer ON o_custkey = c_custkey
 
 F03:PLAN FRAGMENT [UNPARTITIONED] hosts=1 instances=1
 |  Per-Host Resources: mem-estimate=10.77MB mem-reservation=0B thread-reservation=1
@@ -310,11 +299,8 @@ Per-Host Resources: mem-estimate=41.00MB mem-reservation=25.00MB thread-reservat
 ---- PARALLELPLANS
 Max Per-Host Resource Reservation: Memory=101.00MB Threads=7
 Per-Host Resource Estimates: Memory=182MB
-Analyzed query: SELECT 
--- +straight_join
-* FROM tpch_parquet.orders INNER JOIN 
--- +shuffle
-tpch_parquet.customer ON o_custkey = c_custkey
+Analyzed query: SELECT /* +straight_join */ * FROM tpch_parquet.orders INNER
+JOIN /* +shuffle */ tpch_parquet.customer ON o_custkey = c_custkey
 
 F03:PLAN FRAGMENT [UNPARTITIONED] hosts=1 instances=1
 |  Per-Host Resources: mem-estimate=11.55MB mem-reservation=0B thread-reservation=1
@@ -386,11 +372,8 @@ from tpch_parquet.orders
 ---- DISTRIBUTEDPLAN
 Max Per-Host Resource Reservation: Memory=75.00MB Threads=5
 Per-Host Resource Estimates: Memory=120MB
-Analyzed query: SELECT 
--- +straight_join
-* FROM tpch_parquet.orders INNER JOIN 
--- +broadcast
-tpch_parquet.customer ON o_custkey = c_custkey
+Analyzed query: SELECT /* +straight_join */ * FROM tpch_parquet.orders INNER
+JOIN /* +broadcast */ tpch_parquet.customer ON o_custkey = c_custkey
 
 F02:PLAN FRAGMENT [UNPARTITIONED] hosts=1 instances=1
 |  Per-Host Resources: mem-estimate=10.77MB mem-reservation=0B thread-reservation=1
@@ -442,11 +425,8 @@ Per-Host Resources: mem-estimate=85.45MB mem-reservation=59.00MB thread-reservat
 ---- PARALLELPLANS
 Max Per-Host Resource Reservation: Memory=150.00MB Threads=5
 Per-Host Resource Estimates: Memory=210MB
-Analyzed query: SELECT 
--- +straight_join
-* FROM tpch_parquet.orders INNER JOIN 
--- +broadcast
-tpch_parquet.customer ON o_custkey = c_custkey
+Analyzed query: SELECT /* +straight_join */ * FROM tpch_parquet.orders INNER
+JOIN /* +broadcast */ tpch_parquet.customer ON o_custkey = c_custkey
 
 F02:PLAN FRAGMENT [UNPARTITIONED] hosts=1 instances=1
 |  Per-Host Resources: mem-estimate=11.55MB mem-reservation=0B thread-reservation=1
@@ -513,10 +493,8 @@ Max Per-Host Resource Reservation: Memory=34.17MB Threads=5
 Per-Host Resource Estimates: Memory=2.03GB
 WARNING: The following tables are missing relevant table and/or column statistics.
 functional_parquet.alltypes, functional_parquet.alltypestiny
-Analyzed query: SELECT 
--- +straight_join
-* FROM functional_parquet.alltypes LEFT OUTER JOIN
-functional_parquet.alltypestiny ON alltypes.id = alltypestiny.id
+Analyzed query: SELECT /* +straight_join */ * FROM functional_parquet.alltypes
+LEFT OUTER JOIN functional_parquet.alltypestiny ON alltypes.id = alltypestiny.id
 
 F02:PLAN FRAGMENT [UNPARTITIONED] hosts=1 instances=1
 |  Per-Host Resources: mem-estimate=503.95KB mem-reservation=0B thread-reservation=1
@@ -570,10 +548,8 @@ Max Per-Host Resource Reservation: Memory=68.34MB Threads=5
 Per-Host Resource Estimates: Memory=4.06GB
 WARNING: The following tables are missing relevant table and/or column statistics.
 functional_parquet.alltypestiny
-Analyzed query: SELECT 
--- +straight_join
-* FROM functional_parquet.alltypes LEFT OUTER JOIN
-functional_parquet.alltypestiny ON alltypes.id = alltypestiny.id
+Analyzed query: SELECT /* +straight_join */ * FROM functional_parquet.alltypes
+LEFT OUTER JOIN functional_parquet.alltypestiny ON alltypes.id = alltypestiny.id
 
 F02:PLAN FRAGMENT [UNPARTITIONED] hosts=1 instances=1
 |  Per-Host Resources: mem-estimate=1007.95KB mem-reservation=0B thread-reservation=1
@@ -741,11 +717,10 @@ having count(*) = 1
 ---- DISTRIBUTEDPLAN
 Max Per-Host Resource Reservation: Memory=82.00MB Threads=7
 Per-Host Resource Estimates: Memory=244MB
-Analyzed query: SELECT 
--- +straight_join
-l_orderkey, o_orderstatus, count(*) FROM tpch_parquet.lineitem INNER JOIN
-tpch_parquet.orders ON o_orderkey = l_orderkey GROUP BY l_orderkey,
-o_orderstatus HAVING count(*) = CAST(1 AS BIGINT)
+Analyzed query: SELECT /* +straight_join */ l_orderkey, o_orderstatus, count(*)
+FROM tpch_parquet.lineitem INNER JOIN tpch_parquet.orders ON o_orderkey =
+l_orderkey GROUP BY l_orderkey, o_orderstatus HAVING count(*) = CAST(1 AS
+BIGINT)
 
 F04:PLAN FRAGMENT [UNPARTITIONED] hosts=1 instances=1
 |  Per-Host Resources: mem-estimate=10.10MB mem-reservation=0B thread-reservation=1
@@ -826,11 +801,10 @@ Per-Host Resources: mem-estimate=81.00MB mem-reservation=5.00MB thread-reservati
 ---- PARALLELPLANS
 Max Per-Host Resource Reservation: Memory=130.00MB Threads=9
 Per-Host Resource Estimates: Memory=400MB
-Analyzed query: SELECT 
--- +straight_join
-l_orderkey, o_orderstatus, count(*) FROM tpch_parquet.lineitem INNER JOIN
-tpch_parquet.orders ON o_orderkey = l_orderkey GROUP BY l_orderkey,
-o_orderstatus HAVING count(*) = CAST(1 AS BIGINT)
+Analyzed query: SELECT /* +straight_join */ l_orderkey, o_orderstatus, count(*)
+FROM tpch_parquet.lineitem INNER JOIN tpch_parquet.orders ON o_orderkey =
+l_orderkey GROUP BY l_orderkey, o_orderstatus HAVING count(*) = CAST(1 AS
+BIGINT)
 
 F04:PLAN FRAGMENT [UNPARTITIONED] hosts=1 instances=1
 |  Per-Host Resources: mem-estimate=10.19MB mem-reservation=0B thread-reservation=1