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 <bobby@sharedrealm.com>
Reviewed-on: https://gitea.com/xorm/xorm/pulls/1225
This commit is contained in:
Lunny Xiao 2020-03-10 04:46:46 +00:00
parent 36e26e35ed
commit 9d4594632f
2 changed files with 38 additions and 5 deletions

View File

@ -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, 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), "default_is_null" = (CASE WHEN c.text is null THEN 1 ELSE 0 END),
replace(replace(isnull(c.text,''),'(',''),')','') as vdefault, 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 from sys.columns a
left join sys.types b on a.user_type_id=b.user_type_id 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 join sys.syscomments c on a.default_object_id=c.id
LEFT OUTER JOIN LEFT OUTER JOIN (SELECT i.object_id, ic.column_id, i.is_primary_key
sys.index_columns ic ON ic.object_id = a.object_id AND ic.column_id = a.column_id FROM sys.indexes i
LEFT OUTER JOIN LEFT JOIN sys.index_columns ic ON ic.object_id = i.object_id AND ic.index_id = i.index_id
sys.indexes i 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 + `')` where a.object_id=object_id('` + tableName + `')`
rows, err := db.DB().QueryContext(ctx, s, args...) rows, err := db.DB().QueryContext(ctx, s, args...)

View File

@ -6,6 +6,7 @@ package xorm
import ( import (
"fmt" "fmt"
"sort"
"strings" "strings"
"testing" "testing"
"time" "time"
@ -1295,3 +1296,34 @@ func TestVersion4(t *testing.T) {
assert.EqualValues(t, v.Ver, 1) 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))
}