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 2015/09/29 18:48:47 UTC
[1/3] incubator-calcite git commit: [CALCITE-894] Do not generate
redundant column alias for the left relation when translating IN subquery
(Maryann Xue)
Repository: incubator-calcite
Updated Branches:
refs/heads/master d697ca164 -> fbe19d83b
[CALCITE-894] Do not generate redundant column alias for the left relation when translating IN subquery (Maryann Xue)
Project: http://git-wip-us.apache.org/repos/asf/incubator-calcite/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-calcite/commit/c6cc5a77
Tree: http://git-wip-us.apache.org/repos/asf/incubator-calcite/tree/c6cc5a77
Diff: http://git-wip-us.apache.org/repos/asf/incubator-calcite/diff/c6cc5a77
Branch: refs/heads/master
Commit: c6cc5a7794848ef745739518742c490839770e31
Parents: d697ca1
Author: maryannxue <we...@intel.com>
Authored: Mon Sep 28 13:57:58 2015 -0700
Committer: Julian Hyde <jh...@apache.org>
Committed: Mon Sep 28 13:57:58 2015 -0700
----------------------------------------------------------------------
.../calcite/sql2rel/SqlToRelConverter.java | 14 ++++++++-----
.../java/org/apache/calcite/test/JdbcTest.java | 15 ++++++-------
.../org/apache/calcite/test/RelOptRulesTest.xml | 22 ++++++++------------
.../calcite/test/SqlToRelConverterTest.xml | 19 +++++++----------
4 files changed, 32 insertions(+), 38 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/c6cc5a77/core/src/main/java/org/apache/calcite/sql2rel/SqlToRelConverter.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/sql2rel/SqlToRelConverter.java b/core/src/main/java/org/apache/calcite/sql2rel/SqlToRelConverter.java
index c6c03b2..a3d9ff7 100644
--- a/core/src/main/java/org/apache/calcite/sql2rel/SqlToRelConverter.java
+++ b/core/src/main/java/org/apache/calcite/sql2rel/SqlToRelConverter.java
@@ -3723,12 +3723,16 @@ public class SqlToRelConverter {
final List<Integer> leftJoinKeys = Lists.newArrayList();
for (RexNode leftKey : leftKeys) {
- newLeftInputExpr.add(leftKey);
- leftJoinKeys.add(origLeftInputCount + leftJoinKeys.size());
+ int index = newLeftInputExpr.indexOf(leftKey);
+ if (index < 0 || joinType == JoinRelType.LEFT) {
+ index = newLeftInputExpr.size();
+ newLeftInputExpr.add(leftKey);
+ }
+ leftJoinKeys.add(index);
}
- LogicalProject newLeftInput =
- (LogicalProject) RelOptUtil.createProject(
+ RelNode newLeftInput =
+ RelOptUtil.createProject(
root,
newLeftInputExpr,
null,
@@ -3747,7 +3751,7 @@ public class SqlToRelConverter {
final int rightOffset = root.getRowType().getFieldCount()
- newLeftInput.getRowType().getFieldCount();
final List<Integer> rightKeys =
- Util.range(rightOffset, rightOffset + leftJoinKeys.size());
+ Util.range(rightOffset, rightOffset + leftKeys.size());
joinCond =
RelOptUtil.createEquiJoinCondition(newLeftInput, leftJoinKeys,
http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/c6cc5a77/core/src/test/java/org/apache/calcite/test/JdbcTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/calcite/test/JdbcTest.java b/core/src/test/java/org/apache/calcite/test/JdbcTest.java
index 43c9ae9..4467785 100644
--- a/core/src/test/java/org/apache/calcite/test/JdbcTest.java
+++ b/core/src/test/java/org/apache/calcite/test/JdbcTest.java
@@ -2828,21 +2828,18 @@ public class JdbcTest {
+ " where \"empid\" < 150)")
.convertContains(""
+ "LogicalProject(deptno=[$0], name=[$1], employees=[$2], location=[$3])\n"
- + " LogicalJoin(condition=[=($4, $5)], joinType=[inner])\n"
- + " LogicalProject($f0=[$0], $f1=[$1], $f2=[$2], $f3=[$3], $f4=[$0])\n"
- + " EnumerableTableScan(table=[[hr, depts]])\n"
+ + " LogicalJoin(condition=[=($0, $4)], joinType=[inner])\n"
+ + " EnumerableTableScan(table=[[hr, depts]])\n"
+ " LogicalAggregate(group=[{0}])\n"
+ " LogicalProject(deptno=[$1])\n"
+ " LogicalFilter(condition=[<($0, 150)])\n"
+ " LogicalProject(empid=[$0], deptno=[$1])\n"
+ " EnumerableTableScan(table=[[hr, emps]])")
.explainContains(""
- + "EnumerableCalc(expr#0..4=[{inputs}], proj#0..3=[{exprs}])\n"
- + " EnumerableSemiJoin(condition=[=($4, $6)], joinType=[inner])\n"
- + " EnumerableCalc(expr#0..3=[{inputs}], proj#0..3=[{exprs}], $f4=[$t0])\n"
- + " EnumerableTableScan(table=[[hr, depts]])\n"
- + " EnumerableCalc(expr#0..4=[{inputs}], expr#5=[150], expr#6=[<($t0, $t5)], proj#0..4=[{exprs}], $condition=[$t6])\n"
- + " EnumerableTableScan(table=[[hr, emps]])")
+ + "EnumerableSemiJoin(condition=[=($0, $5)], joinType=[inner])\n"
+ + " EnumerableTableScan(table=[[hr, depts]])\n"
+ + " EnumerableCalc(expr#0..4=[{inputs}], expr#5=[150], expr#6=[<($t0, $t5)], proj#0..4=[{exprs}], $condition=[$t6])\n"
+ + " EnumerableTableScan(table=[[hr, emps]])")
.returnsUnordered(
"deptno=10; name=Sales; employees=[Employee [empid: 100, deptno: 10, name: Bill], Employee [empid: 150, deptno: 10, name: Sebastian]]; location=Location [x: -122, y: 38]");
}
http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/c6cc5a77/core/src/test/resources/org/apache/calcite/test/RelOptRulesTest.xml
----------------------------------------------------------------------
diff --git a/core/src/test/resources/org/apache/calcite/test/RelOptRulesTest.xml b/core/src/test/resources/org/apache/calcite/test/RelOptRulesTest.xml
index 52948a9..644449a 100644
--- a/core/src/test/resources/org/apache/calcite/test/RelOptRulesTest.xml
+++ b/core/src/test/resources/org/apache/calcite/test/RelOptRulesTest.xml
@@ -361,24 +361,20 @@ LogicalProject(EXPR$0=[1])
<![CDATA[
LogicalProject(DEPTNO=[$0], NAME=[$1])
LogicalFilter(condition=[<=($0, 10)])
- LogicalProject(DEPTNO=[$0], NAME=[$1])
- SemiJoin(condition=[=($2, $3)], joinType=[inner])
- LogicalProject($f0=[$0], $f1=[$1], $f2=[$0])
- LogicalTableScan(table=[[CATALOG, SALES, DEPT]])
- LogicalProject(DEPTNO=[$7])
- LogicalTableScan(table=[[CATALOG, SALES, EMP]])
+ SemiJoin(condition=[=($0, $2)], joinType=[inner])
+ LogicalTableScan(table=[[CATALOG, SALES, DEPT]])
+ LogicalProject(DEPTNO=[$7])
+ LogicalTableScan(table=[[CATALOG, SALES, EMP]])
]]>
</Resource>
<Resource name="planAfter">
<![CDATA[
LogicalProject(DEPTNO=[$0], NAME=[$1])
- LogicalProject(DEPTNO=[$0], NAME=[$1])
- SemiJoin(condition=[=($2, $3)], joinType=[inner])
- LogicalFilter(condition=[<=($0, 10)])
- LogicalProject($f0=[$0], $f1=[$1], $f2=[$0])
- LogicalTableScan(table=[[CATALOG, SALES, DEPT]])
- LogicalProject(DEPTNO=[$7])
- LogicalTableScan(table=[[CATALOG, SALES, EMP]])
+ SemiJoin(condition=[=($0, $2)], joinType=[inner])
+ LogicalFilter(condition=[<=($0, 10)])
+ LogicalTableScan(table=[[CATALOG, SALES, DEPT]])
+ LogicalProject(DEPTNO=[$7])
+ LogicalTableScan(table=[[CATALOG, SALES, EMP]])
]]>
</Resource>
</TestCase>
http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/c6cc5a77/core/src/test/resources/org/apache/calcite/test/SqlToRelConverterTest.xml
----------------------------------------------------------------------
diff --git a/core/src/test/resources/org/apache/calcite/test/SqlToRelConverterTest.xml b/core/src/test/resources/org/apache/calcite/test/SqlToRelConverterTest.xml
index 95c5507..751ecfa 100644
--- a/core/src/test/resources/org/apache/calcite/test/SqlToRelConverterTest.xml
+++ b/core/src/test/resources/org/apache/calcite/test/SqlToRelConverterTest.xml
@@ -545,9 +545,8 @@ LogicalProject(EMPNO=[$0])
<Resource name="plan">
<![CDATA[
LogicalProject(EMPNO=[$0])
- LogicalJoin(condition=[=($9, $10)], joinType=[inner])
- LogicalProject($f0=[$0], $f1=[$1], $f2=[$2], $f3=[$3], $f4=[$4], $f5=[$5], $f6=[$6], $f7=[$7], $f8=[$8], $f9=[$7])
- LogicalTableScan(table=[[CATALOG, SALES, EMP]])
+ LogicalJoin(condition=[=($7, $9)], joinType=[inner])
+ LogicalTableScan(table=[[CATALOG, SALES, EMP]])
LogicalAggregate(group=[{0}])
LogicalValues(tuples=[[{ 10 }, { 20 }, { 30 }, { 40 }, { 50 }, { 60 }, { 70 }, { 80 }, { 90 }, { 100 }, { 110 }, { 120 }, { 130 }, { 140 }, { 150 }, { 160 }, { 170 }, { 180 }, { 190 }, { 200 }, { 210 }, { 220 }, { 230 }]])
]]>
@@ -560,9 +559,8 @@ LogicalProject(EMPNO=[$0])
<Resource name="plan">
<![CDATA[
LogicalProject(EMPNO=[$0])
- LogicalJoin(condition=[=($9, $10)], joinType=[inner])
- LogicalProject($f0=[$0], $f1=[$1], $f2=[$2], $f3=[$3], $f4=[$4], $f5=[$5], $f6=[$6], $f7=[$7], $f8=[$8], $f9=[$7])
- LogicalTableScan(table=[[CATALOG, SALES, EMP]])
+ LogicalJoin(condition=[=($7, $9)], joinType=[inner])
+ LogicalTableScan(table=[[CATALOG, SALES, EMP]])
LogicalAggregate(group=[{0}])
LogicalProject(DEPTNO=[$0])
LogicalTableScan(table=[[CATALOG, SALES, DEPT]])
@@ -2217,11 +2215,10 @@ having sal in (
<Resource name="plan">
<![CDATA[
LogicalProject(SAL=[$0])
- LogicalJoin(condition=[=($1, $2)], joinType=[inner])
- LogicalProject($f0=[$0], $f1=[$0])
- LogicalAggregate(group=[{0}])
- LogicalProject(SAL=[$5])
- LogicalTableScan(table=[[CATALOG, SALES, EMP]])
+ LogicalJoin(condition=[=($0, $1)], joinType=[inner])
+ LogicalAggregate(group=[{0}])
+ LogicalProject(SAL=[$5])
+ LogicalTableScan(table=[[CATALOG, SALES, EMP]])
LogicalAggregate(group=[{0}])
LogicalProject(DEPTNO=[$0])
LogicalFilter(condition=[>($1, 0)])
[2/3] incubator-calcite git commit: [CALCITE-898] Type of 'Java
* INTEGER' should be BIGINT
Posted by jh...@apache.org.
[CALCITE-898] Type of 'Java<Long> * INTEGER' should be BIGINT
Project: http://git-wip-us.apache.org/repos/asf/incubator-calcite/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-calcite/commit/0cb2e275
Tree: http://git-wip-us.apache.org/repos/asf/incubator-calcite/tree/0cb2e275
Diff: http://git-wip-us.apache.org/repos/asf/incubator-calcite/diff/0cb2e275
Branch: refs/heads/master
Commit: 0cb2e275d61a22b931212f834a7922266fa5d772
Parents: c6cc5a7
Author: Julian Hyde <jh...@apache.org>
Authored: Mon Sep 28 18:25:48 2015 -0700
Committer: Julian Hyde <jh...@apache.org>
Committed: Mon Sep 28 19:06:14 2015 -0700
----------------------------------------------------------------------
.../calcite/sql/type/SqlTypeFactoryImpl.java | 40 +++++++++++++++-----
example/csv/pom.xml | 5 +++
.../java/org/apache/calcite/test/CsvTest.java | 27 +++++++++++++
.../csv/src/test/resources/bug/LONG_EMPS.csv | 6 +++
4 files changed, 69 insertions(+), 9 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/0cb2e275/core/src/main/java/org/apache/calcite/sql/type/SqlTypeFactoryImpl.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/sql/type/SqlTypeFactoryImpl.java b/core/src/main/java/org/apache/calcite/sql/type/SqlTypeFactoryImpl.java
index a37369c..28a5d2d 100644
--- a/core/src/main/java/org/apache/calcite/sql/type/SqlTypeFactoryImpl.java
+++ b/core/src/main/java/org/apache/calcite/sql/type/SqlTypeFactoryImpl.java
@@ -216,25 +216,47 @@ public class SqlTypeFactoryImpl extends RelDataTypeFactoryImpl {
private RelDataType leastRestrictiveSqlType(List<RelDataType> types) {
RelDataType resultType = null;
- boolean anyNullable = false;
+ int nullCount = 0;
+ int nullableCount = 0;
+ int javaCount = 0;
- for (int i = 0; i < types.size(); ++i) {
- RelDataType type = types.get(i);
- RelDataTypeFamily family = type.getFamily();
-
- SqlTypeName typeName = type.getSqlTypeName();
+ for (RelDataType type : types) {
+ final SqlTypeName typeName = type.getSqlTypeName();
if (typeName == null) {
return null;
}
-
if (type.isNullable()) {
- anyNullable = true;
+ ++nullableCount;
+ }
+ if (typeName == SqlTypeName.NULL) {
+ ++nullCount;
}
+ if (isJavaType(type)) {
+ ++javaCount;
+ }
+ }
+
+ for (int i = 0; i < types.size(); ++i) {
+ RelDataType type = types.get(i);
+ RelDataTypeFamily family = type.getFamily();
+ final SqlTypeName typeName = type.getSqlTypeName();
if (typeName == SqlTypeName.NULL) {
continue;
}
+ // Convert Java types; for instance, JavaType(int) becomes INTEGER.
+ // Except if all types are either NULL or Java types.
+ if (isJavaType(type) && javaCount + nullCount < types.size()) {
+ final RelDataType originalType = type;
+ type = typeName.allowsPrecScale(true, true)
+ ? createSqlType(typeName, type.getPrecision(), type.getScale())
+ : typeName.allowsPrecScale(true, false)
+ ? createSqlType(typeName, type.getPrecision())
+ : createSqlType(typeName);
+ type = createTypeWithNullability(type, originalType.isNullable());
+ }
+
if (resultType == null) {
resultType = type;
if (resultType.getSqlTypeName() == SqlTypeName.ROW) {
@@ -442,7 +464,7 @@ public class SqlTypeFactoryImpl extends RelDataTypeFactoryImpl {
return null;
}
}
- if (resultType != null && anyNullable) {
+ if (resultType != null && nullableCount > 0) {
resultType = createTypeWithNullability(resultType, true);
}
return resultType;
http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/0cb2e275/example/csv/pom.xml
----------------------------------------------------------------------
diff --git a/example/csv/pom.xml b/example/csv/pom.xml
index fd0f53c..2f436ad 100644
--- a/example/csv/pom.xml
+++ b/example/csv/pom.xml
@@ -66,6 +66,11 @@ limitations under the License.
<artifactId>commons-lang3</artifactId>
</dependency>
<dependency>
+ <groupId>org.hamcrest</groupId>
+ <artifactId>hamcrest-core</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
<groupId>sqlline</groupId>
<artifactId>sqlline</artifactId>
<scope>test</scope>
http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/0cb2e275/example/csv/src/test/java/org/apache/calcite/test/CsvTest.java
----------------------------------------------------------------------
diff --git a/example/csv/src/test/java/org/apache/calcite/test/CsvTest.java b/example/csv/src/test/java/org/apache/calcite/test/CsvTest.java
index 3fe8363..a048319 100644
--- a/example/csv/src/test/java/org/apache/calcite/test/CsvTest.java
+++ b/example/csv/src/test/java/org/apache/calcite/test/CsvTest.java
@@ -19,6 +19,8 @@ package org.apache.calcite.test;
import org.apache.calcite.linq4j.function.Function1;
import org.apache.calcite.sql2rel.SqlToRelConverter;
+import com.google.common.base.Throwables;
+
import org.junit.Assert;
import org.junit.Ignore;
import org.junit.Test;
@@ -36,6 +38,9 @@ import java.util.Arrays;
import java.util.List;
import java.util.Properties;
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+
/**
* Unit test of the Calcite adapter for CSV.
*/
@@ -127,6 +132,28 @@ public class CsvTest {
checkSql("smart", "select name from DEPTS");
}
+ /** Test case for
+ * <a href="https://issues.apache.org/jira/browse/CALCITE-898">[CALCITE-898]
+ * Type inference multiplying Java long by SQL INTEGER</a>. */
+ @Test public void testSelectLongMultiplyInteger() throws SQLException {
+ final String sql = "select empno * 3 as e3\n"
+ + "from long_emps where empno = 100";
+
+ checkSql(sql, "bug", new Function1<ResultSet, Void>() {
+ public Void apply(ResultSet resultSet) {
+ try {
+ assertThat(resultSet.next(), is(true));
+ Long o = (Long) resultSet.getObject(1);
+ assertThat(o, is(300L));
+ assertThat(resultSet.next(), is(false));
+ return null;
+ } catch (SQLException e) {
+ throw Throwables.propagate(e);
+ }
+ }
+ });
+ }
+
@Test public void testCustomTable() throws SQLException {
checkSql("model-with-custom-table", "select * from CUSTOM_TABLE.EMPS");
}
http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/0cb2e275/example/csv/src/test/resources/bug/LONG_EMPS.csv
----------------------------------------------------------------------
diff --git a/example/csv/src/test/resources/bug/LONG_EMPS.csv b/example/csv/src/test/resources/bug/LONG_EMPS.csv
new file mode 100644
index 0000000..f69e0c5
--- /dev/null
+++ b/example/csv/src/test/resources/bug/LONG_EMPS.csv
@@ -0,0 +1,6 @@
+EMPNO:long,NAME:string,DEPTNO:int,GENDER:string,CITY:string,EMPID:int,AGE:int,SLACKER:boolean,MANAGER:boolean,JOINEDAT:date
+100,"Fred",10,,,30,25,true,false,"1996-08-03"
+110,"Eric",20,"M","San Francisco",3,80,,false,"2001-01-01"
+110,"John",40,"M","Vancouver",2,,false,true,"2002-05-03"
+120,"Wilma",20,"F",,1,5,,true,"2005-09-07"
+130,"Alice",40,"F","Vancouver",2,,false,true,"2007-01-01"
[3/3] incubator-calcite git commit: [CALCITE-843]
AvaticaConnection.getAutoCommit throws NullPointerException
Posted by jh...@apache.org.
[CALCITE-843] AvaticaConnection.getAutoCommit throws NullPointerException
Project: http://git-wip-us.apache.org/repos/asf/incubator-calcite/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-calcite/commit/fbe19d83
Tree: http://git-wip-us.apache.org/repos/asf/incubator-calcite/tree/fbe19d83
Diff: http://git-wip-us.apache.org/repos/asf/incubator-calcite/diff/fbe19d83
Branch: refs/heads/master
Commit: fbe19d83be71a0c3be315262d215a2d439b34511
Parents: 0cb2e27
Author: Julian Hyde <jh...@apache.org>
Authored: Mon Sep 28 18:28:36 2015 -0700
Committer: Julian Hyde <jh...@apache.org>
Committed: Mon Sep 28 19:06:14 2015 -0700
----------------------------------------------------------------------
.../calcite/avatica/AvaticaConnection.java | 24 ++++++++++++++++----
.../calcite/avatica/remote/RemoteMeta.java | 3 ++-
2 files changed, 21 insertions(+), 6 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/fbe19d83/avatica/src/main/java/org/apache/calcite/avatica/AvaticaConnection.java
----------------------------------------------------------------------
diff --git a/avatica/src/main/java/org/apache/calcite/avatica/AvaticaConnection.java b/avatica/src/main/java/org/apache/calcite/avatica/AvaticaConnection.java
index e602ed7..1a7443c 100644
--- a/avatica/src/main/java/org/apache/calcite/avatica/AvaticaConnection.java
+++ b/avatica/src/main/java/org/apache/calcite/avatica/AvaticaConnection.java
@@ -134,7 +134,7 @@ public abstract class AvaticaConnection implements Connection {
}
public boolean getAutoCommit() throws SQLException {
- return meta.connectionSync(handle, new ConnectionPropertiesImpl()).isAutoCommit();
+ return unbox(sync().isAutoCommit(), true);
}
public void commit() throws SQLException {
@@ -173,7 +173,7 @@ public abstract class AvaticaConnection implements Connection {
}
public boolean isReadOnly() throws SQLException {
- return meta.connectionSync(handle, new ConnectionPropertiesImpl()).isReadOnly();
+ return unbox(sync().isReadOnly(), true);
}
public void setCatalog(String catalog) throws SQLException {
@@ -181,7 +181,7 @@ public abstract class AvaticaConnection implements Connection {
}
public String getCatalog() {
- return meta.connectionSync(handle, new ConnectionPropertiesImpl()).getCatalog();
+ return sync().getCatalog();
}
public void setTransactionIsolation(int level) throws SQLException {
@@ -190,7 +190,7 @@ public abstract class AvaticaConnection implements Connection {
public int getTransactionIsolation() throws SQLException {
//noinspection MagicConstant
- return meta.connectionSync(handle, new ConnectionPropertiesImpl()).getTransactionIsolation();
+ return unbox(sync().getTransactionIsolation(), TRANSACTION_NONE);
}
public SQLWarning getWarnings() throws SQLException {
@@ -358,7 +358,7 @@ public abstract class AvaticaConnection implements Connection {
}
public String getSchema() {
- return meta.connectionSync(handle, new ConnectionPropertiesImpl()).getSchema();
+ return sync().getSchema();
}
public void abort(Executor executor) throws SQLException {
@@ -503,6 +503,20 @@ public abstract class AvaticaConnection implements Connection {
return new Trojan();
}
+ /** Converts a {@link Boolean} to a {@code boolean}, with a default value. */
+ private boolean unbox(Boolean b, boolean defaultValue) {
+ return b == null ? defaultValue : b;
+ }
+
+ /** Converts an {@link Integer} to an {@code int}, with a default value. */
+ private int unbox(Integer i, int defaultValue) {
+ return i == null ? defaultValue : i;
+ }
+
+ private Meta.ConnectionProperties sync() {
+ return meta.connectionSync(handle, new ConnectionPropertiesImpl());
+ }
+
/** A way to call package-protected methods. But only a sub-class of
* connection can create one. */
public static class Trojan {
http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/fbe19d83/avatica/src/main/java/org/apache/calcite/avatica/remote/RemoteMeta.java
----------------------------------------------------------------------
diff --git a/avatica/src/main/java/org/apache/calcite/avatica/remote/RemoteMeta.java b/avatica/src/main/java/org/apache/calcite/avatica/remote/RemoteMeta.java
index deacdee..f6047d0 100644
--- a/avatica/src/main/java/org/apache/calcite/avatica/remote/RemoteMeta.java
+++ b/avatica/src/main/java/org/apache/calcite/avatica/remote/RemoteMeta.java
@@ -30,7 +30,8 @@ import java.util.List;
import java.util.Map;
/**
- * Implementation of {@link Meta} for the remote driver.
+ * Implementation of {@link org.apache.calcite.avatica.Meta} for the remote
+ * driver.
*/
class RemoteMeta extends MetaImpl {
final Service service;