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

Konstantin Orlov updated IGNITE-14588:
--------------------------------------
    Component/s: sql

> Calcite integration. Wrong processing of nested aggregates
> ----------------------------------------------------------
>
>                 Key: IGNITE-14588
>                 URL: https://issues.apache.org/jira/browse/IGNITE-14588
>             Project: Ignite
>          Issue Type: Bug
>          Components: sql
>            Reporter: Aleksey Plekhanov
>            Assignee: Aleksey Plekhanov
>            Priority: Major
>          Time Spent: 20m
>  Remaining Estimate: 0h
>
> The wrong plan is created when nested aggregates are used. 
> For example, this query: 
> {{SELECT avg(salary) FROM (SELECT avg(salary) as salary FROM employer UNION 
> ALL SELECT salary FROM employer)}}
> Generates such a plan:
> {noformat}
> IgniteReduceHashAggregate(group=[{}], AVG(SALARY)=[AVG($0)])
>   IgniteExchange(distribution=[single])
>     IgniteMapHashAggregate(group=[{}], AVG(SALARY)=[AVG($0)])
>       IgniteUnionAll(all=[true])
>         IgniteSingleHashAggregate(group=[{}], SALARY=[AVG($0)])
>           IgniteIndexScan(table=[[PUBLIC, EMPLOYER]], index=[_key_PK], 
> requiredColumns=[{3}])
>         IgniteIndexScan(table=[[PUBLIC, EMPLOYER]], index=[_key_PK], 
> requiredColumns=[{3}])
> {noformat}
> With this plan, in subquery data is aggregated locally on nodes and can 
> produce the wrong results.
> For example:
> {code:java}
>     @Test
>     public void aggregateNested() throws Exception {
>         String cacheName = "employer";
>         IgniteCache<Integer, Employer> employer = client.getOrCreateCache(new 
> CacheConfiguration<Integer, Employer>()
>             .setName(cacheName)
>             .setSqlSchema("PUBLIC")
>             .setIndexedTypes(Integer.class, Employer.class)
>             .setBackups(2)
>         );
>         awaitPartitionMapExchange(true, true, null);
>         List<Integer> keysNode0 = primaryKeys(grid(0).cache(cacheName), 2);
>         List<Integer> keysNode1 = primaryKeys(grid(1).cache(cacheName), 1);
>         employer.putAll(ImmutableMap.of(
>             keysNode0.get(0), new Employer("Igor", 1d),
>             keysNode0.get(1), new Employer("Roman", 2d) ,
>             keysNode1.get(0), new Employer("Nikolay", 3d)
>         ));
>         QueryEngine engine = Commons.lookupComponent(grid(1).context(), 
> QueryEngine.class);
>         List<FieldsQueryCursor<List<?>>> qry = engine.query(null, "PUBLIC",
>             "SELECT avg(salary) FROM " +
>                 "(SELECT avg(salary) as salary FROM employer UNION ALL SELECT 
> salary FROM employer)");
>         assertEquals(1, qry.size());
>         List<List<?>> rows = qry.get(0).getAll();
>         assertEquals(1, rows.size());
>         assertEquals(2d, F.first(F.first(rows)));
>     }
> {code}
> With this reproducer we should get 2 as a result (avg(1, 2, 3) = 2, avg(2, 1, 
> 2, 3) = 2), but actual result is 2.1 (avg(1, 2) = 1.5, avg (3) = 3, avg(1.5, 
> 3, 1, 2, 3) = 2.1).
> Root cause: default {{passThroughDistribution}} is not suitable for "reduce 
> aggregate" and "single aggregate" nodes.



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to