[fix](repeat)remove unmaterialized expr from repeat node (#13953)
This commit is contained in:
@ -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
|
||||
|
||||
@ -0,0 +1,5 @@
|
||||
-- This file is automatically generated. You should know what you did if you want to edit this
|
||||
-- !sql --
|
||||
1
|
||||
1
|
||||
|
||||
@ -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;
|
||||
"""
|
||||
}
|
||||
Reference in New Issue
Block a user