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