[Fix](Nereids) fix leading with cte and same subqueryalias name (#34838) (#35047)

fix leading with cte and same subqueryalias name
Example:
with tbl1 as select t1.c1 from t1
select tbl2.c2 from (select / * + leading(t2 tbl1) * / tbl1.c1, t2.c2 from tbl1 join t2) as tbl2 join t3;
Reason:
in this case, before getting analyzed preprocess would change subquery tbl2 to cte plan, and this cte plan should be in upper level cte plan, but not in logical result sink plan
This commit is contained in:
LiBinfeng
2024-05-20 10:44:22 +08:00
committed by GitHub
parent 5ac4ea2cd9
commit be50139eb1
5 changed files with 2056 additions and 2 deletions

View File

@ -79,6 +79,15 @@ public class PullUpSubqueryAliasToCTE extends PlanPreprocessor {
subQueryAlias = new LogicalSubQueryAlias<>(subQueryAlias.getAlias(), newSubQueryAlias);
}
}
return visitChildren(this, logicalCTE, context);
Plan cte = visitChildren(this, logicalCTE, context);
if (!aliasQueries.isEmpty()) {
LogicalCTE newLogicalCTE = (LogicalCTE) cte;
List<LogicalSubQueryAlias<Plan>> subQueryAliasesOfCte = new ArrayList<>();
subQueryAliasesOfCte.addAll(logicalCTE.getAliasQueries());
subQueryAliasesOfCte.addAll(aliasQueries);
aliasQueries = new ArrayList<>();
return new LogicalCTE<>(subQueryAliasesOfCte, (LogicalPlan) newLogicalCTE.child());
}
return cte;
}
}

View File

@ -254,7 +254,7 @@ PhysicalResultSink
----------------PhysicalOlapScan[t1]
Hint log:
Used: leading(t2 t1 ) leading(t2 t1 ) leading(t2 t1 ) leading(t3 alias1 cte )
Used: leading(t2 t1 ) leading(t2 t1 ) leading(t3 alias1 cte )
UnUsed:
SyntaxError:

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -79,6 +79,24 @@ suite("fix_leading") {
time 10000
}
streamLoad {
table "t5"
db "fix_leading"
set 'column_separator', '|'
set 'format', 'csv'
file 't5.csv'
time 10000
}
streamLoad {
table "t6"
db "fix_leading"
set 'column_separator', '|'
set 'format', 'csv'
file 't6.csv'
time 10000
}
// bug fix 1: {t1 t2}{t3 t4} miss levels
qt_select1 """explain shape plan select /*+ leading({t1 t2}{t3 t4}) */ * from t1 join t2 on c2 = c2 join t3 on c1 = c3 join t4 on c1 = c4;"""
@ -222,4 +240,31 @@ suite("fix_leading") {
5;"""
contains("Used: leading({ tbl2 tbl3 } tbl1 )")
}
// check cte as input in alias leading query
explain {
sql """shape plan WITH tbl1 AS (
SELECT
tbl1.c1 AS c111,
tbl2.c2 as c222
FROM
t1 AS tbl1
RIGHT JOIN t2 AS tbl2 ON tbl1.c1 = tbl2.c2
)
SELECT
tbl3.c3,
tbl2.c2
FROM
(
SELECT
/*+ leading( tbl2 tbl1 ) */
tbl1.c111 AS c1,
tbl2.c2 AS c2
FROM
t2 AS tbl2
JOIN tbl1 ON tbl2.c2 = tbl1.c111
) AS tbl2
RIGHT JOIN t3 AS tbl3 ON tbl2.c2 = tbl3.c3;"""
contains("Used: leading(tbl2 tbl1 )")
}
}