func (*testSuite) TestT(c *C) { defer testleak.AfterTest(c)() driver := localstore.Driver{Driver: goleveldb.MemoryDriver{}} store, err := driver.Open("memory") c.Assert(err, IsNil) defer store.Close() handle, err := infoschema.NewHandle(store) c.Assert(err, IsNil) dbName := model.NewCIStr("Test") tbName := model.NewCIStr("T") colName := model.NewCIStr("A") idxName := model.NewCIStr("idx") noexist := model.NewCIStr("noexist") colID, err := genGlobalID(store) c.Assert(err, IsNil) colInfo := &model.ColumnInfo{ ID: colID, Name: colName, Offset: 0, FieldType: *types.NewFieldType(mysql.TypeLonglong), State: model.StatePublic, } idxInfo := &model.IndexInfo{ Name: idxName, Table: tbName, Columns: []*model.IndexColumn{ { Name: colName, Offset: 0, Length: 10, }, }, Unique: true, Primary: true, State: model.StatePublic, } tbID, err := genGlobalID(store) c.Assert(err, IsNil) tblInfo := &model.TableInfo{ ID: tbID, Name: tbName, Columns: []*model.ColumnInfo{colInfo}, Indices: []*model.IndexInfo{idxInfo}, State: model.StatePublic, } dbID, err := genGlobalID(store) c.Assert(err, IsNil) dbInfo := &model.DBInfo{ ID: dbID, Name: dbName, Tables: []*model.TableInfo{tblInfo}, State: model.StatePublic, } dbInfos := []*model.DBInfo{dbInfo} err = kv.RunInNewTxn(store, true, func(txn kv.Transaction) error { meta.NewMeta(txn).CreateDatabase(dbInfo) return errors.Trace(err) }) c.Assert(err, IsNil) builder, err := infoschema.NewBuilder(handle).InitWithDBInfos(dbInfos, 1) c.Assert(err, IsNil) txn, err := store.Begin() c.Assert(err, IsNil) checkApplyCreateNonExistsSchemaDoesNotPanic(c, txn, builder) checkApplyCreateNonExistsTableDoesNotPanic(c, txn, builder, dbID) txn.Rollback() err = builder.Build() c.Assert(err, IsNil) is := handle.Get() schemaNames := is.AllSchemaNames() c.Assert(schemaNames, HasLen, 3) c.Assert(testutil.CompareUnorderedStringSlice(schemaNames, []string{infoschema.Name, perfschema.Name, "Test"}), IsTrue) schemas := is.AllSchemas() c.Assert(schemas, HasLen, 3) schemas = is.Clone() c.Assert(schemas, HasLen, 3) c.Assert(is.SchemaExists(dbName), IsTrue) c.Assert(is.SchemaExists(noexist), IsFalse) schema, ok := is.SchemaByID(dbID) c.Assert(ok, IsTrue) c.Assert(schema, NotNil) schema, ok = is.SchemaByID(tbID) c.Assert(ok, IsFalse) c.Assert(schema, IsNil) schema, ok = is.SchemaByName(dbName) c.Assert(ok, IsTrue) c.Assert(schema, NotNil) schema, ok = is.SchemaByName(noexist) c.Assert(ok, IsFalse) c.Assert(schema, IsNil) c.Assert(is.TableExists(dbName, tbName), IsTrue) c.Assert(is.TableExists(dbName, noexist), IsFalse) tb, ok := is.TableByID(tbID) c.Assert(ok, IsTrue) c.Assert(tb, NotNil) tb, ok = is.TableByID(dbID) c.Assert(ok, IsFalse) c.Assert(tb, IsNil) alloc, ok := is.AllocByID(tbID) c.Assert(ok, IsTrue) c.Assert(alloc, NotNil) tb, err = is.TableByName(dbName, tbName) c.Assert(err, IsNil) c.Assert(tb, NotNil) tb, err = is.TableByName(dbName, noexist) c.Assert(err, NotNil) tbs := is.SchemaTables(dbName) c.Assert(tbs, HasLen, 1) tbs = is.SchemaTables(noexist) c.Assert(tbs, HasLen, 0) // Make sure partitions table exists tb, err = is.TableByName(model.NewCIStr("information_schema"), model.NewCIStr("partitions")) c.Assert(err, IsNil) c.Assert(tb, NotNil) }
func (t *testPrivilegeSuite) TestShowGrants(c *C) { se := newSession(c, t.store, t.dbName) ctx, _ := se.(context.Context) mustExec(c, se, `CREATE USER 'show'@'localhost' identified by '123';`) mustExec(c, se, `GRANT Index ON *.* TO 'show'@'localhost';`) pc := &privileges.UserPrivileges{} gs, err := pc.ShowGrants(ctx, `show@localhost`) c.Assert(err, IsNil) c.Assert(gs, HasLen, 1) c.Assert(gs[0], Equals, `GRANT Index ON *.* TO 'show'@'localhost'`) mustExec(c, se, `GRANT Select ON *.* TO 'show'@'localhost';`) pc = &privileges.UserPrivileges{} gs, err = pc.ShowGrants(ctx, `show@localhost`) c.Assert(err, IsNil) c.Assert(gs, HasLen, 1) c.Assert(gs[0], Equals, `GRANT Select,Index ON *.* TO 'show'@'localhost'`) // The order of privs is the same with AllGlobalPrivs mustExec(c, se, `GRANT Update ON *.* TO 'show'@'localhost';`) pc = &privileges.UserPrivileges{} gs, err = pc.ShowGrants(ctx, `show@localhost`) c.Assert(err, IsNil) c.Assert(gs, HasLen, 1) c.Assert(gs[0], Equals, `GRANT Select,Update,Index ON *.* TO 'show'@'localhost'`) // All privileges mustExec(c, se, `GRANT ALL ON *.* TO 'show'@'localhost';`) pc = &privileges.UserPrivileges{} gs, err = pc.ShowGrants(ctx, `show@localhost`) c.Assert(err, IsNil) c.Assert(gs, HasLen, 1) c.Assert(gs[0], Equals, `GRANT ALL PRIVILEGES ON *.* TO 'show'@'localhost'`) // Add db scope privileges mustExec(c, se, `GRANT Select ON test.* TO 'show'@'localhost';`) pc = &privileges.UserPrivileges{} gs, err = pc.ShowGrants(ctx, `show@localhost`) c.Assert(err, IsNil) c.Assert(gs, HasLen, 2) expected := []string{`GRANT ALL PRIVILEGES ON *.* TO 'show'@'localhost'`, `GRANT Select ON test.* TO 'show'@'localhost'`} c.Assert(testutil.CompareUnorderedStringSlice(gs, expected), IsTrue) mustExec(c, se, `GRANT Index ON test1.* TO 'show'@'localhost';`) pc = &privileges.UserPrivileges{} gs, err = pc.ShowGrants(ctx, `show@localhost`) c.Assert(err, IsNil) c.Assert(gs, HasLen, 3) expected = []string{`GRANT ALL PRIVILEGES ON *.* TO 'show'@'localhost'`, `GRANT Select ON test.* TO 'show'@'localhost'`, `GRANT Index ON test1.* TO 'show'@'localhost'`} c.Assert(testutil.CompareUnorderedStringSlice(gs, expected), IsTrue) mustExec(c, se, `GRANT ALL ON test1.* TO 'show'@'localhost';`) pc = &privileges.UserPrivileges{} gs, err = pc.ShowGrants(ctx, `show@localhost`) c.Assert(err, IsNil) c.Assert(gs, HasLen, 3) expected = []string{`GRANT ALL PRIVILEGES ON *.* TO 'show'@'localhost'`, `GRANT Select ON test.* TO 'show'@'localhost'`, `GRANT ALL PRIVILEGES ON test1.* TO 'show'@'localhost'`} c.Assert(testutil.CompareUnorderedStringSlice(gs, expected), IsTrue) // Add table scope privileges mustExec(c, se, `GRANT Update ON test.test TO 'show'@'localhost';`) pc = &privileges.UserPrivileges{} gs, err = pc.ShowGrants(ctx, `show@localhost`) c.Assert(err, IsNil) c.Assert(gs, HasLen, 4) expected = []string{`GRANT ALL PRIVILEGES ON *.* TO 'show'@'localhost'`, `GRANT Select ON test.* TO 'show'@'localhost'`, `GRANT ALL PRIVILEGES ON test1.* TO 'show'@'localhost'`, `GRANT Update ON test.test TO 'show'@'localhost'`} c.Assert(testutil.CompareUnorderedStringSlice(gs, expected), IsTrue) }
func (*testSuite) TestT(c *C) { defer testleak.AfterTest(c)() driver := localstore.Driver{Driver: goleveldb.MemoryDriver{}} store, err := driver.Open("memory") c.Assert(err, IsNil) defer store.Close() handle, err := infoschema.NewHandle(store) c.Assert(err, IsNil) dbName := model.NewCIStr("Test") tbName := model.NewCIStr("T") colName := model.NewCIStr("A") idxName := model.NewCIStr("idx") noexist := model.NewCIStr("noexist") colID, err := genGlobalID(store) c.Assert(err, IsNil) colInfo := &model.ColumnInfo{ ID: colID, Name: colName, Offset: 0, FieldType: *types.NewFieldType(mysql.TypeLonglong), State: model.StatePublic, } idxInfo := &model.IndexInfo{ Name: idxName, Table: tbName, Columns: []*model.IndexColumn{ { Name: colName, Offset: 0, Length: 10, }, }, Unique: true, Primary: true, State: model.StatePublic, } tbID, err := genGlobalID(store) c.Assert(err, IsNil) tblInfo := &model.TableInfo{ ID: tbID, Name: tbName, Columns: []*model.ColumnInfo{colInfo}, Indices: []*model.IndexInfo{idxInfo}, State: model.StatePublic, } dbID, err := genGlobalID(store) c.Assert(err, IsNil) dbInfo := &model.DBInfo{ ID: dbID, Name: dbName, Tables: []*model.TableInfo{tblInfo}, State: model.StatePublic, } dbInfos := []*model.DBInfo{dbInfo} handle.Set(dbInfos, 1) is := handle.Get() schemaNames := is.AllSchemaNames() c.Assert(schemaNames, HasLen, 3) c.Assert(testutil.CompareUnorderedStringSlice(schemaNames, []string{infoschema.Name, perfschema.Name, "Test"}), IsTrue) schemas := is.AllSchemas() c.Assert(schemas, HasLen, 3) schemas = is.Clone() c.Assert(schemas, HasLen, 3) c.Assert(is.SchemaExists(dbName), IsTrue) c.Assert(is.SchemaExists(noexist), IsFalse) schema, ok := is.SchemaByID(dbID) c.Assert(ok, IsTrue) c.Assert(schema, NotNil) schema, ok = is.SchemaByID(tbID) c.Assert(ok, IsFalse) c.Assert(schema, IsNil) schema, ok = is.SchemaByName(dbName) c.Assert(ok, IsTrue) c.Assert(schema, NotNil) schema, ok = is.SchemaByName(noexist) c.Assert(ok, IsFalse) c.Assert(schema, IsNil) c.Assert(is.TableExists(dbName, tbName), IsTrue) c.Assert(is.TableExists(dbName, noexist), IsFalse) tb, ok := is.TableByID(tbID) c.Assert(ok, IsTrue) c.Assert(tb, NotNil) tb, ok = is.TableByID(dbID) c.Assert(ok, IsFalse) c.Assert(tb, IsNil) alloc, ok := is.AllocByID(tbID) c.Assert(ok, IsTrue) c.Assert(alloc, NotNil) tb, err = is.TableByName(dbName, tbName) c.Assert(err, IsNil) c.Assert(tb, NotNil) tb, err = is.TableByName(dbName, noexist) c.Assert(err, NotNil) c.Assert(is.ColumnExists(dbName, tbName, colName), IsTrue) c.Assert(is.ColumnExists(dbName, tbName, noexist), IsFalse) col, ok := is.ColumnByID(colID) c.Assert(ok, IsTrue) c.Assert(col, NotNil) col, ok = is.ColumnByID(dbID) c.Assert(ok, IsFalse) c.Assert(col, IsNil) col, ok = is.ColumnByName(dbName, tbName, colName) c.Assert(ok, IsTrue) c.Assert(col, NotNil) col, ok = is.ColumnByName(dbName, tbName, noexist) c.Assert(ok, IsFalse) c.Assert(col, IsNil) indices, ok := is.ColumnIndicesByID(colID) c.Assert(ok, IsTrue) c.Assert(indices, HasLen, 1) tbs := is.SchemaTables(dbName) c.Assert(tbs, HasLen, 1) tbs = is.SchemaTables(noexist) c.Assert(tbs, HasLen, 0) idx, ok := is.IndexByName(dbName, tbName, idxName) c.Assert(ok, IsTrue) c.Assert(idx, NotNil) // Make sure partitions table exists tb, err = is.TableByName(model.NewCIStr("information_schema"), model.NewCIStr("partitions")) c.Assert(err, IsNil) c.Assert(tb, NotNil) col, ok = is.ColumnByName(model.NewCIStr("information_schema"), model.NewCIStr("files"), model.NewCIStr("FILE_TYPE")) c.Assert(ok, IsTrue) c.Assert(col, NotNil) }