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  }