You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@impala.apache.org by st...@apache.org on 2024/11/03 23:36:41 UTC

(impala) branch master updated (1f473f365 -> 5c9b82854)

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

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


    from 1f473f365 IMPALA-12390 (part 4): Enable unnecessary-value-param
     new e8e8a5150 IMPALA-13441: Support explain statements in Impala planner
     new 5c9b82854 IMPALA-13327: Fix wrong unpack dir name for Apache HBase

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 bin/bootstrap_toolchain.py                         |  2 +-
 .../java/org/apache/impala/planner/Planner.java    | 17 ++--
 .../java/org/apache/impala/service/Frontend.java   |  2 +-
 .../src/main/codegen/templates/Parser.jj           | 57 ++-----------
 .../impala/calcite/service/CalciteJniFrontend.java | 54 +++++-------
 .../impala/calcite/service/ExecRequestCreator.java | 23 +++---
 .../queries/QueryTest/calcite.test                 | 95 ++++++++++++++++++++++
 7 files changed, 145 insertions(+), 105 deletions(-)


(impala) 01/02: IMPALA-13441: Support explain statements in Impala planner

Posted by st...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit e8e8a5150e21c9b1f92ad5d04a94e8812cdd29dd
Author: Steve Carlin <sc...@cloudera.com>
AuthorDate: Fri May 17 10:35:02 2024 -0700

    IMPALA-13441: Support explain statements in Impala planner
    
    This adds support for explain statements for the Calcite planner.
    This also fixes up the Parser.jj file so that statements not
    processed by Calcite planner will fail, like "describe" and other
    non-select statements.  The parser will now only handle "select"
    and "explain" as the first keyword.
    
    If the parser fails, we need to do an additional check within Impala.
    We run the statement through the Impala parser and check the statement
    type.  If the statement type is anything other than SelectStmt,
    we run the query within the original Impala planner. If it is a SelectStmt,
    we fail the query because we want all select statements to go through
    the Calcite parser.
    
    Change-Id: Iea6afaa1f1698a300ad047c8820691cf7e8eb44b
    Reviewed-on: http://gerrit.cloudera.org:8080/21923
    Reviewed-by: Impala Public Jenkins <im...@cloudera.com>
    Tested-by: Impala Public Jenkins <im...@cloudera.com>
---
 .../java/org/apache/impala/planner/Planner.java    | 17 ++--
 .../java/org/apache/impala/service/Frontend.java   |  2 +-
 .../src/main/codegen/templates/Parser.jj           | 57 ++-----------
 .../impala/calcite/service/CalciteJniFrontend.java | 54 +++++-------
 .../impala/calcite/service/ExecRequestCreator.java | 23 +++---
 .../queries/QueryTest/calcite.test                 | 95 ++++++++++++++++++++++
 6 files changed, 144 insertions(+), 104 deletions(-)

diff --git a/fe/src/main/java/org/apache/impala/planner/Planner.java b/fe/src/main/java/org/apache/impala/planner/Planner.java
index 91c824ae3..131a268e6 100644
--- a/fe/src/main/java/org/apache/impala/planner/Planner.java
+++ b/fe/src/main/java/org/apache/impala/planner/Planner.java
@@ -361,7 +361,8 @@ public class Planner {
     if (ctx_.getAnalysisResult().isExplainStmt() || RuntimeEnv.INSTANCE.isTestEnv()) {
       explainLevel = ctx_.getQueryOptions().getExplain_level();
     }
-    return getExplainString(fragments, request, explainLevel);
+    return getExplainString(fragments, request, explainLevel, ctx_.getQueryOptions(),
+        ctx_.getQueryStmt());
   }
 
   /**
@@ -369,8 +370,9 @@ public class Planner {
    * explicit explain level.
    * Includes the estimated resource requirements from the request if set.
    */
-  public String getExplainString(List<PlanFragment> fragments,
-      TQueryExecRequest request, TExplainLevel explainLevel) {
+  public static String getExplainString(List<PlanFragment> fragments,
+      TQueryExecRequest request, TExplainLevel explainLevel,
+      TQueryOptions options, QueryStmt queryStmt) {
     StringBuilder str = new StringBuilder();
     boolean hasHeader = false;
 
@@ -452,9 +454,10 @@ public class Planner {
       hasHeader = true;
     }
 
-    if (explainLevel.ordinal() >= TExplainLevel.EXTENDED.ordinal()) {
+    if (explainLevel.ordinal() >= TExplainLevel.EXTENDED.ordinal() &&
+        queryStmt != null) {
       // In extended explain include the analyzed query text showing implicit casts
-      String queryText = ctx_.getQueryStmt().toSql(SHOW_IMPLICIT_CASTS);
+      String queryText = queryStmt.toSql(SHOW_IMPLICIT_CASTS);
       String wrappedText = PrintUtils.wrapString("Analyzed query: " + queryText, 80);
       str.append(wrappedText).append("\n");
       hasHeader = true;
@@ -467,12 +470,12 @@ public class Planner {
 
     if (explainLevel.ordinal() < TExplainLevel.VERBOSE.ordinal()) {
       // Print the non-fragmented parallel plan.
-      str.append(fragments.get(0).getExplainString(ctx_.getQueryOptions(), explainLevel));
+      str.append(fragments.get(0).getExplainString(options, explainLevel));
     } else {
       // Print the fragmented parallel plan.
       for (int i = 0; i < fragments.size(); ++i) {
         PlanFragment fragment = fragments.get(i);
-        str.append(fragment.getExplainString(ctx_.getQueryOptions(), explainLevel));
+        str.append(fragment.getExplainString(options, explainLevel));
         if (i < fragments.size() - 1) str.append("\n");
       }
     }
diff --git a/fe/src/main/java/org/apache/impala/service/Frontend.java b/fe/src/main/java/org/apache/impala/service/Frontend.java
index 9b8dab55a..ae398128b 100644
--- a/fe/src/main/java/org/apache/impala/service/Frontend.java
+++ b/fe/src/main/java/org/apache/impala/service/Frontend.java
@@ -3017,7 +3017,7 @@ public class Frontend {
   /**
    * Attaches the explain result to the TExecRequest.
    */
-  private void createExplainRequest(String explainString, TExecRequest result) {
+  public static void createExplainRequest(String explainString, TExecRequest result) {
     // update the metadata - one string column
     TColumn colDesc = new TColumn("Explain String", Type.STRING.toThrift());
     TResultSetMetadata metadata = new TResultSetMetadata(Lists.newArrayList(colDesc));
diff --git a/java/calcite-planner/src/main/codegen/templates/Parser.jj b/java/calcite-planner/src/main/codegen/templates/Parser.jj
index 6a59388dd..f21f912c1 100644
--- a/java/calcite-planner/src/main/codegen/templates/Parser.jj
+++ b/java/calcite-planner/src/main/codegen/templates/Parser.jj
@@ -1132,43 +1132,9 @@ SqlNode SqlStmt() :
 }
 {
     (
-<#-- Add methods to parse additional statements here -->
-<#list (parser.statementParserMethods!default.parser.statementParserMethods) as method>
-        LOOKAHEAD(2) stmt = ${method}
-    |
-</#list>
-        stmt = SqlSetOption(Span.of(), null)
-    |
-        stmt = SqlAlter()
-    |
-<#if (parser.createStatementParserMethods!default.parser.createStatementParserMethods)?size != 0>
-        stmt = SqlCreate()
-    |
-</#if>
-<#if (parser.dropStatementParserMethods!default.parser.dropStatementParserMethods)?size != 0>
-        stmt = SqlDrop()
-    |
-</#if>
-<#if (parser.truncateStatementParserMethods!default.parser.truncateStatementParserMethods)?size != 0>
-        LOOKAHEAD(2)
-        stmt = SqlTruncate()
-    |
-</#if>
         stmt = OrderedQueryOrExpr(ExprContext.ACCEPT_QUERY)
     |
         stmt = SqlExplain()
-    |
-        stmt = SqlDescribe()
-    |
-        stmt = SqlInsert()
-    |
-        stmt = SqlDelete()
-    |
-        stmt = SqlUpdate()
-    |
-        stmt = SqlMerge()
-    |
-        stmt = SqlProcedureCall()
     )
     {
         return stmt;
@@ -1395,26 +1361,13 @@ SqlNode SqlExplain() :
     final SqlExplainFormat format;
 }
 {
-    <EXPLAIN> <PLAN>
-    [ detailLevel = ExplainDetailLevel() ]
-    depth = ExplainDepth()
-    (
-        LOOKAHEAD(2)
-        <AS> <XML> { format = SqlExplainFormat.XML; }
-    |
-        LOOKAHEAD(2)
-        <AS> <JSON> { format = SqlExplainFormat.JSON; }
-    |
-        <AS> <DOT_FORMAT> { format = SqlExplainFormat.DOT; }
-    |
-        { format = SqlExplainFormat.TEXT; }
-    )
-    <FOR> stmt = SqlQueryOrDml() {
+    <EXPLAIN>
+    stmt = SqlQueryOrDml() {
         return new SqlExplain(getPos(),
             stmt,
-            detailLevel.symbol(SqlParserPos.ZERO),
-            depth.symbol(SqlParserPos.ZERO),
-            format.symbol(SqlParserPos.ZERO),
+            SqlExplainLevel.ALL_ATTRIBUTES.symbol(SqlParserPos.ZERO),
+            SqlExplain.Depth.PHYSICAL.symbol(SqlParserPos.ZERO),
+            SqlExplainFormat.TEXT.symbol(SqlParserPos.ZERO),
             nDynamicParams);
     }
 }
diff --git a/java/calcite-planner/src/main/java/org/apache/impala/calcite/service/CalciteJniFrontend.java b/java/calcite-planner/src/main/java/org/apache/impala/calcite/service/CalciteJniFrontend.java
index 54b582a94..44708ac37 100644
--- a/java/calcite-planner/src/main/java/org/apache/impala/calcite/service/CalciteJniFrontend.java
+++ b/java/calcite-planner/src/main/java/org/apache/impala/calcite/service/CalciteJniFrontend.java
@@ -22,7 +22,11 @@ import org.apache.calcite.rel.RelNode;
 import org.apache.calcite.rel.metadata.DefaultRelMetadataProvider;
 import org.apache.calcite.rel.metadata.JaninoRelMetadataProvider;
 import org.apache.calcite.rel.metadata.RelMetadataQuery;
+import org.apache.calcite.sql.SqlExplain;
 import org.apache.calcite.sql.SqlNode;
+import org.apache.calcite.sql.parser.SqlParseException;
+import org.apache.impala.analysis.Parser;
+import org.apache.impala.analysis.SelectStmt;
 import org.apache.impala.calcite.functions.FunctionResolver;
 import org.apache.impala.calcite.operators.ImpalaOperatorTable;
 import org.apache.impala.calcite.rel.node.NodeWithExprs;
@@ -85,9 +89,6 @@ public class CalciteJniFrontend extends JniFrontend {
     Thread.currentThread().setContextClassLoader(this.getClass().getClassLoader());
 
     QueryContext queryCtx = new QueryContext(thriftQueryContext, getFrontend());
-    if (!canStmtBePlannedThroughCalcite(queryCtx)) {
-      return runThroughOriginalPlanner(thriftQueryContext, queryCtx);
-    }
 
     try (FrontendProfile.Scope scope = FrontendProfile.createNewWithScope()) {
       LOG.info("Using Calcite Planner for the following query: " + queryCtx.getStmt());
@@ -104,6 +105,11 @@ public class CalciteJniFrontend extends JniFrontend {
           new CalciteMetadataHandler(parsedSqlNode, queryCtx);
       markEvent(mdHandler, null, queryCtx, "Loaded tables");
 
+      boolean isExplain = false;
+      if (parsedSqlNode instanceof SqlExplain) {
+        isExplain = true;
+        parsedSqlNode = ((SqlExplain) parsedSqlNode).getExplicandum();
+      }
       // Validate the parsed query
       CalciteValidator validator = new CalciteValidator(mdHandler, queryCtx);
       SqlNode validatedNode = validator.validate(parsedSqlNode);
@@ -127,7 +133,7 @@ public class CalciteJniFrontend extends JniFrontend {
 
       // Create exec request for the server
       ExecRequestCreator execRequestCreator =
-          new ExecRequestCreator(physPlanCreator, queryCtx, mdHandler);
+          new ExecRequestCreator(physPlanCreator, queryCtx, mdHandler, isExplain);
       TExecRequest execRequest = execRequestCreator.create(rootNode);
       markEvent(mdHandler, execRequest, queryCtx, "Created exec request");
 
@@ -136,6 +142,16 @@ public class CalciteJniFrontend extends JniFrontend {
       queryCtx.getTimeline().markEvent("Serialized request");
 
       return serializedRequest;
+    } catch (SqlParseException e) {
+      // do a quick parse just to make sure it's not a select stmt. If it is
+      // a select statement, we fail the query since all select statements
+      // should be run through the Calcite Planner.
+      if (Parser.parse(queryCtx.getStmt()) instanceof SelectStmt) {
+        throw new InternalException(e.getMessage());
+      }
+      LOG.info("Calcite planner failed to parse query: " + queryCtx.getStmt());
+      LOG.info("Going to use original Impala planner.");
+      return runThroughOriginalPlanner(thriftQueryContext, queryCtx);
     } catch (Exception e) {
       LOG.info("Calcite planner failed.");
       LOG.info("Exception: " + e);
@@ -147,36 +163,6 @@ public class CalciteJniFrontend extends JniFrontend {
     }
   }
 
-  /**
-   * Use information about the query syntax to see if this can be handled
-   * by Calcite
-   */
-  private boolean canStmtBePlannedThroughCalcite(QueryContext queryCtx) {
-    String stringWithFirstRealWord = queryCtx.getStmt();
-    String[] lines = stringWithFirstRealWord.split("\n");
-    // Get rid of comments and blank lines which start the query. We need to find
-    // the first real word.
-    // TODO: IMPALA-12976: need to make this more generic. Certain patterns aren't caught
-    // here like /* */
-    for (String line : lines) {
-      if (line.trim().startsWith("--") || line.trim().equals("")) {
-        stringWithFirstRealWord = stringWithFirstRealWord.replaceFirst(line + "\n", "");
-      } else {
-        break;
-      }
-    }
-    stringWithFirstRealWord = stringWithFirstRealWord.trim();
-    String beforeStripString;
-    do {
-      beforeStripString = stringWithFirstRealWord;
-      stringWithFirstRealWord = StringUtils.stripStart(stringWithFirstRealWord, "(");
-      stringWithFirstRealWord = StringUtils.stripStart(stringWithFirstRealWord, null);
-    } while (!stringWithFirstRealWord.equals(beforeStripString));
-    return StringUtils.startsWithIgnoreCase(stringWithFirstRealWord, "select") ||
-        StringUtils.startsWithIgnoreCase(stringWithFirstRealWord, "values") ||
-        StringUtils.startsWithIgnoreCase(stringWithFirstRealWord, "with");
-  }
-
   /**
    * Fallback planner method
    */
diff --git a/java/calcite-planner/src/main/java/org/apache/impala/calcite/service/ExecRequestCreator.java b/java/calcite-planner/src/main/java/org/apache/impala/calcite/service/ExecRequestCreator.java
index 96c0a990c..36cb3d9fc 100644
--- a/java/calcite-planner/src/main/java/org/apache/impala/calcite/service/ExecRequestCreator.java
+++ b/java/calcite-planner/src/main/java/org/apache/impala/calcite/service/ExecRequestCreator.java
@@ -87,12 +87,15 @@ public class ExecRequestCreator implements CompilerStep {
   private final CalcitePhysPlanCreator physPlanCreator;
   private final CalciteJniFrontend.QueryContext queryCtx;
   private final CalciteMetadataHandler mdHandler;
+  private final boolean isExplain;
 
   public ExecRequestCreator(CalcitePhysPlanCreator physPlanCreator,
-      CalciteJniFrontend.QueryContext queryCtx, CalciteMetadataHandler mdHandler) {
+      CalciteJniFrontend.QueryContext queryCtx, CalciteMetadataHandler mdHandler,
+      boolean isExplain) {
     this.physPlanCreator = physPlanCreator;
     this.queryCtx = queryCtx;
     this.mdHandler = mdHandler;
+    this.isExplain = isExplain;
   }
 
   /**
@@ -146,18 +149,15 @@ public class ExecRequestCreator implements CompilerStep {
     List<PlanFragment> allFragments = planFragmentRoot.getNodesPreOrder();
     // to mimic the original planner behavior, use EXTENDED mode explain except for
     // EXPLAIN statements.
-    // TODO: support explain plans
-    // TExplainLevel explainLevel =
-    //     isExplain ? plannerContext.getQueryOptions().getExplain_level() :
-    //     TExplainLevel.EXTENDED;
-    TExplainLevel explainLevel = TExplainLevel.EXTENDED;
-    // if (isExplain) {
-    //   result.setStmt_type(TStmtType.EXPLAIN);
-    // }
+    TExplainLevel explainLevel =
+        isExplain ? plannerContext.getQueryOptions().getExplain_level() :
+        TExplainLevel.EXTENDED;
+    if (isExplain) {
+      result.setStmt_type(TStmtType.EXPLAIN);
+    }
     String explainString = getExplainString(allFragments, explainLevel, plannerContext);
     queryExecRequest.setQuery_plan(explainString);
 
-
     queryCtx.setDesc_tbl_serialized(
         plannerContext.getRootAnalyzer().getDescTbl().toSerializedThrift());
 
@@ -170,6 +170,9 @@ public class ExecRequestCreator implements CompilerStep {
     this.queryCtx.getFrontend().addPlannerToProfile("CalcitePlanner");
     result.setProfile(FrontendProfile.getCurrent().emitAsThrift());
     result.setProfile_children(FrontendProfile.getCurrent().emitChildrenAsThrift());
+    if (isExplain) {
+      this.queryCtx.getFrontend().createExplainRequest(explainString, result);
+    }
     return result;
   }
 
diff --git a/testdata/workloads/functional-query/queries/QueryTest/calcite.test b/testdata/workloads/functional-query/queries/QueryTest/calcite.test
index 05a4a8c93..207af6d07 100644
--- a/testdata/workloads/functional-query/queries/QueryTest/calcite.test
+++ b/testdata/workloads/functional-query/queries/QueryTest/calcite.test
@@ -132,6 +132,8 @@ select bigint_col, abs(cast(-3 as bigint)), abs(-3000000000) from functional.all
 10,3,3000000000
 ---- TYPES
 bigint,bigint,bigint
+---- RUNTIME_PROFILE
+row_regex: .*PlannerType: CalcitePlanner.*
 ====
 ---- QUERY
 # Tiny test for Calcite. At the point of this commit, very few functions work. This
@@ -150,6 +152,8 @@ select cast(cast('2005-12-13 08:00:00' as string)  AS TIMESTAMP) from functional
 2005-12-13 08:00:00
 ---- TYPES
 timestamp
+---- RUNTIME_PROFILE
+row_regex: .*PlannerType: CalcitePlanner.*
 ====
 ---- QUERY
 select * from calcite_alltypes where bigint_col = 20;
@@ -157,6 +161,8 @@ select * from calcite_alltypes where bigint_col = 20;
 2,true,2,2,2,20,2.200000047683716,20.2,'01/01/09','2',2009-01-01 00:02:00.100000000,2009,1
 ---- TYPES
 int,boolean,tinyint,smallint,int,bigint,float,double,string,string,timestamp,int,int
+---- RUNTIME_PROFILE
+row_regex: .*PlannerType: CalcitePlanner.*
 ====
 ---- QUERY
 select tinyint_col from calcite_alltypes where bigint_col = 20;
@@ -164,6 +170,8 @@ select tinyint_col from calcite_alltypes where bigint_col = 20;
 2
 ---- TYPES
 tinyint
+---- RUNTIME_PROFILE
+row_regex: .*PlannerType: CalcitePlanner.*
 ====
 ---- QUERY
 # Values test
@@ -172,6 +180,8 @@ select abs(cast(-8 as bigint));
 8
 ---- TYPES
 bigint
+---- RUNTIME_PROFILE
+row_regex: .*PlannerType: CalcitePlanner.*
 ====
 ---- QUERY
 select 'hello'
@@ -179,6 +189,8 @@ select 'hello'
 'hello'
 ---- TYPES
 string
+---- RUNTIME_PROFILE
+row_regex: .*PlannerType: CalcitePlanner.*
 ====
 ---- QUERY
 # Union test
@@ -188,6 +200,8 @@ select 3 union select 4;
 4
 ---- TYPES
 tinyint
+---- RUNTIME_PROFILE
+row_regex: .*PlannerType: CalcitePlanner.*
 ====
 ---- QUERY
 select * from (values (1)) union (values (2), (3));
@@ -208,6 +222,8 @@ select id, abs(bigint_col) from functional.alltypestiny where id > 3 order by ab
 7,10
 ---- TYPES
 int, bigint
+---- RUNTIME_PROFILE
+row_regex: .*PlannerType: CalcitePlanner.*
 ====
 ---- QUERY
 # sort test
@@ -220,6 +236,8 @@ select id, abs(bigint_col) from functional.alltypestiny where id >= 3 order by a
 7,10
 ---- TYPES
 int, bigint
+---- RUNTIME_PROFILE
+row_regex: .*PlannerType: CalcitePlanner.*
 ====
 ---- QUERY
 # sort test
@@ -230,6 +248,8 @@ select id, abs(bigint_col) from functional.alltypestiny where id < 3 order by ab
 1,10
 ---- TYPES
 int, bigint
+---- RUNTIME_PROFILE
+row_regex: .*PlannerType: CalcitePlanner.*
 ====
 ---- QUERY
 # sort test
@@ -241,6 +261,8 @@ select id, abs(bigint_col) from functional.alltypestiny where id <= 3 order by a
 3,10
 ---- TYPES
 int, bigint
+---- RUNTIME_PROFILE
+row_regex: .*PlannerType: CalcitePlanner.*
 ====
 ---- QUERY
 # sort test
@@ -255,6 +277,8 @@ select id, abs(bigint_col) from functional.alltypestiny where id != 3 order by a
 7,10
 ---- TYPES
 int, bigint
+---- RUNTIME_PROFILE
+row_regex: .*PlannerType: CalcitePlanner.*
 ====
 ---- QUERY
 # sort test
@@ -269,6 +293,8 @@ select id, abs(bigint_col) from functional.alltypestiny where id != 3 order by a
 6,0
 ---- TYPES
 int, bigint
+---- RUNTIME_PROFILE
+row_regex: .*PlannerType: CalcitePlanner.*
 ====
 ---- QUERY
 # sort test
@@ -281,6 +307,8 @@ select group_str, some_nulls from functional.nullrows where group_str = 'a' orde
 'a','a'
 ---- TYPES
 string, string
+---- RUNTIME_PROFILE
+row_regex: .*PlannerType: CalcitePlanner.*
 ====
 ---- QUERY
 # sort test
@@ -293,6 +321,8 @@ select group_str, some_nulls from functional.nullrows where group_str = 'a' orde
 'a','NULL'
 ---- TYPES
 string, string
+---- RUNTIME_PROFILE
+row_regex: .*PlannerType: CalcitePlanner.*
 ====
 ---- QUERY
 # limit test
@@ -312,6 +342,8 @@ select id, abs(bigint_col) from functional.alltypestiny where id > 2 order by ab
 3,10
 ---- TYPES
 int, bigint
+---- RUNTIME_PROFILE
+row_regex: .*PlannerType: CalcitePlanner.*
 ====
 ---- QUERY
 # aggregation test
@@ -320,6 +352,8 @@ select sum(bigint_col) from functional.alltypestiny;
 40
 ---- TYPES
 bigint
+---- RUNTIME_PROFILE
+row_regex: .*PlannerType: CalcitePlanner.*
 ====
 ---- QUERY
 # aggregation test
@@ -335,6 +369,8 @@ select id, sum(bigint_col) from functional.alltypestiny group by id order by id;
 7,10
 ---- TYPES
 int, bigint
+---- RUNTIME_PROFILE
+row_regex: .*PlannerType: CalcitePlanner.*
 ====
 ---- QUERY
 # aggregation test
@@ -347,6 +383,8 @@ having sum(bigint_col) > cast(5 as bigint)  order by id;
 7,10
 ---- TYPES
 int, bigint
+---- RUNTIME_PROFILE
+row_regex: .*PlannerType: CalcitePlanner.*
 ====
 ---- QUERY
 # aggregation test
@@ -375,6 +413,8 @@ NULL,0,0
 NULL,10,40
 ---- TYPES
 int, bigint, bigint
+---- RUNTIME_PROFILE
+row_regex: .*PlannerType: CalcitePlanner.*
 ====
 ---- QUERY
 # having test
@@ -386,6 +426,8 @@ select id, sum(bigint_col) from functional.alltypestiny group by id having sum(b
 7,10
 ---- TYPES
 int, bigint
+---- RUNTIME_PROFILE
+row_regex: .*PlannerType: CalcitePlanner.*
 ====
 ---- QUERY
 # join test
@@ -404,6 +446,8 @@ on (a.id = b.id) order by a.id;
 7,10,70
 ---- TYPES
 int, bigint, bigint
+---- RUNTIME_PROFILE
+row_regex: .*PlannerType: CalcitePlanner.*
 ====
 ---- QUERY
 # join inequality test
@@ -423,6 +467,8 @@ order by a.id;
 7,0,10,0
 ---- TYPES
 int, int, bigint,  bigint
+---- RUNTIME_PROFILE
+row_regex: .*PlannerType: CalcitePlanner.*
 ====
 ---- QUERY
 # cross join test
@@ -449,6 +495,8 @@ order by a.id, b.id;
 7,1,10,10
 ---- TYPES
 int, int, bigint, bigint
+---- RUNTIME_PROFILE
+row_regex: .*PlannerType: CalcitePlanner.*
 ====
 ---- QUERY
 # left outer join test
@@ -481,6 +529,8 @@ order by a.id
 19,90,NULL
 ---- TYPES
 int, bigint, bigint
+---- RUNTIME_PROFILE
+row_regex: .*PlannerType: CalcitePlanner.*
 ====
 ---- QUERY
 select bigint_col + bigint_col, int_col + int_col, smallint_col + smallint_col,
@@ -497,6 +547,8 @@ from functional.alltypestiny;
 20,2,2,2,2
 ---- TYPES
 bigint, bigint, int, smallint, int
+---- RUNTIME_PROFILE
+row_regex: .*PlannerType: CalcitePlanner.*
 ====
 ---- QUERY
 select float_col + int_col, float_col + 3.0, 3.0 + 3.0
@@ -512,6 +564,8 @@ from functional.alltypestiny;
 2.10000002384,4.10000002,6.0
 ---- TYPES
 double, decimal, decimal
+---- RUNTIME_PROFILE
+row_regex: .*PlannerType: CalcitePlanner.*
 ====
 ---- QUERY
 select bigint_col - bigint_col, int_col - int_col, smallint_col - smallint_col,
@@ -654,6 +708,8 @@ select 3 union select 458;
 458
 ---- TYPES
 smallint
+---- RUNTIME_PROFILE
+row_regex: .*PlannerType: CalcitePlanner.*
 ====
 ---- QUERY
 # case test
@@ -669,6 +725,8 @@ select tinyint_col, case tinyint_col when 1 then 5 else 458 end from functional.
 1,5
 ---- TYPES
 tinyint,smallint
+---- RUNTIME_PROFILE
+row_regex: .*PlannerType: CalcitePlanner.*
 ====
 ---- QUERY
 # case test
@@ -684,6 +742,8 @@ select tinyint_col, case tinyint_col when 1 then 5 when 2 then 7 else 458 end fr
 1,5
 ---- TYPES
 tinyint,smallint
+---- RUNTIME_PROFILE
+row_regex: .*PlannerType: CalcitePlanner.*
 ====
 ---- QUERY
 # case test
@@ -699,6 +759,8 @@ select tinyint_col, case tinyint_col when 0 then 458 else 5 end from functional.
 1,5
 ---- TYPES
 tinyint,smallint
+---- RUNTIME_PROFILE
+row_regex: .*PlannerType: CalcitePlanner.*
 ====
 ---- QUERY
 # case test
@@ -714,6 +776,8 @@ select tinyint_col, case tinyint_col when 0 then 458 end from functional.alltype
 1,NULL
 ---- TYPES
 tinyint,smallint
+---- RUNTIME_PROFILE
+row_regex: .*PlannerType: CalcitePlanner.*
 ====
 ---- QUERY
 # case test other format (the calcite rexnode should be the same)
@@ -729,6 +793,8 @@ select tinyint_col, case when tinyint_col=00 then 458 else 5 end from functional
 1,5
 ---- TYPES
 tinyint,smallint
+---- RUNTIME_PROFILE
+row_regex: .*PlannerType: CalcitePlanner.*
 ====
 ---- QUERY
 # or test
@@ -744,6 +810,8 @@ true
 true
 ---- TYPES
 boolean
+---- RUNTIME_PROFILE
+row_regex: .*PlannerType: CalcitePlanner.*
 ====
 ---- QUERY
 # and test
@@ -759,6 +827,8 @@ true
 true
 ---- TYPES
 boolean
+---- RUNTIME_PROFILE
+row_regex: .*PlannerType: CalcitePlanner.*
 ====
 ---- QUERY
 # sum cast tinyint agg test
@@ -767,6 +837,8 @@ select sum(tinyint_col) from functional.alltypestiny;
 4
 ---- TYPES
 bigint
+---- RUNTIME_PROFILE
+row_regex: .*PlannerType: CalcitePlanner.*
 ====
 ---- QUERY
 # duplicate test from analytics-fn.test, delete when it is activated.
@@ -801,6 +873,8 @@ order by date_part;
 9999-12-31,2,9999-12-01,9999-12-31
 ---- TYPES
 DATE, BIGINT, DATE, DATE
+---- RUNTIME_PROFILE
+row_regex: .*PlannerType: CalcitePlanner.*
 ====
 ---- QUERY
 # Test ROWS windows with start boundaries
@@ -846,3 +920,24 @@ select "1" as "hello";
 '1'
 ---- TYPES
 string
+---- RUNTIME_PROFILE
+row_regex: .*PlannerType: CalcitePlanner.*
+====
+---- QUERY
+explain select * from functional.alltypestiny;
+---- RESULTS: VERIFY_IS_SUBSET
+row_regex:.*01:EXCHANGE.*
+row_regex:.*00:SCAN HDFS.*
+---- RUNTIME_PROFILE
+row_regex: .*PlannerType: CalcitePlanner.*
+====
+---- QUERY
+set explain_level=3;
+explain select * from functional.alltypestiny;
+---- RESULTS: VERIFY_IS_SUBSET
+row_regex:.*01:EXCHANGE.*
+row_regex:.*00:SCAN HDFS.*
+row_regex:.*HDFS partitions=4/4.*
+---- RUNTIME_PROFILE
+row_regex: .*PlannerType: CalcitePlanner.*
+====


(impala) 02/02: IMPALA-13327: Fix wrong unpack dir name for Apache HBase

Posted by st...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 5c9b82854a3397572c4adb3c6cebb2e7d1aaad9a
Author: Yubi Lee <eu...@gmail.com>
AuthorDate: Thu Aug 29 08:28:14 2024 +0900

    IMPALA-13327: Fix wrong unpack dir name for Apache HBase
    
    Due to wrong unpack dir name for Apache HBase,
    it keeps downloading the same package which already exists
    
    Change-Id: I16797cea260c5c6c3c78cf04a5bb6a564ef3504c
    Reviewed-on: http://gerrit.cloudera.org:8080/21732
    Reviewed-by: Impala Public Jenkins <im...@cloudera.com>
    Tested-by: Impala Public Jenkins <im...@cloudera.com>
---
 bin/bootstrap_toolchain.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/bin/bootstrap_toolchain.py b/bin/bootstrap_toolchain.py
index 950156565..593744abd 100755
--- a/bin/bootstrap_toolchain.py
+++ b/bin/bootstrap_toolchain.py
@@ -520,7 +520,7 @@ def get_hadoop_downloads():
     hbase = ApacheComponent("hbase",
                             component_path_tmpl="${name}/${version}/",
                             archive_basename_tmpl="${name}-${version}-hadoop3-bin",
-                            unpack_directory_tmpl="${name}-${version}")
+                            unpack_directory_tmpl="${name}-${version}-hadoop3")
   else:
     hbase = CdpComponent("hbase",
                          archive_basename_tmpl="hbase-${version}-bin",