diff --git a/go/logic/applier.go b/go/logic/applier.go index 9554c59d0..2d43e2a1a 100644 --- a/go/logic/applier.go +++ b/go/logic/applier.go @@ -471,7 +471,7 @@ func (this *Applier) ExecuteThrottleQuery() (int64, error) { // readMigrationMinValues returns the minimum values to be iterated on rowcopy func (this *Applier) readMigrationMinValues(tx *gosql.Tx, uniqueKey *sql.UniqueKey) error { this.migrationContext.Log.Debugf("Reading migration range according to key: %s", uniqueKey.Name) - query, err := sql.BuildUniqueKeyMinValuesPreparedQuery(this.migrationContext.DatabaseName, this.migrationContext.OriginalTableName, &uniqueKey.Columns) + query, err := sql.BuildUniqueKeyMinValuesPreparedQuery(this.migrationContext.DatabaseName, this.migrationContext.OriginalTableName, uniqueKey) if err != nil { return err } @@ -496,7 +496,7 @@ func (this *Applier) readMigrationMinValues(tx *gosql.Tx, uniqueKey *sql.UniqueK // readMigrationMaxValues returns the maximum values to be iterated on rowcopy func (this *Applier) readMigrationMaxValues(tx *gosql.Tx, uniqueKey *sql.UniqueKey) error { this.migrationContext.Log.Debugf("Reading migration range according to key: %s", uniqueKey.Name) - query, err := sql.BuildUniqueKeyMaxValuesPreparedQuery(this.migrationContext.DatabaseName, this.migrationContext.OriginalTableName, &uniqueKey.Columns) + query, err := sql.BuildUniqueKeyMaxValuesPreparedQuery(this.migrationContext.DatabaseName, this.migrationContext.OriginalTableName, uniqueKey) if err != nil { return err } diff --git a/go/sql/builder.go b/go/sql/builder.go index 0169390c2..286c87fc0 100644 --- a/go/sql/builder.go +++ b/go/sql/builder.go @@ -352,24 +352,24 @@ func BuildUniqueKeyRangeEndPreparedQueryViaTemptable(databaseName, tableName str return result, explodedArgs, nil } -func BuildUniqueKeyMinValuesPreparedQuery(databaseName, tableName string, uniqueKeyColumns *ColumnList) (string, error) { - return buildUniqueKeyMinMaxValuesPreparedQuery(databaseName, tableName, uniqueKeyColumns, "asc") +func BuildUniqueKeyMinValuesPreparedQuery(databaseName, tableName string, uniqueKey *UniqueKey) (string, error) { + return buildUniqueKeyMinMaxValuesPreparedQuery(databaseName, tableName, uniqueKey, "asc") } -func BuildUniqueKeyMaxValuesPreparedQuery(databaseName, tableName string, uniqueKeyColumns *ColumnList) (string, error) { - return buildUniqueKeyMinMaxValuesPreparedQuery(databaseName, tableName, uniqueKeyColumns, "desc") +func BuildUniqueKeyMaxValuesPreparedQuery(databaseName, tableName string, uniqueKey *UniqueKey) (string, error) { + return buildUniqueKeyMinMaxValuesPreparedQuery(databaseName, tableName, uniqueKey, "desc") } -func buildUniqueKeyMinMaxValuesPreparedQuery(databaseName, tableName string, uniqueKeyColumns *ColumnList, order string) (string, error) { - if uniqueKeyColumns.Len() == 0 { +func buildUniqueKeyMinMaxValuesPreparedQuery(databaseName, tableName string, uniqueKey *UniqueKey, order string) (string, error) { + if uniqueKey.Columns.Len() == 0 { return "", fmt.Errorf("Got 0 columns in BuildUniqueKeyMinMaxValuesPreparedQuery") } databaseName = EscapeName(databaseName) tableName = EscapeName(tableName) - uniqueKeyColumnNames := duplicateNames(uniqueKeyColumns.Names()) + uniqueKeyColumnNames := duplicateNames(uniqueKey.Columns.Names()) uniqueKeyColumnOrder := make([]string, len(uniqueKeyColumnNames)) - for i, column := range uniqueKeyColumns.Columns() { + for i, column := range uniqueKey.Columns.Columns() { uniqueKeyColumnNames[i] = EscapeName(uniqueKeyColumnNames[i]) if column.Type == EnumColumnType { uniqueKeyColumnOrder[i] = fmt.Sprintf("concat(%s) %s", uniqueKeyColumnNames[i], order) @@ -378,14 +378,15 @@ func buildUniqueKeyMinMaxValuesPreparedQuery(databaseName, tableName string, uni } } query := fmt.Sprintf(` - select /* gh-ost %s.%s */ %s - from - %s.%s - order by - %s - limit 1 - `, databaseName, tableName, strings.Join(uniqueKeyColumnNames, ", "), - databaseName, tableName, + select /* gh-ost %s.%s */ %s + from + %s.%s + force index (%s) + order by %s + limit 1 + `, + databaseName, tableName, strings.Join(uniqueKeyColumnNames, ", "), + databaseName, tableName, uniqueKey.Name, strings.Join(uniqueKeyColumnOrder, ", "), ) return query, nil diff --git a/go/sql/builder_test.go b/go/sql/builder_test.go index 299824269..e708d19f4 100644 --- a/go/sql/builder_test.go +++ b/go/sql/builder_test.go @@ -1,5 +1,5 @@ /* - Copyright 2016 GitHub Inc. + Copyright 2022 GitHub Inc. See https://github.com/github/gh-ost/blob/master/LICENSE */ @@ -310,13 +310,15 @@ func TestBuildUniqueKeyMinValuesPreparedQuery(t *testing.T) { databaseName := "mydb" originalTableName := "tbl" uniqueKeyColumns := NewColumnList([]string{"name", "position"}) + uniqueKey := &UniqueKey{Name: "PRIMARY", Columns: *uniqueKeyColumns} { - query, err := BuildUniqueKeyMinValuesPreparedQuery(databaseName, originalTableName, uniqueKeyColumns) + query, err := BuildUniqueKeyMinValuesPreparedQuery(databaseName, originalTableName, uniqueKey) test.S(t).ExpectNil(err) expected := ` select /* gh-ost mydb.tbl */ name, position from mydb.tbl + force index (PRIMARY) order by name asc, position asc limit 1 @@ -324,12 +326,13 @@ func TestBuildUniqueKeyMinValuesPreparedQuery(t *testing.T) { test.S(t).ExpectEquals(normalizeQuery(query), normalizeQuery(expected)) } { - query, err := BuildUniqueKeyMaxValuesPreparedQuery(databaseName, originalTableName, uniqueKeyColumns) + query, err := BuildUniqueKeyMaxValuesPreparedQuery(databaseName, originalTableName, uniqueKey) test.S(t).ExpectNil(err) expected := ` select /* gh-ost mydb.tbl */ name, position from mydb.tbl + force index (PRIMARY) order by name desc, position desc limit 1