Repository: incubator-impala
Updated Branches:
  refs/heads/master 54cda7858 -> e0ba5ef6a


IMPALA-5562: Only recomputeMemLayout() if tuple has a layout.

For queries where plan generation is terminated early due to LIMIT 0
or similar, some tuples may not have a mem layout because no PlanNode
has been generated to materialize them. The fix is to make
recomputeMemLayout() a no-op if the tuple does not have an existing
mem layout.

Testing:
- added regression test

Change-Id: I08548c6bfa7dbf4655e55636605bebb89d2a2239
Reviewed-on: http://gerrit.cloudera.org:8080/7264
Reviewed-by: Lars Volker <[email protected]>
Tested-by: Impala Public Jenkins


Project: http://git-wip-us.apache.org/repos/asf/incubator-impala/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-impala/commit/00535ab1
Tree: http://git-wip-us.apache.org/repos/asf/incubator-impala/tree/00535ab1
Diff: http://git-wip-us.apache.org/repos/asf/incubator-impala/diff/00535ab1

Branch: refs/heads/master
Commit: 00535ab1709e8aa5149a2609a5c912455e3678f8
Parents: 54cda78
Author: Alex Behm <[email protected]>
Authored: Thu Jun 22 11:40:06 2017 -0700
Committer: Impala Public Jenkins <[email protected]>
Committed: Fri Jun 23 06:17:14 2017 +0000

----------------------------------------------------------------------
 .../main/java/org/apache/impala/analysis/TupleDescriptor.java | 5 +++--
 .../java/org/apache/impala/planner/SingleNodePlanner.java     | 2 ++
 .../functional-planner/queries/PlannerTest/empty.test         | 7 +++++++
 3 files changed, 12 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-impala/blob/00535ab1/fe/src/main/java/org/apache/impala/analysis/TupleDescriptor.java
----------------------------------------------------------------------
diff --git a/fe/src/main/java/org/apache/impala/analysis/TupleDescriptor.java 
b/fe/src/main/java/org/apache/impala/analysis/TupleDescriptor.java
index de9dc98..bc7da2b 100644
--- a/fe/src/main/java/org/apache/impala/analysis/TupleDescriptor.java
+++ b/fe/src/main/java/org/apache/impala/analysis/TupleDescriptor.java
@@ -233,10 +233,11 @@ public class TupleDescriptor {
 
   /**
    * In some cases changes are made to a tuple after the memory layout has 
been computed.
-   * This function allows us to recompute the memory layout.
+   * This function allows us to recompute the memory layout, if necessary. 
No-op if this
+   * tuple does not have an existing mem layout.
    */
   public void recomputeMemLayout() {
-    Preconditions.checkState(hasMemLayout_);
+    if (!hasMemLayout_) return;
     hasMemLayout_ = false;
     computeMemLayout();
   }

http://git-wip-us.apache.org/repos/asf/incubator-impala/blob/00535ab1/fe/src/main/java/org/apache/impala/planner/SingleNodePlanner.java
----------------------------------------------------------------------
diff --git a/fe/src/main/java/org/apache/impala/planner/SingleNodePlanner.java 
b/fe/src/main/java/org/apache/impala/planner/SingleNodePlanner.java
index 0de35b4..62c045b 100644
--- a/fe/src/main/java/org/apache/impala/planner/SingleNodePlanner.java
+++ b/fe/src/main/java/org/apache/impala/planner/SingleNodePlanner.java
@@ -239,6 +239,8 @@ public class SingleNodePlanner {
       Preconditions.checkState(collExpr instanceof SlotRef);
       SlotRef collSlotRef = (SlotRef) collExpr;
       collSlotRef.getDesc().setIsMaterialized(false);
+      // Re-compute the mem layout if necessary. The tuple may not have a mem 
layout if
+      // no plan has been generated for the TableRef (e.g. due to limit 0 or 
similar).
       collSlotRef.getDesc().getParent().recomputeMemLayout();
     }
   }

http://git-wip-us.apache.org/repos/asf/incubator-impala/blob/00535ab1/testdata/workloads/functional-planner/queries/PlannerTest/empty.test
----------------------------------------------------------------------
diff --git 
a/testdata/workloads/functional-planner/queries/PlannerTest/empty.test 
b/testdata/workloads/functional-planner/queries/PlannerTest/empty.test
index aa4d313..7ea44e0 100644
--- a/testdata/workloads/functional-planner/queries/PlannerTest/empty.test
+++ b/testdata/workloads/functional-planner/queries/PlannerTest/empty.test
@@ -543,3 +543,10 @@ PLAN-ROOT SINK
 |
 00:EMPTYSET
 ====
+# IMPALA-5562: Relative table ref and limit 0.
+select * from tpch_nested_parquet.customer c, c.c_orders limit 0
+---- PLAN
+PLAN-ROOT SINK
+|
+00:EMPTYSET
+====

Reply via email to