From 4e10b3c4b54d2e7f5c96510833b03db747308a95 Mon Sep 17 00:00:00 2001 From: Yusuke Hatanaka Date: Fri, 10 Feb 2017 17:42:42 +0900 Subject: [PATCH] Resolve column position modification (#20) * Resolve column position modificication * bug fix * update version * update CHANGELOG --- CHANGELOG.md | 21 +++++++++++++++++++++ builder/builder.go | 13 ++++++++----- cmd/carpenter/version.go | 2 +- dialect/mysql/column.go | 28 ++++++++++++++++------------ 4 files changed, 46 insertions(+), 18 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6dbddc6..0b64c06 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,24 @@ +## 0.4.2 (2017-02-10) + +Minor feature released + +### Added + +- resolve column position modification + +### Deprecated + +- Nothing + +### Removed + +- Nothing + +### Fixed + +- Fix SEGV error + + ## 0.4.1 (2017-02-08) Add migrate table collation diff --git a/builder/builder.go b/builder/builder.go index 06e43dc..7d81df6 100644 --- a/builder/builder.go +++ b/builder/builder.go @@ -58,13 +58,17 @@ func willAlterTableCharacterSet(old, new *mysql.Table) string { alter := []string{} if old.GetCharset() != new.GetCharset() { alter = append(alter, new.ToConvertCharsetSQL()) + old.TableCollation = new.TableCollation } - old.TableCollation = new.TableCollation return new.ToAlterSQL(alter) } func willAlterColumnCharacterSet(old, new *mysql.Table) []string { + if old == nil || new == nil { + return []string{} + } + newCols := new.Columns.GroupByColumnName() oldCols := old.Columns.GroupByColumnName() sqls := []string{} @@ -134,18 +138,17 @@ func willModifyColumn(old, new *mysql.Table) []string { oldCol := oldCols[colName] oldTableSchema := oldCol.TableSchema oldColumnKey := oldCol.ColumnKey - oldOrdinalPosition := oldCol.OrdinalPosition oldPrivileges := oldCol.Privileges oldCol.TableSchema = newCol.TableSchema oldCol.ColumnKey = newCol.ColumnKey - oldCol.OrdinalPosition = newCol.OrdinalPosition oldCol.Privileges = newCol.Privileges if !reflect.DeepEqual(oldCol, newCol) { - sqls = append(sqls, newCol.ToModifySQL()) + sql := newCol.ToModifySQL() + sql = fmt.Sprintf("%s %s", sql, newCol.AppendPos(new.Columns)) + sqls = append(sqls, sql) } oldCol.TableSchema = oldTableSchema oldCol.ColumnKey = oldColumnKey - oldCol.OrdinalPosition = oldOrdinalPosition oldCol.Privileges = oldPrivileges } return sqls diff --git a/cmd/carpenter/version.go b/cmd/carpenter/version.go index 5527ea5..f1ffb21 100644 --- a/cmd/carpenter/version.go +++ b/cmd/carpenter/version.go @@ -1,4 +1,4 @@ package main const Name string = "carpenter" -const Version string = "0.4.1" +const Version string = "0.4.2" diff --git a/dialect/mysql/column.go b/dialect/mysql/column.go index 3a6aee6..8d7c09a 100644 --- a/dialect/mysql/column.go +++ b/dialect/mysql/column.go @@ -121,21 +121,25 @@ func (m Columns) ToSQL() []string { return sqls } +func (m *Column) AppendPos(all Columns) string { + pos := "first" + if m.OrdinalPosition > 1 { + before := m.OrdinalPosition - 1 + for _, v := range all { + if v.OrdinalPosition != before { + continue + } + pos = fmt.Sprintf("after %s", Quote(v.ColumnName)) + break + } + } + return pos +} + func (m Columns) ToAddSQL(all Columns) []string { sqls := make([]string, 0, len(m)) for _, col := range m { - pos := "first" - if col.OrdinalPosition > 1 { - before := col.OrdinalPosition - 1 - for _, v := range all { - if v.OrdinalPosition != before { - continue - } - pos = fmt.Sprintf("after %s", Quote(v.ColumnName)) - break - } - } - sqls = append(sqls, col.ToAddSQL(pos)) + sqls = append(sqls, col.ToAddSQL(col.AppendPos(all))) } return sqls }