From 81f33be028f81d2e69385e46ef458f8bf5cb1d25 Mon Sep 17 00:00:00 2001 From: ou yuanning <45346669+ouyuanning@users.noreply.github.com> Date: Wed, 11 May 2022 22:44:34 +0800 Subject: [PATCH] add tableDef to update/delete node (#2468) Co-authored-by: Yingfeng <yingfeng.zhang@gmail.com> --- pkg/pb/plan/plan.pb.go | 68 ++++++++++++++++++----------------- pkg/sql/plan2/build_delete.go | 33 ++++++++++++++++- pkg/sql/plan2/build_test.go | 5 +-- pkg/sql/plan2/build_update.go | 17 ++------- pkg/sql/plan2/build_util.go | 15 ++++++++ proto/plan.proto | 1 + 6 files changed, 90 insertions(+), 49 deletions(-) diff --git a/pkg/pb/plan/plan.pb.go b/pkg/pb/plan/plan.pb.go index 6c37f9971..12721d66b 100644 --- a/pkg/pb/plan/plan.pb.go +++ b/pkg/pb/plan/plan.pb.go @@ -433,6 +433,7 @@ const ( // Node_INSERT Node_NodeType = 51 Node_UPDATE Node_NodeType = 52 + Node_DELETE Node_NodeType = 53 ) // Enum value maps for Node_NodeType. @@ -464,6 +465,7 @@ var ( 50: "ASSERT", 51: "INSERT", 52: "UPDATE", + 53: "DELETE", } Node_NodeType_value = map[string]int32{ "UNKNOWN": 0, @@ -492,6 +494,7 @@ var ( "ASSERT": 50, "INSERT": 51, "UPDATE": 52, + "DELETE": 53, } ) @@ -2542,7 +2545,7 @@ var file_plan_proto_rawDesc = []byte{ 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x05, 0x2e, 0x45, 0x78, 0x70, 0x72, 0x52, 0x07, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x12, 0x1d, 0x0a, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x05, 0x2e, 0x45, - 0x78, 0x70, 0x72, 0x52, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x22, 0xbe, 0x09, 0x0a, 0x04, + 0x78, 0x70, 0x72, 0x52, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x22, 0xca, 0x09, 0x0a, 0x04, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x2b, 0x0a, 0x09, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0e, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x08, 0x6e, 0x6f, 0x64, 0x65, 0x54, 0x79, 0x70, @@ -2587,7 +2590,7 @@ var file_plan_proto_rawDesc = []byte{ 0x44, 0x61, 0x74, 0x61, 0x52, 0x0a, 0x72, 0x6f, 0x77, 0x73, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x12, 0x23, 0x0a, 0x0d, 0x65, 0x78, 0x74, 0x72, 0x61, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x13, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x65, 0x78, 0x74, 0x72, 0x61, 0x4f, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xf3, 0x02, 0x0a, 0x08, 0x4e, 0x6f, 0x64, 0x65, 0x54, 0x79, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xff, 0x02, 0x0a, 0x08, 0x4e, 0x6f, 0x64, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0e, 0x0a, 0x0a, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x10, 0x02, 0x12, @@ -2610,36 +2613,37 @@ var file_plan_proto_rawDesc = []byte{ 0x12, 0x09, 0x0a, 0x05, 0x53, 0x50, 0x4c, 0x49, 0x54, 0x10, 0x29, 0x12, 0x0a, 0x0a, 0x06, 0x47, 0x41, 0x54, 0x48, 0x45, 0x52, 0x10, 0x2a, 0x12, 0x0a, 0x0a, 0x06, 0x41, 0x53, 0x53, 0x45, 0x52, 0x54, 0x10, 0x32, 0x12, 0x0a, 0x0a, 0x06, 0x49, 0x4e, 0x53, 0x45, 0x52, 0x54, 0x10, 0x33, 0x12, - 0x0a, 0x0a, 0x06, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x10, 0x34, 0x22, 0x55, 0x0a, 0x08, 0x4a, - 0x6f, 0x69, 0x6e, 0x46, 0x6c, 0x61, 0x67, 0x12, 0x09, 0x0a, 0x05, 0x49, 0x4e, 0x4e, 0x45, 0x52, - 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x4f, 0x55, 0x54, 0x45, 0x52, 0x10, 0x01, 0x12, 0x08, 0x0a, - 0x04, 0x53, 0x45, 0x4d, 0x49, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x41, 0x4e, 0x54, 0x49, 0x10, - 0x04, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x49, 0x4e, 0x47, 0x4c, 0x45, 0x10, 0x08, 0x12, 0x08, 0x0a, - 0x04, 0x4d, 0x41, 0x52, 0x4b, 0x10, 0x10, 0x12, 0x09, 0x0a, 0x05, 0x41, 0x50, 0x50, 0x4c, 0x59, - 0x10, 0x20, 0x22, 0x28, 0x0a, 0x07, 0x41, 0x67, 0x67, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x08, 0x0a, - 0x04, 0x46, 0x55, 0x4c, 0x4c, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x42, 0x4f, 0x54, 0x54, 0x4f, - 0x4d, 0x10, 0x01, 0x12, 0x07, 0x0a, 0x03, 0x54, 0x4f, 0x50, 0x10, 0x02, 0x22, 0xe5, 0x01, 0x0a, - 0x05, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x31, 0x0a, 0x09, 0x73, 0x74, 0x6d, 0x74, 0x5f, 0x74, - 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, - 0x08, 0x73, 0x74, 0x6d, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x65, - 0x70, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x05, 0x52, 0x05, 0x73, 0x74, 0x65, 0x70, 0x73, 0x12, - 0x1b, 0x0a, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x05, - 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x1d, 0x0a, 0x06, - 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x05, 0x2e, 0x45, - 0x78, 0x70, 0x72, 0x52, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x22, 0x57, 0x0a, 0x0d, 0x53, - 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, 0x07, - 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x45, 0x4c, - 0x45, 0x43, 0x54, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x49, 0x4e, 0x53, 0x45, 0x52, 0x54, 0x10, - 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x10, 0x03, 0x12, 0x0a, 0x0a, - 0x06, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x10, 0x04, 0x12, 0x09, 0x0a, 0x05, 0x4d, 0x45, 0x52, - 0x47, 0x45, 0x10, 0x05, 0x2a, 0x56, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, - 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x10, - 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x45, 0x4c, 0x45, 0x43, 0x54, 0x10, 0x01, 0x12, 0x0a, 0x0a, - 0x06, 0x49, 0x4e, 0x53, 0x45, 0x52, 0x54, 0x10, 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x45, 0x4c, - 0x45, 0x54, 0x45, 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x10, - 0x04, 0x12, 0x09, 0x0a, 0x05, 0x4d, 0x45, 0x52, 0x47, 0x45, 0x10, 0x05, 0x42, 0x07, 0x5a, 0x05, - 0x2f, 0x70, 0x6c, 0x61, 0x6e, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x0a, 0x0a, 0x06, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x10, 0x34, 0x12, 0x0a, 0x0a, 0x06, 0x44, + 0x45, 0x4c, 0x45, 0x54, 0x45, 0x10, 0x35, 0x22, 0x55, 0x0a, 0x08, 0x4a, 0x6f, 0x69, 0x6e, 0x46, + 0x6c, 0x61, 0x67, 0x12, 0x09, 0x0a, 0x05, 0x49, 0x4e, 0x4e, 0x45, 0x52, 0x10, 0x00, 0x12, 0x09, + 0x0a, 0x05, 0x4f, 0x55, 0x54, 0x45, 0x52, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x53, 0x45, 0x4d, + 0x49, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x41, 0x4e, 0x54, 0x49, 0x10, 0x04, 0x12, 0x0a, 0x0a, + 0x06, 0x53, 0x49, 0x4e, 0x47, 0x4c, 0x45, 0x10, 0x08, 0x12, 0x08, 0x0a, 0x04, 0x4d, 0x41, 0x52, + 0x4b, 0x10, 0x10, 0x12, 0x09, 0x0a, 0x05, 0x41, 0x50, 0x50, 0x4c, 0x59, 0x10, 0x20, 0x22, 0x28, + 0x0a, 0x07, 0x41, 0x67, 0x67, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x46, 0x55, 0x4c, + 0x4c, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x42, 0x4f, 0x54, 0x54, 0x4f, 0x4d, 0x10, 0x01, 0x12, + 0x07, 0x0a, 0x03, 0x54, 0x4f, 0x50, 0x10, 0x02, 0x22, 0xe5, 0x01, 0x0a, 0x05, 0x51, 0x75, 0x65, + 0x72, 0x79, 0x12, 0x31, 0x0a, 0x09, 0x73, 0x74, 0x6d, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x53, 0x74, + 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x08, 0x73, 0x74, 0x6d, + 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x65, 0x70, 0x73, 0x18, 0x02, + 0x20, 0x03, 0x28, 0x05, 0x52, 0x05, 0x73, 0x74, 0x65, 0x70, 0x73, 0x12, 0x1b, 0x0a, 0x05, 0x6e, + 0x6f, 0x64, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x05, 0x2e, 0x4e, 0x6f, 0x64, + 0x65, 0x52, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x1d, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x61, + 0x6d, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x05, 0x2e, 0x45, 0x78, 0x70, 0x72, 0x52, + 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x22, 0x57, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x74, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, + 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x45, 0x4c, 0x45, 0x43, 0x54, 0x10, + 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x49, 0x4e, 0x53, 0x45, 0x52, 0x54, 0x10, 0x02, 0x12, 0x0a, 0x0a, + 0x06, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x55, 0x50, 0x44, + 0x41, 0x54, 0x45, 0x10, 0x04, 0x12, 0x09, 0x0a, 0x05, 0x4d, 0x45, 0x52, 0x47, 0x45, 0x10, 0x05, + 0x2a, 0x56, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, + 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x10, 0x00, 0x12, 0x0a, 0x0a, + 0x06, 0x53, 0x45, 0x4c, 0x45, 0x43, 0x54, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x49, 0x4e, 0x53, + 0x45, 0x52, 0x54, 0x10, 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x10, + 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x10, 0x04, 0x12, 0x09, 0x0a, + 0x05, 0x4d, 0x45, 0x52, 0x47, 0x45, 0x10, 0x05, 0x42, 0x07, 0x5a, 0x05, 0x2f, 0x70, 0x6c, 0x61, + 0x6e, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/pkg/sql/plan2/build_delete.go b/pkg/sql/plan2/build_delete.go index 58c53d5c4..6b96a6b1a 100644 --- a/pkg/sql/plan2/build_delete.go +++ b/pkg/sql/plan2/build_delete.go @@ -15,7 +15,11 @@ package plan2 import ( + "fmt" + + "github.com/matrixorigin/matrixone/pkg/errno" "github.com/matrixorigin/matrixone/pkg/pb/plan" + "github.com/matrixorigin/matrixone/pkg/sql/errors" "github.com/matrixorigin/matrixone/pkg/sql/parsers/tree" ) @@ -37,5 +41,32 @@ func buildDelete(stmt *tree.Delete, ctx CompilerContext, query *Query) error { selectCtx := &SelectContext{ columnAlias: make(map[string]*plan.Expr), } - return buildSelect(selectStmt, ctx, query, selectCtx) + err := buildSelect(selectStmt, ctx, query, selectCtx) + if err != nil { + return err + } + + return appendDeleteNode(query) +} + +func appendDeleteNode(query *Query) error { + //get tableDef + objRef, tableDef := getLastTableDef(query) + if tableDef == nil { + return errors.New(errno.SyntaxErrororAccessRuleViolation, fmt.Sprintf("cannot find delete table")) + } + + //append delete node + node := &plan.Node{ + NodeType: plan.Node_DELETE, + ObjRef: objRef, + TableDef: tableDef, + } + appendQueryNode(query, node, false) + + //reset root node + preNode := query.Nodes[len(query.Nodes)-1] + query.Steps[len(query.Steps)-1] = preNode.NodeId + + return nil } diff --git a/pkg/sql/plan2/build_test.go b/pkg/sql/plan2/build_test.go index 7f68f8704..d5d11458f 100644 --- a/pkg/sql/plan2/build_test.go +++ b/pkg/sql/plan2/build_test.go @@ -27,7 +27,7 @@ import ( //only use in developing func TestSingleSql(t *testing.T) { - sql := `select c_custkey from (select c_custkey, count(C_NATIONKEY) ff from CUSTOMER group by c_custkey) a where ff > 0` + sql := `DELETE FROM NATION WHERE N_NATIONKEY > 10 LIMIT 20` // stmts, _ := mysql.Parse(sql) // t.Logf("%+v", string(getJson(stmts[0], t))) @@ -258,9 +258,10 @@ func TestNodeTree(t *testing.T) { }, //delete "DELETE FROM NATION WHERE N_NATIONKEY > 10 LIMIT 20": { - root: 0, + root: 1, nodeType: map[int]plan.Node_NodeType{ 0: plan.Node_TABLE_SCAN, + 1: plan.Node_DELETE, }, }, // unrelated subquery diff --git a/pkg/sql/plan2/build_update.go b/pkg/sql/plan2/build_update.go index af26505d4..08407948a 100644 --- a/pkg/sql/plan2/build_update.go +++ b/pkg/sql/plan2/build_update.go @@ -23,19 +23,6 @@ import ( "github.com/matrixorigin/matrixone/pkg/sql/parsers/tree" ) -func getLastTableDef(query *Query, node *plan.Node) *plan.TableDef { - if node.TableDef != nil { - return node.TableDef - } - for _, id := range node.Children { - val := getLastTableDef(query, query.Nodes[id]) - if val != nil { - return val - } - } - return nil -} - func buildUpdate(stmt *tree.Update, ctx CompilerContext, query *Query) error { //build select selectStmt := &tree.Select{ @@ -61,7 +48,7 @@ func buildUpdate(stmt *tree.Update, ctx CompilerContext, query *Query) error { } //get table def - tableDef := getLastTableDef(query, query.Nodes[len(query.Nodes)-1]) + objRef, tableDef := getLastTableDef(query) if tableDef == nil { return errors.New(errno.CaseNotFound, "can not find table in sql") } @@ -128,6 +115,8 @@ func buildUpdate(stmt *tree.Update, ctx CompilerContext, query *Query) error { Columns: columns, Values: values, }, + ObjRef: objRef, + TableDef: tableDef, } appendQueryNode(query, node, false) diff --git a/pkg/sql/plan2/build_util.go b/pkg/sql/plan2/build_util.go index 777664005..af46aee14 100644 --- a/pkg/sql/plan2/build_util.go +++ b/pkg/sql/plan2/build_util.go @@ -358,3 +358,18 @@ func getResolveTable(tblName string, ctx CompilerContext, selectCtx *SelectConte } return nil, nil, false } + +//getLastTableDef get insert/update/delete tableDef +func getLastTableDef(query *Query) (*plan.ObjectRef, *plan.TableDef) { + node := query.Nodes[query.Steps[len(query.Steps)-1]] + for { + if node.TableDef != nil { + return node.ObjRef, node.TableDef + } + if len(node.Children) == 0 { + break + } + node = query.Nodes[node.Children[0]] + } + return nil, nil +} diff --git a/proto/plan.proto b/proto/plan.proto index caeaf04ea..b6311f4a0 100644 --- a/proto/plan.proto +++ b/proto/plan.proto @@ -282,6 +282,7 @@ message Node { // INSERT = 51; UPDATE = 52; + DELETE = 53; } enum JoinFlag { -- GitLab