github.com/matrixorigin/matrixone@v0.7.0/pkg/vm/engine/tae/moengine/engine_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 moengine 16 17 import ( 18 "context" 19 "testing" 20 21 "github.com/matrixorigin/matrixone/pkg/common/mpool" 22 "github.com/matrixorigin/matrixone/pkg/pb/plan" 23 24 mobat "github.com/matrixorigin/matrixone/pkg/container/batch" 25 "github.com/matrixorigin/matrixone/pkg/container/types" 26 "github.com/matrixorigin/matrixone/pkg/vm/engine" 27 "github.com/matrixorigin/matrixone/pkg/vm/engine/tae/containers" 28 29 pkgcatalog "github.com/matrixorigin/matrixone/pkg/catalog" 30 "github.com/matrixorigin/matrixone/pkg/container/vector" 31 "github.com/matrixorigin/matrixone/pkg/vm/engine/tae/catalog" 32 "github.com/matrixorigin/matrixone/pkg/vm/engine/tae/common" 33 "github.com/matrixorigin/matrixone/pkg/vm/engine/tae/db" 34 "github.com/matrixorigin/matrixone/pkg/vm/engine/tae/options" 35 "github.com/matrixorigin/matrixone/pkg/vm/engine/tae/testutils" 36 "github.com/stretchr/testify/assert" 37 ) 38 39 const ( 40 ModuleName = "TAEMOEngine" 41 ) 42 43 func initDB(t *testing.T, opts *options.Options) *db.DB { 44 dir := testutils.InitTestEnv(ModuleName, t) 45 db, _ := db.Open(dir, opts) 46 return db 47 } 48 49 func TestEngine(t *testing.T) { 50 defer testutils.AfterTest(t)() 51 ctx := context.TODO() 52 testutils.EnsureNoLeak(t) 53 tae := initDB(t, nil) 54 defer tae.Close() 55 e := NewEngine(tae) 56 txn, err := e.StartTxn(nil) 57 assert.Nil(t, err) 58 txnOperator := TxnToTxnOperator(txn) 59 err = e.Create(ctx, "db", txnOperator) 60 assert.Nil(t, err) 61 names, _ := e.Databases(ctx, txnOperator) 62 assert.Equal(t, 2, len(names)) 63 dbase, err := e.Database(ctx, "db", txnOperator) 64 assert.Nil(t, err) 65 66 schema := catalog.MockSchema(13, 12) 67 defs, err := SchemaToDefs(schema) 68 assert.NoError(t, err) 69 defs[5].(*engine.AttributeDef).Attr.Default = &plan.Default{ 70 NullAbility: true, 71 Expr: &plan.Expr{ 72 Expr: &plan.Expr_C{ 73 C: &plan.Const{ 74 Isnull: false, 75 Value: &plan.Const_Sval{ 76 Sval: "expr1", 77 }, 78 }, 79 }, 80 }, 81 OriginString: "expr1", 82 } 83 defs[6].(*engine.AttributeDef).Attr.Default = &plan.Default{ 84 NullAbility: false, 85 Expr: &plan.Expr{ 86 Expr: &plan.Expr_C{ 87 C: &plan.Const{ 88 Isnull: false, 89 Value: &plan.Const_Sval{ 90 Sval: "expr2", 91 }, 92 }, 93 }, 94 }, 95 OriginString: "expr2", 96 } 97 assert.NoError(t, err) 98 err = dbase.Create(ctx, schema.Name, defs) 99 assert.Nil(t, err) 100 names, _ = dbase.Relations(ctx) 101 assert.Equal(t, 1, len(names)) 102 103 rel, err := dbase.Relation(ctx, schema.Name) 104 assert.Nil(t, err) 105 rDefs, _ := rel.TableDefs(ctx) 106 assert.Equal(t, 15, len(rDefs)) 107 rAttr := rDefs[5].(*engine.AttributeDef).Attr 108 assert.Equal(t, true, rAttr.Default.NullAbility) 109 rAttr = rDefs[6].(*engine.AttributeDef).Attr 110 assert.Equal(t, false, rAttr.Default.NullAbility) 111 assert.Equal(t, "expr2", rAttr.Default.OriginString) 112 bat := catalog.MockBatch(schema, 100) 113 defer bat.Close() 114 115 newbat := mobat.New(true, bat.Attrs) 116 newbat.Vecs = containers.CopyToMoVecs(bat.Vecs) 117 err = rel.Write(ctx, newbat) 118 assert.Nil(t, err) 119 assert.Nil(t, txn.Commit()) 120 txn, err = e.StartTxn(nil) 121 assert.Nil(t, err) 122 txnOperator = TxnToTxnOperator(txn) 123 dbase, err = e.Database(ctx, "db", txnOperator) 124 assert.Nil(t, err) 125 rel, err = dbase.Relation(ctx, schema.Name) 126 assert.Nil(t, err) 127 attr, _ := rel.GetPrimaryKeys(ctx) 128 key := attr[0] 129 bat = catalog.MockBatch(schema, 20) 130 defer bat.Close() 131 newbat = mobat.New(true, bat.Attrs) 132 newbat.Vecs = containers.CopyToMoVecs(bat.Vecs) 133 testBat := mobat.New(true, []string{bat.Attrs[0]}) 134 testBat.Vecs = containers.CopyToMoVecs([]containers.Vector{bat.Vecs[12]}) 135 err = rel.Delete(ctx, testBat, key.Name) 136 assert.Nil(t, err) 137 assert.Nil(t, txn.Commit()) 138 139 txn, err = e.StartTxn(nil) 140 assert.Nil(t, err) 141 txnOperator = TxnToTxnOperator(txn) 142 dbase, err = e.Database(ctx, "db", txnOperator) 143 assert.Nil(t, err) 144 rel, err = dbase.Relation(ctx, schema.Name) 145 assert.Nil(t, err) 146 readers, _ := rel.NewReader(ctx, 10, nil, nil) 147 m := mpool.MustNewZero() 148 for _, reader := range readers { 149 bat, err := reader.Read(ctx, []string{schema.ColDefs[1].Name}, nil, m) 150 assert.Nil(t, err) 151 if bat != nil { 152 assert.Equal(t, 80, vector.Length(bat.Vecs[0])) 153 } 154 } 155 t.Log(tae.Catalog.SimplePPString(common.PPL1)) 156 } 157 158 func TestEngineAllType(t *testing.T) { 159 defer testutils.AfterTest(t)() 160 ctx := context.TODO() 161 testutils.EnsureNoLeak(t) 162 tae := initDB(t, nil) 163 defer tae.Close() 164 e := NewEngine(tae) 165 txn, err := e.StartTxn(nil) 166 assert.Nil(t, err) 167 txnOperator := TxnToTxnOperator(txn) 168 err = e.Create(ctx, "db", txnOperator) 169 assert.Nil(t, err) 170 names, _ := e.Databases(ctx, txnOperator) 171 assert.Equal(t, 2, len(names)) 172 dbase, err := e.Database(ctx, "db", txnOperator) 173 assert.Nil(t, err) 174 175 schema := catalog.MockSchemaAll(18, 12) 176 defs, err := SchemaToDefs(schema) 177 defs[5].(*engine.AttributeDef).Attr.Default = &plan.Default{ 178 NullAbility: true, 179 Expr: &plan.Expr{ 180 Expr: &plan.Expr_C{ 181 C: &plan.Const{ 182 Isnull: false, 183 Value: &plan.Const_Sval{ 184 Sval: "expr1", 185 }, 186 }, 187 }, 188 }, 189 OriginString: "expr1", 190 } 191 defs[6].(*engine.AttributeDef).Attr.Default = &plan.Default{ 192 NullAbility: false, 193 Expr: &plan.Expr{ 194 Expr: &plan.Expr_C{ 195 C: &plan.Const{ 196 Isnull: false, 197 Value: &plan.Const_Sval{ 198 Sval: "expr2", 199 }, 200 }, 201 }, 202 }, 203 OriginString: "expr2", 204 } 205 assert.NoError(t, err) 206 err = dbase.Create(ctx, schema.Name, defs) 207 assert.Nil(t, err) 208 names, _ = dbase.Relations(ctx) 209 assert.Equal(t, 1, len(names)) 210 211 rel, err := dbase.Relation(ctx, schema.Name) 212 assert.Nil(t, err) 213 rDefs, _ := rel.TableDefs(ctx) 214 assert.Equal(t, 20, len(rDefs)) 215 rAttr := rDefs[5].(*engine.AttributeDef).Attr 216 assert.Equal(t, true, rAttr.Default.NullAbility) 217 rAttr = rDefs[6].(*engine.AttributeDef).Attr 218 assert.Equal(t, "expr2", rAttr.Default.OriginString) 219 basebat := catalog.MockBatch(schema, 100) 220 defer basebat.Close() 221 222 newbat := mobat.New(true, basebat.Attrs) 223 newbat.Vecs = containers.CopyToMoVecs(basebat.Vecs) 224 err = rel.Write(ctx, newbat) 225 assert.Nil(t, err) 226 assert.Nil(t, txn.Commit()) 227 txn, err = e.StartTxn(nil) 228 assert.Nil(t, err) 229 txnOperator = TxnToTxnOperator(txn) 230 dbase, err = e.Database(ctx, "db", txnOperator) 231 assert.Nil(t, err) 232 rel, err = dbase.Relation(ctx, schema.Name) 233 assert.Nil(t, err) 234 attr, _ := rel.GetPrimaryKeys(ctx) 235 key := attr[0] 236 bat := catalog.MockBatch(schema, 20) 237 defer bat.Close() 238 newbat1 := mobat.New(true, bat.Attrs) 239 newbat1.Vecs = containers.CopyToMoVecs(bat.Vecs) 240 testBat := mobat.New(true, []string{bat.Attrs[0]}) 241 testBat.Vecs = containers.CopyToMoVecs([]containers.Vector{bat.Vecs[12]}) 242 err = rel.Delete(ctx, testBat, key.Name) 243 assert.Nil(t, err) 244 assert.Nil(t, txn.Commit()) 245 246 txn, err = e.StartTxn(nil) 247 assert.Nil(t, err) 248 txnOperator = TxnToTxnOperator(txn) 249 dbase, err = e.Database(ctx, "db", txnOperator) 250 assert.Nil(t, err) 251 rel, err = dbase.Relation(ctx, schema.Name) 252 assert.Nil(t, err) 253 //rows, err := rel.Rows(ctx) 254 assert.Nil(t, err) 255 readers, _ := rel.NewReader(ctx, 10, nil, nil) 256 m := mpool.MustNewZero() 257 for _, reader := range readers { 258 bat, err := reader.Read(ctx, schema.Attrs(), nil, m) 259 assert.Nil(t, err) 260 if bat != nil { 261 assert.Equal(t, 80, vector.Length(bat.Vecs[0])) 262 vec := containers.NewVectorWithSharedMemory(bat.Vecs[12], false) 263 assert.Equal(t, vec.Get(0), basebat.Vecs[12].Get(20)) 264 } 265 } 266 //delRows, err := rel.Truncate(ctx) 267 _, err = dbase.Truncate(ctx, schema.Name) 268 assert.Nil(t, err) 269 //assert.Equal(t, rows, int64(delRows)) 270 assert.Nil(t, txn.Commit()) 271 txn, err = e.StartTxn(nil) 272 assert.Nil(t, err) 273 txnOperator = TxnToTxnOperator(txn) 274 dbase, err = e.Database(ctx, "db", txnOperator) 275 assert.Nil(t, err) 276 rel, err = dbase.Relation(ctx, schema.Name) 277 assert.Nil(t, err) 278 _, err = rel.Stats(ctx, nil) 279 assert.Nil(t, err) 280 assert.Nil(t, txn.Commit()) 281 t.Log(tae.Catalog.SimplePPString(common.PPL1)) 282 } 283 284 func TestTxnRelation_GetHideKey(t *testing.T) { 285 defer testutils.AfterTest(t)() 286 ctx := context.TODO() 287 testutils.EnsureNoLeak(t) 288 tae := initDB(t, nil) 289 defer tae.Close() 290 e := NewEngine(tae) 291 txn, err := e.StartTxn(nil) 292 assert.Nil(t, err) 293 txnOperator := TxnToTxnOperator(txn) 294 err = e.Create(ctx, "db", txnOperator) 295 assert.Nil(t, err) 296 names, _ := e.Databases(ctx, txnOperator) 297 assert.Equal(t, 2, len(names)) 298 dbase, err := e.Database(ctx, "db", txnOperator) 299 assert.Nil(t, err) 300 301 schema := catalog.MockSchema(13, 15) 302 defs, err := SchemaToDefs(schema) 303 assert.NoError(t, err) 304 err = dbase.Create(ctx, schema.Name, defs) 305 assert.Nil(t, err) 306 names, _ = dbase.Relations(ctx) 307 assert.Equal(t, 1, len(names)) 308 309 rel, err := dbase.Relation(ctx, schema.Name) 310 assert.Nil(t, err) 311 bat := catalog.MockBatch(schema, 100) 312 defer bat.Close() 313 314 newbat := mobat.New(true, bat.Attrs) 315 newbat.Vecs = containers.CopyToMoVecs(bat.Vecs) 316 err = rel.Write(ctx, newbat) 317 assert.Nil(t, err) 318 assert.Nil(t, txn.Commit()) 319 txn, err = e.StartTxn(nil) 320 assert.Nil(t, err) 321 txnOperator = TxnToTxnOperator(txn) 322 dbase, err = e.Database(ctx, "db", txnOperator) 323 assert.Nil(t, err) 324 rel, err = dbase.Relation(ctx, schema.Name) 325 assert.Nil(t, err) 326 assert.Nil(t, txn.Commit()) 327 readers, _ := rel.NewReader(ctx, 10, nil, nil) 328 delete := mobat.New(true, bat.Attrs) 329 m := mpool.MustNewZero() 330 for _, reader := range readers { 331 bat, err := reader.Read(ctx, []string{schema.ColDefs[13].Name}, nil, m) 332 assert.Nil(t, err) 333 if bat != nil { 334 assert.Equal(t, 100, vector.Length(bat.Vecs[0])) 335 delete = bat 336 } 337 } 338 txn, err = e.StartTxn(nil) 339 assert.Nil(t, err) 340 txnOperator = TxnToTxnOperator(txn) 341 dbase, err = e.Database(ctx, "db", txnOperator) 342 assert.Nil(t, err) 343 rel, err = dbase.Relation(ctx, schema.Name) 344 assert.Nil(t, err) 345 attr, _ := rel.GetPrimaryKeys(ctx) 346 assert.Nil(t, attr) 347 keys, _ := rel.GetHideKeys(ctx) 348 key := keys[0] 349 err = rel.Delete(ctx, delete, key.Name) 350 assert.Nil(t, err) 351 assert.Nil(t, txn.Commit()) 352 txn, err = e.StartTxn(nil) 353 assert.Nil(t, err) 354 txnOperator = TxnToTxnOperator(txn) 355 dbase, err = e.Database(ctx, "db", txnOperator) 356 assert.Nil(t, err) 357 rel, err = dbase.Relation(ctx, schema.Name) 358 assert.Nil(t, err) 359 assert.Nil(t, txn.Commit()) 360 readers, _ = rel.NewReader(ctx, 1, nil, nil) 361 m = mpool.MustNewZero() 362 for _, reader := range readers { 363 bat, err := reader.Read(ctx, []string{schema.ColDefs[13].Name}, nil, m) 364 assert.Nil(t, err) 365 if bat != nil { 366 assert.Equal(t, 0, vector.Length(bat.Vecs[0])) 367 } 368 } 369 370 t.Log(tae.Catalog.SimplePPString(common.PPL1)) 371 } 372 373 func TestCopy1(t *testing.T) { 374 defer testutils.AfterTest(t)() 375 testutils.EnsureNoLeak(t) 376 t1 := types.T_varchar.ToType() 377 v1 := containers.MockVector(t1, 10, false, true, nil) 378 defer v1.Close() 379 v1.Update(5, types.Null{}) 380 mv1 := containers.CopyToMoVec(v1) 381 for i := 0; i < v1.Length(); i++ { 382 assert.Equal(t, v1.Get(i), containers.GetValue(mv1, uint32(i))) 383 } 384 385 t2 := types.T_date.ToType() 386 v2 := containers.MockVector(t2, 20, false, true, nil) 387 defer v2.Close() 388 v2.Update(6, types.Null{}) 389 mv2 := containers.CopyToMoVec(v2) 390 for i := 0; i < v2.Length(); i++ { 391 assert.Equal(t, v2.Get(i), containers.GetValue(mv2, uint32(i))) 392 } 393 394 v3 := containers.NewVectorWithSharedMemory(mv2, true) 395 t.Log(v3.String()) 396 for i := 0; i < v3.Length(); i++ { 397 assert.Equal(t, v2.Get(i), v3.Get(i)) 398 } 399 } 400 401 func checkSysTable(t *testing.T, name string, dbase engine.Database, txn Txn, relcnt int, schema *catalog.Schema) { 402 ctx := context.TODO() 403 defs, err := SchemaToDefs(schema) 404 defs[5].(*engine.AttributeDef).Attr.Default = &plan.Default{ 405 NullAbility: true, 406 Expr: &plan.Expr{ 407 Expr: &plan.Expr_C{ 408 C: &plan.Const{ 409 Isnull: false, 410 Value: &plan.Const_Sval{ 411 Sval: "expr1", 412 }, 413 }, 414 }, 415 }, 416 OriginString: "expr1", 417 } 418 defs[6].(*engine.AttributeDef).Attr.Default = &plan.Default{ 419 NullAbility: false, 420 Expr: &plan.Expr{ 421 Expr: &plan.Expr_C{ 422 C: &plan.Const{ 423 Isnull: false, 424 Value: &plan.Const_Sval{ 425 Sval: "expr2", 426 }, 427 }, 428 }, 429 }, 430 OriginString: "expr2", 431 } 432 assert.NoError(t, err) 433 err = dbase.Create(ctx, name, defs) 434 assert.Nil(t, err) 435 names, _ := dbase.Relations(ctx) 436 assert.Equal(t, relcnt, len(names)) 437 rel, err := dbase.Relation(ctx, name) 438 assert.Nil(t, err) 439 rDefs, _ := rel.TableDefs(ctx) 440 rDefs = rDefs[:len(rDefs)-1] 441 for i, def := range rDefs { 442 assert.Equal(t, defs[i], def) 443 } 444 rAttr := rDefs[5].(*engine.AttributeDef).Attr 445 assert.Equal(t, true, rAttr.Default.NullAbility) 446 rAttr = rDefs[6].(*engine.AttributeDef).Attr 447 assert.Equal(t, false, rAttr.Default.NullAbility) 448 assert.Equal(t, "expr2", rAttr.Default.OriginString) 449 bat := catalog.MockBatch(schema, 100) 450 defer bat.Close() 451 452 newbat := mobat.New(true, bat.Attrs) 453 newbat.Vecs = containers.CopyToMoVecs(bat.Vecs) 454 err = rel.Write(ctx, newbat) 455 assert.Equal(t, ErrReadOnly, err) 456 attrs, _ := rel.GetPrimaryKeys(ctx) 457 assert.NotNil(t, attrs) 458 assert.Equal(t, schema.SortKey.Defs[0].Name, attrs[0].Name) 459 attrs, _ = rel.GetHideKeys(ctx) 460 attr := attrs[0] 461 assert.NotNil(t, attr.Name, catalog.PhyAddrColumnName) 462 } 463 464 func TestSysRelation(t *testing.T) { 465 defer testutils.AfterTest(t)() 466 ctx := context.TODO() 467 testutils.EnsureNoLeak(t) 468 tae := initDB(t, nil) 469 defer tae.Close() 470 e := NewEngine(tae) 471 txn, err := e.StartTxn(nil) 472 assert.Nil(t, err) 473 txnOperator := TxnToTxnOperator(txn) 474 err = e.Create(ctx, pkgcatalog.MO_DATABASE, txnOperator) 475 assert.Nil(t, err) 476 names, _ := e.Databases(ctx, txnOperator) 477 assert.Equal(t, 2, len(names)) 478 dbase, err := e.Database(ctx, pkgcatalog.MO_DATABASE, txnOperator) 479 assert.Nil(t, err) 480 schema := catalog.MockSchema(13, 12) 481 checkSysTable(t, pkgcatalog.MO_DATABASE, dbase, txn, 1, schema) 482 schema = catalog.MockSchema(14, 13) 483 checkSysTable(t, pkgcatalog.MO_TABLES, dbase, txn, 2, schema) 484 schema = catalog.MockSchema(15, 14) 485 checkSysTable(t, pkgcatalog.MO_COLUMNS, dbase, txn, 3, schema) 486 assert.Nil(t, txn.Commit()) 487 }