Fix mssql get indexes bug when collation is not default with collation test for mssql (#2387) (#2389)

backport #2387

Reviewed-on: https://gitea.com/xorm/xorm/pulls/2387

Reviewed-on: https://gitea.com/xorm/xorm/pulls/2389
This commit is contained in:
Lunny Xiao 2023-12-31 14:39:33 +00:00
parent 5d57ef92f5
commit 6ce46e7fac
5 changed files with 19 additions and 2 deletions

View File

@ -44,6 +44,14 @@ jobs:
TEST_MSSQL_USERNAME: sa TEST_MSSQL_USERNAME: sa
TEST_MSSQL_PASSWORD: "yourStrong(!)Password" TEST_MSSQL_PASSWORD: "yourStrong(!)Password"
run: TEST_MSSQL_DEFAULT_VARCHAR=NVARCHAR TEST_MSSQL_DEFAULT_CHAR=NCHAR make test-mssql run: TEST_MSSQL_DEFAULT_VARCHAR=NVARCHAR TEST_MSSQL_DEFAULT_CHAR=NCHAR make test-mssql
- name: test mssql with collation
env:
TEST_MSSQL_HOST: mssql
TEST_MSSQL_DBNAME: xorm_test
TEST_MSSQL_USERNAME: sa
TEST_MSSQL_PASSWORD: "yourStrong(!)Password"
TEST_MSSQL_COLLATION: SQL_Latin1_General_CP1_CS_AS
run: TEST_MSSQL_DEFAULT_VARCHAR=NVARCHAR TEST_MSSQL_DEFAULT_CHAR=NCHAR make test-mssql
services: services:
mssql: mssql:

View File

@ -25,6 +25,7 @@ TEST_MSSQL_PASSWORD ?= MwantsaSecurePassword1
TEST_MSSQL_DEFAULT_VARCHAR ?= varchar TEST_MSSQL_DEFAULT_VARCHAR ?= varchar
TEST_MSSQL_DEFAULT_CHAR ?= char TEST_MSSQL_DEFAULT_CHAR ?= char
TEST_MSSQL_DO_NVARCHAR_OVERRIDE_TEST ?= true TEST_MSSQL_DO_NVARCHAR_OVERRIDE_TEST ?= true
TEST_MSSQL_COLLATION ?=
TEST_MYSQL_HOST ?= mysql:3306 TEST_MYSQL_HOST ?= mysql:3306
TEST_MYSQL_CHARSET ?= utf8 TEST_MYSQL_CHARSET ?= utf8
@ -153,6 +154,7 @@ test-mssql: go-check
-conn_str="server=$(TEST_MSSQL_HOST);user id=$(TEST_MSSQL_USERNAME);password=$(TEST_MSSQL_PASSWORD);database=$(TEST_MSSQL_DBNAME)" \ -conn_str="server=$(TEST_MSSQL_HOST);user id=$(TEST_MSSQL_USERNAME);password=$(TEST_MSSQL_PASSWORD);database=$(TEST_MSSQL_DBNAME)" \
-default_varchar=$(TEST_MSSQL_DEFAULT_VARCHAR) -default_char=$(TEST_MSSQL_DEFAULT_CHAR) \ -default_varchar=$(TEST_MSSQL_DEFAULT_VARCHAR) -default_char=$(TEST_MSSQL_DEFAULT_CHAR) \
-do_nvarchar_override_test=$(TEST_MSSQL_DO_NVARCHAR_OVERRIDE_TEST) \ -do_nvarchar_override_test=$(TEST_MSSQL_DO_NVARCHAR_OVERRIDE_TEST) \
-collation=$(TEST_MSSQL_COLLATION) \
-coverprofile=mssql.$(TEST_QUOTE_POLICY).$(TEST_CACHE_ENABLE).coverage.out -covermode=atomic -timeout=20m -coverprofile=mssql.$(TEST_QUOTE_POLICY).$(TEST_CACHE_ENABLE).coverage.out -covermode=atomic -timeout=20m
.PNONY: test-mssql\#% .PNONY: test-mssql\#%

View File

@ -586,7 +586,7 @@ func (db *mssql) GetIndexes(queryer core.Queryer, ctx context.Context, tableName
IXS.NAME AS [INDEX_NAME], IXS.NAME AS [INDEX_NAME],
C.NAME AS [COLUMN_NAME], C.NAME AS [COLUMN_NAME],
IXS.is_unique AS [IS_UNIQUE] IXS.is_unique AS [IS_UNIQUE]
FROM SYS.INDEXES IXS FROM sys.indexes IXS
INNER JOIN SYS.INDEX_COLUMNS IXCS INNER JOIN SYS.INDEX_COLUMNS IXCS
ON IXS.OBJECT_ID=IXCS.OBJECT_ID AND IXS.INDEX_ID = IXCS.INDEX_ID ON IXS.OBJECT_ID=IXCS.OBJECT_ID AND IXS.INDEX_ID = IXCS.INDEX_ID
INNER JOIN SYS.COLUMNS C ON IXS.OBJECT_ID=C.OBJECT_ID INNER JOIN SYS.COLUMNS C ON IXS.OBJECT_ID=C.OBJECT_ID

1
go.mod
View File

@ -39,6 +39,7 @@ require (
github.com/modern-go/reflect2 v1.0.2 // indirect github.com/modern-go/reflect2 v1.0.2 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect
github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0 // indirect github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0 // indirect
github.com/syndtr/goleveldb v1.0.0 // indirect
golang.org/x/crypto v0.6.0 // indirect golang.org/x/crypto v0.6.0 // indirect
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 // indirect golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 // indirect
golang.org/x/sys v0.5.0 // indirect golang.org/x/sys v0.5.0 // indirect

View File

@ -40,6 +40,7 @@ var (
quotePolicyStr = flag.String("quote", "always", "quote could be always, none, reversed") quotePolicyStr = flag.String("quote", "always", "quote could be always, none, reversed")
defaultVarchar = flag.String("default_varchar", "varchar", "default varchar type, mssql only, could be varchar or nvarchar, default is varchar") defaultVarchar = flag.String("default_varchar", "varchar", "default varchar type, mssql only, could be varchar or nvarchar, default is varchar")
defaultChar = flag.String("default_char", "char", "default char type, mssql only, could be char or nchar, default is char") defaultChar = flag.String("default_char", "char", "default char type, mssql only, could be char or nchar, default is char")
collation = flag.String("collation", "", "default database collation, it's different for different database")
tableMapper names.Mapper tableMapper names.Mapper
colMapper names.Mapper colMapper names.Mapper
) )
@ -55,7 +56,12 @@ func createEngine(dbType, connStr string) error {
if err != nil { if err != nil {
return err return err
} }
if _, err = db.Exec("If(db_id(N'xorm_test') IS NULL) BEGIN CREATE DATABASE xorm_test; END;"); err != nil { createDBSQL := "If(db_id(N'xorm_test') IS NULL) BEGIN CREATE DATABASE xorm_test"
if collation != nil && *collation != "" {
createDBSQL += fmt.Sprintf(" COLLATE %s", *collation)
}
createDBSQL += "; END;"
if _, err = db.Exec(createDBSQL); err != nil {
return fmt.Errorf("db.Exec: %v", err) return fmt.Errorf("db.Exec: %v", err)
} }
db.Close() db.Close()