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  }