[fix](repeat)remove unmaterialized expr from repeat node (#13953)

This commit is contained in:
starocean999
2022-11-07 14:13:05 +08:00
committed by GitHub
parent 7254999f02
commit bb9182d602
3 changed files with 121 additions and 0 deletions

View File

@ -89,7 +89,29 @@ public class GroupingInfo {
}
public void substitutePreRepeatExprs(ExprSubstitutionMap smap, Analyzer analyzer) {
ArrayList<Expr> originalPreRepeatExprs = new ArrayList<>(preRepeatExprs);
preRepeatExprs = Expr.substituteList(preRepeatExprs, smap, analyzer, true);
// remove unmaterialized slotRef from preRepeatExprs
ArrayList<Expr> materializedPreRepeatExprs = new ArrayList<>();
ArrayList<Expr> unMaterializedSlotRefs = new ArrayList<>();
for (int i = 0; i < preRepeatExprs.size(); ++i) {
Expr expr = preRepeatExprs.get(i);
if (expr instanceof SlotRef && !((SlotRef) expr).getDesc().isMaterialized()) {
unMaterializedSlotRefs.add(originalPreRepeatExprs.get(i));
} else {
materializedPreRepeatExprs.add(expr);
}
}
preRepeatExprs = materializedPreRepeatExprs;
// set slotRef unmaterialized in outputTupleSmap
for (Expr expr : unMaterializedSlotRefs) {
Expr rExpr = outputTupleSmap.get(expr);
if (rExpr instanceof SlotRef) {
((SlotRef) rExpr).getDesc().setIsMaterialized(false);
}
}
}
// generate virtual slots for grouping or grouping_id functions

View File

@ -0,0 +1,5 @@
-- This file is automatically generated. You should know what you did if you want to edit this
-- !sql --
1
1

View File

@ -0,0 +1,94 @@
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
suite("test_subquery_grouping") {
sql """
drop table if exists grouping_subquery_table;
"""
sql """
create table grouping_subquery_table ( a int not null, b int not null )
ENGINE=OLAP
DISTRIBUTED BY HASH(a) BUCKETS 1
PROPERTIES (
"replication_allocation" = "tag.location.default: 1",
"in_memory" = "false",
"storage_format" = "V2"
);
"""
sql """
insert into grouping_subquery_table values( 1, 2 );
"""
qt_sql """
SELECT
a
FROM
(
with base_table as (
SELECT
`a`,
sum(`b`) as `sum(b)`
FROM
(
SELECT
inv.a,
sum(inv.b) as b
FROM
grouping_subquery_table inv
group by
inv.a
) T
GROUP BY
`a`
),
grouping_sum_table as (
select
`a`,
sum(`sum(b)`) as `sum(b)`
from
base_table
group by
grouping sets (
(`base_table`.`a`)
)
)
select
*
from
(
select
`a`,
`sum(b)`
from
base_table
union all
select
`a`,
`sum(b)`
from
grouping_sum_table
) T
) T2;
"""
sql """
drop table if exists grouping_subquery_table;
"""
}