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 }