diff --git a/pkg/vm/engine/tae/containers/mock.go b/pkg/vm/engine/tae/containers/mock.go
index 2d7119f15efed1013cb8cafa6f1d0db95758ad17..ad860052d355bf0f8102028a06d102d7ed8c1da5 100644
--- a/pkg/vm/engine/tae/containers/mock.go
+++ b/pkg/vm/engine/tae/containers/mock.go
@@ -173,7 +173,7 @@ func MockVector(t types.Type, rows int, unique, nullable bool, provider Vector)
 			v2 := rand.Intn(math.MaxInt32) + 1
 			vec.Append(float64(v1) / float64(v2))
 		}
-	case types.T_varchar, types.T_char:
+	case types.T_varchar, types.T_char, types.T_blob:
 		if unique {
 			for i := 0; i < rows; i++ {
 				s := fmt.Sprintf("%d-%d", i, 0)
diff --git a/pkg/vm/engine/tae/mergesort/mergesort.go b/pkg/vm/engine/tae/mergesort/mergesort.go
index 1abdf664938fbced4fc39fa460a321af390e4749..2e2dca7bde09f067c514aa0a9b487c4df10b1daa 100644
--- a/pkg/vm/engine/tae/mergesort/mergesort.go
+++ b/pkg/vm/engine/tae/mergesort/mergesort.go
@@ -62,7 +62,7 @@ func SortBlockColumns(cols []containers.Vector, pk int) ([]uint32, error) {
 		decimal128s.Sort(cols[pk], sortedIdx)
 	case types.T_timestamp:
 		numerics.Sort[types.Timestamp](cols[pk], sortedIdx)
-	case types.T_char, types.T_json, types.T_varchar:
+	case types.T_char, types.T_json, types.T_varchar, types.T_blob:
 		varchar.Sort(cols[pk], sortedIdx)
 	default:
 		panic(fmt.Sprintf("%s not supported", cols[pk].GetType().String()))
@@ -111,7 +111,7 @@ func MergeSortedColumn(column []containers.Vector, sortedIdx *[]uint32, fromLayo
 		ret, mapping = decimal128s.Merge(column, sortedIdx, fromLayout, toLayout)
 	case types.T_timestamp:
 		ret, mapping = numerics.Merge[types.Timestamp](column, sortedIdx, fromLayout, toLayout)
-	case types.T_char, types.T_json, types.T_varchar:
+	case types.T_char, types.T_json, types.T_varchar, types.T_blob:
 		ret, mapping = varchar.Merge(column, sortedIdx, fromLayout, toLayout)
 	default:
 		panic(fmt.Sprintf("%s not supported", column[0].GetType().String()))
@@ -191,7 +191,7 @@ func ShuffleColumn(column []containers.Vector, sortedIdx []uint32, fromLayout, t
 //		dates.Merge(col, mergedSrc)
 //	case types.T_datetime:
 //		datetimes.Merge(col, mergedSrc)
-//	case types.T_char, types.T_json, types.T_varchar:
+//	case types.T_char, types.T_json, types.T_varchar, types.T_blob:
 //		varchar.Merge(col, mergedSrc)
 //	}
 //
@@ -228,7 +228,7 @@ func ShuffleColumn(column []containers.Vector, sortedIdx []uint32, fromLayout, t
 //			dates.Multiplex(col, mergedSrc)
 //		case types.T_datetime:
 //			datetimes.Multiplex(col, mergedSrc)
-//		case types.T_char, types.T_json, types.T_varchar:
+//		case types.T_char, types.T_json, types.T_varchar, types.T_blob:
 //			varchar.Multiplex(col, mergedSrc)
 //		}
 //	}
diff --git a/pkg/vm/engine/tae/txn/txnimpl/index.go b/pkg/vm/engine/tae/txn/txnimpl/index.go
index d27034743dc2680e7d00fbb44061087d1e6b1ff8..7c135961d4c55dbca53e3b58afa129f9008bc634 100644
--- a/pkg/vm/engine/tae/txn/txnimpl/index.go
+++ b/pkg/vm/engine/tae/txn/txnimpl/index.go
@@ -82,7 +82,7 @@ func InsertOp[T comparable](input any, start, count int, fromRow uint32, dedupIn
 func (idx *simpleTableIndex) KeyToVector(kType types.Type) containers.Vector {
 	vec := containers.MakeVector(kType, false)
 	switch kType.Oid {
-	case types.T_char, types.T_varchar, types.T_json:
+	case types.T_char, types.T_varchar, types.T_json, types.T_blob:
 		for k := range idx.tree {
 			vec.Append([]byte(k.(string)))
 		}
@@ -180,7 +180,7 @@ func (idx *simpleTableIndex) BatchInsert(col containers.Vector, start, count int
 		return InsertOp[types.Timestamp](col.Slice(), start, count, row, dedupInput, idx.tree)
 	case types.T_datetime:
 		return InsertOp[types.Datetime](col.Slice(), start, count, row, dedupInput, idx.tree)
-	case types.T_char, types.T_varchar, types.T_json:
+	case types.T_char, types.T_varchar, types.T_json, types.T_blob:
 		vs := col.Slice().(*containers.Bytes)
 		if dedupInput {
 			set := make(map[string]bool)
@@ -247,7 +247,7 @@ func (idx *simpleTableIndex) BatchDedup(col containers.Vector) error {
 		return DedupOp[types.Datetime](vals, idx.tree)
 	case types.T_timestamp:
 		return DedupOp[types.Timestamp](vals, idx.tree)
-	case types.T_char, types.T_varchar, types.T_json:
+	case types.T_char, types.T_varchar, types.T_json, types.T_blob:
 		vals := vals.(*containers.Bytes)
 		for i, s := range vals.Offset {
 			e := s + vals.Length[i]