[ 
https://issues.apache.org/jira/browse/CALCITE-5632?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17709955#comment-17709955
 ] 

Kirill Kim edited comment on CALCITE-5632 at 4/9/23 1:05 PM:
-------------------------------------------------------------

i have this code in debug with option  -Dcalcite.debug=true
{code:java}
/*   1 */ public org.apache.calcite.linq4j.Enumerable bind(final 
org.apache.calcite.DataContext root) {
/*   2 */   java.util.List accumulatorAdders = new java.util.LinkedList();
/*   3 */   org.apache.calcite.adapter.enumerable.AggregateLambdaFactory 
lambdaFactory = new 
org.apache.calcite.adapter.enumerable.BasicAggregateLambdaFactory(
/*   4 */     new org.apache.calcite.linq4j.function.Function0() {
/*   5 */       public Object apply()
{ /*   6 */         return org.apache.calcite.runtime.Unit.INSTANCE; /*   7 */  
     }
/*   8 */     }
/*   9 */ ,
/*  10 */     accumulatorAdders);
/*  11 */   final org.apache.calcite.linq4j.Enumerable _inputEnumerable = 
org.apache.calcite.schema.Schemas.enumerable((org.apache.calcite.schema.ScannableTable)
 root.getRootSchema().getSubSchema("INFOSET").getTable("SUBEKT"), 
root).groupBy(new org.apache.calcite.linq4j.function.Function1() {
/*  12 */     public java.util.List apply(Object[] a0)
{ /*  13 */       return org.apache.calcite.runtime.FlatLists.of(a0[3] == null 
? (String) null : a0[3].toString(), a0[11] == null ? (String) null : 
a0[11].toString()); /*  14 */     }
/*  15 */     public Object apply(Object a0)
{ /*  16 */       return apply( /*  17 */         (Object[]) a0); /*  18 */     
}
/*  19 */   }
/*  20 */   , lambdaFactory.accumulatorInitializer(), 
lambdaFactory.accumulatorAdder(), lambdaFactory.resultSelector(new 
org.apache.calcite.linq4j.function.Function2() {
/*  21 */     public Object[] 
apply(org.apache.calcite.runtime.FlatLists.ComparableList key, 
org.apache.calcite.runtime.Unit acc) {
/*  22 */       return new Object[]
{ /*  23 */           key.get(0) == null ? (String) null : 
key.get(0).toString(), /*  24 */           key.get(1) == null ? (String) null : 
key.get(1).toString()}
;
/*  25 */     }
/*  26 */     public Object[] apply(Object key, Object acc)
{ /*  27 */       return apply( /*  28 */         
(org.apache.calcite.runtime.FlatLists.ComparableList) key, /*  29 */         
(org.apache.calcite.runtime.Unit) acc); /*  30 */     }
/*  31 */   }
/*  32 */   ));
/*  33 */   final org.apache.calcite.linq4j.AbstractEnumerable child = new 
org.apache.calcite.linq4j.AbstractEnumerable(){
/*  34 */     public org.apache.calcite.linq4j.Enumerator enumerator() {
/*  35 */       return new org.apache.calcite.linq4j.Enumerator(){
/*  36 */           public final org.apache.calcite.linq4j.Enumerator 
inputEnumerator = _inputEnumerable.enumerator();
/*  37 */           public void reset()
{ /*  38 */             inputEnumerator.reset(); /*  39 */           }
/*  40 */ 
/*  41 */           public boolean moveNext()
{ /*  42 */             return inputEnumerator.moveNext(); /*  43 */           }
/*  44 */ 
/*  45 */           public void close()
{ /*  46 */             inputEnumerator.close(); /*  47 */           }
/*  48 */ 
/*  49 */           public Object current() {
/*  50 */             final Object[] current = (Object[]) 
inputEnumerator.current();
/*  51 */             final Object input_value = current[1];
/*  52 */             final Object input_value0 = current[0];
/*  53 */             return new Object[]
{ /*  54 */                 input_value, /*  55 */                 input_value0}
;
/*  56 */           }
/*  57 */ 
/*  58 */         };
/*  59 */     }
/*  60 */ 
/*  61 */   };
/*  62 */   final java.util.Comparator comparator = new java.util.Comparator(){
/*  63 */     public int compare(Object[] v0, Object[] v1) {
/*  64 */       int c;
/*  65 */       c = org.apache.calcite.runtime.Utilities.compare(v0[0] == null 
? (String) null : v0[0].toString(), v1[0] == null ? (String) null : 
v1[0].toString());
/*  66 */       if (c != 0)
{ /*  67 */         return c; /*  68 */       }
/*  69 */       c = org.apache.calcite.runtime.Utilities.compare(v0[1] == null 
? (String) null : v0[1].toString(), v1[1] == null ? (String) null : 
v1[1].toString());
/*  70 */       if (c != 0)
{ /*  71 */         return c; /*  72 */       }
/*  73 */       return 0;
/*  74 */     }
/*  75 */ 
/*  76 */     public int compare(Object o0, Object o1)
{ /*  77 */       return this.compare((Object[]) o0, (Object[]) o1); /*  78 */  
   }
/*  79 */ 
/*  80 */   };
/*  81 */   return 
child.orderBy(org.apache.calcite.linq4j.function.Functions.identitySelector(), 
comparator);
/*  82 */ }
/*  83 */ 
/*  84 */ 
/*  85 */ public Class getElementType()
{ /*  86 */   return java.lang.Object[].class; /*  87 */ }
/*  88 */ 
/*  89 */  {code}
 

and i can see comparing of 2 arrays 

!image-2023-04-09-11-49-05-991.png!

 

and nullpointer in next method 

!image-2023-04-09-11-50-18-796.png!

return v0.compareTo(v1);


was (Author: JIRAUSER299720):
i have this code in debug with option  -Dcalcite.debug=true

/*   1 */ public org.apache.calcite.linq4j.Enumerable bind(final 
org.apache.calcite.DataContext root) {
/*   2 */   java.util.List accumulatorAdders = new java.util.LinkedList();
/*   3 */   org.apache.calcite.adapter.enumerable.AggregateLambdaFactory 
lambdaFactory = new 
org.apache.calcite.adapter.enumerable.BasicAggregateLambdaFactory(
/*   4 */     new org.apache.calcite.linq4j.function.Function0() {
/*   5 */       public Object apply()

{ /*   6 */         return org.apache.calcite.runtime.Unit.INSTANCE; /*   7 */  
     }

/*   8 */     }
/*   9 */ ,
/*  10 */     accumulatorAdders);
/*  11 */   final org.apache.calcite.linq4j.Enumerable _inputEnumerable = 
org.apache.calcite.schema.Schemas.enumerable((org.apache.calcite.schema.ScannableTable)
 root.getRootSchema().getSubSchema("INFOSET").getTable("SUBEKT"), 
root).groupBy(new org.apache.calcite.linq4j.function.Function1() {
/*  12 */     public java.util.List apply(Object[] a0)

{ /*  13 */       return org.apache.calcite.runtime.FlatLists.of(a0[3] == null 
? (String) null : a0[3].toString(), a0[11] == null ? (String) null : 
a0[11].toString()); /*  14 */     }

/*  15 */     public Object apply(Object a0)

{ /*  16 */       return apply( /*  17 */         (Object[]) a0); /*  18 */     
}

/*  19 */   }
/*  20 */   , lambdaFactory.accumulatorInitializer(), 
lambdaFactory.accumulatorAdder(), lambdaFactory.resultSelector(new 
org.apache.calcite.linq4j.function.Function2() {
/*  21 */     public Object[] 
apply(org.apache.calcite.runtime.FlatLists.ComparableList key, 
org.apache.calcite.runtime.Unit acc) {
/*  22 */       return new Object[]

{ /*  23 */           key.get(0) == null ? (String) null : 
key.get(0).toString(), /*  24 */           key.get(1) == null ? (String) null : 
key.get(1).toString()}

;
/*  25 */     }
/*  26 */     public Object[] apply(Object key, Object acc)

{ /*  27 */       return apply( /*  28 */         
(org.apache.calcite.runtime.FlatLists.ComparableList) key, /*  29 */         
(org.apache.calcite.runtime.Unit) acc); /*  30 */     }

/*  31 */   }
/*  32 */   ));
/*  33 */   final org.apache.calcite.linq4j.AbstractEnumerable child = new 
org.apache.calcite.linq4j.AbstractEnumerable(){
/*  34 */     public org.apache.calcite.linq4j.Enumerator enumerator() {
/*  35 */       return new org.apache.calcite.linq4j.Enumerator(){
/*  36 */           public final org.apache.calcite.linq4j.Enumerator 
inputEnumerator = _inputEnumerable.enumerator();
/*  37 */           public void reset()

{ /*  38 */             inputEnumerator.reset(); /*  39 */           }

/*  40 */ 
/*  41 */           public boolean moveNext()

{ /*  42 */             return inputEnumerator.moveNext(); /*  43 */           }

/*  44 */ 
/*  45 */           public void close()

{ /*  46 */             inputEnumerator.close(); /*  47 */           }

/*  48 */ 
/*  49 */           public Object current() {
/*  50 */             final Object[] current = (Object[]) 
inputEnumerator.current();
/*  51 */             final Object input_value = current[1];
/*  52 */             final Object input_value0 = current[0];
/*  53 */             return new Object[]

{ /*  54 */                 input_value, /*  55 */                 input_value0}

;
/*  56 */           }
/*  57 */ 
/*  58 */         };
/*  59 */     }
/*  60 */ 
/*  61 */   };
/*  62 */   final java.util.Comparator comparator = new java.util.Comparator(){
/*  63 */     public int compare(Object[] v0, Object[] v1) {
/*  64 */       int c;
/*  65 */       c = org.apache.calcite.runtime.Utilities.compare(v0[0] == null 
? (String) null : v0[0].toString(), v1[0] == null ? (String) null : 
v1[0].toString());
/*  66 */       if (c != 0)

{ /*  67 */         return c; /*  68 */       }

/*  69 */       c = org.apache.calcite.runtime.Utilities.compare(v0[1] == null 
? (String) null : v0[1].toString(), v1[1] == null ? (String) null : 
v1[1].toString());
/*  70 */       if (c != 0)

{ /*  71 */         return c; /*  72 */       }

/*  73 */       return 0;
/*  74 */     }
/*  75 */ 
/*  76 */     public int compare(Object o0, Object o1)

{ /*  77 */       return this.compare((Object[]) o0, (Object[]) o1); /*  78 */  
   }

/*  79 */ 
/*  80 */   };
/*  81 */   return 
child.orderBy(org.apache.calcite.linq4j.function.Functions.identitySelector(), 
comparator);
/*  82 */ }
/*  83 */ 
/*  84 */ 
/*  85 */ public Class getElementType()

{ /*  86 */   return java.lang.Object[].class; /*  87 */ }

/*  88 */ 
/*  89 */ 

 

and i can see comparing of 2 arrays 

!image-2023-04-09-11-49-05-991.png!

 

and nullpointer in next method 

!image-2023-04-09-11-50-18-796.png!

return v0.compareTo(v1);

> Query with ORDER BY and null values NullPointer exception
> ---------------------------------------------------------
>
>                 Key: CALCITE-5632
>                 URL: https://issues.apache.org/jira/browse/CALCITE-5632
>             Project: Calcite
>          Issue Type: Bug
>          Components: core
>    Affects Versions: 1.34.0
>            Reporter: Kirill Kim
>            Priority: Major
>         Attachments: image-2023-04-09-11-49-05-991.png, 
> image-2023-04-09-11-50-18-796.png
>
>
> I try to perform query over over some table data in Java using Calcite. I try 
> to execute query:
> {code:java}
> select distinct tbl.col1 , tbl.col2 from infoset.SUBEKT tbl order by col1 asc 
> nulls last , col2 asc nulls last{code}
> And the following exception occurs
> {code:java}
> java.lang.NullPointerException at 
> org.apache.calcite.runtime.Utilities.compare(Utilities.java:202) 
> at Baz$2.compare(ANONYMOUS.java:15) 
> at Baz$2.compare(ANONYMOUS.java:27) 
> at java.util.TreeMap.getEntryUsingComparator(TreeMap.java:376) 
> at java.util.TreeMap.getEntry(TreeMap.java:345) 
> at java.util.TreeMap.get(TreeMap.java:278) 
> at 
> org.apache.calcite.linq4j.EnumerableDefaults.toLookup_(EnumerableDefaults.java:3608)
>  
> at 
> org.apache.calcite.linq4j.EnumerableDefaults$14.enumerator(EnumerableDefaults.java:2660)
>  
> at 
> org.apache.calcite.linq4j.AbstractEnumerable.iterator(AbstractEnumerable.java:33)
>  
> at org.apache.calcite.avatica.MetaImpl.createCursor(MetaImpl.java:90) 
> at 
> org.apache.calcite.avatica.AvaticaResultSet.execute(AvaticaResultSet.java:186)
>  
> at org.apache.calcite.jdbc.CalciteResultSet.execute(CalciteResultSet.java:64) 
> at org.apache.calcite.jdbc.CalciteResultSet.execute(CalciteResultSet.java:43) 
> at 
> org.apache.calcite.avatica.AvaticaConnection$1.execute(AvaticaConnection.java:669)
>  
> at 
> org.apache.calcite.jdbc.CalciteMetaImpl.prepareAndExecute(CalciteMetaImpl.java:636)
>  
> at 
> org.apache.calcite.avatica.AvaticaConnection.prepareAndExecuteInternal(AvaticaConnection.java:677)
>  
> at 
> org.apache.calcite.avatica.AvaticaStatement.executeInternal(AvaticaStatement.java:157)
>  
> at 
> org.apache.calcite.avatica.AvaticaStatement.executeQuery(AvaticaStatement.java:228)
>  
> at 
> ru.spi2.modules.infosetquery.InfosetQueryPlugin.executeQuery(InfosetQueryPlugin.java:101)
>  {code}
> The error occurs because col1 has some rows with null values. If I order only 
> by col1 or col2, all works well.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to