You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@calcite.apache.org by "godfrey he (JIRA)" <ji...@apache.org> on 2018/01/07 06:14:00 UTC
[jira] [Created] (CALCITE-2125) error plan result that using
AggregateExpandDistinctAggregatesRule.INSTANCE and
AggregateProjectMergeRule.INSTANCE
godfrey he created CALCITE-2125:
-----------------------------------
Summary: error plan result that using AggregateExpandDistinctAggregatesRule.INSTANCE and AggregateProjectMergeRule.INSTANCE
Key: CALCITE-2125
URL: https://issues.apache.org/jira/browse/CALCITE-2125
Project: Calcite
Issue Type: Bug
Components: core
Affects Versions: 1.15.0
Reporter: godfrey he
Assignee: Julian Hyde
test case:
{code}
@Test public void testDistinctCount0() {
final HepProgram program = HepProgram.builder()
.addRuleInstance(AggregateExpandDistinctAggregatesRule.INSTANCE)
.addRuleInstance(AggregateProjectMergeRule.INSTANCE)
.build();
checkPlanning(program,
"select type, count(distinct acctno), sum(distinct balance)"
+ " from customer.account group by type");
}
{code}
current result:
{code}
<TestCase name="testDistinctCount0">
<Resource name="sql">
<![CDATA[select type, count(distinct acctno) from customer.account group by type]]>
</Resource>
<Resource name="planBefore">
<![CDATA[
LogicalAggregate(group=[{0}], EXPR$1=[COUNT(DISTINCT $1)], EXPR$2=[SUM(DISTINCT $2)])
LogicalProject(TYPE=[$1], ACCTNO=[$0], BALANCE=[$2])
LogicalTableScan(table=[[CATALOG, CUSTOMER, ACCOUNT]])
]]>
</Resource>
<Resource name="planAfter">
<![CDATA[
LogicalProject(TYPE=[$0], EXPR$1=[$1], EXPR$2=[CAST($2):INTEGER NOT NULL])
LogicalAggregate(group=[{0}], EXPR$1=[COUNT($1) FILTER $3], EXPR$2=[SUM($2) FILTER $4])
LogicalProject(TYPE=[$0], ACCTNO=[$1], BALANCE=[$2], $g_1=[=($3, 1)], $g_2=[=($3, 2)])
LogicalProject(TYPE=[$1], ACCTNO=[$0], BALANCE=[$2], $g=[$3])
LogicalAggregate(group=[{0, 1, 2}], groups=[[{0, 1}, {1, 2}]], $g=[GROUPING($1, $0, $2)])
LogicalTableScan(table=[[CATALOG, CUSTOMER, ACCOUNT]])
]]>
</Resource>
</TestCase>
{code}
However, the result plan is wrong.
first, if we only use *AggregateExpandDistinctAggregatesRule.INSTANCE* to optimize the query, the result plan is correct:
{code}
@Test public void testDistinctCount0() {
final HepProgram program = HepProgram.builder()
.addRuleInstance(AggregateExpandDistinctAggregatesRule.INSTANCE)
//.addRuleInstance(AggregateProjectMergeRule.INSTANCE)
.build();
checkPlanning(program,
"select type, count(distinct acctno), sum(distinct balance)"
+ " from customer.account group by type");
}
LogicalProject(TYPE=[$0], EXPR$1=[$1], EXPR$2=[CAST($2):INTEGER NOT NULL])
LogicalAggregate(group=[{0}], EXPR$1=[COUNT($1) FILTER $3], EXPR$2=[SUM($2) FILTER $4])
LogicalProject(TYPE=[$0], ACCTNO=[$1], BALANCE=[$2], $g_1=[=($3, 1)], $g_2=[=($3, 2)])
LogicalAggregate(group=[{0, 1, 2}], groups=[[{0, 1}, {0, 2}]], $g=[GROUPING($0, $1, $2)])
LogicalProject(TYPE=[$1], ACCTNO=[$0], BALANCE=[$2])
LogicalTableScan(table=[[CATALOG, CUSTOMER, ACCOUNT]])
{code}
then *AggregateProjectMergeRule.INSTANCE* is added, it will change the sub-plan from
{code}
LogicalAggregate(group=[{0, 1, 2}], groups=[[{0, 1}, {0, 2}]], $g=[GROUPING($0, $1, $2)])
LogicalProject(TYPE=[$1], ACCTNO=[$0], BALANCE=[$2])
{code}
to
{code}
LogicalAggregate(group=[{0, 1, 2}], groups=[[{0, 1}, {1, 2}]], $g=[GROUPING($1, $0, $2)])
{code}
Notes that the groups was changed from {code} groups=[[{0, 1}, {0, 2}]] {code} to
{code} groups=[[{0, 1}, {1, 2}]] {code}, but the filter values generated by *groupValue* in *AggregateExpandDistinctAggregatesRule* are not changed in node:
{code}
LogicalProject(TYPE=[$0], ACCTNO=[$1], BALANCE=[$2], $g_1=[=($3, 1)], $g_2=[=($3, 2)])
{code}
{code}
// filter values before AggregateProjectMergeRule added
AggregateExpandDistinctAggregatesRule.groupValue(ImmutableBitSet.of(0,1,2), ImmutableBitSet.of(0,1)); is 1
AggregateExpandDistinctAggregatesRule.groupValue(ImmutableBitSet.of(0,1,2), ImmutableBitSet.of(0,2)); is 2
// filter values after AggregateProjectMergeRule added
AggregateExpandDistinctAggregatesRule.groupValue(ImmutableBitSet.of(1,0,2), ImmutableBitSet.of(0,1)); is 1
AggregateExpandDistinctAggregatesRule.groupValue(ImmutableBitSet.of(1,0,2), ImmutableBitSet.of(1,2)); is 4
{code}
--
This message was sent by Atlassian JIRA
(v6.4.14#64029)