Skip to content
This repository has been archived by the owner on Dec 8, 2021. It is now read-only.

Commit

Permalink
fix autoid for v4.0.0 (#430)
Browse files Browse the repository at this point in the history
  • Loading branch information
glorv authored Oct 27, 2020
1 parent 3ecec63 commit 6887f4e
Show file tree
Hide file tree
Showing 2 changed files with 161 additions and 4 deletions.
27 changes: 23 additions & 4 deletions lightning/backend/tidb.go
Original file line number Diff line number Diff line change
Expand Up @@ -432,7 +432,7 @@ func (be *tidbBackend) FetchRemoteTableModels(ctx context.Context, schemaName st
// init auto id column for each table
for _, tbl := range tables {
tblName := common.UniqueTable(schemaName, tbl.Name.O)
rows, e = tx.Query(fmt.Sprintf("SHOW TABLE %s next_row_id", tblName))
rows, e = tx.Query(fmt.Sprintf("SHOW TABLE %s NEXT_ROW_ID", tblName))
if e != nil {
return e
}
Expand All @@ -441,10 +441,29 @@ func (be *tidbBackend) FetchRemoteTableModels(ctx context.Context, schemaName st
dbName, tblName, columnName, idType string
nextID int64
)
if e := rows.Scan(&dbName, &tblName, &columnName, &nextID, &idType); e != nil {
_ = rows.Close()
return e
columns, err := rows.Columns()
if err != nil {
return err
}

//+--------------+------------+-------------+--------------------+----------------+
//| DB_NAME | TABLE_NAME | COLUMN_NAME | NEXT_GLOBAL_ROW_ID | ID_TYPE |
//+--------------+------------+-------------+--------------------+----------------+
//| testsysbench | t | _tidb_rowid | 1 | AUTO_INCREMENT |
//+--------------+------------+-------------+--------------------+----------------+

// if columns length is 4, it doesn't contains the last column `ID_TYPE`, and it will always be 'AUTO_INCREMENT'
// for v4.0.0~v4.0.2 show table t next_row_id only returns 4 columns.
if len(columns) == 4 {
err = rows.Scan(&dbName, &tblName, &columnName, &nextID)
idType = "AUTO_INCREMENT"
} else {
err = rows.Scan(&dbName, &tblName, &columnName, &nextID, &idType)
}
if err != nil {
return err
}

for _, col := range tbl.Columns {
if col.Name.O == columnName {
switch idType {
Expand Down
138 changes: 138 additions & 0 deletions lightning/backend/tidb_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -201,3 +201,141 @@ func (s *mysqlSuite) TestStrictMode(c *C) {
}, 1, []int{1, 0, -1})
c.Assert(err, ErrorMatches, ".*incorrect ascii value .* for column s1")
}

func (s *mysqlSuite) TestFetchRemoteTableModels_3_x(c *C) {
s.mockDB.ExpectBegin()
s.mockDB.ExpectQuery("SELECT version()").
WillReturnRows(sqlmock.NewRows([]string{"version()"}).AddRow("5.7.25-TiDB-v3.0.18"))
s.mockDB.ExpectQuery("\\QSELECT table_name, column_name, column_type, extra FROM information_schema.columns WHERE table_schema = ? ORDER BY table_name, ordinal_position;\\E").
WithArgs("test").
WillReturnRows(sqlmock.NewRows([]string{"table_name", "column_name", "column_type", "extra"}).
AddRow("t", "id", "int(10)", "auto_increment"))
s.mockDB.ExpectCommit()

bk := kv.NewTiDBBackend(s.dbHandle, config.ErrorOnDup)
tableInfos, err := bk.FetchRemoteTableModels(context.Background(), "test")
c.Assert(err, IsNil)
c.Assert(tableInfos, DeepEquals, []*model.TableInfo{
{
Name: model.NewCIStr("t"),
State: model.StatePublic,
PKIsHandle: true,
Columns: []*model.ColumnInfo{
{
Name: model.NewCIStr("id"),
Offset: 0,
State: model.StatePublic,
FieldType: types.FieldType{
Flag: mysql.AutoIncrementFlag,
},
},
},
},
})
}

func (s *mysqlSuite) TestFetchRemoteTableModels_4_0(c *C) {
s.mockDB.ExpectBegin()
s.mockDB.ExpectQuery("SELECT version()").
WillReturnRows(sqlmock.NewRows([]string{"version()"}).AddRow("5.7.25-TiDB-v4.0.0"))
s.mockDB.ExpectQuery("\\QSELECT table_name, column_name, column_type, extra FROM information_schema.columns WHERE table_schema = ? ORDER BY table_name, ordinal_position;\\E").
WithArgs("test").
WillReturnRows(sqlmock.NewRows([]string{"table_name", "column_name", "column_type", "extra"}).
AddRow("t", "id", "bigint(20) unsigned", "auto_increment"))
s.mockDB.ExpectQuery("SHOW TABLE `test`.`t` NEXT_ROW_ID").
WillReturnRows(sqlmock.NewRows([]string{"DB_NAME", "TABLE_NAME", "COLUMN_NAME", "NEXT_GLOBAL_ROW_ID"}).
AddRow("test", "t", "id", int64(1)))
s.mockDB.ExpectCommit()

bk := kv.NewTiDBBackend(s.dbHandle, config.ErrorOnDup)
tableInfos, err := bk.FetchRemoteTableModels(context.Background(), "test")
c.Assert(err, IsNil)
c.Assert(tableInfos, DeepEquals, []*model.TableInfo{
{
Name: model.NewCIStr("t"),
State: model.StatePublic,
PKIsHandle: true,
Columns: []*model.ColumnInfo{
{
Name: model.NewCIStr("id"),
Offset: 0,
State: model.StatePublic,
FieldType: types.FieldType{
Flag: mysql.AutoIncrementFlag | mysql.UnsignedFlag,
},
},
},
},
})
}

func (s *mysqlSuite) TestFetchRemoteTableModels_4_x_auto_increment(c *C) {
s.mockDB.ExpectBegin()
s.mockDB.ExpectQuery("SELECT version()").
WillReturnRows(sqlmock.NewRows([]string{"version()"}).AddRow("5.7.25-TiDB-v4.0.7"))
s.mockDB.ExpectQuery("\\QSELECT table_name, column_name, column_type, extra FROM information_schema.columns WHERE table_schema = ? ORDER BY table_name, ordinal_position;\\E").
WithArgs("test").
WillReturnRows(sqlmock.NewRows([]string{"table_name", "column_name", "column_type", "extra"}).
AddRow("t", "id", "bigint(20)", ""))
s.mockDB.ExpectQuery("SHOW TABLE `test`.`t` NEXT_ROW_ID").
WillReturnRows(sqlmock.NewRows([]string{"DB_NAME", "TABLE_NAME", "COLUMN_NAME", "NEXT_GLOBAL_ROW_ID", "ID_TYPE"}).
AddRow("test", "t", "id", int64(1), "AUTO_INCREMENT"))
s.mockDB.ExpectCommit()

bk := kv.NewTiDBBackend(s.dbHandle, config.ErrorOnDup)
tableInfos, err := bk.FetchRemoteTableModels(context.Background(), "test")
c.Assert(err, IsNil)
c.Assert(tableInfos, DeepEquals, []*model.TableInfo{
{
Name: model.NewCIStr("t"),
State: model.StatePublic,
PKIsHandle: true,
Columns: []*model.ColumnInfo{
{
Name: model.NewCIStr("id"),
Offset: 0,
State: model.StatePublic,
FieldType: types.FieldType{
Flag: mysql.AutoIncrementFlag,
},
},
},
},
})
}

func (s *mysqlSuite) TestFetchRemoteTableModels_4_x_auto_random(c *C) {
s.mockDB.ExpectBegin()
s.mockDB.ExpectQuery("SELECT version()").
WillReturnRows(sqlmock.NewRows([]string{"version()"}).AddRow("5.7.25-TiDB-v4.0.7"))
s.mockDB.ExpectQuery("\\QSELECT table_name, column_name, column_type, extra FROM information_schema.columns WHERE table_schema = ? ORDER BY table_name, ordinal_position;\\E").
WithArgs("test").
WillReturnRows(sqlmock.NewRows([]string{"table_name", "column_name", "column_type", "extra"}).
AddRow("t", "id", "bigint(20)", ""))
s.mockDB.ExpectQuery("SHOW TABLE `test`.`t` NEXT_ROW_ID").
WillReturnRows(sqlmock.NewRows([]string{"DB_NAME", "TABLE_NAME", "COLUMN_NAME", "NEXT_GLOBAL_ROW_ID", "ID_TYPE"}).
AddRow("test", "t", "id", int64(1), "AUTO_RANDOM"))
s.mockDB.ExpectCommit()

bk := kv.NewTiDBBackend(s.dbHandle, config.ErrorOnDup)
tableInfos, err := bk.FetchRemoteTableModels(context.Background(), "test")
c.Assert(err, IsNil)
c.Assert(tableInfos, DeepEquals, []*model.TableInfo{
{
Name: model.NewCIStr("t"),
State: model.StatePublic,
PKIsHandle: true,
AutoRandomBits: 1,
Columns: []*model.ColumnInfo{
{
Name: model.NewCIStr("id"),
Offset: 0,
State: model.StatePublic,
FieldType: types.FieldType{
Flag: mysql.PriKeyFlag,
},
},
},
},
})
}

0 comments on commit 6887f4e

Please sign in to comment.