Dan Di Spaltro created CALCITE-1212:
---------------------------------------
Summary: Cassandra Projections throw an NPE on a join with another
non-cassandra table
Key: CALCITE-1212
URL: https://issues.apache.org/jira/browse/CALCITE-1212
Project: Calcite
Issue Type: Bug
Reporter: Dan Di Spaltro
Assignee: Julian Hyde
Priority: Minor
Okay, I am really note entirely sure where to begin describing this, since it
involves a lot of what I don't fully understand but Ill list out some of the
observations and maybe that might help.
I have a Jdbc table named assets, it has a field named {{name}} that is
{{VARCHAR}}. If I attempt to do a join like so
{code}
select *
from core.assets
join twissandra.tweets
on core.assets.name = twissandra.tweets.username
{code}
I get an exception like this
{code}
java.lang.NullPointerException: null
at
org.apache.calcite.adapter.cassandra.CassandraTable.query(CassandraTable.java:121)
at
org.apache.calcite.adapter.cassandra.CassandraTable$CassandraQueryable.query(CassandraTable.java:206)
at Baz.bind(Baz.java:6)
at
org.apache.calcite.jdbc.CalcitePrepare$CalciteSignature.enumerable(CalcitePrepare.java:327)
{code}
It looks like it's related to the {{username}} field potentially not having the
same type {{CHAR}} vs {{VARCHAR}} so it gets flagged as a new field? This
[code|https://github.com/apache/calcite/blob/91887366c40310f2435b2677ac0d9616bed842cb/cassandra/src/main/java/org/apache/calcite/adapter/cassandra/CassandraProject.java#L57-L77]
seems to be adding four fields instead of five the additional {{username4}}
which causes the NPE.
I have the output of the code generation here if that helps
{code}
/* 1 */ org.apache.calcite.DataContext root;
/* 2 */
/* 3 */ public org.apache.calcite.linq4j.Enumerable bind(final
org.apache.calcite.DataContext root0) {
/* 4 */ root = root0;
/* 5 */ final java.util.List predicates = java.util.Arrays.asList(new
String[] {});
/* 6 */ final org.apache.calcite.linq4j.Enumerable _inputEnumerable =
((org.apache.calcite.adapter.cassandra.CassandraTable.CassandraQueryable)
org.apache.calcite.schema.Schemas.queryable(root,
root.getRootSchema().getSubSchema("twissandra"), java.lang.Object[].class,
"tweets")).query(java.util.Arrays.asList(new org.apache.calcite.util.Pair[] {
/* 7 */ new org.apache.calcite.util.Pair(
/* 8 */ "tweet_id",
/* 9 */ java.lang.String.class),
/* 10 */ new org.apache.calcite.util.Pair(
/* 11 */ "body",
/* 12 */ java.lang.String.class),
/* 13 */ new org.apache.calcite.util.Pair(
/* 14 */ "tenant_id",
/* 15 */ java.lang.String.class),
/* 16 */ new org.apache.calcite.util.Pair(
/* 17 */ "username",
/* 18 */ java.lang.String.class),
/* 19 */ new org.apache.calcite.util.Pair(
/* 20 */ "username4",
/* 21 */ java.lang.String.class)}), predicates, predicates,
null).join(org.apache.calcite.runtime.ResultSetEnumerable.of(((org.apache.calcite.adapter.jdbc.JdbcSchema)
root.getRootSchema().getSubSchema("core").unwrap(org.apache.calcite.adapter.jdbc.JdbcSchema.class)).getDataSource(),
"SELECT *\nFROM \"assets\"", new
org.apache.calcite.linq4j.function.Function1() {
/* 22 */ public org.apache.calcite.linq4j.function.Function0 apply(final
java.sql.ResultSet resultSet) {
/* 23 */ return new org.apache.calcite.linq4j.function.Function0() {
/* 24 */ public Object apply() {
/* 25 */ try {
/* 26 */ final Object[] values = new Object[4];
/* 27 */ values[0] = resultSet.getObject(1);
/* 28 */ values[1] = resultSet.getObject(2);
/* 29 */ values[2] = resultSet.getObject(3);
/* 30 */ values[3] = resultSet.getObject(4);
/* 31 */ return values;
/* 32 */ } catch (java.sql.SQLException e) {
/* 33 */ throw new RuntimeException(
/* 34 */ e);
/* 35 */ }
/* 36 */ }
/* 37 */ }
/* 38 */ ;
/* 39 */ }
/* 40 */ public Object apply(final Object resultSet) {
/* 41 */ return apply(
/* 42 */ (java.sql.ResultSet) resultSet);
/* 43 */ }
/* 44 */ }
/* 45 */ ), new org.apache.calcite.linq4j.function.Function1() {
/* 46 */ public String apply(Object[] v1) {
/* 47 */ return v1[4] == null ? (String) null : v1[4].toString();
/* 48 */ }
/* 49 */ public Object apply(Object v1) {
/* 50 */ return apply(
/* 51 */ (Object[]) v1);
/* 52 */ }
/* 53 */ }
/* 54 */ , new org.apache.calcite.linq4j.function.Function1() {
/* 55 */ public String apply(Object[] v1) {
/* 56 */ return v1[2] == null ? (String) null : v1[2].toString();
/* 57 */ }
/* 58 */ public Object apply(Object v1) {
/* 59 */ return apply(
/* 60 */ (Object[]) v1);
/* 61 */ }
/* 62 */ }
/* 63 */ , new org.apache.calcite.linq4j.function.Function2() {
/* 64 */ public Object[] apply(Object[] left, Object[] right) {
/* 65 */ return new Object[] {
/* 66 */ left[0],
/* 67 */ left[1],
/* 68 */ left[2],
/* 69 */ left[3],
/* 70 */ left[4],
/* 71 */ right[0],
/* 72 */ right[1],
/* 73 */ right[2],
/* 74 */ right[3]};
/* 75 */ }
/* 76 */ public Object[] apply(Object left, Object right) {
/* 77 */ return apply(
/* 78 */ (Object[]) left,
/* 79 */ (Object[]) right);
/* 80 */ }
/* 81 */ }
/* 82 */ , null, false, false);
/* 83 */ return new org.apache.calcite.linq4j.AbstractEnumerable(){
/* 84 */ public org.apache.calcite.linq4j.Enumerator enumerator() {
/* 85 */ return new org.apache.calcite.linq4j.Enumerator(){
/* 86 */ public final org.apache.calcite.linq4j.Enumerator
inputEnumerator = _inputEnumerable.enumerator();
/* 87 */ public void reset() {
/* 88 */ inputEnumerator.reset();
/* 89 */ }
/* 90 */
/* 91 */ public boolean moveNext() {
/* 92 */ return inputEnumerator.moveNext();
/* 93 */ }
/* 94 */
/* 95 */ public void close() {
/* 96 */ inputEnumerator.close();
/* 97 */ }
/* 98 */
/* 99 */ public Object current() {
/* 100 */ final Object[] current = (Object[])
inputEnumerator.current();
/* 101 */ return new Object[] {
/* 102 */ current[5],
/* 103 */ current[6],
/* 104 */ current[7],
/* 105 */ current[8],
/* 106 */ current[0],
/* 107 */ current[1],
/* 108 */ current[2],
/* 109 */ current[3]};
/* 110 */ }
/* 111 */
/* 112 */ };
/* 113 */ }
/* 114 */
/* 115 */ };
/* 116 */ }
/* 117 */
/* 118 */
/* 119 */ public Class getElementType() {
/* 120 */ return java.lang.Object[].class;
/* 121 */ }
/* 122 */
/* 123 */
{code}
Something else I noticed is that why does {{predicate}} show up twice?
Happy to send more details, but thought I'd dump all I have.
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)