github.com/hasnat/dolt/go@v0.0.0-20210628190320-9eb5d843fbb7/libraries/doltcore/sqle/schema_table_test.go (about) 1 // Copyright 2020 Dolthub, Inc. 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 sqle 16 17 import ( 18 "context" 19 "testing" 20 21 "github.com/dolthub/go-mysql-server/sql" 22 "github.com/stretchr/testify/assert" 23 "github.com/stretchr/testify/require" 24 25 "github.com/dolthub/dolt/go/libraries/doltcore/doltdb" 26 "github.com/dolthub/dolt/go/libraries/doltcore/dtestutils" 27 "github.com/dolthub/dolt/go/libraries/doltcore/row" 28 "github.com/dolthub/dolt/go/libraries/doltcore/sqle/sqlutil" 29 "github.com/dolthub/dolt/go/store/types" 30 ) 31 32 func TestSchemaTableRecreation(t *testing.T) { 33 ctx := NewTestSQLCtx(context.Background()) 34 dEnv := dtestutils.CreateTestEnv() 35 db := NewDatabase("dolt", dEnv.DbData()) 36 err := DSessFromSess(ctx.Session).AddDB(ctx, db, db.DbData()) 37 require.NoError(t, err) 38 ctx.SetCurrentDatabase(db.Name()) 39 40 err = db.createSqlTable(ctx, doltdb.SchemasTableName, sql.Schema{ // schema of dolt_schemas table before the change 41 {Name: doltdb.SchemasTablesTypeCol, Type: sql.Text, Source: doltdb.SchemasTableName, PrimaryKey: true}, 42 {Name: doltdb.SchemasTablesNameCol, Type: sql.Text, Source: doltdb.SchemasTableName, PrimaryKey: true}, 43 {Name: doltdb.SchemasTablesFragmentCol, Type: sql.Text, Source: doltdb.SchemasTableName, PrimaryKey: false}, 44 }) 45 require.NoError(t, err) 46 sqlTbl, found, err := db.GetTableInsensitive(ctx, doltdb.SchemasTableName) 47 require.NoError(t, err) 48 require.True(t, found) 49 inserter := sqlTbl.(*WritableDoltTable).Inserter(ctx) 50 err = inserter.Insert(ctx, sql.Row{"view", "view1", "SELECT v1 FROM test;"}) 51 require.NoError(t, err) 52 err = inserter.Insert(ctx, sql.Row{"view", "view2", "SELECT v2 FROM test;"}) 53 require.NoError(t, err) 54 err = inserter.Close(ctx) 55 require.NoError(t, err) 56 57 table, err := sqlTbl.(*WritableDoltTable).doltTable(ctx) 58 require.NoError(t, err) 59 60 rowData, err := table.GetRowData(ctx) 61 require.NoError(t, err) 62 expectedVals := []sql.Row{ 63 {"view", "view1", "SELECT v1 FROM test;"}, 64 {"view", "view2", "SELECT v2 FROM test;"}, 65 } 66 index := 0 67 _ = rowData.IterAll(ctx, func(keyTpl, valTpl types.Value) error { 68 dRow, err := row.FromNoms(sqlTbl.(*WritableDoltTable).sch, keyTpl.(types.Tuple), valTpl.(types.Tuple)) 69 require.NoError(t, err) 70 sqlRow, err := sqlutil.DoltRowToSqlRow(dRow, sqlTbl.(*WritableDoltTable).sch) 71 require.NoError(t, err) 72 assert.Equal(t, expectedVals[index], sqlRow) 73 index++ 74 return nil 75 }) 76 77 tbl, err := GetOrCreateDoltSchemasTable(ctx, db) // removes the old table and recreates it with the new schema 78 require.NoError(t, err) 79 80 table, err = tbl.doltTable(ctx) 81 require.NoError(t, err) 82 83 rowData, err = table.GetRowData(ctx) 84 require.NoError(t, err) 85 expectedVals = []sql.Row{ 86 {"view", "view1", "SELECT v1 FROM test;", int64(1)}, 87 {"view", "view2", "SELECT v2 FROM test;", int64(2)}, 88 } 89 index = 0 90 _ = rowData.IterAll(ctx, func(keyTpl, valTpl types.Value) error { 91 dRow, err := row.FromNoms(tbl.sch, keyTpl.(types.Tuple), valTpl.(types.Tuple)) 92 require.NoError(t, err) 93 sqlRow, err := sqlutil.DoltRowToSqlRow(dRow, tbl.sch) 94 require.NoError(t, err) 95 assert.Equal(t, expectedVals[index], sqlRow) 96 index++ 97 return nil 98 }) 99 100 indexes := tbl.sch.Indexes().AllIndexes() 101 require.Len(t, indexes, 1) 102 assert.Equal(t, true, indexes[0].IsUnique()) 103 assert.Equal(t, doltdb.SchemasTablesIndexName, indexes[0].Name()) 104 }