You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@calcite.apache.org by "Julian Hyde (JIRA)" <ji...@apache.org> on 2016/10/24 21:05:58 UTC

[jira] [Updated] (CALCITE-1212) Cassandra Projections throw an NPE on a join with another non-cassandra table

     [ https://issues.apache.org/jira/browse/CALCITE-1212?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Julian Hyde updated CALCITE-1212:
---------------------------------
    Fix Version/s: 1.8.0

> 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
>          Components: cassandra
>    Affects Versions: 1.7.0
>            Reporter: Dan Di Spaltro
>            Assignee: Michael Mior
>            Priority: Minor
>             Fix For: 1.8.0
>
>
> 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)