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

Ruben Q L updated CALCITE-6087:
-------------------------------
    Description: 
Performing a MAX on an empty table (or on a table where we apply a filter which 
does not return any value) shall return NULL, we can verify this with our 
"standard" {{EnumerableAggregate}} operator:
{code:java}
  @Test void enumerableAggregateOnEmptyInput() {
    tester(false, new HrSchema())
        .query("select max(deptno) as m from emps where deptno>100")
        .explainContains(
            "EnumerableAggregate(group=[{}], m=[MAX($1)])\n"
            + "  EnumerableCalc(expr#0..4=[{inputs}], expr#5=[100], 
expr#6=[>($t1, $t5)], proj#0..4=[{exprs}], $condition=[$t6])\n"
            + "    EnumerableTableScan(table=[[s, emps]])")
        .returnsOrdered("m=null");
  }
{code}
However, if we use {{Hook.PLANNER}} to force the aggregation to be implemented 
via {{EnumerableSortedAggregate}} on the same query:
{code:java}
  @Test void enumerableSortedAggregateOnEmptyInput() {
    tester(false, new HrSchema())
        .query("select max(deptno) as m from emps where deptno>100")
        .withHook(Hook.PLANNER, (Consumer<RelOptPlanner>) planner -> {
          planner.removeRule(EnumerableRules.ENUMERABLE_AGGREGATE_RULE);
          planner.addRule(EnumerableRules.ENUMERABLE_SORTED_AGGREGATE_RULE);
        })
        .explainContains(
            "EnumerableSortedAggregate(group=[{}], m=[MAX($1)])\n"
            + "  EnumerableCalc(expr#0..4=[{inputs}], expr#5=[100], 
expr#6=[>($t1, $t5)], proj#0..4=[{exprs}], $condition=[$t6])\n"
            + "    EnumerableTableScan(table=[[s, emps]])")
        .returnsOrdered("m=null");
  }
{code}
It fails, because the {{EnumerableSortedAggregate}} returns an empty result set 
rather than NULL:
{noformat}
java.lang.AssertionError: 
Expected: "m=null"
     but: was ""
{noformat}

  was:
Performing a MAX on an empty table (or on a table where we apply a filter which 
does not return any value) shall return NULL, we can verify this with our 
"standard" {{EnumerableAggregate}} operator:
{code:java}
  @Test void enumerableAggregateOnEmptyInput() {
    tester(false, new HrSchema())
        .query("select max(deptno) as m from emps where deptno>100")
        .explainContains(
            "EnumerableAggregate(group=[{}], m=[MAX($1)])\n"
            + "  EnumerableCalc(expr#0..4=[{inputs}], expr#5=[100], 
expr#6=[>($t1, $t5)], proj#0..4=[{exprs}], $condition=[$t6])\n"
            + "    EnumerableTableScan(table=[[s, emps]])")
        .returnsOrdered("m=null");
  }
{code}
However, if we use {{Hook.PLANNER}} to force the aggregation to be implemented 
via {{EnumerableSortedAggregate}} on the same query:
{code:java}
  @Test void enumerableSortedAggregateOnEmptyInput() {
    tester(false, new HrSchema())
        .query("select max(deptno) as m from emps where deptno>100")
        .withHook(Hook.PLANNER, (Consumer<RelOptPlanner>) planner -> {
          planner.removeRule(EnumerableRules.ENUMERABLE_AGGREGATE_RULE);
          planner.addRule(EnumerableRules.ENUMERABLE_SORTED_AGGREGATE_RULE);
        })
        .explainContains(
            "EnumerableSortedAggregate(group=[{}], m=[MAX($1)])\n"
            + "  EnumerableCalc(expr#0..4=[{inputs}], expr#5=[100], 
expr#6=[>($t1, $t5)], proj#0..4=[{exprs}], $condition=[$t6])\n"
            + "    EnumerableTableScan(table=[[s, emps]])")
        .returnsOrdered("m=null");
  }
{code}
It fails, because the EnumerableSortedAggregate returns an empty result set 
rather than NULL:
{noformat}
java.lang.AssertionError: 
Expected: "m=null"
     but: was ""
{noformat}


> EnumerableSortedAggregate returns incorrect result when input is empty
> ----------------------------------------------------------------------
>
>                 Key: CALCITE-6087
>                 URL: https://issues.apache.org/jira/browse/CALCITE-6087
>             Project: Calcite
>          Issue Type: Bug
>          Components: core
>    Affects Versions: 1.35.0
>            Reporter: Ruben Q L
>            Priority: Major
>
> Performing a MAX on an empty table (or on a table where we apply a filter 
> which does not return any value) shall return NULL, we can verify this with 
> our "standard" {{EnumerableAggregate}} operator:
> {code:java}
>   @Test void enumerableAggregateOnEmptyInput() {
>     tester(false, new HrSchema())
>         .query("select max(deptno) as m from emps where deptno>100")
>         .explainContains(
>             "EnumerableAggregate(group=[{}], m=[MAX($1)])\n"
>             + "  EnumerableCalc(expr#0..4=[{inputs}], expr#5=[100], 
> expr#6=[>($t1, $t5)], proj#0..4=[{exprs}], $condition=[$t6])\n"
>             + "    EnumerableTableScan(table=[[s, emps]])")
>         .returnsOrdered("m=null");
>   }
> {code}
> However, if we use {{Hook.PLANNER}} to force the aggregation to be 
> implemented via {{EnumerableSortedAggregate}} on the same query:
> {code:java}
>   @Test void enumerableSortedAggregateOnEmptyInput() {
>     tester(false, new HrSchema())
>         .query("select max(deptno) as m from emps where deptno>100")
>         .withHook(Hook.PLANNER, (Consumer<RelOptPlanner>) planner -> {
>           planner.removeRule(EnumerableRules.ENUMERABLE_AGGREGATE_RULE);
>           planner.addRule(EnumerableRules.ENUMERABLE_SORTED_AGGREGATE_RULE);
>         })
>         .explainContains(
>             "EnumerableSortedAggregate(group=[{}], m=[MAX($1)])\n"
>             + "  EnumerableCalc(expr#0..4=[{inputs}], expr#5=[100], 
> expr#6=[>($t1, $t5)], proj#0..4=[{exprs}], $condition=[$t6])\n"
>             + "    EnumerableTableScan(table=[[s, emps]])")
>         .returnsOrdered("m=null");
>   }
> {code}
> It fails, because the {{EnumerableSortedAggregate}} returns an empty result 
> set rather than NULL:
> {noformat}
> java.lang.AssertionError: 
> Expected: "m=null"
>      but: was ""
> {noformat}



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

Reply via email to