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:
parent
36e26e35ed
commit
9d4594632f
|
@ -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...)
|
||||
|
|
32
tags_test.go
32
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))
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue