> Konstantin, can you log it, please

Yes, sure. Here it is [1]

[1] https://issues.apache.org/jira/browse/CALCITE-4596 
<https://issues.apache.org/jira/browse/CALCITE-4596>

-- 
Regards,
Konstantin Orlov



> On 4 May 2021, at 21:29, Julian Hyde <[email protected]> wrote:
> 
> Regardless of which direction we go (allowing zero-field record types, or 
> disallowing them), Konstantin has found a bug. Konstantin, can you log it, 
> please.
> 
> On 2021/04/29 14:25:27, Konstantin Orlov <[email protected]> wrote: 
>> Hi all.
>> 
>> I faced a problem preventing certain queries being planned because 
>> RelFieldTrimmer throws 
>> an ArrayIndexOutOfBoundsException with message "Index -1 out of bounds for 
>> length 0”.
>> 
>> The problem is here [1]:
>> 
>>    // If they are asking for no fields, we can't give them what they want,
>>    // because zero-column records are illegal. Give them the last field,
>>    // which is unlikely to be a system field.
>>    if (fieldsUsed.isEmpty()) {
>>      fieldsUsed = ImmutableBitSet.range(fieldCount - 1, fieldCount);
>>    }
>> 
>> In case fieldsUsed.isEmpty we returns last field, but it is currently 
>> possible that fieldCount=0 as well.  
>> 
>> After some investigation I find out that the reason is empty record derived 
>> as row type for Aggregate.
>> It is possible when an aggregate has an empty group key and no aggregate 
>> calls.
>> 
>> So the question is whether an empty record is a legal row type for an 
>> aggregation node?
>> 
>> Below is a reproducer for this problem, just put it at RelFieldTrimmerTest:
>> 
>>  @Test void test() {
>>    class ContextImpl implements Context {
>>      final Object target;
>> 
>>      ContextImpl(Object target) {
>>        this.target = Objects.requireNonNull(target, "target");
>>      }
>> 
>>      @Override public <T extends Object> @Nullable T unwrap(Class<T> clazz) {
>>        if (clazz.isInstance(target)) {
>>          return clazz.cast(target);
>>        }
>>        return null;
>>      }
>>    }
>> 
>>    // RelBuilder hides problem when simplifyValues=true, hence we need to 
>> disable it
>>    final RelBuilder builder = RelBuilder.create(config()
>>        .context(new 
>> ContextImpl(RelBuilder.Config.DEFAULT.withSimplifyValues(false))).build());
>> 
>>    final RelNode root =
>>        builder.scan("EMP")
>>            .aggregate(builder.groupKey())
>>            .filter(builder.literal(false))
>>            .project(builder.literal(42))
>>            .build();
>> 
>>    final RelFieldTrimmer fieldTrimmer = new RelFieldTrimmer(null, builder);
>>    fieldTrimmer.trim(root); // fails with ArrayIndexOutOfBoundsException: 
>> Index -1 out of bounds for length 0
>>  }
>> 
>> 
>> [1] 
>> https://github.com/apache/calcite/blob/master/core/src/main/java/org/apache/calcite/sql2rel/RelFieldTrimmer.java#L1197
>> 
>> -- 
>> Regards,
>> Konstantin Orlov
>> 
>> 
>> 
>> 
>> 

Reply via email to