From a07a6f8cf5f48bdb97c622605a87a4389cbc80c6 Mon Sep 17 00:00:00 2001 From: Shlomi Noach Date: Tue, 10 Jan 2017 09:57:42 +0200 Subject: [PATCH] fixing mediumint unsigned problem --- go/logic/inspect.go | 7 ++++++- go/sql/builder.go | 4 ++-- go/sql/types.go | 13 ++++++++++++- localtests/unsigned-modify/create.sql | 3 ++- 4 files changed, 22 insertions(+), 5 deletions(-) diff --git a/go/logic/inspect.go b/go/logic/inspect.go index 6c81e99..9daef39 100644 --- a/go/logic/inspect.go +++ b/go/logic/inspect.go @@ -529,6 +529,11 @@ func (this *Inspector) applyColumnTypes(databaseName, tableName string, columnsL columnsList.SetUnsigned(columnName) } } + if strings.Contains(columnType, "mediumint") { + for _, columnsList := range columnsLists { + columnsList.GetColumn(columnName).Type = sql.MediumIntColumnType + } + } if strings.Contains(columnType, "timestamp") { for _, columnsList := range columnsLists { columnsList.GetColumn(columnName).Type = sql.TimestampColumnType @@ -541,7 +546,7 @@ func (this *Inspector) applyColumnTypes(databaseName, tableName string, columnsL } if strings.HasPrefix(columnType, "enum") { for _, columnsList := range columnsLists { - columnsList.GetColumn(columnName).Type = sql.EnumColumnValue + columnsList.GetColumn(columnName).Type = sql.EnumColumnType } } if charset := m.GetString("CHARACTER_SET_NAME"); charset != "" { diff --git a/go/sql/builder.go b/go/sql/builder.go index c455992..0b1ac9e 100644 --- a/go/sql/builder.go +++ b/go/sql/builder.go @@ -258,7 +258,7 @@ func BuildUniqueKeyRangeEndPreparedQuery(databaseName, tableName string, uniqueK uniqueKeyColumnDescending := make([]string, len(uniqueKeyColumnNames), len(uniqueKeyColumnNames)) for i, column := range uniqueKeyColumns.Columns() { uniqueKeyColumnNames[i] = EscapeName(uniqueKeyColumnNames[i]) - if column.Type == EnumColumnValue { + if column.Type == EnumColumnType { uniqueKeyColumnAscending[i] = fmt.Sprintf("concat(%s) asc", uniqueKeyColumnNames[i]) uniqueKeyColumnDescending[i] = fmt.Sprintf("concat(%s) desc", uniqueKeyColumnNames[i]) } else { @@ -309,7 +309,7 @@ func buildUniqueKeyMinMaxValuesPreparedQuery(databaseName, tableName string, uni uniqueKeyColumnOrder := make([]string, len(uniqueKeyColumnNames), len(uniqueKeyColumnNames)) for i, column := range uniqueKeyColumns.Columns() { uniqueKeyColumnNames[i] = EscapeName(uniqueKeyColumnNames[i]) - if column.Type == EnumColumnValue { + if column.Type == EnumColumnType { uniqueKeyColumnOrder[i] = fmt.Sprintf("concat(%s) %s", uniqueKeyColumnNames[i], order) } else { uniqueKeyColumnOrder[i] = fmt.Sprintf("%s %s", uniqueKeyColumnNames[i], order) diff --git a/go/sql/types.go b/go/sql/types.go index 720f92f..9f4f8e7 100644 --- a/go/sql/types.go +++ b/go/sql/types.go @@ -18,9 +18,12 @@ const ( UnknownColumnType ColumnType = iota TimestampColumnType = iota DateTimeColumnType = iota - EnumColumnValue = iota + EnumColumnType = iota + MediumIntColumnType = iota ) +const maxMediumintUnsigned int32 = 16777215 + type TimezoneConvertion struct { ToTimezone string } @@ -50,6 +53,14 @@ func (this *Column) convertArg(arg interface{}) interface{} { return uint16(i) } if i, ok := arg.(int32); ok { + if this.Type == MediumIntColumnType { + // problem with mediumint is that it's a 3-byte type. There is no compatible golang type to match that. + // So to convert from negative to positive we'd need to convert the value manually + if i >= 0 { + return i + } + return uint32(maxMediumintUnsigned + i + 1) + } return uint32(i) } if i, ok := arg.(int64); ok { diff --git a/localtests/unsigned-modify/create.sql b/localtests/unsigned-modify/create.sql index 9a0eb18..85e7580 100644 --- a/localtests/unsigned-modify/create.sql +++ b/localtests/unsigned-modify/create.sql @@ -8,7 +8,7 @@ create table gh_ost_test ( column5 int(11) NOT NULL, column6 int(11) NOT NULL, PRIMARY KEY (id), - KEY c12_uix (column1, column2) + KEY c12_ix (column1, column2) ) auto_increment=1; drop event if exists gh_ost_test; @@ -23,5 +23,6 @@ create event gh_ost_test begin -- mediumint maxvalue: 16777215 (unsigned), 8388607 (signed) insert into gh_ost_test values (NULL, 13382498, 536, 8388607, 3, 1483892217, 1483892218); + insert into gh_ost_test values (NULL, 13382498, 536, 8388607, 250, 1483892217, 1483892218); insert into gh_ost_test values (NULL, 13382498, 536, 10000000, 3, 1483892217, 1483892218); end ;;