You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@calcite.apache.org by jh...@apache.org on 2018/12/04 07:07:12 UTC
[4/4] calcite git commit: [CALCITE-2596] When translating correlated
variables in enumerable convention,
convert not-null boxed primitive values to primitive (Stamatis Zampetakis)
[CALCITE-2596] When translating correlated variables in enumerable convention, convert not-null boxed primitive values to primitive (Stamatis Zampetakis)
Apply nullAs policy when translating expressions with correlated variables.
Close apache/calcite#868
Project: http://git-wip-us.apache.org/repos/asf/calcite/repo
Commit: http://git-wip-us.apache.org/repos/asf/calcite/commit/5c6d3c22
Tree: http://git-wip-us.apache.org/repos/asf/calcite/tree/5c6d3c22
Diff: http://git-wip-us.apache.org/repos/asf/calcite/diff/5c6d3c22
Branch: refs/heads/master
Commit: 5c6d3c22cd77e3fd6427f327187b3e0bfd8a2a81
Parents: 0ad68c3
Author: Stamatis Zampetakis <za...@gmail.com>
Authored: Wed Sep 26 14:03:29 2018 +0200
Committer: Julian Hyde <jh...@apache.org>
Committed: Mon Dec 3 19:16:15 2018 -0800
----------------------------------------------------------------------
.../adapter/enumerable/RexToLixTranslator.java | 30 +++++++++++++-------
.../enumerable/EnumerableCorrelateTest.java | 12 ++++++++
2 files changed, 32 insertions(+), 10 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/calcite/blob/5c6d3c22/core/src/main/java/org/apache/calcite/adapter/enumerable/RexToLixTranslator.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/RexToLixTranslator.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/RexToLixTranslator.java
index e28a8d0..1a63068 100644
--- a/core/src/main/java/org/apache/calcite/adapter/enumerable/RexToLixTranslator.java
+++ b/core/src/main/java/org/apache/calcite/adapter/enumerable/RexToLixTranslator.java
@@ -571,6 +571,18 @@ public class RexToLixTranslator {
return scaleIntervalToNumber(sourceType, targetType, convert);
}
+ private Expression handleNullUnboxingIfNecessary(
+ Expression input,
+ RexImpTable.NullAs nullAs,
+ Type storageType) {
+ if (RexImpTable.NullAs.NOT_POSSIBLE == nullAs && input.type.equals(storageType)) {
+ // When we asked for not null input that would be stored as box, avoid
+ // unboxing which may occur in the handleNull method below.
+ return input;
+ }
+ return handleNull(input, nullAs);
+ }
+
/** Adapts an expression with "normal" result to one that adheres to
* this particular policy. Wraps the result expression into a new
* parameter if need be.
@@ -624,18 +636,13 @@ public class RexToLixTranslator {
nullAs = RexImpTable.NullAs.NOT_POSSIBLE;
}
switch (expr.getKind()) {
- case INPUT_REF:
+ case INPUT_REF: {
final int index = ((RexInputRef) expr).getIndex();
Expression x = inputGetter.field(list, index, storageType);
Expression input = list.append("inp" + index + "_", x); // safe to share
- if (nullAs == RexImpTable.NullAs.NOT_POSSIBLE
- && input.type.equals(storageType)) {
- // When we asked for not null input that would be stored as box, avoid
- // unboxing via nullAs.handle below.
- return input;
- }
- return handleNull(input, nullAs);
+ return handleNullUnboxingIfNecessary(input, nullAs, storageType);
+ }
case LOCAL_REF:
return translate(
deref(expr),
@@ -655,7 +662,7 @@ public class RexToLixTranslator {
case CORREL_VARIABLE:
throw new RuntimeException("Cannot translate " + expr + ". Correlated"
+ " variables should always be referenced by field access");
- case FIELD_ACCESS:
+ case FIELD_ACCESS: {
RexFieldAccess fieldAccess = (RexFieldAccess) expr;
RexNode target = deref(fieldAccess.getReferenceExpr());
int fieldIndex = fieldAccess.getField().getIndex();
@@ -668,7 +675,9 @@ public class RexToLixTranslator {
}
InputGetter getter =
correlates.apply(((RexCorrelVariable) target).getName());
- return getter.field(list, fieldIndex, storageType);
+ Expression y = getter.field(list, fieldIndex, storageType);
+ Expression input = list.append("corInp" + fieldIndex + "_", y); // safe to share
+ return handleNullUnboxingIfNecessary(input, nullAs, storageType);
default:
RexNode rxIndex = builder.makeLiteral(fieldIndex, typeFactory.createType(int.class), true);
RexNode rxName = builder.makeLiteral(fieldName, typeFactory.createType(String.class), true);
@@ -678,6 +687,7 @@ public class RexToLixTranslator {
ImmutableList.of(target, rxIndex, rxName));
return translateCall(accessCall, nullAs);
}
+ }
default:
if (expr instanceof RexCall) {
return translateCall((RexCall) expr, nullAs);
http://git-wip-us.apache.org/repos/asf/calcite/blob/5c6d3c22/core/src/test/java/org/apache/calcite/test/enumerable/EnumerableCorrelateTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/calcite/test/enumerable/EnumerableCorrelateTest.java b/core/src/test/java/org/apache/calcite/test/enumerable/EnumerableCorrelateTest.java
index 2edc6b9..876c18f 100644
--- a/core/src/test/java/org/apache/calcite/test/enumerable/EnumerableCorrelateTest.java
+++ b/core/src/test/java/org/apache/calcite/test/enumerable/EnumerableCorrelateTest.java
@@ -95,6 +95,18 @@ public class EnumerableCorrelateTest {
"empid=150; name=Sebastian");
}
+ @Test public void simpleCorrelateWithConditionIncludingBoxedPrimitive() {
+ final String sql = "select empid from emps e where not exists (\n"
+ + " select 1 from depts d where d.deptno=e.commission)";
+ tester(false, new JdbcTest.HrSchema())
+ .query(sql)
+ .returnsUnordered(
+ "empid=100",
+ "empid=110",
+ "empid=150",
+ "empid=200");
+ }
+
private CalciteAssert.AssertThat tester(boolean forceDecorrelate,
Object schema) {
return CalciteAssert.that()