[ https://issues.apache.org/jira/browse/IGNITE-20164?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Maksim Zhuravkov reassigned IGNITE-20164: ----------------------------------------- Assignee: Maksim Zhuravkov > Sql. Incorrect propagation of RelCollation trait for Sort-based map/reduce > aggregates. > -------------------------------------------------------------------------------------- > > Key: IGNITE-20164 > URL: https://issues.apache.org/jira/browse/IGNITE-20164 > Project: Ignite > Issue Type: Bug > Components: sql > Affects Versions: 3.0.0-beta1 > Reporter: Maksim Zhuravkov > Assignee: Maksim Zhuravkov > Priority: Major > Labels: ignite-3 > > RelCollation propagation does not take into account remapping of group keys > between MAP/REDUCE phases, hence causes errors in queries that are expected > to use sort-based MAP/REDUCE - RelCollation uses the same keys on both > phases. Example: > {code:java} > String[] rules = { > "MapReduceHashAggregateConverterRule", > "ColocatedHashAggregateConverterRule", > "ColocatedSortAggregateConverterRule" > }; > sql("CREATE TABLE testMe40 (a INTEGER, b INTEGER);"); > sql("INSERT INTO testMe40 VALUES (11, 2), (12, 2), (12, 3)"); > assertQuery("SELECT COUNT(a), COUNT(DISTINCT(b)) FROM testMe40") > .disableRules(rules) > .returns(3L, 2L) > .check(); > {code} > Plan: > {code:java} > IgniteProject(EXPR$0=[CAST($0):BIGINT NOT NULL], EXPR$1=[$1]), > IgniteReduceSortAggregate(group=[{}], EXPR$0=[$SUM0($1)], > EXPR$1=[COUNT($0)], collation=[[]]), > IgniteMapSortAggregate(group=[{}], EXPR$0=[$SUM0($1)], > EXPR$1=[COUNT($0)], collation=[[]]), > IgniteReduceSortAggregate(group=[{1}], EXPR$0=[COUNT($0)], > collation=[[1]]), <---- HERE > IgniteExchange(distribution=[single]), > IgniteMapSortAggregate(group=[{1}], EXPR$0=[COUNT($0)], > collation=[[1]]), > IgniteSort(sort0=[$1], dir0=[ASC]), > IgniteTableScan(table=[[PUBLIC, TESTME40]], > requiredColumns=[{1, 2}]), > {code} > Error: > {code:java} > Caused by: java.lang.ClassCastException: class java.util.ArrayList cannot be > cast to class java.lang.Comparable (java.util.ArrayList and > java.lang.Comparable are in module java.base of loader 'bootstrap') > at > org.apache.ignite.internal.sql.engine.exec.exp.ExpressionFactoryImpl.compare(ExpressionFactoryImpl.java:247) > at > org.apache.ignite.internal.sql.engine.exec.exp.ExpressionFactoryImpl.lambda$comparator$0(ExpressionFactoryImpl.java:178) > at > java.base/java.util.Map$Entry.lambda$comparingByKey$6d558cbf$1(Map.java:539) > at > java.base/java.util.PriorityQueue.siftUpUsingComparator(PriorityQueue.java:675) > at java.base/java.util.PriorityQueue.siftUp(PriorityQueue.java:652) > at java.base/java.util.PriorityQueue.offer(PriorityQueue.java:345) > at > org.apache.ignite.internal.sql.engine.exec.rel.Inbox.pushOrdered(Inbox.java:235) > at > org.apache.ignite.internal.sql.engine.exec.rel.Inbox.push(Inbox.java:188) > at > org.apache.ignite.internal.sql.engine.exec.rel.Inbox.onBatchReceived(Inbox.java:168) > at > org.apache.ignite.internal.sql.engine.exec.ExchangeServiceImpl.onMessage(ExchangeServiceImpl.java:184) > ... 7 more > {code} > The query below works because position of column b does not change after MAP > phase. > {code:java} > String[] rules = { > "MapReduceHashAggregateConverterRule", > "ColocatedHashAggregateConverterRule", > "ColocatedSortAggregateConverterRule" > }; > sql("CREATE TABLE testMe40 (a INTEGER, b INTEGER);"); > sql("INSERT INTO testMe40 VALUES (11, 2), (12, 2), (12, 3)"); > assertQuery("SELECT COUNT(a), COUNT(DISTINCT(b)) FROM testMe40") > .disableRules(rules) > .returns(3L, 2L) > .check(); > {code} > Plan: > {code:java} > IgniteProject(EXPR$0=[$0], EXPR$1=[CAST($1):BIGINT NOT NULL]), > IgniteReduceSortAggregate(group=[{}], EXPR$0=[COUNT($0)], > EXPR$1=[$SUM0($1)], collation=[[]]), > IgniteMapSortAggregate(group=[{}], EXPR$0=[COUNT($0)], > EXPR$1=[$SUM0($1)], collation=[[]]), > IgniteReduceSortAggregate(group=[{0}], EXPR$1=[COUNT($1)], > collation=[[0]]), > IgniteExchange(distribution=[single]), > IgniteMapSortAggregate(group=[{0}], EXPR$1=[COUNT($1)], > collation=[[0]]), > IgniteSort(sort0=[$0], dir0=[ASC]), > IgniteTableScan(table=[[PUBLIC, TESTME40]], projects=[[$t1, > $t0]], requiredColumns=[{1, 2}]), > {code} -- This message was sent by Atlassian Jira (v8.20.10#820010)