[Feature](Nereids): support cte for update and delete statements of Nereids (#23384)

This commit is contained in:
mch_ucchi
2023-08-31 23:36:27 +08:00
committed by GitHub
parent c74ca15753
commit 52e645abd2
9 changed files with 275 additions and 13 deletions

View File

@ -45,11 +45,11 @@ statement
(WITH LABEL labelName=identifier)? cols=identifierList? // label and columns define
(LEFT_BRACKET hints=identifierSeq RIGHT_BRACKET)? // hint define
query #insertIntoQuery
| explain? UPDATE tableName=multipartIdentifier tableAlias
| explain? cte? UPDATE tableName=multipartIdentifier tableAlias
SET updateAssignmentSeq
fromClause?
whereClause #update
| explain? DELETE FROM tableName=multipartIdentifier tableAlias
| explain? cte? DELETE FROM tableName=multipartIdentifier tableAlias
(PARTITION partition=identifierList)?
(USING relation (COMMA relation)*)
whereClause #delete

View File

@ -394,8 +394,12 @@ public class LogicalPlanBuilder extends DorisParserBaseVisitor<Object> {
if (ctx.tableAlias().strictIdentifier() != null) {
tableAlias = ctx.tableAlias().getText();
}
Optional<LogicalPlan> cte = Optional.empty();
if (ctx.cte() != null) {
cte = Optional.ofNullable(withCte(query, ctx.cte()));
}
return withExplain(new UpdateCommand(visitMultipartIdentifier(ctx.tableName), tableAlias,
visitUpdateAssignmentSeq(ctx.updateAssignmentSeq()), query), ctx.explain());
visitUpdateAssignmentSeq(ctx.updateAssignmentSeq()), query, cte), ctx.explain());
}
@Override
@ -412,8 +416,11 @@ public class LogicalPlanBuilder extends DorisParserBaseVisitor<Object> {
if (ctx.tableAlias().strictIdentifier() != null) {
tableAlias = ctx.tableAlias().getText();
}
return withExplain(new DeleteCommand(tableName, tableAlias, partitions, query),
ctx.explain());
Optional<LogicalPlan> cte = Optional.empty();
if (ctx.cte() != null) {
cte = Optional.ofNullable(withCte(query, ctx.cte()));
}
return withExplain(new DeleteCommand(tableName, tableAlias, partitions, query, cte), ctx.explain());
}
@Override

View File

@ -53,17 +53,19 @@ public class DeleteCommand extends Command implements ForwardWithSync, Explainab
private final List<String> partitions;
private LogicalPlan logicalQuery;
private OlapTable targetTable;
private final Optional<LogicalPlan> cte;
/**
* constructor
*/
public DeleteCommand(List<String> nameParts, String tableAlias, List<String> partitions,
LogicalPlan logicalQuery) {
LogicalPlan logicalQuery, Optional<LogicalPlan> cte) {
super(PlanType.DELETE_COMMAND);
this.nameParts = Utils.copyRequiredList(nameParts);
this.tableAlias = tableAlias;
this.partitions = Utils.copyRequiredList(partitions);
this.logicalQuery = logicalQuery;
this.cte = cte;
}
@Override
@ -110,13 +112,13 @@ public class DeleteCommand extends Command implements ForwardWithSync, Explainab
}
logicalQuery = new LogicalProject<>(selectLists, logicalQuery);
boolean isPartialUpdate = false;
if (targetTable.getEnableUniqueKeyMergeOnWrite()
&& cols.size() < targetTable.getColumns().size()) {
isPartialUpdate = true;
if (cte.isPresent()) {
logicalQuery = ((LogicalPlan) cte.get().withChildren(logicalQuery));
}
boolean isPartialUpdate = targetTable.getEnableUniqueKeyMergeOnWrite()
&& cols.size() < targetTable.getColumns().size();
// make UnboundTableSink
return new UnboundOlapTableSink<>(nameParts, cols, ImmutableList.of(),
partitions, isPartialUpdate, logicalQuery);

View File

@ -71,17 +71,19 @@ public class UpdateCommand extends Command implements ForwardWithSync, Explainab
private final @Nullable String tableAlias;
private final LogicalPlan logicalQuery;
private OlapTable targetTable;
private final Optional<LogicalPlan> cte;
/**
* constructor
*/
public UpdateCommand(List<String> nameParts, @Nullable String tableAlias, List<EqualTo> assignments,
LogicalPlan logicalQuery) {
LogicalPlan logicalQuery, Optional<LogicalPlan> cte) {
super(PlanType.UPDATE_COMMAND);
this.nameParts = Utils.copyRequiredList(nameParts);
this.assignments = Utils.copyRequiredList(assignments);
this.tableAlias = tableAlias;
this.logicalQuery = Objects.requireNonNull(logicalQuery, "logicalQuery is required in update command");
this.cte = cte;
}
@Override
@ -117,6 +119,9 @@ public class UpdateCommand extends Command implements ForwardWithSync, Explainab
}
logicalQuery = new LogicalProject<>(selectItems, logicalQuery);
if (cte.isPresent()) {
logicalQuery = ((LogicalPlan) cte.get().withChildren(logicalQuery));
}
// make UnboundTableSink
return new UnboundOlapTableSink<>(nameParts, ImmutableList.of(), ImmutableList.of(),

View File

@ -70,7 +70,7 @@ public class DeleteCommandTest extends TestWithFeService implements PlanPatternM
}
@Test
public void testFromClauseUpdate() throws AnalysisException {
public void testFromClauseDelete() throws AnalysisException {
String sql = "delete from t1 a using src join t2 on src.k1 = t2.k1 where t2.k1 = a.k1";
LogicalPlan parsed = new NereidsParser().parseSingle(sql);
Assertions.assertTrue(parsed instanceof DeleteCommand);