Skip to content

Commit 9d45946

Browse files
lunnyNeopallium
andcommitted
Fix mssql issue with duplicate columns. (go-xorm#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 <[email protected]> Reviewed-on: https://gitea.com/xorm/xorm/pulls/1225
1 parent 36e26e3 commit 9d45946

File tree

2 files changed

+38
-5
lines changed

2 files changed

+38
-5
lines changed

dialects/mssql.go

+6-5
Original file line numberDiff line numberDiff line change
@@ -335,14 +335,15 @@ func (db *mssql) GetColumns(ctx context.Context, tableName string) ([]string, ma
335335
s := `select a.name as name, b.name as ctype,a.max_length,a.precision,a.scale,a.is_nullable as nullable,
336336
"default_is_null" = (CASE WHEN c.text is null THEN 1 ELSE 0 END),
337337
replace(replace(isnull(c.text,''),'(',''),')','') as vdefault,
338-
ISNULL(i.is_primary_key, 0), a.is_identity as is_identity
338+
ISNULL(p.is_primary_key, 0), a.is_identity as is_identity
339339
from sys.columns a
340340
left join sys.types b on a.user_type_id=b.user_type_id
341341
left join sys.syscomments c on a.default_object_id=c.id
342-
LEFT OUTER JOIN
343-
sys.index_columns ic ON ic.object_id = a.object_id AND ic.column_id = a.column_id
344-
LEFT OUTER JOIN
345-
sys.indexes i ON ic.object_id = i.object_id AND ic.index_id = i.index_id
342+
LEFT OUTER JOIN (SELECT i.object_id, ic.column_id, i.is_primary_key
343+
FROM sys.indexes i
344+
LEFT JOIN sys.index_columns ic ON ic.object_id = i.object_id AND ic.index_id = i.index_id
345+
WHERE i.is_primary_key = 1
346+
) as p on p.object_id = a.object_id AND p.column_id = a.column_id
346347
where a.object_id=object_id('` + tableName + `')`
347348

348349
rows, err := db.DB().QueryContext(ctx, s, args...)

tags_test.go

+32
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ package xorm
66

77
import (
88
"fmt"
9+
"sort"
910
"strings"
1011
"testing"
1112
"time"
@@ -1295,3 +1296,34 @@ func TestVersion4(t *testing.T) {
12951296
assert.EqualValues(t, v.Ver, 1)
12961297
}
12971298
}
1299+
1300+
func TestIndexes(t *testing.T) {
1301+
assert.NoError(t, prepareEngine())
1302+
1303+
type TestIndexesStruct struct {
1304+
Id int64
1305+
Name string `xorm:"index unique(s)"`
1306+
Email string `xorm:"index unique(s)"`
1307+
}
1308+
1309+
assertSync(t, new(TestIndexesStruct))
1310+
1311+
tables, err := testEngine.DBMetas()
1312+
assert.NoError(t, err)
1313+
assert.EqualValues(t, 1, len(tables))
1314+
assert.EqualValues(t, 3, len(tables[0].Columns()))
1315+
slice1 := []string{
1316+
testEngine.GetColumnMapper().Obj2Table("Id"),
1317+
testEngine.GetColumnMapper().Obj2Table("Name"),
1318+
testEngine.GetColumnMapper().Obj2Table("Email"),
1319+
}
1320+
slice2 := []string{
1321+
tables[0].Columns()[0].Name,
1322+
tables[0].Columns()[1].Name,
1323+
tables[0].Columns()[2].Name,
1324+
}
1325+
sort.Strings(slice1)
1326+
sort.Strings(slice2)
1327+
assert.EqualValues(t, slice1, slice2)
1328+
assert.EqualValues(t, 3, len(tables[0].Indexes))
1329+
}

0 commit comments

Comments
 (0)