You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@calcite.apache.org by jc...@apache.org on 2018/11/13 22:45:21 UTC
calcite git commit: [CALCITE-2669] RelMdTableReferences should check
whether references inferred from input are null for Union/Join operators
Repository: calcite
Updated Branches:
refs/heads/master 11ff06120 -> fcc8bf7f4
[CALCITE-2669] RelMdTableReferences should check whether references inferred from input are null for Union/Join operators
Project: http://git-wip-us.apache.org/repos/asf/calcite/repo
Commit: http://git-wip-us.apache.org/repos/asf/calcite/commit/fcc8bf7f
Tree: http://git-wip-us.apache.org/repos/asf/calcite/tree/fcc8bf7f
Diff: http://git-wip-us.apache.org/repos/asf/calcite/diff/fcc8bf7f
Branch: refs/heads/master
Commit: fcc8bf7f44f92efb3c9a1e1f51ffc1a09cab27b9
Parents: 11ff061
Author: Jesus Camacho Rodriguez <jc...@apache.org>
Authored: Tue Nov 13 14:00:17 2018 -0800
Committer: Jesus Camacho Rodriguez <jc...@apache.org>
Committed: Tue Nov 13 14:45:06 2018 -0800
----------------------------------------------------------------------
.../rel/metadata/RelMdTableReferences.java | 21 ++++++++--
.../apache/calcite/test/RelMetadataTest.java | 44 ++++++++++++++++++++
2 files changed, 62 insertions(+), 3 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/calcite/blob/fcc8bf7f/core/src/main/java/org/apache/calcite/rel/metadata/RelMdTableReferences.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdTableReferences.java b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdTableReferences.java
index 6c2395f..6e4f153 100644
--- a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdTableReferences.java
+++ b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdTableReferences.java
@@ -108,7 +108,12 @@ public class RelMdTableReferences
// Gather table references, left input references remain unchanged
final Multimap<List<String>, RelTableRef> leftQualifiedNamesToRefs = HashMultimap.create();
- for (RelTableRef leftRef : mq.getTableReferences(leftInput)) {
+ final Set<RelTableRef> leftTableRefs = mq.getTableReferences(leftInput);
+ if (leftTableRefs == null) {
+ // We could not infer the table refs from left input
+ return null;
+ }
+ for (RelTableRef leftRef : leftTableRefs) {
assert !result.contains(leftRef);
result.add(leftRef);
leftQualifiedNamesToRefs.put(leftRef.getQualifiedName(), leftRef);
@@ -116,7 +121,12 @@ public class RelMdTableReferences
// Gather table references, right input references might need to be
// updated if there are table names clashes with left input
- for (RelTableRef rightRef : mq.getTableReferences(rightInput)) {
+ final Set<RelTableRef> rightTableRefs = mq.getTableReferences(rightInput);
+ if (rightTableRefs == null) {
+ // We could not infer the table refs from right input
+ return null;
+ }
+ for (RelTableRef rightRef : rightTableRefs) {
int shift = 0;
Collection<RelTableRef> lRefs = leftQualifiedNamesToRefs.get(rightRef.getQualifiedName());
if (lRefs != null) {
@@ -145,7 +155,12 @@ public class RelMdTableReferences
final Multimap<List<String>, RelTableRef> qualifiedNamesToRefs = HashMultimap.create();
for (RelNode input : rel.getInputs()) {
final Map<RelTableRef, RelTableRef> currentTablesMapping = new HashMap<>();
- for (RelTableRef tableRef : mq.getTableReferences(input)) {
+ final Set<RelTableRef> inputTableRefs = mq.getTableReferences(input);
+ if (inputTableRefs == null) {
+ // We could not infer the table refs from input
+ return null;
+ }
+ for (RelTableRef tableRef : inputTableRefs) {
int shift = 0;
Collection<RelTableRef> lRefs = qualifiedNamesToRefs.get(
tableRef.getQualifiedName());
http://git-wip-us.apache.org/repos/asf/calcite/blob/fcc8bf7f/core/src/test/java/org/apache/calcite/test/RelMetadataTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/calcite/test/RelMetadataTest.java b/core/src/test/java/org/apache/calcite/test/RelMetadataTest.java
index 1c5140f..4ee5881 100644
--- a/core/src/test/java/org/apache/calcite/test/RelMetadataTest.java
+++ b/core/src/test/java/org/apache/calcite/test/RelMetadataTest.java
@@ -22,6 +22,7 @@ import org.apache.calcite.plan.RelOptCluster;
import org.apache.calcite.plan.RelOptPlanner;
import org.apache.calcite.plan.RelOptPredicateList;
import org.apache.calcite.plan.RelOptTable;
+import org.apache.calcite.plan.RelTraitSet;
import org.apache.calcite.rel.InvalidRelException;
import org.apache.calcite.rel.RelCollation;
import org.apache.calcite.rel.RelCollationTraitDef;
@@ -31,6 +32,7 @@ import org.apache.calcite.rel.RelDistributions;
import org.apache.calcite.rel.RelFieldCollation;
import org.apache.calcite.rel.RelNode;
import org.apache.calcite.rel.RelRoot;
+import org.apache.calcite.rel.SingleRel;
import org.apache.calcite.rel.core.Aggregate;
import org.apache.calcite.rel.core.AggregateCall;
import org.apache.calcite.rel.core.Correlate;
@@ -2076,6 +2078,21 @@ public class RelMetadataTest extends SqlToRelTestBase {
equalTo("[true, =([CATALOG, SALES, EMP].#1.$0, 5), true]"));
}
+ @Test public void testTableReferencesJoinUnknownNode() {
+ final String sql = "select * from emp limit 10";
+ final RelNode node = convertSql(sql);
+ final RelNode nodeWithUnknown = new DummyRelNode(
+ node.getCluster(), node.getTraitSet(), node);
+ final RexBuilder rexBuilder = node.getCluster().getRexBuilder();
+ // Join
+ final LogicalJoin join =
+ LogicalJoin.create(nodeWithUnknown, node, rexBuilder.makeLiteral(true),
+ ImmutableSet.of(), JoinRelType.INNER);
+ final RelMetadataQuery mq = RelMetadataQuery.instance();
+ final Set<RelTableRef> tableReferences = mq.getTableReferences(join);
+ assertNull(tableReferences);
+ }
+
@Test public void testAllPredicatesUnionMultiTable() {
final String sql = "select x.sal from\n"
+ "(select a.deptno, a.sal from (select * from emp) as a\n"
@@ -2095,6 +2112,20 @@ public class RelMetadataTest extends SqlToRelTestBase {
equalTo("[=([CATALOG, SALES, EMP].#2.$0, 5)]"));
}
+ @Test public void testTableReferencesUnionUnknownNode() {
+ final String sql = "select * from emp limit 10";
+ final RelNode node = convertSql(sql);
+ final RelNode nodeWithUnknown = new DummyRelNode(
+ node.getCluster(), node.getTraitSet(), node);
+ // Union
+ final LogicalUnion union =
+ LogicalUnion.create(ImmutableList.of(nodeWithUnknown, node),
+ true);
+ final RelMetadataQuery mq = RelMetadataQuery.instance();
+ final Set<RelTableRef> tableReferences = mq.getTableReferences(union);
+ assertNull(tableReferences);
+ }
+
private void checkNodeTypeCount(String sql, Map<Class<? extends RelNode>, Integer> expected) {
final RelNode rel = convertSql(sql);
final RelMetadataQuery mq = RelMetadataQuery.instance();
@@ -2505,6 +2536,19 @@ public class RelMetadataTest extends SqlToRelTestBase {
}
}
}
+
+ /**
+ * Dummy rel node used for testing.
+ */
+ private class DummyRelNode extends SingleRel {
+
+ /**
+ * Creates a <code>DummyRelNode</code>.
+ */
+ DummyRelNode(RelOptCluster cluster, RelTraitSet traits, RelNode input) {
+ super(cluster, traits, input);
+ }
+ }
}
// End RelMetadataTest.java