From 688bee7f571f74e4ffa2a06a297e4065585724c3 Mon Sep 17 00:00:00 2001 From: noorall <863485501@qq.com> Date: Thu, 30 Nov 2023 15:19:47 +0800 Subject: [PATCH] [fix] the issue of being unable to delete special tables --- pkg/sql/plan/build_dml_util.go | 42 ++++++++++++++++++++++++---------- 1 file changed, 30 insertions(+), 12 deletions(-) diff --git a/pkg/sql/plan/build_dml_util.go b/pkg/sql/plan/build_dml_util.go index e15a49088985..08c77ec08edc 100644 --- a/pkg/sql/plan/build_dml_util.go +++ b/pkg/sql/plan/build_dml_util.go @@ -269,8 +269,17 @@ func buildDeletePlans(ctx CompilerContext, builder *QueryBuilder, bindCtx *BindC // both UK and SK. To handle SK case, we will have flags to indicate if it's UK or SK. hasUniqueKey := haveUniqueKey(delCtx.tableDef) hasSecondaryKey := haveSecondaryKey(delCtx.tableDef) - if (hasUniqueKey || hasSecondaryKey) && !delCtx.isDeleteWithoutFilters { - uniqueDeleteIdx := len(delCtx.tableDef.Cols) + delCtx.updateColLength + + canTruncate := delCtx.isDeleteWithoutFilters + + if len(delCtx.tableDef.RefChildTbls) > 0 || + delCtx.tableDef.ViewSql != nil || + (util.TableIsClusterTable(delCtx.tableDef.GetTableType()) && ctx.GetAccountId() != catalog.System_Account) || + delCtx.objRef.PubInfo != nil { + canTruncate = false + } + + if (hasUniqueKey || hasSecondaryKey) && !canTruncate { typMap := make(map[string]*plan.Type) posMap := make(map[string]int) for idx, col := range delCtx.tableDef.Cols { @@ -303,17 +312,26 @@ func buildDeletePlans(ctx CompilerContext, builder *QueryBuilder, bindCtx *BindC if uniqueTableDef == nil { return moerr.NewNoSuchTable(builder.GetContext(), delCtx.objRef.SchemaName, indexdef.IndexTableName) } - lastNodeId := appendSinkScanNode(builder, bindCtx, delCtx.sourceStep) - - lastNodeId, err := appendDeleteUniqueTablePlan(builder, bindCtx, uniqueObjRef, uniqueTableDef, indexdef, typMap, posMap, lastNodeId, isUk) - + var lastNodeId int32 + var err error + var uniqueDeleteIdx int + var uniqueTblPkPos int + var uniqueTblPkTyp *Type + + if delCtx.isDeleteWithoutFilters { + lastNodeId, err = appendDeleteUniqueTablePlanWithoutFilters(builder, bindCtx, uniqueObjRef, uniqueTableDef) + uniqueDeleteIdx = getRowIdPos(uniqueTableDef) + uniqueTblPkPos, uniqueTblPkTyp = getPkPos(uniqueTableDef, false) + } else { + lastNodeId = appendSinkScanNode(builder, bindCtx, delCtx.sourceStep) + lastNodeId, err = appendDeleteUniqueTablePlan(builder, bindCtx, uniqueObjRef, uniqueTableDef, indexdef, typMap, posMap, lastNodeId, isUk) + uniqueDeleteIdx = len(delCtx.tableDef.Cols) + delCtx.updateColLength + uniqueTblPkPos = uniqueDeleteIdx + 1 + uniqueTblPkTyp = uniqueTableDef.Cols[0].Typ + } if err != nil { return err } - - uniqueTblPkPos := uniqueDeleteIdx + 1 - uniqueTblPkTyp := uniqueTableDef.Cols[0].Typ - if isUpdate { // do it like simple update lastNodeId = appendSinkNode(builder, bindCtx, lastNodeId) @@ -373,7 +391,7 @@ func buildDeletePlans(ctx CompilerContext, builder *QueryBuilder, bindCtx *BindC } else { // it's more simple for delete hidden unique table .so we append nodes after the plan. not recursive call buildDeletePlans delNodeInfo := makeDeleteNodeInfo(builder.compCtx, uniqueObjRef, uniqueTableDef, uniqueDeleteIdx, -1, false, uniqueTblPkPos, uniqueTblPkTyp, delCtx.lockTable, delCtx.partitionInfos) - lastNodeId, err = makeOneDeletePlan(builder, bindCtx, lastNodeId, delNodeInfo, isUk, isSK, delCtx.isDeleteWithoutFilters) + lastNodeId, err = makeOneDeletePlan(builder, bindCtx, lastNodeId, delNodeInfo, isUk, isSK, false) putDeleteNodeInfo(delNodeInfo) if err != nil { return err @@ -393,7 +411,7 @@ func buildDeletePlans(ctx CompilerContext, builder *QueryBuilder, bindCtx *BindC } pkPos, pkTyp := getPkPos(delCtx.tableDef, false) delNodeInfo := makeDeleteNodeInfo(ctx, delCtx.objRef, delCtx.tableDef, delCtx.rowIdPos, partExprIdx, true, pkPos, pkTyp, delCtx.lockTable, delCtx.partitionInfos) - lastNodeId, err := makeOneDeletePlan(builder, bindCtx, lastNodeId, delNodeInfo, false, false, delCtx.isDeleteWithoutFilters) + lastNodeId, err := makeOneDeletePlan(builder, bindCtx, lastNodeId, delNodeInfo, false, false, canTruncate) putDeleteNodeInfo(delNodeInfo) if err != nil { return err