diff --git a/pkg/vm/engine/aoe/engine/relation.go b/pkg/vm/engine/aoe/engine/relation.go
index 1a14bcc0bed06972a403ff7a5f3078099191d7f7..9d500f369ab0c6682b4dba99cd5c96c3eae26507 100644
--- a/pkg/vm/engine/aoe/engine/relation.go
+++ b/pkg/vm/engine/aoe/engine/relation.go
@@ -128,7 +128,7 @@ func (r *relation) Write(_ uint64, bat *batch.Batch, _ engine.Snapshot) error {
 }
 
 func (r *relation) Delete(_ uint64, _ *vector.Vector, _ string, _ engine.Snapshot) error {
-	panic(any("implement me"))
+	return nil
 }
 
 func (r *relation) update() error {
@@ -254,11 +254,11 @@ func (r *relation) Nodes(_ engine.Snapshot) engine.Nodes {
 }
 
 func (r *relation) GetPrimaryKeys(_ engine.Snapshot) []*engine.Attribute {
-	panic(any("implement me"))
+	return nil
 }
 
 func (r *relation) GetHideKey(_ engine.Snapshot) *engine.Attribute {
-	panic(any("implement me"))
+	return nil
 }
 
 func (r *relation) GetPriKeyOrHideKey(_ engine.Snapshot) ([]engine.Attribute, bool) {
diff --git a/pkg/vm/engine/tae/dataio/segmentio/segment.go b/pkg/vm/engine/tae/dataio/segmentio/segment.go
index 8ab2851ed11a216b70104e0ce32d519353013ae2..a537f791aa3cab4e986dea2ad850ef53a3967ab2 100644
--- a/pkg/vm/engine/tae/dataio/segmentio/segment.go
+++ b/pkg/vm/engine/tae/dataio/segmentio/segment.go
@@ -53,7 +53,7 @@ func openSegment(name string, id uint64) *segmentFile {
 	sf.seg = &segment.Segment{}
 	err := sf.seg.Open(sf.name)
 	if err != nil {
-		return nil
+		panic(any(err.Error()))
 	}
 	sf.id = &common.ID{
 		SegmentID: id,
@@ -172,7 +172,7 @@ func newSegmentFile(name string, id uint64) *segmentFile {
 	sf.seg = &segment.Segment{}
 	err := sf.seg.Init(sf.name)
 	if err != nil {
-		return nil
+		panic(any(err.Error()))
 	}
 	sf.seg.Mount()
 	sf.id = &common.ID{
diff --git a/pkg/vm/engine/tae/moengine/engine_test.go b/pkg/vm/engine/tae/moengine/engine_test.go
index e5fb89dd031764f00fa98a9c0aaa9d511e36a6ca..7ff6d075aebfb3da09dcfca202eeff4bb8a4a412 100644
--- a/pkg/vm/engine/tae/moengine/engine_test.go
+++ b/pkg/vm/engine/tae/moengine/engine_test.go
@@ -53,6 +53,18 @@ func TestEngine(t *testing.T) {
 	err = rel.Write(0, bat, txn.GetCtx())
 	assert.Nil(t, err)
 	assert.Nil(t, txn.Commit())
+	txn, err = e.StartTxn(nil)
+	assert.Nil(t, err)
+	dbase, err = e.Database("db", txn.GetCtx())
+	assert.Nil(t, err)
+	rel, err = dbase.Relation(schema.Name, txn.GetCtx())
+	assert.Nil(t, err)
+	attr := rel.GetPrimaryKeys(nil)
+	key := attr[0]
+	bat = catalog.MockData(schema, 20)
+	err = rel.Delete(0, bat.Vecs[12], key.Name, nil)
+	assert.Nil(t, err)
+	assert.Nil(t, txn.Commit())
 
 	txn, err = e.StartTxn(nil)
 	assert.Nil(t, err)
@@ -64,8 +76,84 @@ func TestEngine(t *testing.T) {
 	for _, reader := range readers {
 		bat, err := reader.Read([]uint64{uint64(1)}, []string{schema.ColDefs[1].Name})
 		assert.Nil(t, err)
+		if bat != nil {
+			assert.Equal(t, 80, vector.Length(bat.Vecs[0]))
+		}
+	}
+	t.Log(tae.Catalog.SimplePPString(common.PPL1))
+}
+
+func TestTxnRelation_GetHideKey(t *testing.T) {
+	tae := initDB(t, nil)
+	defer tae.Close()
+	e := NewEngine(tae)
+	txn, err := e.StartTxn(nil)
+	assert.Nil(t, err)
+	err = e.Create(0, "db", 0, txn.GetCtx())
+	assert.Nil(t, err)
+	names := e.Databases(txn.GetCtx())
+	assert.Equal(t, 2, len(names))
+	dbase, err := e.Database("db", txn.GetCtx())
+	assert.Nil(t, err)
+
+	schema := catalog.MockSchema(13, 15)
+	defs, err := SchemaToDefs(schema)
+	assert.NoError(t, err)
+	err = dbase.Create(0, schema.Name, defs, txn.GetCtx())
+	assert.Nil(t, err)
+	names = dbase.Relations(txn.GetCtx())
+	assert.Equal(t, 1, len(names))
+
+	rel, err := dbase.Relation(schema.Name, txn.GetCtx())
+	assert.Nil(t, err)
+	assert.Equal(t, 1, len(rel.Nodes(nil)))
+	assert.Equal(t, ADDR, rel.Nodes(nil)[0].Addr)
+	bat := catalog.MockData(schema, 100)
+	err = rel.Write(0, bat, txn.GetCtx())
+	assert.Nil(t, err)
+	assert.Nil(t, txn.Commit())
+	txn, err = e.StartTxn(nil)
+	assert.Nil(t, err)
+	dbase, err = e.Database("db", txn.GetCtx())
+	assert.Nil(t, err)
+	rel, err = dbase.Relation(schema.Name, txn.GetCtx())
+	assert.Nil(t, err)
+	assert.Nil(t, txn.Commit())
+	readers := rel.NewReader(10, nil, nil, nil)
+	delete := bat
+	for _, reader := range readers {
+		bat, err := reader.Read([]uint64{uint64(1)}, []string{schema.ColDefs[13].Name})
+		assert.Nil(t, err)
 		if bat != nil {
 			assert.Equal(t, 100, vector.Length(bat.Vecs[0]))
+			delete = bat
+		}
+	}
+	txn, err = e.StartTxn(nil)
+	assert.Nil(t, err)
+	dbase, err = e.Database("db", txn.GetCtx())
+	assert.Nil(t, err)
+	rel, err = dbase.Relation(schema.Name, txn.GetCtx())
+	assert.Nil(t, err)
+	attr := rel.GetPrimaryKeys(nil)
+	assert.Nil(t, attr)
+	key := rel.GetHideKey(nil)
+	err = rel.Delete(0, delete.Vecs[0], key.Name, nil)
+	assert.Nil(t, err)
+	assert.Nil(t, txn.Commit())
+	txn, err = e.StartTxn(nil)
+	assert.Nil(t, err)
+	dbase, err = e.Database("db", txn.GetCtx())
+	assert.Nil(t, err)
+	rel, err = dbase.Relation(schema.Name, txn.GetCtx())
+	assert.Nil(t, err)
+	assert.Nil(t, txn.Commit())
+	readers = rel.NewReader(1, nil, nil, nil)
+	for _, reader := range readers {
+		bat, err := reader.Read([]uint64{uint64(1)}, []string{schema.ColDefs[13].Name})
+		assert.Nil(t, err)
+		if bat != nil {
+			assert.Equal(t, 0, vector.Length(bat.Vecs[0]))
 		}
 	}
 	t.Log(tae.Catalog.SimplePPString(common.PPL1))
diff --git a/pkg/vm/engine/tae/moengine/relation.go b/pkg/vm/engine/tae/moengine/relation.go
index 77a149ff22def7c15b8424d8ce3bcdfc35c4380a..a391db3b691883c8f7b4ffafb7732083a0ea0391 100644
--- a/pkg/vm/engine/tae/moengine/relation.go
+++ b/pkg/vm/engine/tae/moengine/relation.go
@@ -17,9 +17,11 @@ package moengine
 import (
 	"github.com/matrixorigin/matrixone/pkg/container/batch"
 	"github.com/matrixorigin/matrixone/pkg/container/vector"
+	"github.com/matrixorigin/matrixone/pkg/logutil"
 	"github.com/matrixorigin/matrixone/pkg/sql/colexec/extend"
 	"github.com/matrixorigin/matrixone/pkg/vm/engine"
 	"github.com/matrixorigin/matrixone/pkg/vm/engine/tae/catalog"
+	"github.com/matrixorigin/matrixone/pkg/vm/engine/tae/container/compute"
 	"github.com/matrixorigin/matrixone/pkg/vm/engine/tae/iface/handle"
 )
 
@@ -98,6 +100,7 @@ func (rel *txnRelation) GetPrimaryKeys(_ engine.Snapshot) (attrs []*engine.Attri
 		attr.Type = def.Type
 		attrs = append(attrs, attr)
 	}
+	logutil.Debugf("GetPrimaryKeys: %v", attrs[0])
 	return
 }
 
@@ -106,6 +109,7 @@ func (rel *txnRelation) GetHideKey(_ engine.Snapshot) *engine.Attribute {
 	key := new(engine.Attribute)
 	key.Name = schema.HiddenKey.Name
 	key.Type = schema.HiddenKey.Type
+	logutil.Debugf("GetHideKey: %v", key)
 	return key
 }
 
@@ -132,8 +136,27 @@ func (rel *txnRelation) Write(_ uint64, bat *batch.Batch, _ engine.Snapshot) err
 	return rel.handle.Append(bat)
 }
 
-func (rel *txnRelation) Delete(_ uint64, _ *vector.Vector, _ string, _ engine.Snapshot) error {
-	panic(any("implement me"))
+func (rel *txnRelation) Delete(_ uint64, data *vector.Vector, col string, _ engine.Snapshot) error {
+	schema := rel.handle.GetMeta().(*catalog.TableEntry).GetSchema()
+	logutil.Debugf("Delete col: %v", col)
+	if schema.HiddenKey.Name == col {
+		return rel.handle.DeleteByHiddenKeys(data)
+	}
+	if !schema.HasPK() || schema.IsCompoundSortKey() {
+		panic(any("No valid primary key found"))
+	}
+	if schema.SortKey.Defs[0].Name == col {
+		for i := 0; i < vector.Length(data); i++ {
+			v := compute.GetValue(data, uint32(i))
+			filter := handle.NewEQFilter(v)
+			err := rel.handle.DeleteByFilter(filter)
+			if err != nil {
+				return err
+			}
+		}
+		return nil
+	}
+	panic(any("Key not found"))
 }
 
 func (rel *txnRelation) NewReader(num int, _ extend.Extend, _ []byte, _ engine.Snapshot) (rds []engine.Reader) {