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,
|
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...)
|
||||||
|
|
32
tags_test.go
32
tags_test.go
|
@ -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))
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue