From 9d4594632fef598b76e1723641dfb01261c673d1 Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Tue, 10 Mar 2020 04:46:46 +0000 Subject: [PATCH] Fix mssql issue with duplicate columns. (#1225) fix test fix test Fix mssql issue with duplicate columns. The `GetColumns()` method for the mssql dialect can return the same column multiple times if the column is in multiple indexes. Co-authored-by: Robert G. Jakabosky Reviewed-on: https://gitea.com/xorm/xorm/pulls/1225 --- dialects/mssql.go | 11 ++++++----- tags_test.go | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+), 5 deletions(-) diff --git a/dialects/mssql.go b/dialects/mssql.go index cad18a29..dd3f4247 100644 --- a/dialects/mssql.go +++ b/dialects/mssql.go @@ -335,14 +335,15 @@ func (db *mssql) GetColumns(ctx context.Context, tableName string) ([]string, ma s := `select a.name as name, b.name as ctype,a.max_length,a.precision,a.scale,a.is_nullable as nullable, "default_is_null" = (CASE WHEN c.text is null THEN 1 ELSE 0 END), replace(replace(isnull(c.text,''),'(',''),')','') as vdefault, - ISNULL(i.is_primary_key, 0), a.is_identity as is_identity + ISNULL(p.is_primary_key, 0), a.is_identity as is_identity from sys.columns a left join sys.types b on a.user_type_id=b.user_type_id left join sys.syscomments c on a.default_object_id=c.id - LEFT OUTER JOIN - sys.index_columns ic ON ic.object_id = a.object_id AND ic.column_id = a.column_id - LEFT OUTER JOIN - sys.indexes i ON ic.object_id = i.object_id AND ic.index_id = i.index_id + LEFT OUTER JOIN (SELECT i.object_id, ic.column_id, i.is_primary_key + FROM sys.indexes i + LEFT JOIN sys.index_columns ic ON ic.object_id = i.object_id AND ic.index_id = i.index_id + WHERE i.is_primary_key = 1 + ) as p on p.object_id = a.object_id AND p.column_id = a.column_id where a.object_id=object_id('` + tableName + `')` rows, err := db.DB().QueryContext(ctx, s, args...) diff --git a/tags_test.go b/tags_test.go index ff578def..74822956 100644 --- a/tags_test.go +++ b/tags_test.go @@ -6,6 +6,7 @@ package xorm import ( "fmt" + "sort" "strings" "testing" "time" @@ -1295,3 +1296,34 @@ func TestVersion4(t *testing.T) { assert.EqualValues(t, v.Ver, 1) } } + +func TestIndexes(t *testing.T) { + assert.NoError(t, prepareEngine()) + + type TestIndexesStruct struct { + Id int64 + Name string `xorm:"index unique(s)"` + Email string `xorm:"index unique(s)"` + } + + assertSync(t, new(TestIndexesStruct)) + + tables, err := testEngine.DBMetas() + assert.NoError(t, err) + assert.EqualValues(t, 1, len(tables)) + assert.EqualValues(t, 3, len(tables[0].Columns())) + slice1 := []string{ + testEngine.GetColumnMapper().Obj2Table("Id"), + testEngine.GetColumnMapper().Obj2Table("Name"), + testEngine.GetColumnMapper().Obj2Table("Email"), + } + slice2 := []string{ + tables[0].Columns()[0].Name, + tables[0].Columns()[1].Name, + tables[0].Columns()[2].Name, + } + sort.Strings(slice1) + sort.Strings(slice2) + assert.EqualValues(t, slice1, slice2) + assert.EqualValues(t, 3, len(tables[0].Indexes)) +}