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.
This commit is contained in:
Robert G. Jakabosky 2019-02-12 15:32:12 +08:00 committed by Lunny Xiao
parent 36e26e35ed
commit 94f5b89fcf
No known key found for this signature in database
GPG Key ID: C3B7C91B632F738A
2 changed files with 25 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

@ -1295,3 +1295,22 @@ 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()))
assert.EqualValues(t, testEngine.GetTableMapper().tables[0].Columns()[0].Name)
assert.EqualValues(t, 3, len(tables[0].Indexes))
}