github.com/matrixorigin/matrixone@v0.7.0/pkg/txn/storage/memorystorage/mem_handler.go (about)

     1  // Copyright 2022 Matrix Origin
     2  //
     3  // Licensed under the Apache License, Version 2.0 (the "License");
     4  // you may not use this file except in compliance with the License.
     5  // You may obtain a copy of the License at
     6  //
     7  //      http://www.apache.org/licenses/LICENSE-2.0
     8  //
     9  // Unless required by applicable law or agreed to in writing, software
    10  // distributed under the License is distributed on an "AS IS" BASIS,
    11  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    12  // See the License for the specific language governing permissions and
    13  // limitations under the License.
    14  
    15  package memorystorage
    16  
    17  import (
    18  	"context"
    19  	crand "crypto/rand"
    20  	"database/sql"
    21  	"encoding/binary"
    22  	"errors"
    23  	"fmt"
    24  	"sort"
    25  	"sync"
    26  
    27  	"github.com/matrixorigin/matrixone/pkg/catalog"
    28  	"github.com/matrixorigin/matrixone/pkg/common/moerr"
    29  	"github.com/matrixorigin/matrixone/pkg/common/mpool"
    30  	"github.com/matrixorigin/matrixone/pkg/container/batch"
    31  	"github.com/matrixorigin/matrixone/pkg/container/nulls"
    32  	"github.com/matrixorigin/matrixone/pkg/container/types"
    33  	"github.com/matrixorigin/matrixone/pkg/container/vector"
    34  	"github.com/matrixorigin/matrixone/pkg/pb/plan"
    35  	"github.com/matrixorigin/matrixone/pkg/pb/timestamp"
    36  	"github.com/matrixorigin/matrixone/pkg/pb/txn"
    37  	"github.com/matrixorigin/matrixone/pkg/txn/clock"
    38  	"github.com/matrixorigin/matrixone/pkg/txn/storage/memorystorage/memorytable"
    39  	"github.com/matrixorigin/matrixone/pkg/vm/engine"
    40  	"github.com/matrixorigin/matrixone/pkg/vm/engine/memoryengine"
    41  )
    42  
    43  type MemHandler struct {
    44  
    45  	// catalog
    46  	databases  *memorytable.Table[ID, *DatabaseRow, *DatabaseRow]
    47  	relations  *memorytable.Table[ID, *RelationRow, *RelationRow]
    48  	attributes *memorytable.Table[ID, *AttributeRow, *AttributeRow]
    49  
    50  	// data
    51  	data *memorytable.Table[DataKey, DataValue, DataRow]
    52  
    53  	// transactions
    54  	transactions struct {
    55  		sync.Mutex
    56  		// transaction id -> transaction
    57  		Map map[string]*Transaction
    58  	}
    59  
    60  	// iterators
    61  	iterators struct {
    62  		sync.Mutex
    63  		// iterator id -> iterator
    64  		Map map[ID]*Iter[DataKey, DataValue]
    65  	}
    66  
    67  	// misc
    68  	mheap       *mpool.MPool
    69  	clock       clock.Clock
    70  	idGenerator memoryengine.IDGenerator
    71  }
    72  
    73  type Iter[
    74  	K memorytable.Ordered[K],
    75  	V any,
    76  ] struct {
    77  	TableIter *memorytable.TableIter[K, V]
    78  	TableID   ID
    79  	AttrsMap  map[string]*AttributeRow
    80  	Expr      *plan.Expr
    81  	nextFunc  func() bool
    82  	Tx        *Transaction
    83  }
    84  
    85  func NewMemHandler(
    86  	mp *mpool.MPool,
    87  	clock clock.Clock,
    88  	idGenerator memoryengine.IDGenerator,
    89  ) *MemHandler {
    90  	h := &MemHandler{
    91  		databases:   memorytable.NewTable[ID, *DatabaseRow, *DatabaseRow](),
    92  		relations:   memorytable.NewTable[ID, *RelationRow, *RelationRow](),
    93  		attributes:  memorytable.NewTable[ID, *AttributeRow, *AttributeRow](),
    94  		data:        memorytable.NewTable[DataKey, DataValue, DataRow](),
    95  		mheap:       mp,
    96  		clock:       clock,
    97  		idGenerator: idGenerator,
    98  	}
    99  	h.transactions.Map = make(map[string]*Transaction)
   100  	h.iterators.Map = make(map[ID]*Iter[DataKey, DataValue])
   101  	return h
   102  }
   103  
   104  var _ Handler = new(MemHandler)
   105  
   106  func (m *MemHandler) HandleAddTableDef(ctx context.Context, meta txn.TxnMeta, req memoryengine.AddTableDefReq, resp *memoryengine.AddTableDefResp) error {
   107  	tx := m.getTx(meta)
   108  
   109  	table, err := m.relations.Get(tx, req.TableID)
   110  	if errors.Is(err, sql.ErrNoRows) {
   111  		return moerr.NewInternalErrorNoCtx(
   112  			"invalid table id %v, db %v, name %v",
   113  			req.TableID,
   114  			req.DatabaseName,
   115  			req.TableName,
   116  		)
   117  	}
   118  	if err != nil {
   119  		return err
   120  	}
   121  
   122  	maxAttributeOrder := 0
   123  	if err := m.iterRelationAttributes(
   124  		tx, req.TableID,
   125  		func(_ ID, row *AttributeRow) error {
   126  			if row.Order > maxAttributeOrder {
   127  				maxAttributeOrder = row.Order
   128  			}
   129  			return nil
   130  		},
   131  	); err != nil {
   132  		return err
   133  	}
   134  
   135  	switch def := req.Def.(type) {
   136  
   137  	case *engine.CommentDef:
   138  		// update comments
   139  		table.Comments = []byte(def.Comment)
   140  		if err := m.relations.Update(tx, table); err != nil {
   141  			return err
   142  		}
   143  
   144  	case *engine.PartitionDef:
   145  		// update
   146  		table.PartitionDef = []byte(def.Partition)
   147  		if err := m.relations.Update(tx, table); err != nil {
   148  			return err
   149  		}
   150  
   151  	case *engine.ViewDef:
   152  		// update
   153  		table.ViewDef = []byte(def.View)
   154  		if err := m.relations.Update(tx, table); err != nil {
   155  			return err
   156  		}
   157  
   158  	case *engine.ConstraintDef:
   159  		pkeyDef := def.GetPrimaryKeyDef()
   160  		if pkeyDef != nil {
   161  			// set primary index
   162  			if err := m.iterRelationAttributes(
   163  				tx, req.TableID,
   164  				func(_ ID, row *AttributeRow) error {
   165  					isPrimary := false
   166  					if pkeyDef.Pkey.PkeyColName == row.Name {
   167  						isPrimary = true
   168  					}
   169  					if isPrimary == row.Primary {
   170  						return nil
   171  					}
   172  					row.Primary = isPrimary
   173  					if err := m.attributes.Update(tx, row); err != nil {
   174  						return err
   175  					}
   176  					return nil
   177  				},
   178  			); err != nil {
   179  				return err
   180  			}
   181  		}
   182  
   183  		// update Constraint
   184  		if table.Constraint, err = def.MarshalBinary(); err != nil {
   185  			return nil
   186  		}
   187  		if err := m.relations.Update(tx, table); err != nil {
   188  			return err
   189  		}
   190  
   191  	case *engine.AttributeDef:
   192  		// add attribute
   193  		// check existence
   194  		entries, err := m.attributes.Index(tx, Tuple{
   195  			index_RelationID_Name,
   196  			req.TableID,
   197  			Text(def.Attr.Name),
   198  		})
   199  		if err != nil {
   200  			return err
   201  		}
   202  		if len(entries) > 0 {
   203  			return moerr.NewConstraintViolationNoCtx(`duplicate column "%s"`, def.Attr.Name)
   204  		}
   205  		// insert
   206  		id, err := m.idGenerator.NewID(ctx)
   207  		if err != nil {
   208  			return err
   209  		}
   210  		attrRow := &AttributeRow{
   211  			ID:         id,
   212  			RelationID: req.TableID,
   213  			Order:      maxAttributeOrder + 1,
   214  			Nullable:   def.Attr.Default != nil && def.Attr.Default.NullAbility,
   215  			Attribute:  def.Attr,
   216  		}
   217  		if err := m.attributes.Insert(tx, attrRow); err != nil {
   218  			return err
   219  		}
   220  
   221  	case *engine.IndexTableDef:
   222  		// tea & mem do not use this def now.
   223  	case *engine.PropertiesDef:
   224  		// update properties
   225  		for _, prop := range def.Properties {
   226  			table.Properties[prop.Key] = prop.Value
   227  		}
   228  		if err := m.relations.Update(tx, table); err != nil {
   229  			return err
   230  		}
   231  
   232  	default:
   233  		panic(fmt.Sprintf("unknown table def: %T", req.Def))
   234  
   235  	}
   236  
   237  	return nil
   238  }
   239  
   240  func (m *MemHandler) HandleCloseTableIter(ctx context.Context, meta txn.TxnMeta, req memoryengine.CloseTableIterReq, resp *memoryengine.CloseTableIterResp) error {
   241  	m.iterators.Lock()
   242  	defer m.iterators.Unlock()
   243  	iter, ok := m.iterators.Map[req.IterID]
   244  	if !ok {
   245  		return moerr.NewInternalErrorNoCtx("no such iter: %v", req.IterID)
   246  	}
   247  	delete(m.iterators.Map, req.IterID)
   248  	if err := iter.TableIter.Close(); err != nil {
   249  		return err
   250  	}
   251  	return nil
   252  }
   253  
   254  func (m *MemHandler) HandleCreateDatabase(ctx context.Context, meta txn.TxnMeta, req memoryengine.CreateDatabaseReq, resp *memoryengine.CreateDatabaseResp) error {
   255  	tx := m.getTx(meta)
   256  
   257  	entries, err := m.databases.Index(tx, Tuple{
   258  		index_AccountID_Name,
   259  		Uint(req.AccessInfo.AccountID),
   260  		Text(req.Name),
   261  	})
   262  	if err != nil {
   263  		return err
   264  	}
   265  	if len(entries) > 0 {
   266  		return moerr.NewDBAlreadyExistsNoCtx(req.Name)
   267  	}
   268  
   269  	if req.ID.IsEmpty() {
   270  		req.ID, err = m.idGenerator.NewID(ctx)
   271  		if err != nil {
   272  			return err
   273  		}
   274  	}
   275  	err = m.databases.Insert(tx, &DatabaseRow{
   276  		ID:        req.ID,
   277  		AccountID: req.AccessInfo.AccountID,
   278  		Name:      []byte(req.Name),
   279  	})
   280  	if err != nil {
   281  		return err
   282  	}
   283  
   284  	resp.ID = req.ID
   285  	return nil
   286  }
   287  
   288  func (m *MemHandler) HandleCreateRelation(ctx context.Context, meta txn.TxnMeta, req memoryengine.CreateRelationReq, resp *memoryengine.CreateRelationResp) error {
   289  	tx := m.getTx(meta)
   290  
   291  	// validate database id
   292  	if !req.DatabaseID.IsEmpty() {
   293  		_, err := m.databases.Get(tx, req.DatabaseID)
   294  		if errors.Is(err, sql.ErrNoRows) {
   295  			return moerr.NewNoDBNoCtx()
   296  		}
   297  		if err != nil {
   298  			return err
   299  		}
   300  	}
   301  
   302  	// check existence
   303  	entries, err := m.relations.Index(tx, Tuple{
   304  		index_DatabaseID_Name,
   305  		req.DatabaseID,
   306  		Text(req.Name),
   307  	})
   308  	if err != nil {
   309  		return err
   310  	}
   311  	if len(entries) > 0 {
   312  		return moerr.NewTableAlreadyExistsNoCtx(req.Name)
   313  	}
   314  
   315  	// row
   316  	if req.ID.IsEmpty() {
   317  		req.ID, err = m.idGenerator.NewID(ctx)
   318  		if err != nil {
   319  			return err
   320  		}
   321  	}
   322  	row := &RelationRow{
   323  		ID:         req.ID,
   324  		DatabaseID: req.DatabaseID,
   325  		Name:       []byte(req.Name),
   326  		Type:       req.Type,
   327  		Properties: make(map[string]string),
   328  	}
   329  
   330  	// handle defs
   331  	var relAttrs []engine.Attribute
   332  	var primaryColumnName string
   333  	for _, def := range req.Defs {
   334  		switch def := def.(type) {
   335  
   336  		case *engine.CommentDef:
   337  			row.Comments = []byte(def.Comment)
   338  
   339  		case *engine.PartitionDef:
   340  			row.PartitionDef = []byte(def.Partition)
   341  
   342  		case *engine.ViewDef:
   343  			row.ViewDef = []byte(def.View)
   344  
   345  		case *engine.ConstraintDef:
   346  			row.Constraint, err = def.MarshalBinary()
   347  			if err != nil {
   348  				return err
   349  			}
   350  			pKeyDef := def.GetPrimaryKeyDef()
   351  			if pKeyDef != nil {
   352  				primaryColumnName = pKeyDef.Pkey.PkeyColName
   353  			}
   354  		case *engine.AttributeDef:
   355  			relAttrs = append(relAttrs, def.Attr)
   356  
   357  		case *engine.IndexTableDef:
   358  			// do nothing
   359  
   360  		case *engine.PropertiesDef:
   361  			for _, prop := range def.Properties {
   362  				row.Properties[prop.Key] = prop.Value
   363  			}
   364  
   365  		//case *engine.PrimaryIndexDef:
   366  		//	primaryColumnNames = def.Names
   367  
   368  		default:
   369  			panic(fmt.Sprintf("unknown table def: %T", def))
   370  		}
   371  	}
   372  
   373  	if len(relAttrs) == 0 && len(row.ViewDef) == 0 {
   374  		return moerr.NewConstraintViolationNoCtx("no schema")
   375  	}
   376  
   377  	// add row id
   378  	relAttrs = append(relAttrs, engine.Attribute{
   379  		IsHidden: true,
   380  		IsRowId:  true,
   381  		Name:     rowIDColumnName,
   382  		Type:     types.T_Rowid.ToType(),
   383  		Default: &plan.Default{
   384  			NullAbility: false,
   385  		},
   386  	})
   387  
   388  	// insert relation attributes
   389  	nameSet := make(map[string]bool)
   390  	for i, attr := range relAttrs {
   391  		if _, ok := nameSet[attr.Name]; ok {
   392  			return moerr.NewConstraintViolationNoCtx(`duplicate column "%s"`, attr.Name)
   393  		}
   394  		nameSet[attr.Name] = true
   395  		if primaryColumnName != "" {
   396  			isPrimary := false
   397  			if primaryColumnName == attr.Name {
   398  				isPrimary = true
   399  			}
   400  			attr.Primary = isPrimary
   401  		}
   402  
   403  		id, err := m.idGenerator.NewID(ctx)
   404  		if err != nil {
   405  			return err
   406  		}
   407  		attrRow := &AttributeRow{
   408  			ID:         id,
   409  			RelationID: row.ID,
   410  			Order:      i + 1,
   411  			Nullable:   attr.Default != nil && attr.Default.NullAbility,
   412  			Attribute:  attr,
   413  		}
   414  		if err := m.attributes.Insert(tx, attrRow); err != nil {
   415  			return err
   416  		}
   417  	}
   418  
   419  	// insert relation
   420  	if err := m.relations.Insert(tx, row); err != nil {
   421  		return err
   422  	}
   423  
   424  	resp.ID = row.ID
   425  	return nil
   426  }
   427  
   428  const rowIDColumnName = catalog.Row_ID
   429  
   430  func (m *MemHandler) HandleDelTableDef(ctx context.Context, meta txn.TxnMeta, req memoryengine.DelTableDefReq, resp *memoryengine.DelTableDefResp) error {
   431  	tx := m.getTx(meta)
   432  
   433  	table, err := m.relations.Get(tx, req.TableID)
   434  	if errors.Is(err, sql.ErrNoRows) {
   435  		return moerr.NewInternalErrorNoCtx(
   436  			"invalid table id %v, db %v, name %v",
   437  			req.TableID,
   438  			req.DatabaseName,
   439  			req.TableName,
   440  		)
   441  	}
   442  	if err != nil {
   443  		return err
   444  	}
   445  
   446  	switch def := req.Def.(type) {
   447  
   448  	case *engine.CommentDef:
   449  		// del comments
   450  		table.Comments = nil
   451  		if err := m.relations.Update(tx, table); err != nil {
   452  			return err
   453  		}
   454  
   455  	case *engine.AttributeDef:
   456  		// delete attribute
   457  		entries, err := m.attributes.Index(tx, Tuple{
   458  			index_RelationID_Name,
   459  			req.TableID,
   460  			Text(def.Attr.Name),
   461  		})
   462  		if err != nil {
   463  			return err
   464  		}
   465  		for _, entry := range entries {
   466  			if err := m.attributes.Delete(tx, entry.Key); err != nil {
   467  				return err
   468  			}
   469  			//TODO update DataValue
   470  		}
   471  
   472  	case *engine.IndexTableDef:
   473  		// do nothing
   474  
   475  	case *engine.ConstraintDef:
   476  		table.Constraint = nil
   477  		if err := m.relations.Update(tx, table); err != nil {
   478  			return err
   479  		}
   480  
   481  	case *engine.PropertiesDef:
   482  		// delete properties
   483  		for _, prop := range def.Properties {
   484  			delete(table.Properties, prop.Key)
   485  		}
   486  		if err := m.relations.Update(tx, table); err != nil {
   487  			return err
   488  		}
   489  
   490  	default:
   491  		panic(fmt.Sprintf("invalid table def: %T", req.Def))
   492  
   493  	}
   494  
   495  	return nil
   496  }
   497  
   498  func (m *MemHandler) HandleDelete(ctx context.Context, meta txn.TxnMeta, req memoryengine.DeleteReq, resp *memoryengine.DeleteResp) error {
   499  	tx := m.getTx(meta)
   500  	reqVecLen := req.Vector.Length()
   501  
   502  	// check table existence
   503  	_, err := m.relations.Get(tx, ID(req.TableID))
   504  	if err != nil {
   505  		if errors.Is(err, sql.ErrNoRows) {
   506  			panic(fmt.Sprintf("no such table: %v, %v", req.TableID, req.TableName))
   507  		}
   508  		return err
   509  	}
   510  
   511  	// by row id
   512  	if req.ColumnName == rowIDColumnName {
   513  		for i := 0; i < reqVecLen; i++ {
   514  			value := memorytable.VectorAt(req.Vector, i)
   515  			rowID := value.Value.(types.Rowid)
   516  			entries, err := m.data.Index(tx, Tuple{
   517  				index_RowID, memorytable.ToOrdered(rowID),
   518  			})
   519  			if err != nil {
   520  				return err
   521  			}
   522  			if len(entries) == 0 {
   523  				continue
   524  			}
   525  			if len(entries) != 1 {
   526  				panic("impossible")
   527  			}
   528  			if err := m.data.Delete(tx, entries[0].Key); err != nil {
   529  				return err
   530  			}
   531  		}
   532  		return nil
   533  	}
   534  
   535  	// by primary keys
   536  	entries, err := m.attributes.Index(tx, Tuple{
   537  		index_RelationID_IsPrimary,
   538  		req.TableID,
   539  		Bool(true),
   540  	})
   541  	if err != nil {
   542  		return err
   543  	}
   544  	if len(entries) == 1 {
   545  		attr, err := m.attributes.Get(tx, entries[0].Key)
   546  		if err != nil {
   547  			return err
   548  		}
   549  		if attr.Name == req.ColumnName {
   550  			// by primary key
   551  			for i := 0; i < reqVecLen; i++ {
   552  				value := memorytable.VectorAt(req.Vector, i)
   553  				key := DataKey{
   554  					tableID:    req.TableID,
   555  					primaryKey: Tuple{memorytable.ToOrdered(value.Value)},
   556  				}
   557  				if err := m.data.Delete(tx, key); err != nil {
   558  					return err
   559  				}
   560  			}
   561  			return nil
   562  		}
   563  	}
   564  
   565  	// by non-primary key, slow but works
   566  	entries, err = m.attributes.Index(tx, Tuple{
   567  		index_RelationID_Name,
   568  		req.TableID,
   569  		Text(req.ColumnName),
   570  	})
   571  	if err != nil {
   572  		return err
   573  	}
   574  	if len(entries) == 0 {
   575  		return moerr.NewInternalErrorNoCtx("no such column: %s", req.ColumnName)
   576  	}
   577  	if len(entries) != 1 {
   578  		panic("impossible")
   579  	}
   580  	attr, err := m.attributes.Get(tx, entries[0].Key)
   581  	if err != nil {
   582  		return err
   583  	}
   584  	attrIndex := attr.Order
   585  	iter, err := m.data.NewIter(tx)
   586  	if err != nil {
   587  		return err
   588  	}
   589  	defer iter.Close()
   590  	tableKey := DataKey{
   591  		tableID: req.TableID,
   592  	}
   593  	for ok := iter.Seek(tableKey); ok; ok = iter.Next() {
   594  		key, dataValue, err := iter.Read()
   595  		if err != nil {
   596  			return err
   597  		}
   598  		if key.tableID != req.TableID {
   599  			break
   600  		}
   601  		for i := 0; i < reqVecLen; i++ {
   602  			value := memorytable.VectorAt(req.Vector, i)
   603  			if attrIndex >= len(dataValue) {
   604  				// attr not in row
   605  				continue
   606  			}
   607  			attrInRow := dataValue[attrIndex]
   608  			if value.Equal(attrInRow) {
   609  				if err := m.data.Delete(tx, key); err != nil {
   610  					return err
   611  				}
   612  			}
   613  		}
   614  	}
   615  
   616  	return nil
   617  }
   618  
   619  func (m *MemHandler) HandleDeleteDatabase(ctx context.Context, meta txn.TxnMeta, req memoryengine.DeleteDatabaseReq, resp *memoryengine.DeleteDatabaseResp) error {
   620  	tx := m.getTx(meta)
   621  
   622  	entries, err := m.databases.Index(tx, Tuple{
   623  		index_AccountID_Name,
   624  		Uint(req.AccessInfo.AccountID),
   625  		Text(req.Name),
   626  	})
   627  	if err != nil {
   628  		return err
   629  	}
   630  	if len(entries) == 0 {
   631  		return moerr.NewNoDBNoCtx()
   632  	}
   633  
   634  	for _, entry := range entries {
   635  		db, err := m.databases.Get(tx, entry.Key)
   636  		if err != nil {
   637  			return err
   638  		}
   639  		if err := m.databases.Delete(tx, entry.Key); err != nil {
   640  			return err
   641  		}
   642  		if err := m.deleteRelationsByDBID(tx, db.ID); err != nil {
   643  			return err
   644  		}
   645  		resp.ID = db.ID
   646  	}
   647  
   648  	return nil
   649  }
   650  
   651  func (m *MemHandler) deleteRelationsByDBID(tx *Transaction, dbID ID) error {
   652  	entries, err := m.relations.Index(tx, Tuple{
   653  		index_DatabaseID,
   654  		dbID,
   655  	})
   656  	if err != nil {
   657  		return err
   658  	}
   659  	for _, entry := range entries {
   660  		rel, err := m.relations.Get(tx, entry.Key)
   661  		if err != nil {
   662  			return err
   663  		}
   664  		if err := m.relations.Delete(tx, entry.Key); err != nil {
   665  			return err
   666  		}
   667  		if err := m.deleteAttributesByRelationID(tx, rel.ID); err != nil {
   668  			return err
   669  		}
   670  		if err := m.deleteRelationData(tx, rel.ID); err != nil {
   671  			return err
   672  		}
   673  	}
   674  	return nil
   675  }
   676  
   677  func (m *MemHandler) deleteAttributesByRelationID(tx *Transaction, relationID ID) error {
   678  	entries, err := m.attributes.Index(tx, Tuple{
   679  		index_RelationID,
   680  		relationID,
   681  	})
   682  	if err != nil {
   683  		return err
   684  	}
   685  	for _, entry := range entries {
   686  		if err := m.attributes.Delete(tx, entry.Key); err != nil {
   687  			return err
   688  		}
   689  	}
   690  	return nil
   691  }
   692  
   693  func (m *MemHandler) deleteRelationData(tx *Transaction, relationID ID) error {
   694  	iter, err := m.data.NewIter(tx)
   695  	if err != nil {
   696  		return err
   697  	}
   698  	defer iter.Close()
   699  	tableKey := DataKey{
   700  		tableID: relationID,
   701  	}
   702  	for ok := iter.Seek(tableKey); ok; ok = iter.Next() {
   703  		key, _, err := iter.Read()
   704  		if err != nil {
   705  			return err
   706  		}
   707  		if key.tableID != relationID {
   708  			break
   709  		}
   710  		if err := m.data.Delete(tx, key); err != nil {
   711  			return err
   712  		}
   713  	}
   714  	return nil
   715  }
   716  
   717  func (m *MemHandler) HandleDeleteRelation(ctx context.Context, meta txn.TxnMeta, req memoryengine.DeleteRelationReq, resp *memoryengine.DeleteRelationResp) error {
   718  	tx := m.getTx(meta)
   719  	entries, err := m.relations.Index(tx, Tuple{
   720  		index_DatabaseID_Name,
   721  		req.DatabaseID,
   722  		Text(req.Name),
   723  	})
   724  	if err != nil {
   725  		return err
   726  	}
   727  	if len(entries) == 0 {
   728  		// the caller expects no error if table not exist
   729  		//resp.ErrNotFound.Name = req.Name
   730  		return nil
   731  	}
   732  	if len(entries) != 1 {
   733  		panic("impossible")
   734  	}
   735  	entry := entries[0]
   736  	rel, err := m.relations.Get(tx, entry.Key)
   737  	if err != nil {
   738  		return err
   739  	}
   740  	if err := m.relations.Delete(tx, entry.Key); err != nil {
   741  		return err
   742  	}
   743  	if err := m.deleteAttributesByRelationID(tx, rel.ID); err != nil {
   744  		return err
   745  	}
   746  	resp.ID = rel.ID
   747  	return nil
   748  }
   749  
   750  func (m *MemHandler) HandleTruncateRelation(ctx context.Context, meta txn.TxnMeta, req memoryengine.TruncateRelationReq, resp *memoryengine.TruncateRelationResp) error {
   751  	tx := m.getTx(meta)
   752  	_, err := m.relations.Get(tx, req.OldTableID)
   753  	if errors.Is(err, sql.ErrNoRows) {
   754  		return moerr.NewNoSuchTableNoCtx(req.DatabaseName, req.Name)
   755  	}
   756  	return m.deleteRelationData(tx, req.OldTableID)
   757  }
   758  
   759  func (m *MemHandler) HandleGetDatabases(ctx context.Context, meta txn.TxnMeta, req memoryengine.GetDatabasesReq, resp *memoryengine.GetDatabasesResp) error {
   760  	tx := m.getTx(meta)
   761  
   762  	entries, err := m.databases.Index(tx, Tuple{
   763  		index_AccountID,
   764  		Uint(req.AccessInfo.AccountID),
   765  	})
   766  	if err != nil {
   767  		return err
   768  	}
   769  
   770  	for _, entry := range entries {
   771  		db, err := m.databases.Get(tx, entry.Key)
   772  		if err != nil {
   773  			return err
   774  		}
   775  		resp.Names = append(resp.Names, string(db.Name))
   776  	}
   777  
   778  	return nil
   779  }
   780  
   781  func (m *MemHandler) HandleGetPrimaryKeys(ctx context.Context, meta txn.TxnMeta, req memoryengine.GetPrimaryKeysReq, resp *memoryengine.GetPrimaryKeysResp) error {
   782  	tx := m.getTx(meta)
   783  	entries, err := m.attributes.Index(tx, Tuple{
   784  		index_RelationID_IsPrimary,
   785  		req.TableID,
   786  		Bool(true),
   787  	})
   788  	if err != nil {
   789  		return err
   790  	}
   791  	for _, entry := range entries {
   792  		attr, err := m.attributes.Get(tx, entry.Key)
   793  		if err != nil {
   794  			return err
   795  		}
   796  		resp.Attrs = append(resp.Attrs, &attr.Attribute)
   797  	}
   798  	return nil
   799  }
   800  
   801  func (m *MemHandler) HandleGetRelations(ctx context.Context, meta txn.TxnMeta, req memoryengine.GetRelationsReq, resp *memoryengine.GetRelationsResp) error {
   802  	tx := m.getTx(meta)
   803  
   804  	entries, err := m.relations.Index(tx, Tuple{
   805  		index_DatabaseID,
   806  		req.DatabaseID,
   807  	})
   808  	if err != nil {
   809  		return err
   810  	}
   811  	for _, entry := range entries {
   812  		rel, err := m.relations.Get(tx, entry.Key)
   813  		if err != nil {
   814  			return err
   815  		}
   816  		resp.Names = append(resp.Names, string(rel.Name))
   817  	}
   818  	return nil
   819  }
   820  
   821  func (m *MemHandler) HandleGetTableColumns(ctx context.Context, meta txn.TxnMeta, req memoryengine.GetTableColumnsReq, resp *memoryengine.GetTableColumnsResp) error {
   822  	tx := m.getTx(meta)
   823  
   824  	_, err := m.relations.Get(tx, req.TableID)
   825  	if errors.Is(err, sql.ErrNoRows) {
   826  		// the caller expects no error if table not exist
   827  		//resp.ErrTableNotFound.ID = req.TableID
   828  		return nil
   829  	}
   830  	if err != nil {
   831  		return err
   832  	}
   833  
   834  	var attrRows []*AttributeRow
   835  	if err := m.iterRelationAttributes(
   836  		tx, req.TableID,
   837  		func(_ ID, row *AttributeRow) error {
   838  			attrRows = append(attrRows, row)
   839  			return nil
   840  		},
   841  	); err != nil {
   842  		return err
   843  	}
   844  	sort.Slice(attrRows, func(i, j int) bool {
   845  		return attrRows[i].Order < attrRows[j].Order
   846  	})
   847  	for _, row := range attrRows {
   848  		resp.Attrs = append(resp.Attrs, &row.Attribute)
   849  	}
   850  	return nil
   851  }
   852  
   853  func (m *MemHandler) HandleGetTableDefs(ctx context.Context, meta txn.TxnMeta, req memoryengine.GetTableDefsReq, resp *memoryengine.GetTableDefsResp) error {
   854  	tx := m.getTx(meta)
   855  
   856  	relRow, err := m.relations.Get(tx, req.TableID)
   857  	if errors.Is(err, sql.ErrNoRows) {
   858  		// the caller expects no error if table not exist
   859  		//resp.ErrTableNotFound.ID = req.TableID
   860  		return nil
   861  	}
   862  	if err != nil {
   863  		return err
   864  	}
   865  
   866  	// comments
   867  	if len(relRow.Comments) != 0 {
   868  		resp.Defs = append(resp.Defs, &engine.CommentDef{
   869  			Comment: string(relRow.Comments),
   870  		})
   871  	}
   872  
   873  	// partiton
   874  	if len(relRow.PartitionDef) != 0 {
   875  		resp.Defs = append(resp.Defs, &engine.PartitionDef{
   876  			Partition: string(relRow.PartitionDef),
   877  		})
   878  	}
   879  
   880  	// view
   881  	if len(relRow.ViewDef) != 0 {
   882  		resp.Defs = append(resp.Defs, &engine.ViewDef{
   883  			View: string(relRow.ViewDef),
   884  		})
   885  	}
   886  
   887  	// attributes and primary index
   888  	{
   889  		var primaryAttrNames []string
   890  		var attrRows []*AttributeRow
   891  		if err := m.iterRelationAttributes(
   892  			tx, req.TableID,
   893  			func(_ ID, row *AttributeRow) error {
   894  				if row.IsHidden {
   895  					return nil
   896  				}
   897  				attrRows = append(attrRows, row)
   898  				if row.Primary {
   899  					primaryAttrNames = append(primaryAttrNames, row.Name)
   900  				}
   901  				return nil
   902  			},
   903  		); err != nil {
   904  			return err
   905  		}
   906  
   907  		sort.Slice(attrRows, func(i, j int) bool {
   908  			return attrRows[i].Order < attrRows[j].Order
   909  		})
   910  		for _, row := range attrRows {
   911  			resp.Defs = append(resp.Defs, &engine.AttributeDef{
   912  				Attr: row.Attribute,
   913  			})
   914  
   915  		}
   916  	}
   917  
   918  	// Constraint
   919  	if len(relRow.Constraint) != 0 {
   920  		c := new(engine.ConstraintDef)
   921  		if err = c.UnmarshalBinary(relRow.Constraint); err != nil {
   922  			return err
   923  		}
   924  		resp.Defs = append(resp.Defs, c)
   925  	}
   926  
   927  	// properties
   928  	if len(relRow.Properties) > 0 {
   929  		propertiesDef := new(engine.PropertiesDef)
   930  		for key, value := range relRow.Properties {
   931  			propertiesDef.Properties = append(propertiesDef.Properties, engine.Property{
   932  				Key:   key,
   933  				Value: value,
   934  			})
   935  		}
   936  		resp.Defs = append(resp.Defs, propertiesDef)
   937  	}
   938  
   939  	return nil
   940  }
   941  
   942  func (m *MemHandler) HandleGetHiddenKeys(ctx context.Context, meta txn.TxnMeta, req memoryengine.GetHiddenKeysReq, resp *memoryengine.GetHiddenKeysResp) error {
   943  	tx := m.getTx(meta)
   944  	entries, err := m.attributes.Index(tx, Tuple{
   945  		index_RelationID_IsHidden,
   946  		req.TableID,
   947  		Bool(true),
   948  	})
   949  	if err != nil {
   950  		return err
   951  	}
   952  	for _, entry := range entries {
   953  		attr, err := m.attributes.Get(tx, entry.Key)
   954  		if err != nil {
   955  			return err
   956  		}
   957  		resp.Attrs = append(resp.Attrs, &attr.Attribute)
   958  	}
   959  	return nil
   960  }
   961  
   962  func (m *MemHandler) HandleNewTableIter(ctx context.Context, meta txn.TxnMeta, req memoryengine.NewTableIterReq, resp *memoryengine.NewTableIterResp) error {
   963  	tx := m.getTx(meta)
   964  
   965  	tableIter, err := m.data.NewIter(tx)
   966  	if err != nil {
   967  		return err
   968  	}
   969  	attrsMap := make(map[string]*AttributeRow)
   970  	if err := m.iterRelationAttributes(
   971  		tx, req.TableID,
   972  		func(_ ID, row *AttributeRow) error {
   973  			attrsMap[row.Name] = row
   974  			return nil
   975  		},
   976  	); err != nil {
   977  		return err
   978  	}
   979  
   980  	iter := &Iter[DataKey, DataValue]{
   981  		TableIter: tableIter,
   982  		TableID:   req.TableID,
   983  		AttrsMap:  attrsMap,
   984  		Expr:      req.Expr,
   985  		nextFunc: func() bool {
   986  			tableKey := DataKey{
   987  				tableID: req.TableID,
   988  			}
   989  			return tableIter.Seek(tableKey)
   990  		},
   991  		Tx: tx,
   992  	}
   993  
   994  	m.iterators.Lock()
   995  	defer m.iterators.Unlock()
   996  	id, err := m.idGenerator.NewID(ctx)
   997  	if err != nil {
   998  		return err
   999  	}
  1000  	resp.IterID = id
  1001  	m.iterators.Map[id] = iter
  1002  
  1003  	return nil
  1004  }
  1005  
  1006  func (m *MemHandler) HandleOpenDatabase(ctx context.Context, meta txn.TxnMeta, req memoryengine.OpenDatabaseReq, resp *memoryengine.OpenDatabaseResp) error {
  1007  	tx := m.getTx(meta)
  1008  
  1009  	entries, err := m.databases.Index(tx, Tuple{
  1010  		index_AccountID_Name,
  1011  		Uint(req.AccessInfo.AccountID),
  1012  		Text(req.Name),
  1013  	})
  1014  	if err != nil {
  1015  		return err
  1016  	}
  1017  
  1018  	if len(entries) == 0 {
  1019  		return moerr.NewNoDBNoCtx()
  1020  	}
  1021  
  1022  	entry := entries[0]
  1023  	db, err := m.databases.Get(tx, entry.Key)
  1024  	if err != nil {
  1025  		return err
  1026  	}
  1027  	resp.ID = db.ID
  1028  	resp.Name = string(db.Name)
  1029  
  1030  	return nil
  1031  }
  1032  
  1033  func (m *MemHandler) HandleOpenRelation(ctx context.Context, meta txn.TxnMeta, req memoryengine.OpenRelationReq, resp *memoryengine.OpenRelationResp) error {
  1034  	tx := m.getTx(meta)
  1035  	entries, err := m.relations.Index(tx, Tuple{
  1036  		index_DatabaseID_Name,
  1037  		req.DatabaseID,
  1038  		Text(req.Name),
  1039  	})
  1040  	if err != nil {
  1041  		return err
  1042  	}
  1043  	if len(entries) == 0 {
  1044  		return moerr.NewNoSuchTableNoCtx(req.DatabaseName, req.Name)
  1045  	}
  1046  	entry := entries[0]
  1047  	rel, err := m.relations.Get(tx, entry.Key)
  1048  	if err != nil {
  1049  		return err
  1050  	}
  1051  	resp.ID = rel.ID
  1052  	resp.Type = rel.Type
  1053  	resp.RelationName = string(rel.Name)
  1054  	db, err := m.databases.Get(tx, rel.DatabaseID)
  1055  	if err != nil {
  1056  		return err
  1057  	}
  1058  	resp.DatabaseName = string(db.Name)
  1059  	return nil
  1060  }
  1061  
  1062  func (m *MemHandler) HandleRead(ctx context.Context, meta txn.TxnMeta, req memoryengine.ReadReq, resp *memoryengine.ReadResp) error {
  1063  	resp.SetHeap(m.mheap)
  1064  
  1065  	m.iterators.Lock()
  1066  	iter, ok := m.iterators.Map[req.IterID]
  1067  	if !ok {
  1068  		m.iterators.Unlock()
  1069  		return moerr.NewInternalErrorNoCtx("no such iter: %v", req.IterID)
  1070  	}
  1071  	m.iterators.Unlock()
  1072  
  1073  	b := batch.New(false, req.ColNames)
  1074  
  1075  	for i, name := range req.ColNames {
  1076  		b.Vecs[i] = vector.New(iter.AttrsMap[name].Type)
  1077  	}
  1078  
  1079  	fn := iter.TableIter.Next
  1080  	if iter.nextFunc != nil {
  1081  		fn = iter.nextFunc
  1082  		iter.nextFunc = nil
  1083  	}
  1084  
  1085  	maxRows := 4096
  1086  	type Row struct {
  1087  		Value DataValue
  1088  	}
  1089  	var rows []Row
  1090  
  1091  	for ok := fn(); ok; ok = iter.TableIter.Next() {
  1092  		key, value, err := iter.TableIter.Read()
  1093  		if err != nil {
  1094  			return err
  1095  		}
  1096  		if err != nil {
  1097  			return err
  1098  		}
  1099  		if key.tableID != iter.TableID {
  1100  			break
  1101  		}
  1102  
  1103  		rows = append(rows, Row{
  1104  			Value: value,
  1105  		})
  1106  		if len(rows) >= maxRows {
  1107  			break
  1108  		}
  1109  	}
  1110  
  1111  	// sort to emulate TAE behavior TODO remove this after BVT fixes
  1112  	//sort.Slice(rows, func(i, j int) bool {
  1113  	//	return rows[i].PhysicalRow.LastUpdate.Before(
  1114  	//		rows[j].PhysicalRow.LastUpdate,
  1115  	//	)
  1116  	//})
  1117  
  1118  	tx := m.getTx(meta)
  1119  	for _, row := range rows {
  1120  		namedRow := &NamedDataRow{
  1121  			Value:    row.Value,
  1122  			AttrsMap: iter.AttrsMap,
  1123  		}
  1124  		if err := appendNamedRowToBatch(tx, m, 0, b, namedRow); err != nil {
  1125  			return err
  1126  		}
  1127  	}
  1128  
  1129  	if len(rows) > 0 {
  1130  		b.InitZsOne(len(rows))
  1131  		for _, vec := range b.Vecs {
  1132  			nulls.TryExpand(vec.GetNulls(), len(rows))
  1133  		}
  1134  		resp.Batch = b
  1135  	}
  1136  
  1137  	return nil
  1138  }
  1139  
  1140  func (m *MemHandler) HandleUpdate(ctx context.Context, meta txn.TxnMeta, req memoryengine.UpdateReq, resp *memoryengine.UpdateResp) error {
  1141  	tx := m.getTx(meta)
  1142  
  1143  	if err := m.rangeBatchPhysicalRows(
  1144  		tx,
  1145  		req.TableID,
  1146  		req.DatabaseName,
  1147  		req.TableName,
  1148  		req.Batch,
  1149  		func(
  1150  			row *DataRow,
  1151  			_ types.Rowid,
  1152  		) error {
  1153  			if err := m.data.Update(tx, *row); err != nil {
  1154  				return err
  1155  			}
  1156  			return nil
  1157  		},
  1158  	); err != nil {
  1159  		return err
  1160  	}
  1161  
  1162  	return nil
  1163  }
  1164  
  1165  func (m *MemHandler) HandleWrite(ctx context.Context, meta txn.TxnMeta, req memoryengine.WriteReq, resp *memoryengine.WriteResp) error {
  1166  	tx := m.getTx(meta)
  1167  
  1168  	if err := m.rangeBatchPhysicalRows(
  1169  		tx,
  1170  		req.TableID,
  1171  		req.DatabaseName,
  1172  		req.TableName,
  1173  		req.Batch,
  1174  		func(
  1175  			row *DataRow,
  1176  			_ types.Rowid,
  1177  		) error {
  1178  			if err := m.data.Insert(tx, *row); err != nil {
  1179  				return err
  1180  			}
  1181  			return nil
  1182  		},
  1183  	); err != nil {
  1184  		return err
  1185  	}
  1186  
  1187  	return nil
  1188  }
  1189  
  1190  func (m *MemHandler) rangeBatchPhysicalRows(
  1191  	tx *Transaction,
  1192  	tableID ID,
  1193  	dbName string,
  1194  	tableName string,
  1195  	b *batch.Batch,
  1196  	fn func(
  1197  		*DataRow,
  1198  		types.Rowid,
  1199  	) error,
  1200  ) error {
  1201  
  1202  	// load attributes
  1203  	nameToAttrs := make(map[string]*AttributeRow)
  1204  	if err := m.iterRelationAttributes(
  1205  		tx, tableID,
  1206  		func(_ ID, row *AttributeRow) error {
  1207  			nameToAttrs[row.Name] = row
  1208  			return nil
  1209  		},
  1210  	); err != nil {
  1211  		return err
  1212  	}
  1213  
  1214  	if len(nameToAttrs) == 0 {
  1215  		return moerr.NewInternalErrorNoCtx(
  1216  			"invalid table id %v, db %v, name %v",
  1217  			tableID,
  1218  			dbName,
  1219  			tableName,
  1220  		)
  1221  	}
  1222  
  1223  	// iter
  1224  	batchIter := memorytable.NewBatchIter(b)
  1225  	for {
  1226  		row := batchIter()
  1227  		if len(row) == 0 {
  1228  			break
  1229  		}
  1230  
  1231  		rowID := newRowID()
  1232  		physicalRow := NewDataRow(
  1233  			tableID,
  1234  			[]Tuple{
  1235  				{index_RowID, memorytable.ToOrdered(rowID)},
  1236  			},
  1237  		)
  1238  		physicalRow.value = make(DataValue, 0, len(nameToAttrs))
  1239  		idx := nameToAttrs[rowIDColumnName].Order
  1240  		for idx >= len(physicalRow.value) {
  1241  			physicalRow.value = append(physicalRow.value, Nullable{})
  1242  		}
  1243  		physicalRow.value[idx] = Nullable{
  1244  			Value: rowID,
  1245  		}
  1246  
  1247  		for i, col := range row {
  1248  			name := b.Attrs[i]
  1249  
  1250  			attr, ok := nameToAttrs[name]
  1251  			if !ok {
  1252  				panic(fmt.Sprintf("unknown attr: %s", name))
  1253  			}
  1254  
  1255  			if attr.Primary {
  1256  				physicalRow.key.primaryKey = append(
  1257  					physicalRow.key.primaryKey,
  1258  					memorytable.ToOrdered(col.Value),
  1259  				)
  1260  			}
  1261  
  1262  			idx := attr.Order
  1263  			for idx >= len(physicalRow.value) {
  1264  				physicalRow.value = append(physicalRow.value, Nullable{})
  1265  			}
  1266  			physicalRow.value[idx] = col
  1267  		}
  1268  
  1269  		// use row id as primary key if no primary key is provided
  1270  		if len(physicalRow.key.primaryKey) == 0 {
  1271  			physicalRow.key.primaryKey = append(
  1272  				physicalRow.key.primaryKey,
  1273  				memorytable.ToOrdered(rowID),
  1274  			)
  1275  		}
  1276  
  1277  		if err := fn(physicalRow, rowID); err != nil {
  1278  			return err
  1279  		}
  1280  
  1281  	}
  1282  
  1283  	return nil
  1284  }
  1285  
  1286  func (m *MemHandler) getTx(meta txn.TxnMeta) *Transaction {
  1287  	id := string(meta.ID)
  1288  	m.transactions.Lock()
  1289  	defer m.transactions.Unlock()
  1290  	tx, ok := m.transactions.Map[id]
  1291  	if !ok {
  1292  		ts := meta.SnapshotTS
  1293  		if ts.IsEmpty() {
  1294  			ts = memorytable.Now(m.clock)
  1295  		}
  1296  		tx = memorytable.NewTransaction(ts)
  1297  		m.transactions.Map[id] = tx
  1298  	}
  1299  	return tx
  1300  }
  1301  
  1302  func (*MemHandler) HandleClose(ctx context.Context) error {
  1303  	return nil
  1304  }
  1305  
  1306  func (m *MemHandler) HandleCommit(ctx context.Context, meta txn.TxnMeta) error {
  1307  	tx := m.getTx(meta)
  1308  	commitTS := meta.CommitTS
  1309  	if err := tx.Commit(commitTS); err != nil {
  1310  		return err
  1311  	}
  1312  	return nil
  1313  }
  1314  
  1315  func (m *MemHandler) HandleCommitting(ctx context.Context, meta txn.TxnMeta) error {
  1316  	return nil
  1317  }
  1318  
  1319  func (m *MemHandler) HandleDestroy(ctx context.Context) error {
  1320  	*m = *NewMemHandler(m.mheap, m.clock, m.idGenerator)
  1321  	return nil
  1322  }
  1323  
  1324  func (m *MemHandler) HandlePrepare(ctx context.Context, meta txn.TxnMeta) (timestamp.Timestamp, error) {
  1325  	now, _ := m.clock.Now()
  1326  	return now, nil
  1327  }
  1328  
  1329  func (m *MemHandler) HandleRollback(ctx context.Context, meta txn.TxnMeta) error {
  1330  	tx := m.getTx(meta)
  1331  	tx.Abort()
  1332  	return nil
  1333  }
  1334  
  1335  func (m *MemHandler) HandleStartRecovery(ctx context.Context, ch chan txn.TxnMeta) {
  1336  	// no recovery
  1337  	close(ch)
  1338  }
  1339  
  1340  func (m *MemHandler) iterRelationAttributes(
  1341  	tx *Transaction,
  1342  	relationID ID,
  1343  	fn func(key ID, row *AttributeRow) error,
  1344  ) error {
  1345  	entries, err := m.attributes.Index(tx, Tuple{
  1346  		index_RelationID,
  1347  		relationID,
  1348  	})
  1349  	if err != nil {
  1350  		return err
  1351  	}
  1352  	for _, entry := range entries {
  1353  		attr, err := m.attributes.Get(tx, entry.Key)
  1354  		if err != nil {
  1355  			return err
  1356  		}
  1357  		if err := fn(entry.Key, attr); err != nil {
  1358  			return err
  1359  		}
  1360  	}
  1361  	return nil
  1362  }
  1363  
  1364  func (m *MemHandler) HandleTableStats(ctx context.Context, meta txn.TxnMeta, req memoryengine.TableStatsReq, resp *memoryengine.TableStatsResp) (err error) {
  1365  	tx := m.getTx(meta)
  1366  
  1367  	// maybe an estimation is enough
  1368  	iter, err := m.data.NewIter(tx)
  1369  	if err != nil {
  1370  		return err
  1371  	}
  1372  	defer iter.Close()
  1373  	n := 0
  1374  	tableKey := DataKey{
  1375  		tableID: req.TableID,
  1376  	}
  1377  	for ok := iter.Seek(tableKey); ok; ok = iter.Next() {
  1378  		key, _, err := iter.Read()
  1379  		if err != nil {
  1380  			return err
  1381  		}
  1382  		if key.tableID != req.TableID {
  1383  			break
  1384  		}
  1385  		n++
  1386  	}
  1387  	resp.Rows = n
  1388  
  1389  	return nil
  1390  }
  1391  
  1392  func newRowID() types.Rowid {
  1393  	var rowid types.Rowid
  1394  	err := binary.Read(crand.Reader, binary.LittleEndian, &rowid)
  1395  	if err != nil {
  1396  		panic(err)
  1397  	}
  1398  	return rowid
  1399  }