Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Vinai/create database #298

Merged
merged 19 commits into from
Feb 17, 2021
Merged
223 changes: 221 additions & 2 deletions enginetest/enginetests.go
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ import (
"github.com/dolthub/go-mysql-server/sql/parse"
"github.com/dolthub/go-mysql-server/sql/plan"
"github.com/dolthub/go-mysql-server/test"
"github.com/dolthub/vitess/go/mysql"
)

// Tests a variety of queries against databases and tables provided by the given harness.
Expand Down Expand Up @@ -1736,6 +1737,198 @@ func TestDropColumn(t *testing.T, harness Harness) {
require.True(sql.ErrTableColumnNotFound.Is(err))
}

func TestCreateDatabase(t *testing.T, harness Harness) {
e := NewEngine(t, harness)
ctx := NewContext(harness)

t.Run("CREATE DATABASE and create table", func(t *testing.T) {
TestQuery(t, harness, e,
"CREATE DATABASE testdb",
[]sql.Row{{sql.OkResult{RowsAffected: 1}}},
nil,
)

db, err := e.Catalog.Database("testdb")
require.NoError(t, err)

TestQuery(t, harness, e,
"USE testdb",
[]sql.Row(nil),
nil,
)

require.Equal(t, ctx.GetCurrentDatabase(), "testdb")

ctx = NewContext(harness)
TestQuery(t, harness, e,
"CREATE TABLE test (pk int primary key)",
[]sql.Row(nil),
nil,
)

db, err = e.Catalog.Database("testdb")
require.NoError(t, err)

_, ok, err := db.GetTableInsensitive(ctx, "test")

require.NoError(t, err)
require.True(t, ok)
})

t.Run("CREATE DATABASE IF NOT EXISTS", func(t *testing.T) {
TestQuery(t, harness, e,
"CREATE DATABASE IF NOT EXISTS testdb2",
[]sql.Row{{sql.OkResult{RowsAffected: 1}}},
nil,
)

db, err := e.Catalog.Database("testdb2")
require.NoError(t, err)

TestQuery(t, harness, e,
"USE testdb2",
[]sql.Row(nil),
nil,
)

require.Equal(t, ctx.GetCurrentDatabase(), "testdb2")

ctx = NewContext(harness)
TestQuery(t, harness, e,
"CREATE TABLE test (pk int primary key)",
[]sql.Row(nil),
nil,
)

db, err = e.Catalog.Database("testdb2")
require.NoError(t, err)

_, ok, err := db.GetTableInsensitive(ctx, "test")

require.NoError(t, err)
require.True(t, ok)
})

t.Run("CREATE SCHEMA", func(t *testing.T) {
TestQuery(t, harness, e,
"CREATE SCHEMA testdb3",
[]sql.Row{{sql.OkResult{RowsAffected: 1}}},
nil,
)

db, err := e.Catalog.Database("testdb3")
require.NoError(t, err)

TestQuery(t, harness, e,
"USE testdb3",
[]sql.Row(nil),
nil,
)

require.Equal(t, ctx.GetCurrentDatabase(), "testdb3")

ctx = NewContext(harness)
TestQuery(t, harness, e,
"CREATE TABLE test (pk int primary key)",
[]sql.Row(nil),
nil,
)

db, err = e.Catalog.Database("testdb3")
require.NoError(t, err)

_, ok, err := db.GetTableInsensitive(ctx, "test")

require.NoError(t, err)
require.True(t, ok)
})

t.Run("CREATE DATABASE error handling", func(t *testing.T) {
AssertErr(t, e, harness, "CREATE DATABASE mydb", sql.ErrCannotCreateDatabaseExists)

AssertWarning(t, e, harness, "CREATE DATABASE IF NOT EXISTS mydb", mysql.ERDbCreateExists)
})
}

func TestDropDatabase(t *testing.T, harness Harness) {
e := NewEngine(t, harness)

t.Run("DROP DATABASE correctly works", func(t *testing.T) {
TestQuery(t, harness, e,
"DROP DATABASE mydb",
[]sql.Row{{sql.OkResult{RowsAffected: 1}}},
nil,
)

_, err := e.Catalog.Database("mydb")
require.Error(t, err)

// TODO: Deal with handling this error.
//AssertErr(t, e, harness, "SHOW TABLES", sql.ErrNoDatabaseSelected)
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@zachmu Are you fine with me leaving this as an issue an moving on? Getting this render correctly seems to be a pain to get right and is not an important feature imo.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah I think that's fine for now

})

t.Run("DROP DATABASE works on newly created databases.", func(t *testing.T) {
TestQuery(t, harness, e,
"CREATE DATABASE testdb",
[]sql.Row{{sql.OkResult{RowsAffected: 1}}},
nil,
)

_, err := e.Catalog.Database("testdb")
require.NoError(t, err)

TestQuery(t, harness, e,
"DROP DATABASE testdb",
[]sql.Row{{sql.OkResult{RowsAffected: 1}}},
nil,
)

AssertErr(t, e, harness, "USE testdb", sql.ErrDatabaseNotFound)
})

t.Run("DROP SCHEMA works on newly created databases.", func(t *testing.T) {
TestQuery(t, harness, e,
"CREATE SCHEMA testdb",
[]sql.Row{{sql.OkResult{RowsAffected: 1}}},
nil,
)

_, err := e.Catalog.Database("testdb")
require.NoError(t, err)

TestQuery(t, harness, e,
"DROP SCHEMA testdb",
[]sql.Row{{sql.OkResult{RowsAffected: 1}}},
nil,
)

AssertErr(t, e, harness, "USE testdb", sql.ErrDatabaseNotFound)
})

t.Run("DROP DATABASE IF EXISTS correctly works.", func(t *testing.T) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You need to also do this on a database that doesn't exist and assert no err

AssertWarning(t, e, harness, "DROP DATABASE IF EXISTS mydb", mysql.ERDbDropExists)

TestQuery(t, harness, e,
"CREATE DATABASE testdb",
[]sql.Row{{sql.OkResult{RowsAffected: 1}}},
nil,
)

_, err := e.Catalog.Database("testdb")
require.NoError(t, err)

TestQuery(t, harness, e,
"DROP DATABASE IF EXISTS testdb",
[]sql.Row{{sql.OkResult{RowsAffected: 1}}},
nil,
)

AssertErr(t, e, harness, "USE testdb", sql.ErrDatabaseNotFound)

AssertWarning(t, e, harness, "DROP DATABASE IF EXISTS testdb", mysql.ERDbDropExists)
})
}

func TestCreateForeignKeys(t *testing.T, harness Harness) {
require := require.New(t)

Expand Down Expand Up @@ -2391,6 +2584,27 @@ func AssertErr(t *testing.T, e *sqle.Engine, harness Harness, query string, expe
}
}

func AssertWarning(t *testing.T, e *sqle.Engine, harness Harness, query string, expectedCode int) {
_, iter, err := e.Query(NewContext(harness), query)
require.NoError(t, err)

_, err = sql.RowIterToRows(iter)
require.NoError(t, err)

ctx := NewContext(harness)
require.True(t, len(ctx.Warnings()) > 0)

condition := false
for _, warning := range ctx.Warnings() {
if warning.Code == expectedCode {
condition = true
break
}
}

require.True(t, condition)
}

type customFunc struct {
expression.UnaryExpression
}
Expand Down Expand Up @@ -3049,9 +3263,14 @@ func TestColumnDefaults(t *testing.T, harness Harness) {
var pid uint64

func NewContext(harness Harness) *sql.Context {
ctx := harness.NewContext().WithCurrentDB("mydb")
ctx := harness.NewContext()
currentDB := ctx.GetCurrentDatabase()
if currentDB == "" {
currentDB = "mydb"
ctx.WithCurrentDB(currentDB)
}

_ = ctx.ViewRegistry.Register("mydb",
_ = ctx.ViewRegistry.Register(currentDB,
plan.NewSubqueryAlias(
"myview",
"SELECT * FROM mytable",
Expand Down
8 changes: 8 additions & 0 deletions enginetest/memory_engine_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -301,6 +301,14 @@ func TestDropColumn(t *testing.T) {
enginetest.TestDropColumn(t, enginetest.NewDefaultMemoryHarness())
}

func TestCreateDatabase(t *testing.T) {
enginetest.TestCreateDatabase(t, enginetest.NewDefaultMemoryHarness())
}

func TestDropDatabase(t *testing.T) {
enginetest.TestDropDatabase(t, enginetest.NewDefaultMemoryHarness())
}

func TestCreateForeignKeys(t *testing.T) {
enginetest.TestCreateForeignKeys(t, enginetest.NewDefaultMemoryHarness())
}
Expand Down
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ require (
github.com/VividCortex/gohistogram v1.0.0 // indirect
github.com/cespare/xxhash v1.1.0
github.com/dolthub/sqllogictest/go v0.0.0-20201105013724-5123fc66e12c
github.com/dolthub/vitess v0.0.0-20210216102645-78bbab1f4f25
github.com/dolthub/vitess v0.0.0-20210217181323-2e12516a549a
github.com/fastly/go-utils v0.0.0-20180712184237-d95a45783239 // indirect
github.com/go-kit/kit v0.9.0
github.com/go-sql-driver/mysql v1.4.1
Expand Down
9 changes: 2 additions & 7 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,8 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/dolthub/sqllogictest/go v0.0.0-20201105013724-5123fc66e12c h1:ZIo6IOXU3/rJK4lp83QRq1zGhQrjQQtlmE2b7H1Vv/k=
github.com/dolthub/sqllogictest/go v0.0.0-20201105013724-5123fc66e12c/go.mod h1:siLfyv2c92W1eN/R4QqG/+RjjX5W2+gCTRjZxBjI3TY=
github.com/dolthub/vitess v0.0.0-20201204232015-9e3805156304 h1:+rrZ04a6UHIIopSMmAK5/qO+hWGoIwmRY6qzlDaUIIk=
github.com/dolthub/vitess v0.0.0-20201204232015-9e3805156304/go.mod h1:hUE8oSk2H5JZnvtlLBhJPYC8WZCA5AoSntdLTcBvdBM=
github.com/dolthub/vitess v0.0.0-20210216102645-78bbab1f4f25 h1:NUtW65AUYlauiphoTFJp7kkASTG3Yj1KUNjkF6f9KEU=
github.com/dolthub/vitess v0.0.0-20210216102645-78bbab1f4f25/go.mod h1:hUE8oSk2H5JZnvtlLBhJPYC8WZCA5AoSntdLTcBvdBM=
github.com/dolthub/vitess v0.0.0-20210217181323-2e12516a549a h1:zPh/GxVnpSJnw+fU801C6az6csVgABDNwBea6m4dDgw=
github.com/dolthub/vitess v0.0.0-20210217181323-2e12516a549a/go.mod h1:hUE8oSk2H5JZnvtlLBhJPYC8WZCA5AoSntdLTcBvdBM=
github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
github.com/fastly/go-utils v0.0.0-20180712184237-d95a45783239 h1:Ghm4eQYC0nEPnSJdVkTrXpu9KtoVCSo1hg7mtI7G9KU=
Expand All @@ -35,7 +33,6 @@ github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5y
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.3.2 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs=
github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/google/go-cmp v0.2.0 h1:+dTQ8DZQJz0Mb/HjFlkptS1FeQ4cWSnN941F8aEG4SQ=
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
github.com/google/go-cmp v0.3.0 h1:crn/baboCvb5fXaQ0IJ1SGTsTVrWpDsCWC8EGETZijY=
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
Expand Down Expand Up @@ -66,7 +63,6 @@ github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE
github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4 h1:gQz4mCbXsO+nc9n1hCxHcGA3Zx3Eo+UHZoInFGUIXNM=
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
github.com/sanity-io/litter v1.2.0 h1:DGJO0bxH/+C2EukzOSBmAlxmkhVMGqzvcx/rvySYw9M=
github.com/sanity-io/litter v1.2.0/go.mod h1:JF6pZUFgu2Q0sBZ+HSV35P8TVPI1TTzEwyu9FXAw2W4=
Expand Down Expand Up @@ -106,7 +102,6 @@ golang.org/x/net v0.0.0-20190926025831-c00fd9afed17/go.mod h1:z5CRVTTTmAJ677TzLL
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190423024810-112230192c58 h1:8gQV6CLnAEikrhgkHFbMAEhagSSnXWGV915qUMm9mrU=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
Expand Down
10 changes: 5 additions & 5 deletions memory/database_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,25 +12,25 @@
// See the License for the specific language governing permissions and
// limitations under the License.

package memory
package memory_test

import (
"testing"

"github.com/stretchr/testify/require"

"github.com/dolthub/go-mysql-server/memory"
"github.com/dolthub/go-mysql-server/sql"
"github.com/stretchr/testify/require"
)

func TestDatabase_Name(t *testing.T) {
require := require.New(t)
db := NewDatabase("test")
db := memory.NewDatabase("test")
require.Equal("test", db.Name())
}

func TestDatabase_AddTable(t *testing.T) {
require := require.New(t)
db := NewDatabase("test")
db := memory.NewDatabase("test")
tables := db.Tables()
require.Equal(0, len(tables))

Expand Down