[Feature](Nereids): support cte for update and delete statements of Nereids (#23384)
This commit is contained in:
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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(),
|
||||
|
||||
@ -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);
|
||||
|
||||
Reference in New Issue
Block a user