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