github.com/matrixorigin/matrixone@v0.7.0/pkg/vm/engine/tae/rpc/base_test.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 rpc
    16  
    17  import (
    18  	"context"
    19  	"fmt"
    20  	catalog2 "github.com/matrixorigin/matrixone/pkg/vm/engine/tae/catalog"
    21  	"github.com/matrixorigin/matrixone/pkg/vm/engine/tae/containers"
    22  	"testing"
    23  	"time"
    24  
    25  	"github.com/matrixorigin/matrixone/pkg/catalog"
    26  	"github.com/matrixorigin/matrixone/pkg/common/moerr"
    27  	"github.com/matrixorigin/matrixone/pkg/common/mpool"
    28  	"github.com/matrixorigin/matrixone/pkg/container/batch"
    29  	"github.com/matrixorigin/matrixone/pkg/container/types"
    30  	"github.com/matrixorigin/matrixone/pkg/container/vector"
    31  	"github.com/matrixorigin/matrixone/pkg/pb/api"
    32  	"github.com/matrixorigin/matrixone/pkg/pb/metadata"
    33  	"github.com/matrixorigin/matrixone/pkg/pb/txn"
    34  	"github.com/matrixorigin/matrixone/pkg/vm/engine"
    35  	"github.com/matrixorigin/matrixone/pkg/vm/engine/tae/db"
    36  	"github.com/matrixorigin/matrixone/pkg/vm/engine/tae/moengine"
    37  	"github.com/matrixorigin/matrixone/pkg/vm/engine/tae/options"
    38  	"github.com/matrixorigin/matrixone/pkg/vm/engine/tae/tasks"
    39  	"github.com/matrixorigin/matrixone/pkg/vm/engine/tae/testutils"
    40  )
    41  
    42  const ModuleName = "TAEHANDLE"
    43  
    44  type mockHandle struct {
    45  	*Handle
    46  	m *mpool.MPool
    47  }
    48  
    49  type CmdType int32
    50  
    51  const (
    52  	CmdPreCommitWrite CmdType = iota
    53  	CmdPrepare
    54  	CmdCommitting
    55  	CmdCommit
    56  	CmdRollback
    57  )
    58  
    59  type txnCommand struct {
    60  	typ CmdType
    61  	cmd any
    62  }
    63  
    64  func (h *mockHandle) HandleClose(ctx context.Context) error {
    65  	err := h.Handle.HandleClose(ctx)
    66  	return err
    67  }
    68  
    69  func (h *mockHandle) HandleCommit(ctx context.Context, meta *txn.TxnMeta) error {
    70  	//2PC
    71  	if len(meta.DNShards) > 1 && meta.CommitTS.IsEmpty() {
    72  		meta.CommitTS = meta.PreparedTS.Next()
    73  	}
    74  	return h.Handle.HandleCommit(ctx, *meta)
    75  }
    76  
    77  func (h *mockHandle) HandleCommitting(ctx context.Context, meta *txn.TxnMeta) error {
    78  	//meta.CommitTS = h.eng.GetTAE(context.TODO()).TxnMgr.TsAlloc.Alloc().ToTimestamp()
    79  	if meta.PreparedTS.IsEmpty() {
    80  		return moerr.NewInternalError(ctx, "PreparedTS is empty")
    81  	}
    82  	meta.CommitTS = meta.PreparedTS.Next()
    83  	return h.Handle.HandleCommitting(ctx, *meta)
    84  }
    85  
    86  func (h *mockHandle) HandlePrepare(ctx context.Context, meta *txn.TxnMeta) error {
    87  	pts, err := h.Handle.HandlePrepare(ctx, *meta)
    88  	if err != nil {
    89  		return err
    90  	}
    91  	meta.PreparedTS = pts
    92  	return nil
    93  }
    94  
    95  func (h *mockHandle) HandleRollback(ctx context.Context, meta *txn.TxnMeta) error {
    96  	return h.Handle.HandleRollback(ctx, *meta)
    97  }
    98  
    99  func (h *mockHandle) HandlePreCommit(
   100  	ctx context.Context,
   101  	meta *txn.TxnMeta,
   102  	req api.PrecommitWriteCmd,
   103  	resp *api.SyncLogTailResp) error {
   104  
   105  	return h.Handle.HandlePreCommitWrite(ctx, *meta, req, resp)
   106  }
   107  
   108  func (h *mockHandle) handleCmds(
   109  	ctx context.Context,
   110  	txn *txn.TxnMeta,
   111  	cmds []txnCommand) (err error) {
   112  	for _, e := range cmds {
   113  		switch e.typ {
   114  		case CmdPreCommitWrite:
   115  			cmd, ok := e.cmd.(api.PrecommitWriteCmd)
   116  			if !ok {
   117  				return moerr.NewInfo(ctx, "cmd is not PreCommitWriteCmd")
   118  			}
   119  			if err = h.Handle.HandlePreCommitWrite(ctx, *txn,
   120  				cmd, new(api.SyncLogTailResp)); err != nil {
   121  				return
   122  			}
   123  		case CmdPrepare:
   124  			if err = h.HandlePrepare(ctx, txn); err != nil {
   125  				return
   126  			}
   127  		case CmdCommitting:
   128  			if err = h.HandleCommitting(ctx, txn); err != nil {
   129  				return
   130  			}
   131  		case CmdCommit:
   132  			if err = h.HandleCommit(ctx, txn); err != nil {
   133  				return
   134  			}
   135  		case CmdRollback:
   136  			if err = h.HandleRollback(ctx, txn); err != nil {
   137  				return
   138  			}
   139  		default:
   140  			panic(moerr.NewInfo(ctx, "Invalid CmdType"))
   141  		}
   142  	}
   143  	return
   144  }
   145  
   146  func initDB(t *testing.T, opts *options.Options) *db.DB {
   147  	dir := testutils.InitTestEnv(ModuleName, t)
   148  	db, _ := db.Open(dir, opts)
   149  	return db
   150  }
   151  
   152  func mockTAEHandle(t *testing.T, opts *options.Options) *mockHandle {
   153  	tae := initDB(t, opts)
   154  	mh := &mockHandle{
   155  		m: mpool.MustNewZero(),
   156  	}
   157  
   158  	mh.Handle = &Handle{
   159  		eng:          moengine.NewEngine(tae),
   160  		jobScheduler: tasks.NewParallelJobScheduler(5),
   161  	}
   162  	mh.Handle.mu.txnCtxs = make(map[string]*txnContext)
   163  	return mh
   164  }
   165  
   166  func mock1PCTxn(eng moengine.TxnEngine) *txn.TxnMeta {
   167  	txnMeta := &txn.TxnMeta{}
   168  	txnMeta.ID = eng.GetTAE(context.TODO()).TxnMgr.IdAlloc.Alloc()
   169  	txnMeta.SnapshotTS = eng.GetTAE(context.TODO()).TxnMgr.TsAlloc.Alloc().ToTimestamp()
   170  	return txnMeta
   171  }
   172  
   173  func mockDNShard(id uint64) metadata.DNShard {
   174  	return metadata.DNShard{
   175  		DNShardRecord: metadata.DNShardRecord{
   176  			ShardID:    id,
   177  			LogShardID: id,
   178  		},
   179  		ReplicaID: id,
   180  		Address:   fmt.Sprintf("dn-%d", id),
   181  	}
   182  }
   183  
   184  func mock2PCTxn(eng moengine.TxnEngine) *txn.TxnMeta {
   185  	txnMeta := &txn.TxnMeta{}
   186  	txnMeta.ID = eng.GetTAE(context.TODO()).TxnMgr.IdAlloc.Alloc()
   187  	txnMeta.SnapshotTS = eng.GetTAE(context.TODO()).TxnMgr.TsAlloc.Alloc().ToTimestamp()
   188  	txnMeta.DNShards = append(txnMeta.DNShards, mockDNShard(1))
   189  	txnMeta.DNShards = append(txnMeta.DNShards, mockDNShard(2))
   190  	return txnMeta
   191  }
   192  
   193  const (
   194  	INSERT = iota
   195  	DELETE
   196  )
   197  
   198  type AccessInfo struct {
   199  	accountId uint32
   200  	userId    uint32
   201  	roleId    uint32
   202  }
   203  
   204  // Entry represents a delete/insert
   205  type Entry struct {
   206  	typ          int
   207  	tableId      uint64
   208  	databaseId   uint64
   209  	tableName    string
   210  	databaseName string
   211  	//object name for s3 file
   212  	fileName string
   213  	// update or delete tuples
   214  	bat *batch.Batch
   215  }
   216  
   217  type column struct {
   218  	databaseId uint64
   219  	accountId  uint32
   220  	tableId    uint64
   221  	// column name
   222  	name            string
   223  	tableName       string
   224  	databaseName    string
   225  	typ             []byte
   226  	typLen          int32
   227  	num             int32
   228  	comment         string
   229  	notNull         int8
   230  	hasDef          int8
   231  	defaultExpr     []byte
   232  	constraintType  string
   233  	isHidden        int8
   234  	isAutoIncrement int8
   235  	hasUpdate       int8
   236  	updateExpr      []byte
   237  	clusterBy       int8
   238  }
   239  
   240  func genColumns(accountId uint32, tableName, databaseName string,
   241  	tableId, databaseId uint64, defs []engine.TableDef) ([]column, error) {
   242  	{ // XXX Why not store PrimaryIndexDef and
   243  		// then use PrimaryIndexDef for all primary key constraints.
   244  		mp := make(map[string]int)
   245  		for i, def := range defs {
   246  			if attr, ok := def.(*engine.AttributeDef); ok {
   247  				mp[attr.Attr.Name] = i
   248  			}
   249  		}
   250  		for _, def := range defs {
   251  			if constraintDef, ok := def.(*engine.ConstraintDef); ok {
   252  				pkeyDef := constraintDef.GetPrimaryKeyDef()
   253  				if pkeyDef != nil {
   254  					pkeyColName := pkeyDef.Pkey.PkeyColName
   255  					attr, _ := defs[mp[pkeyColName]].(*engine.AttributeDef)
   256  					attr.Attr.Primary = true
   257  				}
   258  			}
   259  		}
   260  	}
   261  	num := 0
   262  	cols := make([]column, 0, len(defs))
   263  	for _, def := range defs {
   264  		attrDef, ok := def.(*engine.AttributeDef)
   265  		if !ok {
   266  			continue
   267  		}
   268  		typ, err := types.Encode(&attrDef.Attr.Type)
   269  		if err != nil {
   270  			return nil, err
   271  		}
   272  		col := column{
   273  			typ:          typ,
   274  			typLen:       int32(len(typ)),
   275  			accountId:    accountId,
   276  			tableId:      tableId,
   277  			databaseId:   databaseId,
   278  			name:         attrDef.Attr.Name,
   279  			tableName:    tableName,
   280  			databaseName: databaseName,
   281  			num:          int32(num),
   282  			comment:      attrDef.Attr.Comment,
   283  		}
   284  		col.hasDef = 0
   285  		if attrDef.Attr.Default != nil {
   286  			defaultExpr, err := types.Encode(attrDef.Attr.Default)
   287  			if err != nil {
   288  				return nil, err
   289  			}
   290  			if len(defaultExpr) > 0 {
   291  				col.hasDef = 1
   292  				col.defaultExpr = defaultExpr
   293  			}
   294  		}
   295  		if attrDef.Attr.OnUpdate != nil {
   296  			expr, err := types.Encode(attrDef.Attr.OnUpdate)
   297  			if err != nil {
   298  				return nil, err
   299  			}
   300  			if len(expr) > 0 {
   301  				col.hasUpdate = 1
   302  				col.updateExpr = expr
   303  			}
   304  		}
   305  		if attrDef.Attr.IsHidden {
   306  			col.isHidden = 1
   307  		}
   308  		if attrDef.Attr.AutoIncrement {
   309  			col.isAutoIncrement = 1
   310  		}
   311  		if attrDef.Attr.Primary {
   312  			col.constraintType = catalog.SystemColPKConstraint
   313  		} else {
   314  			col.constraintType = catalog.SystemColNoConstraint
   315  		}
   316  		cols = append(cols, col)
   317  		num++
   318  	}
   319  	return cols, nil
   320  }
   321  
   322  func makePBEntry(
   323  	typ int,
   324  	dbId,
   325  	tableId uint64,
   326  	dbName,
   327  	tbName,
   328  	file string,
   329  	bat *batch.Batch) (pe *api.Entry, err error) {
   330  	e := Entry{
   331  		typ:          typ,
   332  		databaseName: dbName,
   333  		databaseId:   dbId,
   334  		tableName:    tbName,
   335  		tableId:      tableId,
   336  		fileName:     file,
   337  		bat:          bat,
   338  	}
   339  	return toPBEntry(e)
   340  }
   341  
   342  func getTableComment(defs []engine.TableDef) string {
   343  	for _, def := range defs {
   344  		if cdef, ok := def.(*engine.CommentDef); ok {
   345  			return cdef.Comment
   346  		}
   347  	}
   348  	return ""
   349  }
   350  
   351  func genCreateDatabaseTuple(
   352  	sql string,
   353  	accountId,
   354  	userId,
   355  	roleId uint32,
   356  	name string,
   357  	id uint64,
   358  	m *mpool.MPool,
   359  ) (*batch.Batch, error) {
   360  	bat := batch.NewWithSize(len(catalog.MoDatabaseSchema))
   361  	bat.Attrs = append(bat.Attrs, catalog.MoDatabaseSchema...)
   362  	{
   363  		idx := catalog.MO_DATABASE_DAT_ID_IDX
   364  		bat.Vecs[idx] = vector.New(catalog.MoDatabaseTypes[idx]) // dat_id
   365  		if err := bat.Vecs[idx].Append(uint64(id), false, m); err != nil {
   366  			return nil, err
   367  		}
   368  		idx = catalog.MO_DATABASE_DAT_NAME_IDX
   369  		bat.Vecs[idx] = vector.New(catalog.MoDatabaseTypes[idx]) // datname
   370  		if err := bat.Vecs[idx].Append([]byte(name), false, m); err != nil {
   371  			return nil, err
   372  		}
   373  		idx = catalog.MO_DATABASE_DAT_CATALOG_NAME_IDX
   374  		bat.Vecs[idx] = vector.New(catalog.MoDatabaseTypes[idx]) // dat_catalog_name
   375  		if err := bat.Vecs[idx].Append([]byte(catalog.MO_CATALOG), false, m); err != nil {
   376  			return nil, err
   377  		}
   378  		idx = catalog.MO_DATABASE_CREATESQL_IDX
   379  		bat.Vecs[idx] = vector.New(catalog.MoDatabaseTypes[idx])            // dat_createsql
   380  		if err := bat.Vecs[idx].Append([]byte(sql), false, m); err != nil { // TODO
   381  			return nil, err
   382  		}
   383  		idx = catalog.MO_DATABASE_OWNER_IDX
   384  		bat.Vecs[idx] = vector.New(catalog.MoDatabaseTypes[idx]) // owner
   385  		if err := bat.Vecs[idx].Append(roleId, false, m); err != nil {
   386  			return nil, err
   387  		}
   388  		idx = catalog.MO_DATABASE_CREATOR_IDX
   389  		bat.Vecs[idx] = vector.New(catalog.MoDatabaseTypes[idx]) // creator
   390  		if err := bat.Vecs[idx].Append(userId, false, m); err != nil {
   391  			return nil, err
   392  		}
   393  		idx = catalog.MO_DATABASE_CREATED_TIME_IDX
   394  		bat.Vecs[idx] = vector.New(catalog.MoDatabaseTypes[idx]) // created_time
   395  		if err := bat.Vecs[idx].Append(types.Timestamp(time.Now().Unix()), false, m); err != nil {
   396  			return nil, err
   397  		}
   398  		idx = catalog.MO_DATABASE_ACCOUNT_ID_IDX
   399  		bat.Vecs[idx] = vector.New(catalog.MoDatabaseTypes[idx]) // account_id
   400  		if err := bat.Vecs[idx].Append(accountId, false, m); err != nil {
   401  			return nil, err
   402  		}
   403  	}
   404  	return bat, nil
   405  }
   406  
   407  func genCreateColumnTuple(
   408  	col column,
   409  	m *mpool.MPool,
   410  ) (*batch.Batch, error) {
   411  	bat := batch.NewWithSize(len(catalog.MoColumnsSchema))
   412  	bat.Attrs = append(bat.Attrs, catalog.MoColumnsSchema...)
   413  	bat.SetZs(1, m)
   414  	{
   415  		idx := catalog.MO_COLUMNS_ATT_UNIQ_NAME_IDX
   416  		bat.Vecs[idx] = vector.New(catalog.MoColumnsTypes[idx]) // att_uniq_name
   417  		if err := bat.Vecs[idx].Append([]byte(""), false, m); err != nil {
   418  			return nil, err
   419  		}
   420  		idx = catalog.MO_COLUMNS_ACCOUNT_ID_IDX
   421  		bat.Vecs[idx] = vector.New(catalog.MoColumnsTypes[idx]) // account_id
   422  		if err := bat.Vecs[idx].Append(uint32(0), false, m); err != nil {
   423  			return nil, err
   424  		}
   425  		idx = catalog.MO_COLUMNS_ATT_DATABASE_ID_IDX
   426  		bat.Vecs[idx] = vector.New(catalog.MoColumnsTypes[idx]) // att_database_id
   427  		if err := bat.Vecs[idx].Append(col.databaseId, false, m); err != nil {
   428  			return nil, err
   429  		}
   430  		idx = catalog.MO_COLUMNS_ATT_DATABASE_IDX
   431  		bat.Vecs[idx] = vector.New(catalog.MoColumnsTypes[idx]) // att_database
   432  		if err := bat.Vecs[idx].Append([]byte(col.databaseName), false, m); err != nil {
   433  			return nil, err
   434  		}
   435  
   436  		idx = catalog.MO_COLUMNS_ATT_RELNAME_ID_IDX
   437  		bat.Vecs[idx] = vector.New(catalog.MoColumnsTypes[idx]) // att_relname_id
   438  		if err := bat.Vecs[idx].Append(col.tableId, false, m); err != nil {
   439  			return nil, err
   440  		}
   441  
   442  		idx = catalog.MO_COLUMNS_ATT_RELNAME_IDX
   443  		bat.Vecs[idx] = vector.New(catalog.MoColumnsTypes[idx]) // att_relname_id
   444  		if err := bat.Vecs[idx].Append([]byte(col.tableName), false, m); err != nil {
   445  			return nil, err
   446  		}
   447  		//idx = catalog.MO_COLUMNS_ATTNUM_IDX
   448  		idx = catalog.MO_COLUMNS_ATTNAME_IDX
   449  		bat.Vecs[idx] = vector.New(catalog.MoColumnsTypes[idx]) // attname
   450  		if err := bat.Vecs[idx].Append([]byte(col.name), false, m); err != nil {
   451  			return nil, err
   452  		}
   453  		idx = catalog.MO_COLUMNS_ATTTYP_IDX
   454  		bat.Vecs[idx] = vector.New(catalog.MoColumnsTypes[idx]) // att_relname
   455  		if err := bat.Vecs[idx].Append(col.typ, false, m); err != nil {
   456  			return nil, err
   457  		}
   458  		idx = catalog.MO_COLUMNS_ATTNUM_IDX
   459  		bat.Vecs[idx] = vector.New(catalog.MoColumnsTypes[idx]) // attnum
   460  		if err := bat.Vecs[idx].Append(col.num, false, m); err != nil {
   461  			return nil, err
   462  		}
   463  		idx = catalog.MO_COLUMNS_ATT_LENGTH_IDX
   464  		bat.Vecs[idx] = vector.New(catalog.MoColumnsTypes[idx]) // att_length
   465  		if err := bat.Vecs[idx].Append(col.typLen, false, m); err != nil {
   466  			return nil, err
   467  		}
   468  		idx = catalog.MO_COLUMNS_ATTNOTNULL_IDX
   469  		bat.Vecs[idx] = vector.New(catalog.MoColumnsTypes[idx]) // attnotnul
   470  		if err := bat.Vecs[idx].Append(col.notNull, false, m); err != nil {
   471  			return nil, err
   472  		}
   473  		idx = catalog.MO_COLUMNS_ATTHASDEF_IDX
   474  		bat.Vecs[idx] = vector.New(catalog.MoColumnsTypes[idx]) // atthasdef
   475  		if err := bat.Vecs[idx].Append(col.hasDef, false, m); err != nil {
   476  			return nil, err
   477  		}
   478  		idx = catalog.MO_COLUMNS_ATT_DEFAULT_IDX
   479  		bat.Vecs[idx] = vector.New(catalog.MoColumnsTypes[idx]) // att_default
   480  		if err := bat.Vecs[idx].Append(col.defaultExpr, false, m); err != nil {
   481  			return nil, err
   482  		}
   483  		idx = catalog.MO_COLUMNS_ATTISDROPPED_IDX
   484  		bat.Vecs[idx] = vector.New(catalog.MoColumnsTypes[idx]) // attisdropped
   485  		if err := bat.Vecs[idx].Append(int8(0), false, m); err != nil {
   486  			return nil, err
   487  		}
   488  		idx = catalog.MO_COLUMNS_ATT_CONSTRAINT_TYPE_IDX
   489  		bat.Vecs[idx] = vector.New(catalog.MoColumnsTypes[idx]) // att_constraint_type
   490  		if err := bat.Vecs[idx].Append([]byte(col.constraintType), false, m); err != nil {
   491  			return nil, err
   492  		}
   493  		idx = catalog.MO_COLUMNS_ATT_IS_UNSIGNED_IDX
   494  		bat.Vecs[idx] = vector.New(catalog.MoColumnsTypes[idx]) // att_is_unsigned
   495  		if err := bat.Vecs[idx].Append(int8(0), false, m); err != nil {
   496  			return nil, err
   497  		}
   498  		idx = catalog.MO_COLUMNS_ATT_IS_AUTO_INCREMENT_IDX
   499  		bat.Vecs[idx] = vector.New(catalog.MoColumnsTypes[idx]) // att_is_auto_increment
   500  		if err := bat.Vecs[idx].Append(col.isAutoIncrement, false, m); err != nil {
   501  			return nil, err
   502  		}
   503  		idx = catalog.MO_COLUMNS_ATT_COMMENT_IDX
   504  		bat.Vecs[idx] = vector.New(catalog.MoColumnsTypes[idx]) // att_comment
   505  		if err := bat.Vecs[idx].Append([]byte(col.comment), false, m); err != nil {
   506  			return nil, err
   507  		}
   508  		idx = catalog.MO_COLUMNS_ATT_IS_HIDDEN_IDX
   509  		bat.Vecs[idx] = vector.New(catalog.MoColumnsTypes[idx]) // att_is_hidden
   510  		if err := bat.Vecs[idx].Append(col.isHidden, false, m); err != nil {
   511  			return nil, err
   512  		}
   513  
   514  		idx = catalog.MO_COLUMNS_ATT_HAS_UPDATE_IDX
   515  		bat.Vecs[idx] = vector.New(catalog.MoColumnsTypes[idx]) // att_has_update
   516  		if err := bat.Vecs[idx].Append(col.hasUpdate, false, m); err != nil {
   517  			return nil, err
   518  		}
   519  		idx = catalog.MO_COLUMNS_ATT_UPDATE_IDX
   520  		bat.Vecs[idx] = vector.New(catalog.MoColumnsTypes[idx]) // att_update
   521  		if err := bat.Vecs[idx].Append(col.updateExpr, false, m); err != nil {
   522  			return nil, err
   523  		}
   524  
   525  		idx = catalog.MO_COLUMNS_ATT_IS_CLUSTERBY
   526  		bat.Vecs[idx] = vector.New(catalog.MoColumnsTypes[idx]) // att_is_clusterby
   527  		if err := bat.Vecs[idx].Append(col.clusterBy, false, m); err != nil {
   528  			return nil, err
   529  		}
   530  
   531  	}
   532  	return bat, nil
   533  }
   534  
   535  func makeCreateDatabaseEntries(
   536  	sql string,
   537  	ac AccessInfo,
   538  	name string,
   539  	id uint64,
   540  	m *mpool.MPool,
   541  ) ([]*api.Entry, error) {
   542  
   543  	createDbBat, err := genCreateDatabaseTuple(
   544  		sql,
   545  		ac.accountId,
   546  		ac.userId,
   547  		ac.roleId,
   548  		name,
   549  		id,
   550  		m,
   551  	)
   552  	if err != nil {
   553  		return nil, err
   554  	}
   555  	createDbEntry, err := makePBEntry(
   556  		INSERT,
   557  		catalog.MO_CATALOG_ID,
   558  		catalog.MO_DATABASE_ID,
   559  		catalog.MO_CATALOG,
   560  		catalog.MO_DATABASE,
   561  		"",
   562  		createDbBat,
   563  	)
   564  	if err != nil {
   565  		return nil, err
   566  	}
   567  	var entries []*api.Entry
   568  	entries = append(entries, createDbEntry)
   569  	return entries, nil
   570  
   571  }
   572  
   573  func makeCreateTableEntries(
   574  	sql string,
   575  	ac AccessInfo,
   576  	name string,
   577  	tableId uint64,
   578  	dbId uint64,
   579  	dbName string,
   580  	m *mpool.MPool,
   581  	defs []engine.TableDef,
   582  ) ([]*api.Entry, error) {
   583  	comment := getTableComment(defs)
   584  	cols, err := genColumns(ac.accountId, name, dbName, tableId, dbId, defs)
   585  	if err != nil {
   586  		return nil, err
   587  	}
   588  	//var entries []*api.Entry
   589  	entries := make([]*api.Entry, 0)
   590  	{
   591  		bat, err := genCreateTableTuple(
   592  			sql, ac.accountId, ac.userId, ac.roleId,
   593  			name, tableId, dbId, dbName, comment, m)
   594  		if err != nil {
   595  			return nil, err
   596  		}
   597  		createTbEntry, err := makePBEntry(INSERT,
   598  			catalog.MO_CATALOG_ID, catalog.MO_TABLES_ID,
   599  			catalog.MO_CATALOG, catalog.MO_TABLES, "", bat)
   600  		if err != nil {
   601  			return nil, err
   602  		}
   603  		entries = append(entries, createTbEntry)
   604  	}
   605  	for _, col := range cols {
   606  		bat, err := genCreateColumnTuple(col, m)
   607  		if err != nil {
   608  			return nil, err
   609  		}
   610  		createColumnEntry, err := makePBEntry(
   611  			INSERT, catalog.MO_CATALOG_ID,
   612  			catalog.MO_COLUMNS_ID, catalog.MO_CATALOG,
   613  			catalog.MO_COLUMNS, "", bat)
   614  		if err != nil {
   615  			return nil, err
   616  		}
   617  		entries = append(entries, createColumnEntry)
   618  	}
   619  	return entries, nil
   620  
   621  }
   622  
   623  func genCreateTableTuple(
   624  	sql string,
   625  	accountId,
   626  	userId,
   627  	roleId uint32,
   628  	name string,
   629  	tableId uint64,
   630  	databaseId uint64,
   631  	databaseName string,
   632  	comment string,
   633  	m *mpool.MPool) (*batch.Batch, error) {
   634  	bat := batch.NewWithSize(len(catalog.MoTablesSchema))
   635  	bat.Attrs = append(bat.Attrs, catalog.MoTablesSchema...)
   636  	bat.SetZs(1, m)
   637  	{
   638  		idx := catalog.MO_TABLES_REL_ID_IDX
   639  		bat.Vecs[idx] = vector.New(catalog.MoTablesTypes[idx]) // rel_id
   640  		if err := bat.Vecs[idx].Append(tableId, false, m); err != nil {
   641  			return nil, err
   642  		}
   643  		idx = catalog.MO_TABLES_REL_NAME_IDX
   644  		bat.Vecs[idx] = vector.New(catalog.MoTablesTypes[idx]) // relname
   645  		if err := bat.Vecs[idx].Append([]byte(name), false, m); err != nil {
   646  			return nil, err
   647  		}
   648  		idx = catalog.MO_TABLES_RELDATABASE_IDX
   649  		bat.Vecs[idx] = vector.New(catalog.MoTablesTypes[idx]) // reldatabase
   650  		if err := bat.Vecs[idx].Append([]byte(databaseName), false, m); err != nil {
   651  			return nil, err
   652  		}
   653  		idx = catalog.MO_TABLES_RELDATABASE_ID_IDX
   654  		bat.Vecs[idx] = vector.New(catalog.MoTablesTypes[idx]) // reldatabase_id
   655  		if err := bat.Vecs[idx].Append(databaseId, false, m); err != nil {
   656  			return nil, err
   657  		}
   658  		idx = catalog.MO_TABLES_RELPERSISTENCE_IDX
   659  		bat.Vecs[idx] = vector.New(catalog.MoTablesTypes[idx]) // relpersistence
   660  		if err := bat.Vecs[idx].Append([]byte(""), false, m); err != nil {
   661  			return nil, err
   662  		}
   663  		idx = catalog.MO_TABLES_RELKIND_IDX
   664  		bat.Vecs[idx] = vector.New(catalog.MoTablesTypes[idx]) // relkind
   665  		if err := bat.Vecs[idx].Append([]byte(""), false, m); err != nil {
   666  			return nil, err
   667  		}
   668  		idx = catalog.MO_TABLES_REL_COMMENT_IDX
   669  		bat.Vecs[idx] = vector.New(catalog.MoTablesTypes[idx]) // rel_comment
   670  		if err := bat.Vecs[idx].Append([]byte(comment), false, m); err != nil {
   671  			return nil, err
   672  		}
   673  		idx = catalog.MO_TABLES_REL_CREATESQL_IDX
   674  		bat.Vecs[idx] = vector.New(catalog.MoTablesTypes[idx]) // rel_createsql
   675  		if err := bat.Vecs[idx].Append([]byte(sql), false, m); err != nil {
   676  			return nil, err
   677  		}
   678  		idx = catalog.MO_TABLES_CREATED_TIME_IDX
   679  		bat.Vecs[idx] = vector.New(catalog.MoTablesTypes[idx]) // created_time
   680  		if err := bat.Vecs[idx].Append(types.Timestamp(time.Now().Unix()), false, m); err != nil {
   681  			return nil, err
   682  		}
   683  		idx = catalog.MO_TABLES_CREATOR_IDX
   684  		bat.Vecs[idx] = vector.New(catalog.MoTablesTypes[idx]) // creator
   685  		if err := bat.Vecs[idx].Append(userId, false, m); err != nil {
   686  			return nil, err
   687  		}
   688  		idx = catalog.MO_TABLES_OWNER_IDX
   689  		bat.Vecs[idx] = vector.New(catalog.MoTablesTypes[idx]) // owner
   690  		if err := bat.Vecs[idx].Append(roleId, false, m); err != nil {
   691  			return nil, err
   692  		}
   693  		idx = catalog.MO_TABLES_ACCOUNT_ID_IDX
   694  		bat.Vecs[idx] = vector.New(catalog.MoTablesTypes[idx]) // account_id
   695  		if err := bat.Vecs[idx].Append(accountId, false, m); err != nil {
   696  			return nil, err
   697  		}
   698  		idx = catalog.MO_TABLES_PARTITIONED_IDX
   699  		bat.Vecs[idx] = vector.New(catalog.MoTablesTypes[idx]) // partition
   700  		if err := bat.Vecs[idx].Append([]byte(""), false, m); err != nil {
   701  			return nil, err
   702  		}
   703  		idx = catalog.MO_TABLES_VIEWDEF_IDX
   704  		bat.Vecs[idx] = vector.New(catalog.MoTablesTypes[idx]) // viewdef
   705  		if err := bat.Vecs[idx].Append([]byte(""), false, m); err != nil {
   706  			return nil, err
   707  		}
   708  		idx = catalog.MO_TABLES_CONSTRAINT_IDX
   709  		bat.Vecs[idx] = vector.New(catalog.MoTablesTypes[idx]) // constraint
   710  		if err := bat.Vecs[idx].Append([]byte(""), false, m); err != nil {
   711  			return nil, err
   712  		}
   713  
   714  	}
   715  	return bat, nil
   716  }
   717  
   718  func toPBEntry(e Entry) (*api.Entry, error) {
   719  	bat, err := toPBBatch(e.bat)
   720  	if err != nil {
   721  		return nil, err
   722  	}
   723  	typ := api.Entry_Insert
   724  	if e.typ == DELETE {
   725  		typ = api.Entry_Delete
   726  	}
   727  	return &api.Entry{
   728  		Bat:          bat,
   729  		EntryType:    typ,
   730  		TableId:      e.tableId,
   731  		DatabaseId:   e.databaseId,
   732  		TableName:    e.tableName,
   733  		DatabaseName: e.databaseName,
   734  		FileName:     e.fileName,
   735  	}, nil
   736  }
   737  
   738  func toPBBatch(bat *batch.Batch) (*api.Batch, error) {
   739  	rbat := new(api.Batch)
   740  	rbat.Attrs = bat.Attrs
   741  	for _, vec := range bat.Vecs {
   742  		pbVector, err := vector.VectorToProtoVector(vec)
   743  		if err != nil {
   744  			return nil, err
   745  		}
   746  		rbat.Vecs = append(rbat.Vecs, pbVector)
   747  	}
   748  	return rbat, nil
   749  }
   750  
   751  func toTAEBatchWithSharedMemory(schema *catalog2.Schema,
   752  	bat *batch.Batch) *containers.Batch {
   753  	allNullables := schema.AllNullables()
   754  	taeBatch := containers.NewEmptyBatch()
   755  	for i, vec := range bat.Vecs {
   756  		v := containers.NewVectorWithSharedMemory(vec, allNullables[i])
   757  		taeBatch.AddVector(bat.Attrs[i], v)
   758  	}
   759  	return taeBatch
   760  }
   761  
   762  //gen LogTail