Permalink
Browse files

fixing mediumint unsigned problem

  • Loading branch information...
1 parent 67cfba3 commit a07a6f8cf5f48bdb97c622605a87a4389cbc80c6 @shlomi-noach shlomi-noach committed Jan 10, 2017
Showing with 22 additions and 5 deletions.
  1. +6 −1 go/logic/inspect.go
  2. +2 −2 go/sql/builder.go
  3. +12 −1 go/sql/types.go
  4. +2 −1 localtests/unsigned-modify/create.sql
View
@@ -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 != "" {
View
@@ -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)
View
@@ -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 {
@@ -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 ;;

0 comments on commit a07a6f8

Please sign in to comment.