Merge branch 'master' into local-tests
Get correct `rename` behavior for tests to pass
This commit is contained in:
commit
1be3b052c2
2
build.sh
2
build.sh
@ -2,7 +2,7 @@
|
|||||||
#
|
#
|
||||||
#
|
#
|
||||||
|
|
||||||
RELEASE_VERSION="1.0.11"
|
RELEASE_VERSION="1.0.12"
|
||||||
|
|
||||||
function build {
|
function build {
|
||||||
osname=$1
|
osname=$1
|
||||||
|
@ -107,7 +107,7 @@ func (this *Applier) ValidateOrDropExistingTables() error {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if this.tableExists(this.migrationContext.GetGhostTableName()) {
|
if this.tableExists(this.migrationContext.GetGhostTableName()) {
|
||||||
return fmt.Errorf("Table %s already exists. Panicking. Use --initially-drop-ghost-table to force dropping it", sql.EscapeName(this.migrationContext.GetGhostTableName()))
|
return fmt.Errorf("Table %s already exists. Panicking. Use --initially-drop-ghost-table to force dropping it, though I really prefer that you drop it or rename it away", sql.EscapeName(this.migrationContext.GetGhostTableName()))
|
||||||
}
|
}
|
||||||
if this.migrationContext.InitiallyDropOldTable {
|
if this.migrationContext.InitiallyDropOldTable {
|
||||||
if err := this.DropOldTable(); err != nil {
|
if err := this.DropOldTable(); err != nil {
|
||||||
@ -115,7 +115,7 @@ func (this *Applier) ValidateOrDropExistingTables() error {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if this.tableExists(this.migrationContext.GetOldTableName()) {
|
if this.tableExists(this.migrationContext.GetOldTableName()) {
|
||||||
return fmt.Errorf("Table %s already exists. Panicking. Use --initially-drop-old-table to force dropping it", sql.EscapeName(this.migrationContext.GetOldTableName()))
|
return fmt.Errorf("Table %s already exists. Panicking. Use --initially-drop-old-table to force dropping it, though I really prefer that you drop it or rename it away", sql.EscapeName(this.migrationContext.GetOldTableName()))
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
@ -837,7 +837,7 @@ func (this *Applier) buildDMLEventQuery(dmlEvent *binlog.BinlogDMLEvent) (query
|
|||||||
}
|
}
|
||||||
case binlog.UpdateDML:
|
case binlog.UpdateDML:
|
||||||
{
|
{
|
||||||
query, sharedArgs, uniqueKeyArgs, err := sql.BuildDMLUpdateQuery(dmlEvent.DatabaseName, this.migrationContext.GetGhostTableName(), this.migrationContext.OriginalTableColumns, this.migrationContext.MappedSharedColumns, &this.migrationContext.UniqueKey.Columns, dmlEvent.NewColumnValues.AbstractValues(), dmlEvent.WhereColumnValues.AbstractValues())
|
query, sharedArgs, uniqueKeyArgs, err := sql.BuildDMLUpdateQuery(dmlEvent.DatabaseName, this.migrationContext.GetGhostTableName(), this.migrationContext.OriginalTableColumns, this.migrationContext.SharedColumns, this.migrationContext.MappedSharedColumns, &this.migrationContext.UniqueKey.Columns, dmlEvent.NewColumnValues.AbstractValues(), dmlEvent.WhereColumnValues.AbstractValues())
|
||||||
args = append(args, sharedArgs...)
|
args = append(args, sharedArgs...)
|
||||||
args = append(args, uniqueKeyArgs...)
|
args = append(args, uniqueKeyArgs...)
|
||||||
return query, args, 0, err
|
return query, args, 0, err
|
||||||
@ -853,7 +853,6 @@ func (this *Applier) ApplyDMLEventQuery(dmlEvent *binlog.BinlogDMLEvent) error {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO The below is in preparation for transactional writes on the ghost tables.
|
// TODO The below is in preparation for transactional writes on the ghost tables.
|
||||||
// Such writes would be, for example:
|
// Such writes would be, for example:
|
||||||
// - prepended with sql_mode setup
|
// - prepended with sql_mode setup
|
||||||
|
@ -354,7 +354,7 @@ func (this *Migrator) validateStatement() (err error) {
|
|||||||
if this.parser.HasNonTrivialRenames() && !this.migrationContext.SkipRenamedColumns {
|
if this.parser.HasNonTrivialRenames() && !this.migrationContext.SkipRenamedColumns {
|
||||||
this.migrationContext.ColumnRenameMap = this.parser.GetNonTrivialRenames()
|
this.migrationContext.ColumnRenameMap = this.parser.GetNonTrivialRenames()
|
||||||
if !this.migrationContext.ApproveRenamedColumns {
|
if !this.migrationContext.ApproveRenamedColumns {
|
||||||
return fmt.Errorf("Alter statement has column(s) renamed. gh-ost suspects the following renames: %v; but to proceed you must approve via `--approve-renamed-columns` (or you can skip renamed columns via `--skip-renamed-columns`)", this.parser.GetNonTrivialRenames())
|
return fmt.Errorf("gh-ost believes the ALTER statement renames columns, as follows: %v; as precation, you are asked to confirm gh-ost is correct, and provide with `--approve-renamed-columns`, and we're all happy. Or you can skip renamed columns via `--skip-renamed-columns`, in which case column data may be lost", this.parser.GetNonTrivialRenames())
|
||||||
}
|
}
|
||||||
log.Infof("Alter statement has column(s) renamed. gh-ost finds the following renames: %v; --approve-renamed-columns is given and so migration proceeds.", this.parser.GetNonTrivialRenames())
|
log.Infof("Alter statement has column(s) renamed. gh-ost finds the following renames: %v; --approve-renamed-columns is given and so migration proceeds.", this.parser.GetNonTrivialRenames())
|
||||||
}
|
}
|
||||||
|
@ -393,7 +393,7 @@ func BuildDMLInsertQuery(databaseName, tableName string, tableColumns, sharedCol
|
|||||||
return result, sharedArgs, nil
|
return result, sharedArgs, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func BuildDMLUpdateQuery(databaseName, tableName string, tableColumns, sharedColumns, uniqueKeyColumns *ColumnList, valueArgs, whereArgs []interface{}) (result string, sharedArgs, uniqueKeyArgs []interface{}, err error) {
|
func BuildDMLUpdateQuery(databaseName, tableName string, tableColumns, sharedColumns, mappedSharedColumns, uniqueKeyColumns *ColumnList, valueArgs, whereArgs []interface{}) (result string, sharedArgs, uniqueKeyArgs []interface{}, err error) {
|
||||||
if len(valueArgs) != tableColumns.Len() {
|
if len(valueArgs) != tableColumns.Len() {
|
||||||
return result, sharedArgs, uniqueKeyArgs, fmt.Errorf("value args count differs from table column count in BuildDMLUpdateQuery")
|
return result, sharedArgs, uniqueKeyArgs, fmt.Errorf("value args count differs from table column count in BuildDMLUpdateQuery")
|
||||||
}
|
}
|
||||||
@ -415,9 +415,10 @@ func BuildDMLUpdateQuery(databaseName, tableName string, tableColumns, sharedCol
|
|||||||
databaseName = EscapeName(databaseName)
|
databaseName = EscapeName(databaseName)
|
||||||
tableName = EscapeName(tableName)
|
tableName = EscapeName(tableName)
|
||||||
|
|
||||||
for _, column := range sharedColumns.Names {
|
for i, column := range sharedColumns.Names {
|
||||||
|
mappedColumn := mappedSharedColumns.Names[i]
|
||||||
tableOrdinal := tableColumns.Ordinals[column]
|
tableOrdinal := tableColumns.Ordinals[column]
|
||||||
arg := fixArgType(valueArgs[tableOrdinal], sharedColumns.IsUnsigned(column))
|
arg := fixArgType(valueArgs[tableOrdinal], mappedSharedColumns.IsUnsigned(mappedColumn))
|
||||||
sharedArgs = append(sharedArgs, arg)
|
sharedArgs = append(sharedArgs, arg)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -427,11 +428,11 @@ func BuildDMLUpdateQuery(databaseName, tableName string, tableColumns, sharedCol
|
|||||||
uniqueKeyArgs = append(uniqueKeyArgs, arg)
|
uniqueKeyArgs = append(uniqueKeyArgs, arg)
|
||||||
}
|
}
|
||||||
|
|
||||||
sharedColumnNames := duplicateNames(sharedColumns.Names)
|
mappedSharedColumnNames := duplicateNames(mappedSharedColumns.Names)
|
||||||
for i := range sharedColumnNames {
|
for i := range mappedSharedColumnNames {
|
||||||
sharedColumnNames[i] = EscapeName(sharedColumnNames[i])
|
mappedSharedColumnNames[i] = EscapeName(mappedSharedColumnNames[i])
|
||||||
}
|
}
|
||||||
setClause, err := BuildSetPreparedClause(sharedColumnNames)
|
setClause, err := BuildSetPreparedClause(mappedSharedColumnNames)
|
||||||
|
|
||||||
equalsComparison, err := BuildEqualsPreparedComparison(uniqueKeyColumns.Names)
|
equalsComparison, err := BuildEqualsPreparedComparison(uniqueKeyColumns.Names)
|
||||||
result = fmt.Sprintf(`
|
result = fmt.Sprintf(`
|
||||||
|
@ -544,7 +544,7 @@ func TestBuildDMLUpdateQuery(t *testing.T) {
|
|||||||
{
|
{
|
||||||
sharedColumns := NewColumnList([]string{"id", "name", "position", "age"})
|
sharedColumns := NewColumnList([]string{"id", "name", "position", "age"})
|
||||||
uniqueKeyColumns := NewColumnList([]string{"position"})
|
uniqueKeyColumns := NewColumnList([]string{"position"})
|
||||||
query, sharedArgs, uniqueKeyArgs, err := BuildDMLUpdateQuery(databaseName, tableName, tableColumns, sharedColumns, uniqueKeyColumns, valueArgs, whereArgs)
|
query, sharedArgs, uniqueKeyArgs, err := BuildDMLUpdateQuery(databaseName, tableName, tableColumns, sharedColumns, sharedColumns, uniqueKeyColumns, valueArgs, whereArgs)
|
||||||
test.S(t).ExpectNil(err)
|
test.S(t).ExpectNil(err)
|
||||||
expected := `
|
expected := `
|
||||||
update /* gh-ost mydb.tbl */
|
update /* gh-ost mydb.tbl */
|
||||||
@ -560,7 +560,7 @@ func TestBuildDMLUpdateQuery(t *testing.T) {
|
|||||||
{
|
{
|
||||||
sharedColumns := NewColumnList([]string{"id", "name", "position", "age"})
|
sharedColumns := NewColumnList([]string{"id", "name", "position", "age"})
|
||||||
uniqueKeyColumns := NewColumnList([]string{"position", "name"})
|
uniqueKeyColumns := NewColumnList([]string{"position", "name"})
|
||||||
query, sharedArgs, uniqueKeyArgs, err := BuildDMLUpdateQuery(databaseName, tableName, tableColumns, sharedColumns, uniqueKeyColumns, valueArgs, whereArgs)
|
query, sharedArgs, uniqueKeyArgs, err := BuildDMLUpdateQuery(databaseName, tableName, tableColumns, sharedColumns, sharedColumns, uniqueKeyColumns, valueArgs, whereArgs)
|
||||||
test.S(t).ExpectNil(err)
|
test.S(t).ExpectNil(err)
|
||||||
expected := `
|
expected := `
|
||||||
update /* gh-ost mydb.tbl */
|
update /* gh-ost mydb.tbl */
|
||||||
@ -576,7 +576,7 @@ func TestBuildDMLUpdateQuery(t *testing.T) {
|
|||||||
{
|
{
|
||||||
sharedColumns := NewColumnList([]string{"id", "name", "position", "age"})
|
sharedColumns := NewColumnList([]string{"id", "name", "position", "age"})
|
||||||
uniqueKeyColumns := NewColumnList([]string{"age"})
|
uniqueKeyColumns := NewColumnList([]string{"age"})
|
||||||
query, sharedArgs, uniqueKeyArgs, err := BuildDMLUpdateQuery(databaseName, tableName, tableColumns, sharedColumns, uniqueKeyColumns, valueArgs, whereArgs)
|
query, sharedArgs, uniqueKeyArgs, err := BuildDMLUpdateQuery(databaseName, tableName, tableColumns, sharedColumns, sharedColumns, uniqueKeyColumns, valueArgs, whereArgs)
|
||||||
test.S(t).ExpectNil(err)
|
test.S(t).ExpectNil(err)
|
||||||
expected := `
|
expected := `
|
||||||
update /* gh-ost mydb.tbl */
|
update /* gh-ost mydb.tbl */
|
||||||
@ -592,7 +592,7 @@ func TestBuildDMLUpdateQuery(t *testing.T) {
|
|||||||
{
|
{
|
||||||
sharedColumns := NewColumnList([]string{"id", "name", "position", "age"})
|
sharedColumns := NewColumnList([]string{"id", "name", "position", "age"})
|
||||||
uniqueKeyColumns := NewColumnList([]string{"age", "position", "id", "name"})
|
uniqueKeyColumns := NewColumnList([]string{"age", "position", "id", "name"})
|
||||||
query, sharedArgs, uniqueKeyArgs, err := BuildDMLUpdateQuery(databaseName, tableName, tableColumns, sharedColumns, uniqueKeyColumns, valueArgs, whereArgs)
|
query, sharedArgs, uniqueKeyArgs, err := BuildDMLUpdateQuery(databaseName, tableName, tableColumns, sharedColumns, sharedColumns, uniqueKeyColumns, valueArgs, whereArgs)
|
||||||
test.S(t).ExpectNil(err)
|
test.S(t).ExpectNil(err)
|
||||||
expected := `
|
expected := `
|
||||||
update /* gh-ost mydb.tbl */
|
update /* gh-ost mydb.tbl */
|
||||||
@ -608,15 +608,32 @@ func TestBuildDMLUpdateQuery(t *testing.T) {
|
|||||||
{
|
{
|
||||||
sharedColumns := NewColumnList([]string{"id", "name", "position", "age"})
|
sharedColumns := NewColumnList([]string{"id", "name", "position", "age"})
|
||||||
uniqueKeyColumns := NewColumnList([]string{"age", "surprise"})
|
uniqueKeyColumns := NewColumnList([]string{"age", "surprise"})
|
||||||
_, _, _, err := BuildDMLUpdateQuery(databaseName, tableName, tableColumns, sharedColumns, uniqueKeyColumns, valueArgs, whereArgs)
|
_, _, _, err := BuildDMLUpdateQuery(databaseName, tableName, tableColumns, sharedColumns, sharedColumns, uniqueKeyColumns, valueArgs, whereArgs)
|
||||||
test.S(t).ExpectNotNil(err)
|
test.S(t).ExpectNotNil(err)
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
sharedColumns := NewColumnList([]string{"id", "name", "position", "age"})
|
sharedColumns := NewColumnList([]string{"id", "name", "position", "age"})
|
||||||
uniqueKeyColumns := NewColumnList([]string{})
|
uniqueKeyColumns := NewColumnList([]string{})
|
||||||
_, _, _, err := BuildDMLUpdateQuery(databaseName, tableName, tableColumns, sharedColumns, uniqueKeyColumns, valueArgs, whereArgs)
|
_, _, _, err := BuildDMLUpdateQuery(databaseName, tableName, tableColumns, sharedColumns, sharedColumns, uniqueKeyColumns, valueArgs, whereArgs)
|
||||||
test.S(t).ExpectNotNil(err)
|
test.S(t).ExpectNotNil(err)
|
||||||
}
|
}
|
||||||
|
{
|
||||||
|
sharedColumns := NewColumnList([]string{"id", "name", "position", "age"})
|
||||||
|
mappedColumns := NewColumnList([]string{"id", "name", "role", "age"})
|
||||||
|
uniqueKeyColumns := NewColumnList([]string{"id"})
|
||||||
|
query, sharedArgs, uniqueKeyArgs, err := BuildDMLUpdateQuery(databaseName, tableName, tableColumns, sharedColumns, mappedColumns, uniqueKeyColumns, valueArgs, whereArgs)
|
||||||
|
test.S(t).ExpectNil(err)
|
||||||
|
expected := `
|
||||||
|
update /* gh-ost mydb.tbl */
|
||||||
|
mydb.tbl
|
||||||
|
set id=?, name=?, role=?, age=?
|
||||||
|
where
|
||||||
|
((id = ?))
|
||||||
|
`
|
||||||
|
test.S(t).ExpectEquals(normalizeQuery(query), normalizeQuery(expected))
|
||||||
|
test.S(t).ExpectTrue(reflect.DeepEqual(sharedArgs, []interface{}{3, "testname", 17, 23}))
|
||||||
|
test.S(t).ExpectTrue(reflect.DeepEqual(uniqueKeyArgs, []interface{}{3}))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestBuildDMLUpdateQuerySignedUnsigned(t *testing.T) {
|
func TestBuildDMLUpdateQuerySignedUnsigned(t *testing.T) {
|
||||||
@ -629,7 +646,7 @@ func TestBuildDMLUpdateQuerySignedUnsigned(t *testing.T) {
|
|||||||
uniqueKeyColumns := NewColumnList([]string{"position"})
|
uniqueKeyColumns := NewColumnList([]string{"position"})
|
||||||
{
|
{
|
||||||
// test signed
|
// test signed
|
||||||
query, sharedArgs, uniqueKeyArgs, err := BuildDMLUpdateQuery(databaseName, tableName, tableColumns, sharedColumns, uniqueKeyColumns, valueArgs, whereArgs)
|
query, sharedArgs, uniqueKeyArgs, err := BuildDMLUpdateQuery(databaseName, tableName, tableColumns, sharedColumns, sharedColumns, uniqueKeyColumns, valueArgs, whereArgs)
|
||||||
test.S(t).ExpectNil(err)
|
test.S(t).ExpectNil(err)
|
||||||
expected := `
|
expected := `
|
||||||
update /* gh-ost mydb.tbl */
|
update /* gh-ost mydb.tbl */
|
||||||
@ -646,7 +663,7 @@ func TestBuildDMLUpdateQuerySignedUnsigned(t *testing.T) {
|
|||||||
// test unsigned
|
// test unsigned
|
||||||
sharedColumns.SetUnsigned("age")
|
sharedColumns.SetUnsigned("age")
|
||||||
uniqueKeyColumns.SetUnsigned("position")
|
uniqueKeyColumns.SetUnsigned("position")
|
||||||
query, sharedArgs, uniqueKeyArgs, err := BuildDMLUpdateQuery(databaseName, tableName, tableColumns, sharedColumns, uniqueKeyColumns, valueArgs, whereArgs)
|
query, sharedArgs, uniqueKeyArgs, err := BuildDMLUpdateQuery(databaseName, tableName, tableColumns, sharedColumns, sharedColumns, uniqueKeyColumns, valueArgs, whereArgs)
|
||||||
test.S(t).ExpectNil(err)
|
test.S(t).ExpectNil(err)
|
||||||
expected := `
|
expected := `
|
||||||
update /* gh-ost mydb.tbl */
|
update /* gh-ost mydb.tbl */
|
||||||
|
Loading…
Reference in New Issue
Block a user