You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@drill.apache.org by vi...@apache.org on 2018/08/11 11:51:57 UTC
[drill] 03/03: DRILL-6671: Multi level lateral unnest join is
throwing an exception during materializing the plan.
This is an automated email from the ASF dual-hosted git repository.
vitalii pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/drill.git
commit 93a1c5aba6f17b93a52ab4367f625103a904f1ad
Author: Hanumath Rao Maduri <ha...@gmail.com>
AuthorDate: Fri Aug 3 13:56:44 2018 -0700
DRILL-6671: Multi level lateral unnest join is throwing an exception during materializing the plan.
closes #1426
---
.../drill/exec/planner/fragment/Materializer.java | 19 ++--
.../drill/exec/planner/physical/UnnestPrel.java | 10 ++
.../visitor/LateralUnnestRowIDVisitor.java | 54 ++++++++-
.../impl/lateraljoin/TestE2EUnnestAndLateral.java | 81 ++++++++++----
.../impl/lateraljoin/TestLateralPlans.java | 124 ++++++++++-----------
5 files changed, 189 insertions(+), 99 deletions(-)
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/fragment/Materializer.java b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/fragment/Materializer.java
index 987e65c..2f7fdce 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/fragment/Materializer.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/fragment/Materializer.java
@@ -17,6 +17,8 @@
*/
package org.apache.drill.exec.planner.fragment;
+import java.util.ArrayDeque;
+import java.util.Deque;
import java.util.List;
import org.apache.drill.common.exceptions.ExecutionSetupException;
@@ -116,29 +118,28 @@ public class Materializer extends AbstractPhysicalVisitor<PhysicalOperator, Mate
children.add(op.getLeft().accept(this, iNode));
children.add(op.getRight().accept(this, iNode));
- UnnestPOP unnestInLeftInput = iNode.getUnnest();
+ UnnestPOP unnestForThisLateral = iNode.getUnnest();
PhysicalOperator newOp = op.getNewWithChildren(children);
newOp.setCost(op.getCost());
newOp.setOperatorId(Short.MAX_VALUE & op.getOperatorId());
- ((LateralJoinPOP)newOp).setUnnestForLateralJoin(unnestInLeftInput);
-
+ ((LateralJoinPOP) newOp).setUnnestForLateralJoin(unnestForThisLateral);
return newOp;
}
@Override
public PhysicalOperator visitUnnest(UnnestPOP unnest, IndexedFragmentNode value) throws ExecutionSetupException {
PhysicalOperator newOp = visitOp(unnest, value);
- value.addUnnest((UnnestPOP)newOp);
+ value.addUnnest((UnnestPOP) newOp);
return newOp;
}
public static class IndexedFragmentNode{
- final Wrapper info;
- final int minorFragmentId;
+ private final Wrapper info;
+ private final int minorFragmentId;
- UnnestPOP unnest = null;
+ private final Deque<UnnestPOP> unnest = new ArrayDeque<>();
public IndexedFragmentNode(int minorFragmentId, Wrapper info) {
super();
@@ -163,11 +164,11 @@ public class Materializer extends AbstractPhysicalVisitor<PhysicalOperator, Mate
}
public void addUnnest(UnnestPOP unnest) {
- this.unnest = unnest;
+ this.unnest.addFirst(unnest);
}
public UnnestPOP getUnnest() {
- return this.unnest;
+ return this.unnest.removeFirst();
}
}
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/UnnestPrel.java b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/UnnestPrel.java
index 274f27a..a344915 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/UnnestPrel.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/UnnestPrel.java
@@ -25,6 +25,7 @@ import org.apache.calcite.rel.type.RelDataTypeFactory;
import org.apache.calcite.rel.type.RelDataTypeField;
import org.apache.calcite.rex.RexFieldAccess;
import org.apache.calcite.rex.RexNode;
+import org.apache.calcite.rex.RexShuttle;
import org.apache.calcite.sql.type.SqlTypeName;
import org.apache.drill.common.expression.SchemaPath;
import org.apache.drill.exec.physical.base.PhysicalOperator;
@@ -86,6 +87,15 @@ public class UnnestPrel extends DrillUnnestRelBase implements Prel {
}
@Override
+ public RelNode accept(RexShuttle shuttle) {
+ RexNode ref = shuttle.apply(this.ref);
+ if (this.ref == ref) {
+ return this;
+ }
+ return new UnnestPrel(getCluster(), traitSet, rowType, ref);
+ }
+
+ @Override
public Prel prepareForLateralUnnestPipeline(List<RelNode> children) {
RelDataTypeFactory typeFactory = this.getCluster().getTypeFactory();
List<String> fieldNames = new ArrayList<>();
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/visitor/LateralUnnestRowIDVisitor.java b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/visitor/LateralUnnestRowIDVisitor.java
index dc4af5b..7734d90 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/visitor/LateralUnnestRowIDVisitor.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/visitor/LateralUnnestRowIDVisitor.java
@@ -19,11 +19,18 @@ package org.apache.drill.exec.planner.physical.visitor;
import com.google.common.collect.Lists;
import org.apache.calcite.rel.RelNode;
+import org.apache.calcite.rel.core.CorrelationId;
+import org.apache.calcite.rel.rules.ProjectCorrelateTransposeRule;
+import org.apache.calcite.rex.RexCorrelVariable;
+import org.apache.calcite.rex.RexShuttle;
+import org.apache.calcite.util.ImmutableBitSet;
import org.apache.drill.exec.planner.physical.LateralJoinPrel;
import org.apache.drill.exec.planner.physical.Prel;
import org.apache.drill.exec.planner.physical.UnnestPrel;
+import java.util.HashMap;
import java.util.List;
+import java.util.Map;
/**
* LateralUnnestRowIDVisitor traverses the physical plan and modifies all the operators in the
@@ -59,16 +66,55 @@ public class LateralUnnestRowIDVisitor extends BasePrelVisitor<Prel, Boolean, Ru
}
@Override
- public Prel visitLateral(LateralJoinPrel prel, Boolean value) throws RuntimeException {
+ public Prel visitLateral(LateralJoinPrel prel, Boolean isRightOfLateral) throws RuntimeException {
List<RelNode> children = Lists.newArrayList();
- children.add(((Prel)prel.getInput(0)).accept(this, value));
+ children.add(((Prel) prel.getInput(0)).accept(this, isRightOfLateral));
children.add(((Prel) prel.getInput(1)).accept(this, true));
- return (Prel) prel.copy(prel.getTraitSet(), children);
+ if (!isRightOfLateral) {
+ return (Prel) prel.copy(prel.getTraitSet(), children);
+ } else {
+ //Adjust the column numbering due to an additional column "$drill_implicit_field$" is added to the inputs.
+ Map<Integer, Integer> requiredColsMap = new HashMap<>();
+ for (Integer corrColIndex : prel.getRequiredColumns()) {
+ requiredColsMap.put(corrColIndex, corrColIndex + 1);
+ }
+ ImmutableBitSet requiredColumns = prel.getRequiredColumns().shift(1);
+
+ CorrelationId corrId = prel.getCluster().createCorrel();
+ RexCorrelVariable updatedCorrel =
+ (RexCorrelVariable) prel.getCluster().getRexBuilder().makeCorrel(
+ children.get(0).getRowType(),
+ corrId);
+ RelNode rightChild = children.get(1).accept(
+ new CorrelateVarReplacer(
+ new ProjectCorrelateTransposeRule.RexFieldAccessReplacer(prel.getCorrelationId(),
+ updatedCorrel, prel.getCluster().getRexBuilder(), requiredColsMap)));
+ return (Prel) prel.copy(prel.getTraitSet(), children.get(0), rightChild,
+ corrId, requiredColumns, prel.getJoinType());
+ }
}
@Override
- public Prel visitUnnest(UnnestPrel prel, Boolean value) throws RuntimeException {
+ public Prel visitUnnest(UnnestPrel prel, Boolean isRightOfLateral) throws RuntimeException {
return prel.prepareForLateralUnnestPipeline(null);
}
+
+ /**
+ * Visitor for RelNodes which applies specified {@link RexShuttle} visitor
+ * for every node in the tree.
+ */
+ public static class CorrelateVarReplacer extends ProjectCorrelateTransposeRule.RelNodesExprsHandler {
+ protected final RexShuttle rexVisitor;
+
+ public CorrelateVarReplacer(RexShuttle rexVisitor) {
+ super(rexVisitor);
+ this.rexVisitor = rexVisitor;
+ }
+
+ @Override
+ public RelNode visit(RelNode other) {
+ return super.visit(other.accept(rexVisitor));
+ }
+ }
}
diff --git a/exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/lateraljoin/TestE2EUnnestAndLateral.java b/exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/lateraljoin/TestE2EUnnestAndLateral.java
index 0d752a2..0283ade 100644
--- a/exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/lateraljoin/TestE2EUnnestAndLateral.java
+++ b/exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/lateraljoin/TestE2EUnnestAndLateral.java
@@ -58,40 +58,40 @@ public class TestE2EUnnestAndLateral extends ClusterTest {
@Test
public void testLateral_WithLimitInSubQuery() throws Exception {
- String Sql = "SELECT customer.c_name, customer.c_address, orders.o_id, orders.o_amount " +
+ String sql = "SELECT customer.c_name, customer.c_address, orders.o_id, orders.o_amount " +
"FROM cp.`lateraljoin/nested-customer.parquet` customer, LATERAL " +
"(SELECT t.ord.o_id as o_id, t.ord.o_amount as o_amount FROM UNNEST(customer.orders) t(ord) LIMIT 1) orders";
- runAndLog(Sql);
+ runAndLog(sql);
}
@Test
public void testLateral_WithFilterInSubQuery() throws Exception {
- String Sql = "SELECT customer.c_name, customer.c_address, orders.o_id, orders.o_amount " +
+ String sql = "SELECT customer.c_name, customer.c_address, orders.o_id, orders.o_amount " +
"FROM cp.`lateraljoin/nested-customer.parquet` customer, LATERAL " +
"(SELECT t.ord.o_id as o_id, t.ord.o_amount as o_amount FROM UNNEST(customer.orders) t(ord) WHERE t.ord.o_amount > 10) orders";
- runAndLog(Sql);
+ runAndLog(sql);
}
@Test
public void testLateral_WithFilterAndLimitInSubQuery() throws Exception {
- String Sql = "SELECT customer.c_name, customer.c_address, orders.o_id, orders.o_amount " +
+ String sql = "SELECT customer.c_name, customer.c_address, orders.o_id, orders.o_amount " +
"FROM cp.`lateraljoin/nested-customer.parquet` customer, LATERAL " +
"(SELECT t.ord.o_id as o_id, t.ord.o_amount as o_amount FROM UNNEST(customer.orders) t(ord) WHERE t.ord.o_amount > 10 LIMIT 1) orders";
- runAndLog(Sql);
+ runAndLog(sql);
}
@Test
public void testLateral_WithTopNInSubQuery() throws Exception {
runAndLog("alter session set `planner.enable_topn`=false");
- String Sql = "SELECT customer.c_name, orders.o_id, orders.o_amount " +
+ String sql = "SELECT customer.c_name, orders.o_id, orders.o_amount " +
"FROM cp.`lateraljoin/nested-customer.parquet` customer, LATERAL " +
"(SELECT t.ord.o_id as o_id, t.ord.o_amount as o_amount FROM UNNEST(customer.orders) t(ord) ORDER BY " +
"o_amount DESC LIMIT 1) orders";
try {
testBuilder()
- .sqlQuery(Sql)
+ .sqlQuery(sql)
.unOrdered()
.baselineColumns("c_name", "o_id", "o_amount")
.baselineValues("customer1", 3.0, 294.5)
@@ -113,14 +113,14 @@ public class TestE2EUnnestAndLateral extends ClusterTest {
runAndLog("alter session set `planner.enable_topn`=false");
- String Sql = "SELECT customer.c_name, orders.o_id, orders.o_amount " +
+ String sql = "SELECT customer.c_name, orders.o_id, orders.o_amount " +
"FROM cp.`lateraljoin/nested-customer.parquet` customer, LATERAL " +
"(SELECT t.ord.o_id as o_id, t.ord.o_amount as o_amount FROM UNNEST(customer.orders) t(ord) ORDER BY " +
"o_amount DESC LIMIT 1) orders";
try {
testBuilder()
- .sqlQuery(Sql)
+ .sqlQuery(sql)
.unOrdered()
.baselineColumns("c_name", "o_id", "o_amount")
.baselineValues("customer1", 3.0, 294.5)
@@ -135,13 +135,13 @@ public class TestE2EUnnestAndLateral extends ClusterTest {
@Test
public void testLateral_WithSortInSubQuery() throws Exception {
- String Sql = "SELECT customer.c_name, orders.o_id, orders.o_amount " +
+ String sql = "SELECT customer.c_name, orders.o_id, orders.o_amount " +
"FROM cp.`lateraljoin/nested-customer.parquet` customer, LATERAL " +
"(SELECT t.ord.o_id as o_id, t.ord.o_amount as o_amount FROM UNNEST(customer.orders) t(ord) ORDER BY " +
"o_amount DESC) orders WHERE customer.c_id = 1.0";
testBuilder()
- .sqlQuery(Sql)
+ .sqlQuery(sql)
.ordered()
.baselineColumns("c_name", "o_id", "o_amount")
.baselineValues("customer1", 3.0, 294.5)
@@ -152,28 +152,61 @@ public class TestE2EUnnestAndLateral extends ClusterTest {
@Test
public void testOuterApply_WithFilterAndLimitInSubQuery() throws Exception {
- String Sql = "SELECT customer.c_name, customer.c_address, orders.o_id, orders.o_amount " +
+ String sql = "SELECT customer.c_name, customer.c_address, orders.o_id, orders.o_amount " +
"FROM cp.`lateraljoin/nested-customer.parquet` customer OUTER APPLY " +
"(SELECT t.ord.o_id as o_id , t.ord.o_amount as o_amount FROM UNNEST(customer.orders) t(ord) WHERE t.ord.o_amount > 10 LIMIT 1) orders";
- runAndLog(Sql);
+ runAndLog(sql);
}
@Test
public void testLeftLateral_WithFilterAndLimitInSubQuery() throws Exception {
- String Sql = "SELECT customer.c_name, customer.c_address, orders.o_id, orders.o_amount " +
+ String sql = "SELECT customer.c_name, customer.c_address, orders.o_id, orders.o_amount " +
"FROM cp.`lateraljoin/nested-customer.parquet` customer LEFT JOIN LATERAL " +
"(SELECT t.ord.o_id as o_id, t.ord.o_amount as o_amount FROM UNNEST(customer.orders) t(ord) WHERE t.ord.o_amount > 10 LIMIT 1) orders ON TRUE";
- runAndLog(Sql);
+ runAndLog(sql);
}
@Test
public void testMultiUnnestAtSameLevel() throws Exception {
- String Sql = "EXPLAIN PLAN FOR SELECT customer.c_name, customer.c_address, U1.order_id, U1.order_amt," +
- " U1.itemName, U1.itemNum" + " FROM cp.`lateraljoin/nested-customer.parquet` customer, LATERAL" +
- " (SELECT t.ord.o_id AS order_id, t.ord.o_amount AS order_amt, U2.item_name AS itemName, U2.item_num AS " +
- "itemNum FROM UNNEST(customer.orders) t(ord) , LATERAL" +
- " (SELECT t1.ord.i_name AS item_name, t1.ord.i_number AS item_num FROM UNNEST(t.ord) AS t1(ord)) AS U2) AS U1";
- runAndLog(Sql);
+ String sql = "EXPLAIN PLAN FOR SELECT customer.c_name, customer.c_address, U1.order_id, U1.order_amt," +
+ " U1.itemName, U1.itemNum" + " FROM cp.`lateraljoin/nested-customer.parquet` customer, LATERAL" +
+ " (SELECT t.ord.o_id AS order_id, t.ord.o_amount AS order_amt, U2.item_name AS itemName, U2.item_num AS " +
+ "itemNum FROM UNNEST(customer.orders) t(ord) , LATERAL" +
+ " (SELECT t1.ord.i_name AS item_name, t1.ord.i_number AS item_num FROM UNNEST(t.ord) AS t1(ord)) AS U2) AS U1";
+ runAndLog(sql);
+ }
+
+ @Test
+ public void testMultiUnnestAtSameLevelExec() throws Exception {
+ String sql = "SELECT customer.c_name, customer.c_address, U1.order_id, U1.order_amt," +
+ " U1.itemName, U1.itemNum FROM cp.`lateraljoin/nested-customer.parquet` customer, LATERAL" +
+ " (SELECT dt.order_id, dt.order_amt, U2.item_name AS itemName, U2.item_num AS itemNum from" +
+ "(select t.ord.items as items, t.ord.o_id AS order_id, t.ord.o_amount AS order_amt FROM UNNEST(customer.orders) t(ord)) dt , LATERAL" +
+ " (SELECT t1.items.i_name AS item_name, t1.items.i_number AS item_num FROM UNNEST(dt.items) AS t1(items)) AS U2) AS U1";
+ String baseline = "SELECT customer.c_name, customer.c_address, U1.order_id, U1.order_amount as order_amt, U2.item_name as itemName, U2.item_num as itemNum" +
+ " FROM cp.`lateraljoin/nested-customer.parquet` customer, LATERAL " +
+ "(SELECT t.ord.items as items, t.ord.o_id as order_id, t.ord.o_amount as order_amount from UNNEST(customer.orders) t(ord)) U1, LATERAL" +
+ "(SELECT t1.items.i_name as item_name, t1.items.i_number as item_num from UNNEST(U1.items) t1(items)) U2";
+ testBuilder()
+ .unOrdered()
+ .sqlQuery(sql)
+ .sqlBaselineQuery(baseline)
+ .go();
+ }
+
+ @Test
+ public void testMultiUnnestAtSameLevelExecExplicitResult() throws Exception {
+ String sql = "SELECT customer.c_name, customer.c_address, U1.order_id, U1.order_amt," +
+ " U1.itemName, U1.itemNum FROM cp.`lateraljoin/nested-customer.parquet` customer, LATERAL" +
+ " (SELECT dt.order_id, dt.order_amt, U2.item_name AS itemName, U2.item_num AS itemNum from" +
+ "(select t.ord.items as items, t.ord.o_id AS order_id, t.ord.o_amount AS order_amt FROM UNNEST(customer.orders) t(ord)) dt , LATERAL" +
+ " (SELECT t1.items.i_name AS item_name, t1.items.i_number AS item_num FROM UNNEST(dt.items) AS t1(items)) AS U2) AS U1 order by 1,2,3,4,5,6 limit 1";
+ testBuilder()
+ .unOrdered()
+ .sqlQuery(sql)
+ .baselineColumns("c_name", "c_address", "order_id", "order_amt", "itemName", "itemNum")
+ .baselineValues("customer1","bay area, CA",1.0,4.5,"cheese",9.0)
+ .go();
}
@Test
@@ -265,9 +298,9 @@ public class TestE2EUnnestAndLateral extends ClusterTest {
@Test
public void testNestedUnnest() throws Exception {
- String Sql = "select * from (select customer.orders as orders from cp.`lateraljoin/nested-customer.parquet` customer ) t1," +
+ String sql = "select * from (select customer.orders as orders from cp.`lateraljoin/nested-customer.parquet` customer ) t1," +
" lateral ( select t.ord.items as items from unnest(t1.orders) t(ord) ) t2, unnest(t2.items) t3(item) ";
- runAndLog(Sql);
+ runAndLog(sql);
}
/***********************************************************************************************
diff --git a/exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/lateraljoin/TestLateralPlans.java b/exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/lateraljoin/TestLateralPlans.java
index 9cb5b6d..ef52f8e 100644
--- a/exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/lateraljoin/TestLateralPlans.java
+++ b/exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/lateraljoin/TestLateralPlans.java
@@ -51,15 +51,15 @@ public class TestLateralPlans extends BaseTestQuery {
@Test
public void testLateralSql() throws Exception {
- String Sql = "select t.c_name, t2.ord.o_shop as o_shop from cp.`lateraljoin/nested-customer.json` t," +
+ String sql = "select t.c_name, t2.ord.o_shop as o_shop from cp.`lateraljoin/nested-customer.json` t," +
" unnest(t.orders) t2(ord) limit 1";
- PlanTestBase.testPlanMatchingPatterns(Sql, new String[]{"column excluded from output: =\\[\\`orders\\`\\]"},
+ PlanTestBase.testPlanMatchingPatterns(sql, new String[]{"column excluded from output: =\\[\\`orders\\`\\]"},
new String[]{});
testBuilder()
.unOrdered()
- .sqlQuery(Sql)
+ .sqlQuery(sql)
.baselineColumns("c_name", "o_shop")
.baselineValues("customer1", "Meno Park 1st")
.go();
@@ -70,10 +70,10 @@ public class TestLateralPlans extends BaseTestQuery {
String explainSql = "explain plan without implementation for select t.c_name, t2.ord.o_shop as o_shop from cp.`lateraljoin/nested-customer.json` t," +
" unnest(t.orders) t2(ord) limit 1";
- String Sql = "select t.c_name, t2.ord.o_shop as o_shop from cp.`lateraljoin/nested-customer.json` t," +
+ String sql = "select t.c_name, t2.ord.o_shop as o_shop from cp.`lateraljoin/nested-customer.json` t," +
" unnest(t.orders) t2(ord) limit 1";
- PlanTestBase.testPlanMatchingPatterns(Sql, new String[]{"column excluded from output: =\\[\\`orders\\`\\]"},
+ PlanTestBase.testPlanMatchingPatterns(sql, new String[]{"column excluded from output: =\\[\\`orders\\`\\]"},
new String[]{});
test(explainSql);
@@ -82,18 +82,18 @@ public class TestLateralPlans extends BaseTestQuery {
@Test
public void testFilterPushCorrelate() throws Exception {
test("alter session set `planner.slice_target`=1");
- String query = "select t.c_name, t2.ord.o_shop as o_shop from cp.`lateraljoin/nested-customer.json` t,"
+ String sql = "select t.c_name, t2.ord.o_shop as o_shop from cp.`lateraljoin/nested-customer.json` t,"
+ " unnest(t.orders) t2(ord) where t.c_name='customer1' AND t2.ord.o_shop='Meno Park 1st' ";
- PlanTestBase.testPlanMatchingPatterns(query, new String[]{"LateralJoin(.*[\n\r])+.*Filter(.*[\n\r])+.*Scan(.*[\n\r])+.*Filter"},
+ PlanTestBase.testPlanMatchingPatterns(sql, new String[]{"LateralJoin(.*[\n\r])+.*Filter(.*[\n\r])+.*Scan(.*[\n\r])+.*Filter"},
new String[]{});
- PlanTestBase.testPlanMatchingPatterns(query, new String[]{"column excluded from output: =\\[\\`orders\\`\\]"},
+ PlanTestBase.testPlanMatchingPatterns(sql, new String[]{"column excluded from output: =\\[\\`orders\\`\\]"},
new String[]{});
testBuilder()
.unOrdered()
- .sqlQuery(query)
+ .sqlQuery(sql)
.baselineColumns("c_name", "o_shop")
.baselineValues("customer1", "Meno Park 1st")
.go();
@@ -101,15 +101,15 @@ public class TestLateralPlans extends BaseTestQuery {
@Test
public void testLateralSqlPlainCol() throws Exception {
- String Sql = "select t.c_name, t2.phone as c_phone from cp.`lateraljoin/nested-customer.json` t,"
+ String sql = "select t.c_name, t2.phone as c_phone from cp.`lateraljoin/nested-customer.json` t,"
+ " unnest(t.c_phone) t2(phone) limit 1";
- PlanTestBase.testPlanMatchingPatterns(Sql, new String[]{"column excluded from output: =\\[\\`c_phone\\`\\]"},
+ PlanTestBase.testPlanMatchingPatterns(sql, new String[]{"column excluded from output: =\\[\\`c_phone\\`\\]"},
new String[]{});
testBuilder()
.unOrdered()
- .sqlQuery(Sql)
+ .sqlQuery(sql)
.baselineColumns("c_name", "c_phone")
.baselineValues("customer1", "6505200001")
.go();
@@ -117,14 +117,14 @@ public class TestLateralPlans extends BaseTestQuery {
@Test
public void testLateralSqlStar() throws Exception {
- String Sql = "select * from cp.`lateraljoin/nested-customer.json` t, unnest(t.orders) Orders(ord) limit 0";
+ String sql = "select * from cp.`lateraljoin/nested-customer.json` t, unnest(t.orders) Orders(ord) limit 0";
- PlanTestBase.testPlanMatchingPatterns(Sql, new String[]{},
+ PlanTestBase.testPlanMatchingPatterns(sql, new String[]{},
new String[]{"column excluded from output: =\\[\\`orders\\`\\]"});
testBuilder()
.unOrdered()
- .sqlQuery(Sql)
+ .sqlQuery(sql)
.baselineColumns("c_name", "c_id", "c_phone", "orders", "c_address", "ord")
.expectsEmptyResultSet()
.go();
@@ -147,14 +147,14 @@ public class TestLateralPlans extends BaseTestQuery {
@Test
public void testLateralSqlStar3() throws Exception {
- String Sql = "select Orders.*, c.* from cp.`lateraljoin/nested-customer.json` c, unnest(c.orders) Orders(ord) limit 0";
+ String sql = "select Orders.*, c.* from cp.`lateraljoin/nested-customer.json` c, unnest(c.orders) Orders(ord) limit 0";
- PlanTestBase.testPlanMatchingPatterns(Sql, new String[]{},
+ PlanTestBase.testPlanMatchingPatterns(sql, new String[]{},
new String[]{"column excluded from output: =\\[\\`orders\\`\\]"});
testBuilder()
.unOrdered()
- .sqlQuery(Sql)
+ .sqlQuery(sql)
.baselineColumns("ord","c_name", "c_id", "c_phone", "orders", "c_address")
.expectsEmptyResultSet()
.go();
@@ -162,13 +162,13 @@ public class TestLateralPlans extends BaseTestQuery {
@Test
public void testLateralSqlStar4() throws Exception {
- String Sql = "select Orders.* from cp.`lateraljoin/nested-customer.json` c, unnest(c.orders) Orders(ord) limit 0";
+ String sql = "select Orders.* from cp.`lateraljoin/nested-customer.json` c, unnest(c.orders) Orders(ord) limit 0";
- PlanTestBase.testPlanMatchingPatterns(Sql, new String[]{"column excluded from output: =\\[\\`orders\\`\\]"}, new String[]{});
+ PlanTestBase.testPlanMatchingPatterns(sql, new String[]{"column excluded from output: =\\[\\`orders\\`\\]"}, new String[]{});
testBuilder()
.unOrdered()
- .sqlQuery(Sql)
+ .sqlQuery(sql)
.baselineColumns("ord")
.expectsEmptyResultSet()
.go();
@@ -176,17 +176,17 @@ public class TestLateralPlans extends BaseTestQuery {
@Test
public void testLateralSqlWithAS() throws Exception {
- String Sql = "select t.c_name, t2.orders from cp.`lateraljoin/nested-customer.parquet` t,"
+ String sql = "select t.c_name, t2.orders from cp.`lateraljoin/nested-customer.parquet` t,"
+ " unnest(t.orders) as t2(orders)";
String baselineQuery = "select t.c_name, t2.orders from cp.`lateraljoin/nested-customer.parquet` t inner join" +
" (select c_name, flatten(orders) from cp" +
".`lateraljoin/nested-customer.parquet` ) as t2(name, orders) on t.c_name = t2.name";
- PlanTestBase.testPlanMatchingPatterns(Sql, new String[]{"column excluded from output: =\\[\\`orders\\`\\]"}, new String[]{});
+ PlanTestBase.testPlanMatchingPatterns(sql, new String[]{"column excluded from output: =\\[\\`orders\\`\\]"}, new String[]{});
testBuilder()
.unOrdered()
- .sqlQuery(Sql)
+ .sqlQuery(sql)
.sqlBaselineQuery(baselineQuery)
.go();
@@ -194,25 +194,25 @@ public class TestLateralPlans extends BaseTestQuery {
@Test
public void testMultiUnnestLateralAtSameLevel() throws Exception {
- String Sql = "select t.c_name, t2.orders, t3.orders from cp.`lateraljoin/nested-customer.parquet` t," +
+ String sql = "select t.c_name, t2.orders, t3.orders from cp.`lateraljoin/nested-customer.parquet` t," +
" LATERAL ( select t2.orders from unnest(t.orders) as t2(orders)) as t2, LATERAL " +
"(select t3.orders from unnest(t.orders) as t3(orders)) as t3";
String baselineQuery = "select t.c_name, t2.orders, t3.orders from cp.`lateraljoin/nested-customer.parquet` t inner join" +
" (select c_name, flatten(orders) from cp.`lateraljoin/nested-customer.parquet` ) as t2 (name, orders) on t.c_name = t2.name " +
" inner join (select c_name, flatten(orders) from cp.`lateraljoin/nested-customer.parquet` ) as t3(name, orders) on t.c_name = t3.name";
- PlanTestBase.testPlanMatchingPatterns(Sql, new String[]{"column excluded from output: =\\[\\`orders\\`\\]"}, new String[]{});
+ PlanTestBase.testPlanMatchingPatterns(sql, new String[]{"column excluded from output: =\\[\\`orders\\`\\]"}, new String[]{});
testBuilder()
.unOrdered()
- .sqlQuery(Sql)
+ .sqlQuery(sql)
.sqlBaselineQuery(baselineQuery)
.go();
}
@Test
public void testSubQuerySql() throws Exception {
- String Sql = "select t.c_name, d1.items as items0 , t3.items as items1 from cp.`lateraljoin/nested-customer.parquet` t," +
+ String sql = "select t.c_name, d1.items as items0 , t3.items as items1 from cp.`lateraljoin/nested-customer.parquet` t," +
" lateral (select t2.ord.items as items from unnest(t.orders) t2(ord)) d1," +
" unnest(d1.items) t3(items)";
@@ -220,18 +220,18 @@ public class TestLateralPlans extends BaseTestQuery {
" inner join (select c_name, f, flatten(t1.f.items) from (select c_name, flatten(orders) as f from cp.`lateraljoin/nested-customer.parquet`) as t1 ) " +
"t3(name, orders, items) on t.c_name = t3.name ";
- PlanTestBase.testPlanMatchingPatterns(Sql, new String[]{"column excluded from output: =\\[\\`orders\\`\\]"}, new String[]{"column excluded from output: =\\[\\`items\\`\\]"});
+ PlanTestBase.testPlanMatchingPatterns(sql, new String[]{"column excluded from output: =\\[\\`orders\\`\\]"}, new String[]{"column excluded from output: =\\[\\`items\\`\\]"});
testBuilder()
.unOrdered()
- .sqlQuery(Sql)
+ .sqlQuery(sql)
.sqlBaselineQuery(baselineQuery)
.go();
}
@Test
public void testUnnestWithFilter() throws Exception {
- String Sql = "select t.c_name, d1.items as items0, t3.items as items1 from cp.`lateraljoin/nested-customer.parquet` t," +
+ String sql = "select t.c_name, d1.items as items0, t3.items as items1 from cp.`lateraljoin/nested-customer.parquet` t," +
" lateral (select t2.ord.items as items from unnest(t.orders) t2(ord)) d1," +
" unnest(d1.items) t3(items) where t.c_id > 1";
@@ -239,18 +239,18 @@ public class TestLateralPlans extends BaseTestQuery {
" inner join (select c_name, f, flatten(t1.f.items) from (select c_name, flatten(orders) as f from cp.`lateraljoin/nested-customer.parquet`) as t1 ) " +
"t3(name, orders, items) on t.c_name = t3.name where t.c_id > 1";
- PlanTestBase.testPlanMatchingPatterns(Sql, new String[]{"column excluded from output: =\\[\\`orders\\`\\]"}, new String[]{"column excluded from output: =\\[\\`items\\`\\]"});
+ PlanTestBase.testPlanMatchingPatterns(sql, new String[]{"column excluded from output: =\\[\\`orders\\`\\]"}, new String[]{"column excluded from output: =\\[\\`items\\`\\]"});
testBuilder()
.unOrdered()
- .sqlQuery(Sql)
+ .sqlQuery(sql)
.sqlBaselineQuery(baselineQuery)
.go();
}
@Test
public void testUnnestWithAggInSubquery() throws Exception {
- String Sql = "select t.c_name, sum(t4.items) from cp.`lateraljoin/nested-customer.parquet` t," +
+ String sql = "select t.c_name, sum(t4.items) from cp.`lateraljoin/nested-customer.parquet` t," +
" lateral (select t2.ord.items as items from unnest(t.orders) t2(ord)) d1," +
" lateral (select sum(t3.items.i_number) from unnest(d1.items) t3(items)) t4(items) where t.c_id > 1 group by t.c_name";
@@ -267,14 +267,14 @@ public class TestLateralPlans extends BaseTestQuery {
.testBuilder()
.ordered()
.sqlBaselineQuery(baselineQuery)
- .sqlQuery(Sql)
+ .sqlQuery(sql)
.go();
}
}
@Test
public void testUnnestWithAggOnOuterTable() throws Exception {
- String Sql = "select avg(d2.inum) from cp.`lateraljoin/nested-customer.parquet` t," +
+ String sql = "select avg(d2.inum) from cp.`lateraljoin/nested-customer.parquet` t," +
" lateral (select t2.ord.items as items from unnest(t.orders) t2(ord)) d1," +
" lateral (select t3.items.i_number as inum from unnest(d1.items) t3(items)) d2 where t.c_id > 1 group by t.c_id";
@@ -282,11 +282,11 @@ public class TestLateralPlans extends BaseTestQuery {
" inner join (select c_name, f, flatten(t1.f.items) from (select c_name, flatten(orders) as f from cp.`lateraljoin/nested-customer.parquet`) as t1 ) " +
"t3(name, orders, items) on t.c_name = t3.name where t.c_id > 1 group by t.c_id";
- PlanTestBase.testPlanMatchingPatterns(Sql, new String[]{"column excluded from output: =\\[\\`orders\\`\\]", "column excluded from output: =\\[\\`items\\`\\]"}, new String[]{});
+ PlanTestBase.testPlanMatchingPatterns(sql, new String[]{"column excluded from output: =\\[\\`orders\\`\\]", "column excluded from output: =\\[\\`items\\`\\]"}, new String[]{});
testBuilder()
.unOrdered()
- .sqlQuery(Sql)
+ .sqlQuery(sql)
.sqlBaselineQuery(baselineQuery)
.go();
@@ -294,7 +294,7 @@ public class TestLateralPlans extends BaseTestQuery {
@Test
public void testUnnestTableAndColumnAlias() throws Exception {
- String Sql = "select t.c_name from cp.`lateraljoin/nested-customer.json` t, unnest(t.orders) ";
+ String sql = "select t.c_name from cp.`lateraljoin/nested-customer.json` t, unnest(t.orders) ";
ClusterFixtureBuilder builder = ClusterFixture.builder(dirTestWatcher)
.setOptionDefault(ExecConstants.ENABLE_UNNEST_LATERAL_KEY, true);
@@ -302,7 +302,7 @@ public class TestLateralPlans extends BaseTestQuery {
ClientFixture client = cluster.clientFixture()) {
client
.queryBuilder()
- .sql(Sql)
+ .sql(sql)
.run();
} catch (UserRemoteException ex) {
assertTrue(ex.getMessage().contains("Alias table and column name are required for UNNEST"));
@@ -311,7 +311,7 @@ public class TestLateralPlans extends BaseTestQuery {
@Test
public void testUnnestColumnAlias() throws Exception {
- String Sql = "select t.c_name, t2.orders from cp.`lateraljoin/nested-customer.json` t, unnest(t.orders) t2";
+ String sql = "select t.c_name, t2.orders from cp.`lateraljoin/nested-customer.json` t, unnest(t.orders) t2";
ClusterFixtureBuilder builder = ClusterFixture.builder(dirTestWatcher)
.setOptionDefault(ExecConstants.ENABLE_UNNEST_LATERAL_KEY, true);
@@ -319,7 +319,7 @@ public class TestLateralPlans extends BaseTestQuery {
ClientFixture client = cluster.clientFixture()) {
client
.queryBuilder()
- .sql(Sql)
+ .sql(sql)
.run();
} catch (UserRemoteException ex) {
assertTrue(ex.getMessage().contains("Alias table and column name are required for UNNEST"));
@@ -333,7 +333,7 @@ public class TestLateralPlans extends BaseTestQuery {
@Test
public void testNoExchangeWithAggWithoutGrpBy() throws Exception {
- String Sql = "select d1.totalprice from dfs.`lateraljoin/multipleFiles` t," +
+ String sql = "select d1.totalprice from dfs.`lateraljoin/multipleFiles` t," +
" lateral ( select sum(t2.ord.o_totalprice) as totalprice from unnest(t.c_orders) t2(ord)) d1";
ClusterFixtureBuilder builder = ClusterFixture.builder(dirTestWatcher)
.setOptionDefault(ExecConstants.ENABLE_UNNEST_LATERAL_KEY, true)
@@ -341,7 +341,7 @@ public class TestLateralPlans extends BaseTestQuery {
try (ClusterFixture cluster = builder.build();
ClientFixture client = cluster.clientFixture()) {
- String explain = client.queryBuilder().sql(Sql).explainText();
+ String explain = client.queryBuilder().sql(sql).explainText();
String rightChild = getRightChildOfLateral(explain);
assertFalse(rightChild.contains("Exchange"));
}
@@ -349,7 +349,7 @@ public class TestLateralPlans extends BaseTestQuery {
@Test
public void testNoExchangeWithStreamAggWithGrpBy() throws Exception {
- String Sql = "select d1.totalprice from dfs.`lateraljoin/multipleFiles` t," +
+ String sql = "select d1.totalprice from dfs.`lateraljoin/multipleFiles` t," +
" lateral ( select sum(t2.ord.o_totalprice) as totalprice from unnest(t.c_orders) t2(ord) group by t2.ord.o_orderkey) d1";
ClusterFixtureBuilder builder = ClusterFixture.builder(dirTestWatcher)
@@ -360,7 +360,7 @@ public class TestLateralPlans extends BaseTestQuery {
try (ClusterFixture cluster = builder.build();
ClientFixture client = cluster.clientFixture()) {
- String explain = client.queryBuilder().sql(Sql).explainText();
+ String explain = client.queryBuilder().sql(sql).explainText();
String rightChild = getRightChildOfLateral(explain);
assertFalse(rightChild.contains("Exchange"));
}
@@ -368,7 +368,7 @@ public class TestLateralPlans extends BaseTestQuery {
@Test
public void testNoExchangeWithHashAggWithGrpBy() throws Exception {
- String Sql = "select d1.totalprice from dfs.`lateraljoin/multipleFiles` t," +
+ String sql = "select d1.totalprice from dfs.`lateraljoin/multipleFiles` t," +
" lateral ( select sum(t2.ord.o_totalprice) as totalprice from unnest(t.c_orders) t2(ord) group by t2.ord.o_orderkey) d1";
ClusterFixtureBuilder builder = ClusterFixture.builder(dirTestWatcher)
.setOptionDefault(ExecConstants.ENABLE_UNNEST_LATERAL_KEY, true)
@@ -378,7 +378,7 @@ public class TestLateralPlans extends BaseTestQuery {
try (ClusterFixture cluster = builder.build();
ClientFixture client = cluster.clientFixture()) {
- String explain = client.queryBuilder().sql(Sql).explainText();
+ String explain = client.queryBuilder().sql(sql).explainText();
String rightChild = getRightChildOfLateral(explain);
assertFalse(rightChild.contains("Exchange"));
}
@@ -402,7 +402,7 @@ public class TestLateralPlans extends BaseTestQuery {
@Test
public void testNoExchangeWithOrderByLimit() throws Exception {
- String Sql = "select d1.totalprice from dfs.`lateraljoin/multipleFiles` t," +
+ String sql = "select d1.totalprice from dfs.`lateraljoin/multipleFiles` t," +
" lateral ( select t2.ord.o_totalprice as totalprice from unnest(t.c_orders) t2(ord) order by t2.ord.o_orderkey limit 10) d1";
ClusterFixtureBuilder builder = ClusterFixture.builder(dirTestWatcher)
.setOptionDefault(ExecConstants.ENABLE_UNNEST_LATERAL_KEY, true)
@@ -410,7 +410,7 @@ public class TestLateralPlans extends BaseTestQuery {
try (ClusterFixture cluster = builder.build();
ClientFixture client = cluster.clientFixture()) {
- String explain = client.queryBuilder().sql(Sql).explainText();
+ String explain = client.queryBuilder().sql(sql).explainText();
String rightChild = getRightChildOfLateral(explain);
assertFalse(rightChild.contains("Exchange"));
}
@@ -419,7 +419,7 @@ public class TestLateralPlans extends BaseTestQuery {
@Test
public void testNoExchangeWithLateralsDownStreamJoin() throws Exception {
- String Sql = "select d1.totalprice from dfs.`lateraljoin/multipleFiles` t, dfs.`lateraljoin/multipleFiles` t2, " +
+ String sql = "select d1.totalprice from dfs.`lateraljoin/multipleFiles` t, dfs.`lateraljoin/multipleFiles` t2, " +
" lateral ( select t2.ord.o_totalprice as totalprice from unnest(t.c_orders) t2(ord) order by t2.ord.o_orderkey limit 10) d1" +
" where t.c_name = t2.c_name";
ClusterFixtureBuilder builder = ClusterFixture.builder(dirTestWatcher)
@@ -428,7 +428,7 @@ public class TestLateralPlans extends BaseTestQuery {
try (ClusterFixture cluster = builder.build();
ClientFixture client = cluster.clientFixture()) {
- String explain = client.queryBuilder().sql(Sql).explainText();
+ String explain = client.queryBuilder().sql(sql).explainText();
String rightChild = getRightChildOfLateral(explain);
assertFalse(rightChild.contains("Exchange"));
}
@@ -436,7 +436,7 @@ public class TestLateralPlans extends BaseTestQuery {
@Test
public void testNoExchangeWithLateralsDownStreamUnion() throws Exception {
- String Sql = "select t.c_name from dfs.`lateraljoin/multipleFiles` t union all " +
+ String sql = "select t.c_name from dfs.`lateraljoin/multipleFiles` t union all " +
" select t.c_name from dfs.`lateraljoin/multipleFiles` t, " +
" lateral ( select t2.ord.o_totalprice as totalprice from unnest(t.c_orders) t2(ord) order by t2.ord.o_orderkey limit 10) d1";
ClusterFixtureBuilder builder = ClusterFixture.builder(dirTestWatcher)
@@ -445,7 +445,7 @@ public class TestLateralPlans extends BaseTestQuery {
try (ClusterFixture cluster = builder.build();
ClientFixture client = cluster.clientFixture()) {
- String explain = client.queryBuilder().sql(Sql).explainText();
+ String explain = client.queryBuilder().sql(sql).explainText();
String rightChild = getRightChildOfLateral(explain);
assertFalse(rightChild.contains("Exchange"));
}
@@ -453,7 +453,7 @@ public class TestLateralPlans extends BaseTestQuery {
@Test
public void testNoExchangeWithLateralsDownStreamAgg() throws Exception {
- String Sql = "select sum(d1.totalprice) from dfs.`lateraljoin/multipleFiles` t, " +
+ String sql = "select sum(d1.totalprice) from dfs.`lateraljoin/multipleFiles` t, " +
" lateral ( select t2.ord.o_totalprice as totalprice from unnest(t.c_orders) t2(ord) order by t2.ord.o_orderkey limit 10) d1 group by t.c_custkey";
ClusterFixtureBuilder builder = ClusterFixture.builder(dirTestWatcher)
.setOptionDefault(ExecConstants.ENABLE_UNNEST_LATERAL_KEY, true)
@@ -463,7 +463,7 @@ public class TestLateralPlans extends BaseTestQuery {
try (ClusterFixture cluster = builder.build();
ClientFixture client = cluster.clientFixture()) {
- String explain = client.queryBuilder().sql(Sql).explainText();
+ String explain = client.queryBuilder().sql(sql).explainText();
String rightChild = getRightChildOfLateral(explain);
assertFalse(rightChild.contains("Exchange"));
}
@@ -480,14 +480,14 @@ public class TestLateralPlans extends BaseTestQuery {
//The following test is for testing the explain plan contains relation between lateral and corresponding unnest.
@Test
public void testLateralAndUnnestExplainPlan() throws Exception {
- String Sql = "select c.* from cp.`lateraljoin/nested-customer.json` c, unnest(c.orders) Orders(ord)";
+ String sql = "select c.* from cp.`lateraljoin/nested-customer.json` c, unnest(c.orders) Orders(ord)";
ClusterFixtureBuilder builder = ClusterFixture.builder(dirTestWatcher)
.setOptionDefault(ExecConstants.ENABLE_UNNEST_LATERAL_KEY, true)
.setOptionDefault(ExecConstants.SLICE_TARGET, 1);
try (ClusterFixture cluster = builder.build();
ClientFixture client = cluster.clientFixture()) {
- String explain = client.queryBuilder().sql(Sql).explainText();
+ String explain = client.queryBuilder().sql(sql).explainText();
String srcOp = explain.substring(explain.indexOf("srcOp"));
assertTrue(srcOp != null && srcOp.length() > 0);
String correlateFragmentPattern = srcOp.substring(srcOp.indexOf("=")+1, srcOp.indexOf("]"));
@@ -499,7 +499,7 @@ public class TestLateralPlans extends BaseTestQuery {
@Test
public void testUnnestTopN() throws Exception {
- String query =
+ String sql =
"select customer.c_custkey," +
"customer.c_name," +
"t.o.o_orderkey," +
@@ -517,7 +517,7 @@ public class TestLateralPlans extends BaseTestQuery {
try (ClusterFixture cluster = builder.build();
ClientFixture client = cluster.clientFixture()) {
String plan = client.queryBuilder()
- .sql(query)
+ .sql(sql)
.explainText();
assertThat("Query plan doesn't contain TopN operator",
@@ -529,7 +529,7 @@ public class TestLateralPlans extends BaseTestQuery {
@Test
public void testMultiUnnestQuery() throws Exception {
- String Sql = "SELECT t5.l_quantity FROM dfs.`lateraljoin/multipleFiles` t, " +
+ String sql = "SELECT t5.l_quantity FROM dfs.`lateraljoin/multipleFiles` t, " +
"LATERAL (SELECT t2.ordrs.o_lineitems FROM UNNEST(t.c_orders) t2(ordrs)) t3(lineitems), " +
"LATERAL (SELECT t4.lineitems.l_quantity FROM UNNEST(t3.lineitems) t4(lineitems)) t5(l_quantity) order by 1";
@@ -545,7 +545,7 @@ public class TestLateralPlans extends BaseTestQuery {
client.testBuilder()
.ordered()
.sqlBaselineQuery(baselineQuery)
- .sqlQuery(Sql)
+ .sqlQuery(sql)
.go();
}
}